FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/h264_picture.c
Date: 2026-09-25 11:37:27
Exec Total Coverage
Lines: 101 129 78.3%
Functions: 6 6 100.0%
Branches: 40 66 60.6%

Line Branch Exec Source
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
39 140703 void ff_h264_unref_picture(H264Picture *pic)
40 {
41 140703 int off = offsetof(H264Picture, f_grain) + sizeof(pic->f_grain);
42 int i;
43
44
3/4
✓ Branch 0 taken 140703 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 86212 times.
✓ Branch 3 taken 54491 times.
140703 if (!pic->f || !pic->f->buf[0])
45 86212 return;
46
47 54491 av_refstruct_unref(&pic->hwaccel_picture_private);
48 54491 ff_thread_release_ext_buffer(&pic->tf);
49 54491 av_frame_unref(pic->f_grain);
50
51 54491 av_refstruct_unref(&pic->qscale_table_base);
52 54491 av_refstruct_unref(&pic->mb_type_base);
53 54491 av_refstruct_unref(&pic->pps);
54
2/2
✓ Branch 0 taken 108982 times.
✓ Branch 1 taken 54491 times.
163473 for (i = 0; i < 2; i++) {
55 108982 av_refstruct_unref(&pic->motion_val_base[i]);
56 108982 av_refstruct_unref(&pic->ref_index[i]);
57 }
58 54491 av_refstruct_unref(&pic->decode_error_flags);
59
60 54491 memset((uint8_t*)pic + off, 0, sizeof(*pic) - off);
61 }
62
63 28120 static void h264_copy_picture_params(H264Picture *dst, const H264Picture *src)
64 {
65 28120 av_refstruct_replace(&dst->qscale_table_base, src->qscale_table_base);
66 28120 av_refstruct_replace(&dst->mb_type_base, src->mb_type_base);
67 28120 av_refstruct_replace(&dst->pps, src->pps);
68
69
2/2
✓ Branch 0 taken 56240 times.
✓ Branch 1 taken 28120 times.
84360 for (int i = 0; i < 2; i++) {
70 56240 av_refstruct_replace(&dst->motion_val_base[i], src->motion_val_base[i]);
71 56240 av_refstruct_replace(&dst->ref_index[i], src->ref_index[i]);
72 }
73
74 28120 av_refstruct_replace(&dst->hwaccel_picture_private,
75 28120 src->hwaccel_picture_private);
76
77 28120 av_refstruct_replace(&dst->decode_error_flags, src->decode_error_flags);
78
79 28120 dst->qscale_table = src->qscale_table;
80 28120 dst->mb_type = src->mb_type;
81
82
2/2
✓ Branch 0 taken 56240 times.
✓ Branch 1 taken 28120 times.
84360 for (int i = 0; i < 2; i++)
83 56240 dst->motion_val[i] = src->motion_val[i];
84
85
2/2
✓ Branch 0 taken 56240 times.
✓ Branch 1 taken 28120 times.
84360 for (int i = 0; i < 2; i++)
86 56240 dst->field_poc[i] = src->field_poc[i];
87
88 28120 memcpy(dst->ref_poc, src->ref_poc, sizeof(src->ref_poc));
89 28120 memcpy(dst->ref_count, src->ref_count, sizeof(src->ref_count));
90
91 28120 dst->poc = src->poc;
92 28120 dst->frame_num = src->frame_num;
93 28120 dst->mmco_reset = src->mmco_reset;
94 28120 dst->long_ref = src->long_ref;
95 28120 dst->mbaff = src->mbaff;
96 28120 dst->field_picture = src->field_picture;
97 28120 dst->reference = src->reference;
98 28120 dst->recovered = src->recovered;
99 28120 dst->gray = src->gray;
100 28120 dst->invalid_gap = src->invalid_gap;
101 28120 dst->sei_recovery_frame_cnt = src->sei_recovery_frame_cnt;
102 28120 dst->mb_width = src->mb_width;
103 28120 dst->mb_height = src->mb_height;
104 28120 dst->mb_stride = src->mb_stride;
105 28120 dst->needs_fg = src->needs_fg;
106 28120 }
107
108 27822 int ff_h264_ref_picture(H264Picture *dst, const H264Picture *src)
109 {
110 int ret;
111
112
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27822 times.
27822 av_assert0(!dst->f->buf[0]);
113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27822 times.
27822 av_assert0(src->f->buf[0]);
114
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27822 times.
27822 av_assert0(src->tf.f == src->f);
115
116 27822 dst->tf.f = dst->f;
117 27822 ret = ff_thread_ref_frame(&dst->tf, &src->tf);
118
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27822 times.
27822 if (ret < 0)
119 ✗ goto fail;
120
121
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27822 times.
27822 if (src->needs_fg) {
122 ✗ ret = av_frame_ref(dst->f_grain, src->f_grain);
123 ✗ if (ret < 0)
124 ✗ goto fail;
125 }
126
127 27822 h264_copy_picture_params(dst, src);
128
129 27822 return 0;
130 ✗ fail:
131 ✗ ff_h264_unref_picture(dst);
132 ✗ return ret;
133 }
134
135 2146 int ff_h264_replace_picture(H264Picture *dst, const H264Picture *src)
136 {
137 int ret;
138
139
3/4
✓ Branch 0 taken 2146 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1848 times.
✓ Branch 3 taken 298 times.
2146 if (!src->f || !src->f->buf[0]) {
140 1848 ff_h264_unref_picture(dst);
141 1848 return 0;
142 }
143
144
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 298 times.
298 av_assert0(src->tf.f == src->f);
145
146 298 dst->tf.f = dst->f;
147 298 ret = ff_thread_replace_frame(&dst->tf, &src->tf);
148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 298 times.
298 if (ret < 0)
149 ✗ goto fail;
150
151
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 298 times.
298 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
158 298 h264_copy_picture_params(dst, src);
159
160 298 return 0;
161 ✗ fail:
162 ✗ ff_h264_unref_picture(dst);
163 ✗ return ret;
164 }
165
166 146196 void ff_h264_set_erpic(ERPicture *dst, const H264Picture *src)
167 {
168 #if CONFIG_ERROR_RESILIENCE
169 int i;
170
171 146196 memset(dst, 0, sizeof(*dst));
172
173
2/2
✓ Branch 0 taken 94023 times.
✓ Branch 1 taken 52173 times.
146196 if (!src)
174 94023 return;
175
176 52173 dst->f = src->f;
177 52173 dst->tf = &src->tf;
178
179
2/2
✓ Branch 0 taken 104346 times.
✓ Branch 1 taken 52173 times.
156519 for (i = 0; i < 2; i++) {
180 104346 dst->motion_val[i] = src->motion_val[i];
181 104346 dst->ref_index[i] = src->ref_index[i];
182 }
183
184 52173 dst->mb_type = src->mb_type;
185 52173 dst->field_picture = src->field_picture;
186 #endif /* CONFIG_ERROR_RESILIENCE */
187 }
188
189 29332 int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
190 {
191 29332 AVCodecContext *const avctx = h->avctx;
192 29332 H264Picture *cur = h->cur_pic_ptr;
193 29332 int err = 0;
194 29332 h->mb_y = 0;
195
196
4/4
✓ Branch 0 taken 29136 times.
✓ Branch 1 taken 196 times.
✓ Branch 2 taken 29094 times.
✓ Branch 3 taken 42 times.
29332 if (in_setup || !(avctx->active_thread_type & FF_THREAD_FRAME)) {
197
2/2
✓ Branch 0 taken 19199 times.
✓ Branch 1 taken 10091 times.
29290 if (!h->droppable) {
198 19199 err = ff_h264_execute_ref_pic_marking(h);
199 19199 h->poc.prev_poc_msb = h->poc.poc_msb;
200 19199 h->poc.prev_poc_lsb = h->poc.poc_lsb;
201 }
202 29290 h->poc.prev_frame_num_offset = h->poc.frame_num_offset;
203 29290 h->poc.prev_frame_num = h->poc.frame_num;
204 }
205
206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29332 times.
29332 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
3/8
✓ Branch 0 taken 29136 times.
✓ Branch 1 taken 196 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 29136 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
29332 } else if (!in_setup && cur->needs_fg && (!FIELD_PICTURE(h) || !h->first_field)) {
212 ✗ const AVFrameSideData *sd = av_frame_get_side_data(cur->f, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
213
214 ✗ err = AVERROR_INVALIDDATA;
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
4/4
✓ Branch 0 taken 29136 times.
✓ Branch 1 taken 196 times.
✓ Branch 2 taken 19156 times.
✓ Branch 3 taken 9980 times.
29332 if (!in_setup && !h->droppable)
227 19156 ff_thread_report_progress(&cur->tf, INT_MAX,
228 19156 h->picture_structure == PICT_BOTTOM_FIELD);
229 29332 emms_c();
230
231 29332 h->current_slice = 0;
232
233 29332 return err;
234 }
235