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 "error_resilience.h" | ||
30 | #include "avcodec.h" | ||
31 | #include "h264dec.h" | ||
32 | #include "mpegutils.h" | ||
33 | #include "thread.h" | ||
34 | #include "threadframe.h" | ||
35 | |||
36 | 127655 | void ff_h264_unref_picture(H264Context *h, H264Picture *pic) | |
37 | { | ||
38 | 127655 | int off = offsetof(H264Picture, f_grain) + sizeof(pic->f_grain); | |
39 | int i; | ||
40 | |||
41 |
3/4✓ Branch 0 taken 127655 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 78090 times.
✓ Branch 3 taken 49565 times.
|
127655 | if (!pic->f || !pic->f->buf[0]) |
42 | 78090 | return; | |
43 | |||
44 | 49565 | ff_thread_release_ext_buffer(h->avctx, &pic->tf); | |
45 | 49565 | ff_thread_release_buffer(h->avctx, pic->f_grain); | |
46 | 49565 | av_buffer_unref(&pic->hwaccel_priv_buf); | |
47 | |||
48 | 49565 | av_buffer_unref(&pic->qscale_table_buf); | |
49 | 49565 | av_buffer_unref(&pic->mb_type_buf); | |
50 | 49565 | av_buffer_unref(&pic->pps_buf); | |
51 |
2/2✓ Branch 0 taken 99130 times.
✓ Branch 1 taken 49565 times.
|
148695 | for (i = 0; i < 2; i++) { |
52 | 99130 | av_buffer_unref(&pic->motion_val_buf[i]); | |
53 | 99130 | av_buffer_unref(&pic->ref_index_buf[i]); | |
54 | } | ||
55 | |||
56 | 49565 | memset((uint8_t*)pic + off, 0, sizeof(*pic) - off); | |
57 | } | ||
58 | |||
59 | 25592 | static void h264_copy_picture_params(H264Picture *dst, const H264Picture *src) | |
60 | { | ||
61 | 25592 | dst->qscale_table = src->qscale_table; | |
62 | 25592 | dst->mb_type = src->mb_type; | |
63 | 25592 | dst->pps = src->pps; | |
64 | |||
65 |
2/2✓ Branch 0 taken 51184 times.
✓ Branch 1 taken 25592 times.
|
76776 | for (int i = 0; i < 2; i++) { |
66 | 51184 | dst->motion_val[i] = src->motion_val[i]; | |
67 | 51184 | dst->ref_index[i] = src->ref_index[i]; | |
68 | } | ||
69 | |||
70 |
2/2✓ Branch 0 taken 51184 times.
✓ Branch 1 taken 25592 times.
|
76776 | for (int i = 0; i < 2; i++) |
71 | 51184 | dst->field_poc[i] = src->field_poc[i]; | |
72 | |||
73 | 25592 | memcpy(dst->ref_poc, src->ref_poc, sizeof(src->ref_poc)); | |
74 | 25592 | memcpy(dst->ref_count, src->ref_count, sizeof(src->ref_count)); | |
75 | |||
76 | 25592 | dst->poc = src->poc; | |
77 | 25592 | dst->frame_num = src->frame_num; | |
78 | 25592 | dst->mmco_reset = src->mmco_reset; | |
79 | 25592 | dst->long_ref = src->long_ref; | |
80 | 25592 | dst->mbaff = src->mbaff; | |
81 | 25592 | dst->field_picture = src->field_picture; | |
82 | 25592 | dst->reference = src->reference; | |
83 | 25592 | dst->recovered = src->recovered; | |
84 | 25592 | dst->invalid_gap = src->invalid_gap; | |
85 | 25592 | dst->sei_recovery_frame_cnt = src->sei_recovery_frame_cnt; | |
86 | 25592 | dst->mb_width = src->mb_width; | |
87 | 25592 | dst->mb_height = src->mb_height; | |
88 | 25592 | dst->mb_stride = src->mb_stride; | |
89 | 25592 | dst->needs_fg = src->needs_fg; | |
90 | 25592 | } | |
91 | |||
92 | 25274 | int ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src) | |
93 | { | ||
94 | int ret, i; | ||
95 | |||
96 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25274 times.
|
25274 | av_assert0(!dst->f->buf[0]); |
97 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25274 times.
|
25274 | av_assert0(src->f->buf[0]); |
98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25274 times.
|
25274 | av_assert0(src->tf.f == src->f); |
99 | |||
100 | 25274 | dst->tf.f = dst->f; | |
101 | 25274 | ret = ff_thread_ref_frame(&dst->tf, &src->tf); | |
102 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25274 times.
|
25274 | if (ret < 0) |
103 | ✗ | goto fail; | |
104 | |||
105 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25274 times.
|
25274 | if (src->needs_fg) { |
106 | ✗ | ret = av_frame_ref(dst->f_grain, src->f_grain); | |
107 | ✗ | if (ret < 0) | |
108 | ✗ | goto fail; | |
109 | } | ||
110 | |||
111 | 25274 | dst->qscale_table_buf = av_buffer_ref(src->qscale_table_buf); | |
112 | 25274 | dst->mb_type_buf = av_buffer_ref(src->mb_type_buf); | |
113 | 25274 | dst->pps_buf = av_buffer_ref(src->pps_buf); | |
114 |
3/6✓ Branch 0 taken 25274 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 25274 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 25274 times.
|
25274 | if (!dst->qscale_table_buf || !dst->mb_type_buf || !dst->pps_buf) { |
115 | ✗ | ret = AVERROR(ENOMEM); | |
116 | ✗ | goto fail; | |
117 | } | ||
118 | |||
119 |
2/2✓ Branch 0 taken 50548 times.
✓ Branch 1 taken 25274 times.
|
75822 | for (i = 0; i < 2; i++) { |
120 | 50548 | dst->motion_val_buf[i] = av_buffer_ref(src->motion_val_buf[i]); | |
121 | 50548 | dst->ref_index_buf[i] = av_buffer_ref(src->ref_index_buf[i]); | |
122 |
2/4✓ Branch 0 taken 50548 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 50548 times.
|
50548 | if (!dst->motion_val_buf[i] || !dst->ref_index_buf[i]) { |
123 | ✗ | ret = AVERROR(ENOMEM); | |
124 | ✗ | goto fail; | |
125 | } | ||
126 | } | ||
127 | |||
128 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 25274 times.
|
25274 | if (src->hwaccel_picture_private) { |
129 | ✗ | dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf); | |
130 | ✗ | if (!dst->hwaccel_priv_buf) { | |
131 | ✗ | ret = AVERROR(ENOMEM); | |
132 | ✗ | goto fail; | |
133 | } | ||
134 | ✗ | dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data; | |
135 | } | ||
136 | |||
137 | 25274 | h264_copy_picture_params(dst, src); | |
138 | |||
139 | 25274 | return 0; | |
140 | ✗ | fail: | |
141 | ✗ | ff_h264_unref_picture(h, dst); | |
142 | ✗ | return ret; | |
143 | } | ||
144 | |||
145 | 2294 | int ff_h264_replace_picture(H264Context *h, H264Picture *dst, const H264Picture *src) | |
146 | { | ||
147 | int ret, i; | ||
148 | |||
149 |
3/4✓ Branch 0 taken 2294 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1976 times.
✓ Branch 3 taken 318 times.
|
2294 | if (!src->f || !src->f->buf[0]) { |
150 | 1976 | ff_h264_unref_picture(h, dst); | |
151 | 1976 | return 0; | |
152 | } | ||
153 | |||
154 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
|
318 | av_assert0(src->tf.f == src->f); |
155 | |||
156 | 318 | dst->tf.f = dst->f; | |
157 | 318 | ff_thread_release_ext_buffer(h->avctx, &dst->tf); | |
158 | 318 | ret = ff_thread_ref_frame(&dst->tf, &src->tf); | |
159 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
|
318 | if (ret < 0) |
160 | ✗ | goto fail; | |
161 | |||
162 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
|
318 | if (src->needs_fg) { |
163 | ✗ | ff_thread_release_buffer(h->avctx, dst->f_grain); | |
164 | ✗ | ret = av_frame_ref(dst->f_grain, src->f_grain); | |
165 | ✗ | if (ret < 0) | |
166 | ✗ | goto fail; | |
167 | } | ||
168 | |||
169 | 318 | ret = av_buffer_replace(&dst->qscale_table_buf, src->qscale_table_buf); | |
170 | 318 | ret |= av_buffer_replace(&dst->mb_type_buf, src->mb_type_buf); | |
171 | 318 | ret |= av_buffer_replace(&dst->pps_buf, src->pps_buf); | |
172 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
|
318 | if (ret < 0) |
173 | ✗ | goto fail; | |
174 | |||
175 |
2/2✓ Branch 0 taken 636 times.
✓ Branch 1 taken 318 times.
|
954 | for (i = 0; i < 2; i++) { |
176 | 636 | ret = av_buffer_replace(&dst->motion_val_buf[i], src->motion_val_buf[i]); | |
177 | 636 | ret |= av_buffer_replace(&dst->ref_index_buf[i], src->ref_index_buf[i]); | |
178 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 636 times.
|
636 | if (ret < 0) |
179 | ✗ | goto fail; | |
180 | } | ||
181 | |||
182 | 318 | ret = av_buffer_replace(&dst->hwaccel_priv_buf, src->hwaccel_priv_buf); | |
183 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
|
318 | if (ret < 0) |
184 | ✗ | goto fail; | |
185 | |||
186 | 318 | dst->hwaccel_picture_private = src->hwaccel_picture_private; | |
187 | |||
188 | 318 | h264_copy_picture_params(dst, src); | |
189 | |||
190 | 318 | return 0; | |
191 | ✗ | fail: | |
192 | ✗ | ff_h264_unref_picture(h, dst); | |
193 | ✗ | return ret; | |
194 | } | ||
195 | |||
196 | 129022 | void ff_h264_set_erpic(ERPicture *dst, H264Picture *src) | |
197 | { | ||
198 | #if CONFIG_ERROR_RESILIENCE | ||
199 | int i; | ||
200 | |||
201 | 129022 | memset(dst, 0, sizeof(*dst)); | |
202 | |||
203 |
2/2✓ Branch 0 taken 83238 times.
✓ Branch 1 taken 45784 times.
|
129022 | if (!src) |
204 | 83238 | return; | |
205 | |||
206 | 45784 | dst->f = src->f; | |
207 | 45784 | dst->tf = &src->tf; | |
208 | |||
209 |
2/2✓ Branch 0 taken 91568 times.
✓ Branch 1 taken 45784 times.
|
137352 | for (i = 0; i < 2; i++) { |
210 | 91568 | dst->motion_val[i] = src->motion_val[i]; | |
211 | 91568 | dst->ref_index[i] = src->ref_index[i]; | |
212 | } | ||
213 | |||
214 | 45784 | dst->mb_type = src->mb_type; | |
215 | 45784 | dst->field_picture = src->field_picture; | |
216 | #endif /* CONFIG_ERROR_RESILIENCE */ | ||
217 | } | ||
218 | |||
219 | 26856 | int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup) | |
220 | { | ||
221 | 26856 | AVCodecContext *const avctx = h->avctx; | |
222 | 26856 | H264Picture *cur = h->cur_pic_ptr; | |
223 | 26856 | int err = 0; | |
224 | 26856 | h->mb_y = 0; | |
225 | |||
226 |
4/4✓ Branch 0 taken 26663 times.
✓ Branch 1 taken 193 times.
✓ Branch 2 taken 26621 times.
✓ Branch 3 taken 42 times.
|
26856 | if (in_setup || !(avctx->active_thread_type & FF_THREAD_FRAME)) { |
227 |
2/2✓ Branch 0 taken 17591 times.
✓ Branch 1 taken 9223 times.
|
26814 | if (!h->droppable) { |
228 | 17591 | err = ff_h264_execute_ref_pic_marking(h); | |
229 | 17591 | h->poc.prev_poc_msb = h->poc.poc_msb; | |
230 | 17591 | h->poc.prev_poc_lsb = h->poc.poc_lsb; | |
231 | } | ||
232 | 26814 | h->poc.prev_frame_num_offset = h->poc.frame_num_offset; | |
233 | 26814 | h->poc.prev_frame_num = h->poc.frame_num; | |
234 | } | ||
235 | |||
236 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 26856 times.
|
26856 | if (avctx->hwaccel) { |
237 | ✗ | err = avctx->hwaccel->end_frame(avctx); | |
238 | ✗ | if (err < 0) | |
239 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
240 | "hardware accelerator failed to decode picture\n"); | ||
241 |
3/8✓ Branch 0 taken 26663 times.
✓ Branch 1 taken 193 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 26663 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
26856 | } else if (!in_setup && cur->needs_fg && (!FIELD_PICTURE(h) || !h->first_field)) { |
242 | ✗ | AVFrameSideData *sd = av_frame_get_side_data(cur->f, AV_FRAME_DATA_FILM_GRAIN_PARAMS); | |
243 | |||
244 | ✗ | err = AVERROR_INVALIDDATA; | |
245 | ✗ | if (sd) // a decoding error may have happened before the side data could be allocated | |
246 | ✗ | err = ff_h274_apply_film_grain(cur->f_grain, cur->f, &h->h274db, | |
247 | ✗ | (AVFilmGrainParams *) sd->data); | |
248 | ✗ | if (err < 0) { | |
249 | ✗ | av_log(h->avctx, AV_LOG_WARNING, "Failed synthesizing film " | |
250 | ✗ | "grain, ignoring: %s\n", av_err2str(err)); | |
251 | ✗ | cur->needs_fg = 0; | |
252 | ✗ | err = 0; | |
253 | } | ||
254 | } | ||
255 | |||
256 |
4/4✓ Branch 0 taken 26663 times.
✓ Branch 1 taken 193 times.
✓ Branch 2 taken 17549 times.
✓ Branch 3 taken 9114 times.
|
26856 | if (!in_setup && !h->droppable) |
257 | 17549 | ff_thread_report_progress(&cur->tf, INT_MAX, | |
258 | 17549 | h->picture_structure == PICT_BOTTOM_FIELD); | |
259 | 26856 | emms_c(); | |
260 | |||
261 | 26856 | h->current_slice = 0; | |
262 | |||
263 | 26856 | return err; | |
264 | } | ||
265 |