FFmpeg
Loading...
Searching...
No Matches
h264_picture.c
Go to the documentation of this file.
1/*
2 * H.26L/H.264/AVC/JVT/14496-10/... decoder
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * H.264 / AVC / MPEG-4 part10 codec.
25 * @author Michael Niedermayer <michaelni@gmx.at>
26 */
27
28#include "libavutil/avassert.h"
29#include "libavutil/emms.h"
30#include "error_resilience.h"
31#include "avcodec.h"
32#include "h264dec.h"
33#include "h274.h"
34#include "hwaccel_internal.h"
35#include "mpegutils.h"
36#include "libavutil/refstruct.h"
37#include "threadframe.h"
38
40{
41 int off = offsetof(H264Picture, f_grain) + sizeof(pic->f_grain);
42 int i;
43
44 if (!pic->f || !pic->f->buf[0])
45 return;
46
50
54 for (i = 0; i < 2; i++) {
57 }
59
60 memset((uint8_t*)pic + off, 0, sizeof(*pic) - off);
61}
62
64{
65 av_refstruct_replace(&dst->qscale_table_base, src->qscale_table_base);
66 av_refstruct_replace(&dst->mb_type_base, src->mb_type_base);
67 av_refstruct_replace(&dst->pps, src->pps);
68
69 for (int i = 0; i < 2; i++) {
70 av_refstruct_replace(&dst->motion_val_base[i], src->motion_val_base[i]);
71 av_refstruct_replace(&dst->ref_index[i], src->ref_index[i]);
72 }
73
74 av_refstruct_replace(&dst->hwaccel_picture_private,
75 src->hwaccel_picture_private);
76
77 av_refstruct_replace(&dst->decode_error_flags, src->decode_error_flags);
78
79 dst->qscale_table = src->qscale_table;
80 dst->mb_type = src->mb_type;
81
82 for (int i = 0; i < 2; i++)
83 dst->motion_val[i] = src->motion_val[i];
84
85 for (int i = 0; i < 2; i++)
86 dst->field_poc[i] = src->field_poc[i];
87
88 memcpy(dst->ref_poc, src->ref_poc, sizeof(src->ref_poc));
89 memcpy(dst->ref_count, src->ref_count, sizeof(src->ref_count));
90
91 dst->poc = src->poc;
92 dst->frame_num = src->frame_num;
93 dst->mmco_reset = src->mmco_reset;
94 dst->long_ref = src->long_ref;
95 dst->mbaff = src->mbaff;
96 dst->field_picture = src->field_picture;
97 dst->reference = src->reference;
98 dst->recovered = src->recovered;
99 dst->gray = src->gray;
100 dst->invalid_gap = src->invalid_gap;
101 dst->sei_recovery_frame_cnt = src->sei_recovery_frame_cnt;
102 dst->mb_width = src->mb_width;
103 dst->mb_height = src->mb_height;
104 dst->mb_stride = src->mb_stride;
105 dst->needs_fg = src->needs_fg;
106}
107
109{
110 int ret;
111
112 av_assert0(!dst->f->buf[0]);
113 av_assert0(src->f->buf[0]);
114 av_assert0(src->tf.f == src->f);
115
116 dst->tf.f = dst->f;
117 ret = ff_thread_ref_frame(&dst->tf, &src->tf);
118 if (ret < 0)
119 goto fail;
120
121 if (src->needs_fg) {
122 ret = av_frame_ref(dst->f_grain, src->f_grain);
123 if (ret < 0)
124 goto fail;
125 }
126
128
129 return 0;
130fail:
132 return ret;
133}
134
136{
137 int ret;
138
139 if (!src->f || !src->f->buf[0]) {
141 return 0;
142 }
143
144 av_assert0(src->tf.f == src->f);
145
146 dst->tf.f = dst->f;
147 ret = ff_thread_replace_frame(&dst->tf, &src->tf);
148 if (ret < 0)
149 goto fail;
150
151 if (src->needs_fg) {
152 av_frame_unref(dst->f_grain);
153 ret = av_frame_ref(dst->f_grain, src->f_grain);
154 if (ret < 0)
155 goto fail;
156 }
157
159
160 return 0;
161fail:
163 return ret;
164}
165
167{
168#if CONFIG_ERROR_RESILIENCE
169 int i;
170
171 memset(dst, 0, sizeof(*dst));
172
173 if (!src)
174 return;
175
176 dst->f = src->f;
177 dst->tf = &src->tf;
178
179 for (i = 0; i < 2; i++) {
180 dst->motion_val[i] = src->motion_val[i];
181 dst->ref_index[i] = src->ref_index[i];
182 }
183
184 dst->mb_type = src->mb_type;
185 dst->field_picture = src->field_picture;
186#endif /* CONFIG_ERROR_RESILIENCE */
187}
188
190{
191 AVCodecContext *const avctx = h->avctx;
192 H264Picture *cur = h->cur_pic_ptr;
193 int err = 0;
194 h->mb_y = 0;
195
196 if (in_setup || !(avctx->active_thread_type & FF_THREAD_FRAME)) {
197 if (!h->droppable) {
199 h->poc.prev_poc_msb = h->poc.poc_msb;
200 h->poc.prev_poc_lsb = h->poc.poc_lsb;
201 }
202 h->poc.prev_frame_num_offset = h->poc.frame_num_offset;
203 h->poc.prev_frame_num = h->poc.frame_num;
204 }
205
206 if (avctx->hwaccel) {
207 err = FF_HW_SIMPLE_CALL(avctx, end_frame);
208 if (err < 0)
209 av_log(avctx, AV_LOG_ERROR,
210 "hardware accelerator failed to decode picture\n");
211 } else if (!in_setup && cur->needs_fg && (!FIELD_PICTURE(h) || !h->first_field)) {
213
215 if (sd) // a decoding error may have happened before the side data could be allocated
216 err = ff_h274_apply_film_grain(cur->f_grain, cur->f,
217 (AVFilmGrainParams *) sd->data);
218 if (err < 0) {
219 av_log(h->avctx, AV_LOG_WARNING, "Failed synthesizing film "
220 "grain, ignoring: %s\n", av_err2str(err));
221 cur->needs_fg = 0;
222 err = 0;
223 }
224 }
225
226 if (!in_setup && !h->droppable)
227 ff_thread_report_progress(&cur->tf, INT_MAX,
228 h->picture_structure == PICT_BOTTOM_FIELD);
229 emms_c();
230
231 h->current_slice = 0;
232
233 return err;
234}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition avcodec.h:1590
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define emms_c()
Definition emms.h:88
#define fail
Definition test.h:479
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition error.h:122
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
@ AV_FRAME_DATA_FILM_GRAIN_PARAMS
Film grain parameters for a frame, described by AVFilmGrainParams.
Definition frame.h:188
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
void ff_h264_set_erpic(ERPicture *dst, const H264Picture *src)
void ff_h264_unref_picture(H264Picture *pic)
int ff_h264_ref_picture(H264Picture *dst, const H264Picture *src)
static void h264_copy_picture_params(H264Picture *dst, const H264Picture *src)
int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
int ff_h264_replace_picture(H264Picture *dst, const H264Picture *src)
int ff_h264_execute_ref_pic_marking(H264Context *h)
Execute the reference picture marking (memory management control operations).
Definition h264_refs.c:610
H.264 / AVC / MPEG-4 part10 codec.
#define FIELD_PICTURE(h)
Definition h264dec.h:65
int ff_h274_apply_film_grain(AVFrame *out_frame, const AVFrame *in_frame, const AVFilmGrainParams *params)
Definition h274.c:245
H.274 film grain synthesis.
#define FF_HW_SIMPLE_CALL(avctx, function)
#define PICT_BOTTOM_FIELD
Definition mpegutils.h:32
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
void ff_thread_release_ext_buffer(ThreadFrame *f)
Unref a ThreadFrame.
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:120
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition refstruct.c:160
main external API structure.
Definition avcodec.h:443
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition avcodec.h:1423
int active_thread_type
Which multithreading methods are in use by the codec.
Definition avcodec.h:1598
This structure describes how to handle film grain synthesis in video for specific codecs.
Structure to hold side data for an AVFrame.
Definition frame.h:327
uint8_t * data
Definition frame.h:329
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition frame.h:649
H264Context.
Definition h264dec.h:338
const PPS * pps
Definition h264dec.h:156
atomic_int * decode_error_flags
RefStruct reference; its pointee is shared between decoding threads.
Definition h264dec.h:162
int8_t * ref_index[2]
RefStruct reference.
Definition h264dec.h:130
void * hwaccel_picture_private
RefStruct reference for hardware accelerator private data.
Definition h264dec.h:128
AVFrame * f
Definition h264dec.h:113
int8_t * qscale_table_base
RefStruct reference.
Definition h264dec.h:118
int16_t(*[2] motion_val_base)[2]
RefStruct reference.
Definition h264dec.h:121
uint32_t * mb_type_base
RefStruct reference.
Definition h264dec.h:124
AVFrame * f_grain
Definition h264dec.h:116
ThreadFrame tf
Definition h264dec.h:114
int needs_fg
whether picture needs film grain synthesis (see f_grain)
Definition h264dec.h:154
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
int ff_thread_replace_frame(ThreadFrame *dst, const ThreadFrame *src)
Definition utils.c:888
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
Definition utils.c:869