Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * H.26L/H.264/AVC/JVT/14496-10/... SEI decoding | ||
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 SEI decoding. | ||
25 | * @author Michael Niedermayer <michaelni@gmx.at> | ||
26 | */ | ||
27 | |||
28 | #include <limits.h> | ||
29 | #include <stdio.h> | ||
30 | #include <string.h> | ||
31 | #include "libavutil/error.h" | ||
32 | #include "libavutil/log.h" | ||
33 | #include "libavutil/macros.h" | ||
34 | #include "libavutil/mem.h" | ||
35 | #include "bytestream.h" | ||
36 | #include "get_bits.h" | ||
37 | #include "golomb.h" | ||
38 | #include "h264_ps.h" | ||
39 | #include "h264_sei.h" | ||
40 | #include "sei.h" | ||
41 | |||
42 | #define AVERROR_PS_NOT_FOUND FFERRTAG(0xF8,'?','P','S') | ||
43 | |||
44 | static const uint8_t sei_num_clock_ts_table[9] = { | ||
45 | 1, 1, 1, 2, 2, 3, 3, 2, 3 | ||
46 | }; | ||
47 | |||
48 | 57480 | void ff_h264_sei_uninit(H264SEIContext *h) | |
49 | { | ||
50 | 57480 | h->recovery_point.recovery_frame_cnt = -1; | |
51 | |||
52 | 57480 | h->picture_timing.dpb_output_delay = 0; | |
53 | 57480 | h->picture_timing.cpb_removal_delay = -1; | |
54 | |||
55 | 57480 | h->picture_timing.present = 0; | |
56 | 57480 | h->buffering_period.present = 0; | |
57 | 57480 | h->common.frame_packing.present = 0; | |
58 | 57480 | h->common.film_grain_characteristics.present = 0; | |
59 | 57480 | h->common.display_orientation.present = 0; | |
60 | 57480 | h->common.afd.present = 0; | |
61 | |||
62 | 57480 | ff_h2645_sei_reset(&h->common); | |
63 | 57480 | } | |
64 | |||
65 | 4395 | int ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps, | |
66 | void *logctx) | ||
67 | { | ||
68 | GetBitContext gb; | ||
69 | av_unused int ret; | ||
70 | |||
71 | 4395 | ret = init_get_bits8(&gb, h->payload, h->payload_size_bytes); | |
72 | av_assert1(ret >= 0); | ||
73 | |||
74 |
2/2✓ Branch 0 taken 1946 times.
✓ Branch 1 taken 2449 times.
|
4395 | if (sps->nal_hrd_parameters_present_flag || |
75 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1946 times.
|
1946 | sps->vcl_hrd_parameters_present_flag) { |
76 | 2449 | h->cpb_removal_delay = get_bits_long(&gb, sps->cpb_removal_delay_length); | |
77 | 2449 | h->dpb_output_delay = get_bits_long(&gb, sps->dpb_output_delay_length); | |
78 | } | ||
79 |
2/2✓ Branch 0 taken 4375 times.
✓ Branch 1 taken 20 times.
|
4395 | if (sps->pic_struct_present_flag) { |
80 | unsigned int i, num_clock_ts; | ||
81 | |||
82 | 4375 | h->pic_struct = get_bits(&gb, 4); | |
83 | 4375 | h->ct_type = 0; | |
84 | |||
85 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4375 times.
|
4375 | if (h->pic_struct > H264_SEI_PIC_STRUCT_FRAME_TRIPLING) |
86 | ✗ | return AVERROR_INVALIDDATA; | |
87 | |||
88 | 4375 | num_clock_ts = sei_num_clock_ts_table[h->pic_struct]; | |
89 | 4375 | h->timecode_cnt = 0; | |
90 |
2/2✓ Branch 0 taken 7150 times.
✓ Branch 1 taken 4375 times.
|
11525 | for (i = 0; i < num_clock_ts; i++) { |
91 |
2/2✓ Branch 1 taken 1737 times.
✓ Branch 2 taken 5413 times.
|
7150 | if (get_bits(&gb, 1)) { /* clock_timestamp_flag */ |
92 | 1737 | H264SEITimeCode *tc = &h->timecode[h->timecode_cnt++]; | |
93 | unsigned int full_timestamp_flag; | ||
94 | unsigned int counting_type, cnt_dropped_flag; | ||
95 | 1737 | h->ct_type |= 1 << get_bits(&gb, 2); | |
96 | 1737 | skip_bits(&gb, 1); /* nuit_field_based_flag */ | |
97 | 1737 | counting_type = get_bits(&gb, 5); /* counting_type */ | |
98 | 1737 | full_timestamp_flag = get_bits(&gb, 1); | |
99 | 1737 | skip_bits(&gb, 1); /* discontinuity_flag */ | |
100 | 1737 | cnt_dropped_flag = get_bits(&gb, 1); /* cnt_dropped_flag */ | |
101 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 1737 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1737 | if (cnt_dropped_flag && counting_type > 1 && counting_type < 7) |
102 | ✗ | tc->dropframe = 1; | |
103 | 1737 | tc->frame = get_bits(&gb, 8); /* n_frames */ | |
104 |
2/2✓ Branch 0 taken 1202 times.
✓ Branch 1 taken 535 times.
|
1737 | if (full_timestamp_flag) { |
105 | 1202 | tc->full = 1; | |
106 | 1202 | tc->seconds = get_bits(&gb, 6); /* seconds_value 0..59 */ | |
107 | 1202 | tc->minutes = get_bits(&gb, 6); /* minutes_value 0..59 */ | |
108 | 1202 | tc->hours = get_bits(&gb, 5); /* hours_value 0..23 */ | |
109 | } else { | ||
110 | 535 | tc->seconds = tc->minutes = tc->hours = tc->full = 0; | |
111 |
2/2✓ Branch 1 taken 86 times.
✓ Branch 2 taken 449 times.
|
535 | if (get_bits(&gb, 1)) { /* seconds_flag */ |
112 | 86 | tc->seconds = get_bits(&gb, 6); | |
113 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 86 times.
|
86 | if (get_bits(&gb, 1)) { /* minutes_flag */ |
114 | ✗ | tc->minutes = get_bits(&gb, 6); | |
115 | ✗ | if (get_bits(&gb, 1)) /* hours_flag */ | |
116 | ✗ | tc->hours = get_bits(&gb, 5); | |
117 | } | ||
118 | } | ||
119 | } | ||
120 | |||
121 |
1/2✓ Branch 0 taken 1737 times.
✗ Branch 1 not taken.
|
1737 | if (sps->time_offset_length > 0) |
122 | 1737 | skip_bits(&gb, | |
123 | 1737 | sps->time_offset_length); /* time_offset */ | |
124 | } | ||
125 | } | ||
126 | |||
127 | 4375 | av_log(logctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n", | |
128 | 4375 | h->ct_type, h->pic_struct); | |
129 | } | ||
130 | |||
131 | 4395 | return 0; | |
132 | } | ||
133 | |||
134 | 5523 | static int decode_picture_timing(H264SEIPictureTiming *h, GetByteContext *gb, | |
135 | void *logctx) | ||
136 | { | ||
137 | 5523 | int size = bytestream2_get_bytes_left(gb); | |
138 | |||
139 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5523 times.
|
5523 | if (size > sizeof(h->payload)) { |
140 | ✗ | av_log(logctx, AV_LOG_ERROR, "Picture timing SEI payload too large\n"); | |
141 | ✗ | return AVERROR_INVALIDDATA; | |
142 | } | ||
143 | 5523 | bytestream2_get_bufferu(gb, h->payload, size); | |
144 | |||
145 | 5523 | h->payload_size_bytes = size; | |
146 | |||
147 | 5523 | h->present = 1; | |
148 | 5523 | return 0; | |
149 | } | ||
150 | |||
151 | 222 | static int decode_recovery_point(H264SEIRecoveryPoint *h, GetBitContext *gb, void *logctx) | |
152 | { | ||
153 | 222 | unsigned recovery_frame_cnt = get_ue_golomb_long(gb); | |
154 | |||
155 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 222 times.
|
222 | if (recovery_frame_cnt >= (1<<MAX_LOG2_MAX_FRAME_NUM)) { |
156 | ✗ | av_log(logctx, AV_LOG_ERROR, "recovery_frame_cnt %u is out of range\n", recovery_frame_cnt); | |
157 | ✗ | return AVERROR_INVALIDDATA; | |
158 | } | ||
159 | |||
160 | 222 | h->recovery_frame_cnt = recovery_frame_cnt; | |
161 | /* 1b exact_match_flag, | ||
162 | * 1b broken_link_flag, | ||
163 | * 2b changing_slice_group_idc */ | ||
164 | 222 | skip_bits(gb, 4); | |
165 | |||
166 | 222 | return 0; | |
167 | } | ||
168 | |||
169 | 1225 | static int decode_buffering_period(H264SEIBufferingPeriod *h, GetBitContext *gb, | |
170 | const H264ParamSets *ps, void *logctx) | ||
171 | { | ||
172 | unsigned int sps_id; | ||
173 | int sched_sel_idx; | ||
174 | const SPS *sps; | ||
175 | |||
176 | 1225 | sps_id = get_ue_golomb_31(gb); | |
177 |
3/4✓ Branch 0 taken 1225 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 1221 times.
|
1225 | if (sps_id > 31 || !ps->sps_list[sps_id]) { |
178 | 4 | av_log(logctx, AV_LOG_ERROR, | |
179 | "non-existing SPS %d referenced in buffering period\n", sps_id); | ||
180 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | return sps_id > 31 ? AVERROR_INVALIDDATA : AVERROR_PS_NOT_FOUND; |
181 | } | ||
182 | 1221 | sps = (const SPS*)ps->sps_list[sps_id]->data; | |
183 | |||
184 | // NOTE: This is really so duplicated in the standard... See H.264, D.1.1 | ||
185 |
2/2✓ Branch 0 taken 599 times.
✓ Branch 1 taken 622 times.
|
1221 | if (sps->nal_hrd_parameters_present_flag) { |
186 |
2/2✓ Branch 0 taken 599 times.
✓ Branch 1 taken 599 times.
|
1198 | for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) { |
187 | 599 | h->initial_cpb_removal_delay[sched_sel_idx] = | |
188 | 599 | get_bits_long(gb, sps->initial_cpb_removal_delay_length); | |
189 | // initial_cpb_removal_delay_offset | ||
190 | 599 | skip_bits(gb, sps->initial_cpb_removal_delay_length); | |
191 | } | ||
192 | } | ||
193 |
2/2✓ Branch 0 taken 352 times.
✓ Branch 1 taken 869 times.
|
1221 | if (sps->vcl_hrd_parameters_present_flag) { |
194 |
2/2✓ Branch 0 taken 352 times.
✓ Branch 1 taken 352 times.
|
704 | for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) { |
195 | 352 | h->initial_cpb_removal_delay[sched_sel_idx] = | |
196 | 352 | get_bits_long(gb, sps->initial_cpb_removal_delay_length); | |
197 | // initial_cpb_removal_delay_offset | ||
198 | 352 | skip_bits(gb, sps->initial_cpb_removal_delay_length); | |
199 | } | ||
200 | } | ||
201 | |||
202 | 1221 | h->present = 1; | |
203 | 1221 | return 0; | |
204 | } | ||
205 | |||
206 | ✗ | static int decode_green_metadata(H264SEIGreenMetaData *h, GetByteContext *gb) | |
207 | { | ||
208 | ✗ | h->green_metadata_type = bytestream2_get_byte(gb); | |
209 | |||
210 | ✗ | if (h->green_metadata_type == 0) { | |
211 | ✗ | h->period_type = bytestream2_get_byte(gb); | |
212 | |||
213 | ✗ | if (h->period_type == 2) | |
214 | ✗ | h->num_seconds = bytestream2_get_be16(gb); | |
215 | ✗ | else if (h->period_type == 3) | |
216 | ✗ | h->num_pictures = bytestream2_get_be16(gb); | |
217 | |||
218 | ✗ | h->percent_non_zero_macroblocks = bytestream2_get_byte(gb); | |
219 | ✗ | h->percent_intra_coded_macroblocks = bytestream2_get_byte(gb); | |
220 | ✗ | h->percent_six_tap_filtering = bytestream2_get_byte(gb); | |
221 | ✗ | h->percent_alpha_point_deblocking_instance = bytestream2_get_byte(gb); | |
222 | |||
223 | ✗ | } else if (h->green_metadata_type == 1) { | |
224 | ✗ | h->xsd_metric_type = bytestream2_get_byte(gb); | |
225 | ✗ | h->xsd_metric_value = bytestream2_get_be16(gb); | |
226 | } | ||
227 | |||
228 | ✗ | return 0; | |
229 | } | ||
230 | |||
231 | 6987 | int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, | |
232 | const H264ParamSets *ps, void *logctx) | ||
233 | { | ||
234 | GetByteContext gbyte; | ||
235 | 6987 | int master_ret = 0; | |
236 | |||
237 | av_assert1((get_bits_count(gb) % 8) == 0); | ||
238 | 6987 | bytestream2_init(&gbyte, gb->buffer + get_bits_count(gb) / 8, | |
239 | 6987 | get_bits_left(gb) / 8); | |
240 | |||
241 |
4/4✓ Branch 1 taken 8914 times.
✓ Branch 2 taken 6964 times.
✓ Branch 4 taken 8898 times.
✓ Branch 5 taken 16 times.
|
15878 | while (bytestream2_get_bytes_left(&gbyte) > 2 && bytestream2_peek_ne16(&gbyte)) { |
242 | GetByteContext gbyte_payload; | ||
243 | GetBitContext gb_payload; | ||
244 | 8898 | int type = 0; | |
245 | 8898 | unsigned size = 0; | |
246 | 8898 | int ret = 0; | |
247 | |||
248 | do { | ||
249 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 8922 times.
|
8922 | if (bytestream2_get_bytes_left(&gbyte) <= 0) |
250 | 7 | return AVERROR_INVALIDDATA; | |
251 | 8922 | type += bytestream2_peek_byteu(&gbyte); | |
252 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 8898 times.
|
8922 | } while (bytestream2_get_byteu(&gbyte) == 255); |
253 | |||
254 | do { | ||
255 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9144 times.
|
9144 | if (bytestream2_get_bytes_left(&gbyte) <= 0) |
256 | ✗ | return AVERROR_INVALIDDATA; | |
257 | 9144 | size += bytestream2_peek_byteu(&gbyte); | |
258 |
2/2✓ Branch 1 taken 246 times.
✓ Branch 2 taken 8898 times.
|
9144 | } while (bytestream2_get_byteu(&gbyte) == 255); |
259 | |||
260 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 8891 times.
|
8898 | if (size > bytestream2_get_bytes_left(&gbyte)) { |
261 | 7 | av_log(logctx, AV_LOG_ERROR, "SEI type %d size %d truncated at %d\n", | |
262 | type, size, bytestream2_get_bytes_left(&gbyte)); | ||
263 | 7 | return AVERROR_INVALIDDATA; | |
264 | } | ||
265 | |||
266 | 8891 | bytestream2_init (&gbyte_payload, gbyte.buffer, size); | |
267 | 8891 | ret = init_get_bits8(&gb_payload, gbyte.buffer, size); | |
268 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8891 times.
|
8891 | if (ret < 0) |
269 | ✗ | return ret; | |
270 | |||
271 |
4/5✓ Branch 0 taken 5523 times.
✓ Branch 1 taken 222 times.
✓ Branch 2 taken 1225 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1921 times.
|
8891 | switch (type) { |
272 | 5523 | case SEI_TYPE_PIC_TIMING: // Picture timing SEI | |
273 | 5523 | ret = decode_picture_timing(&h->picture_timing, &gbyte_payload, logctx); | |
274 | 5523 | break; | |
275 | 222 | case SEI_TYPE_RECOVERY_POINT: | |
276 | 222 | ret = decode_recovery_point(&h->recovery_point, &gb_payload, logctx); | |
277 | 222 | break; | |
278 | 1225 | case SEI_TYPE_BUFFERING_PERIOD: | |
279 | 1225 | ret = decode_buffering_period(&h->buffering_period, &gb_payload, ps, logctx); | |
280 | 1225 | break; | |
281 | ✗ | case SEI_TYPE_GREEN_METADATA: | |
282 | ✗ | ret = decode_green_metadata(&h->green_metadata, &gbyte_payload); | |
283 | ✗ | break; | |
284 | 1921 | default: | |
285 | 1921 | ret = ff_h2645_sei_message_decode(&h->common, type, AV_CODEC_ID_H264, | |
286 | &gb_payload, &gbyte_payload, logctx); | ||
287 |
2/2✓ Branch 0 taken 328 times.
✓ Branch 1 taken 1593 times.
|
1921 | if (ret == FF_H2645_SEI_MESSAGE_UNHANDLED) |
288 | 328 | av_log(logctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type); | |
289 | } | ||
290 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8887 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
|
8891 | if (ret < 0 && ret != AVERROR_PS_NOT_FOUND) |
291 | ✗ | return ret; | |
292 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8887 times.
|
8891 | if (ret < 0) |
293 | 4 | master_ret = ret; | |
294 | |||
295 |
2/2✓ Branch 1 taken 3 times.
✓ Branch 2 taken 8888 times.
|
8891 | if (get_bits_left(&gb_payload) < 0) { |
296 | 3 | av_log(logctx, AV_LOG_WARNING, "SEI type %d overread by %d bits\n", | |
297 | 3 | type, -get_bits_left(&gb_payload)); | |
298 | } | ||
299 | |||
300 | 8891 | bytestream2_skipu(&gbyte, size); | |
301 | } | ||
302 | |||
303 | 6980 | return master_ret; | |
304 | } | ||
305 | |||
306 | 23130 | const char *ff_h264_sei_stereo_mode(const H2645SEIFramePacking *h) | |
307 | { | ||
308 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 23130 times.
|
23130 | if (h->arrangement_cancel_flag == 0) { |
309 | ✗ | switch (h->arrangement_type) { | |
310 | ✗ | case SEI_FPA_H264_TYPE_CHECKERBOARD: | |
311 | ✗ | if (h->content_interpretation_type == 2) | |
312 | ✗ | return "checkerboard_rl"; | |
313 | else | ||
314 | ✗ | return "checkerboard_lr"; | |
315 | ✗ | case SEI_FPA_H264_TYPE_INTERLEAVE_COLUMN: | |
316 | ✗ | if (h->content_interpretation_type == 2) | |
317 | ✗ | return "col_interleaved_rl"; | |
318 | else | ||
319 | ✗ | return "col_interleaved_lr"; | |
320 | ✗ | case SEI_FPA_H264_TYPE_INTERLEAVE_ROW: | |
321 | ✗ | if (h->content_interpretation_type == 2) | |
322 | ✗ | return "row_interleaved_rl"; | |
323 | else | ||
324 | ✗ | return "row_interleaved_lr"; | |
325 | ✗ | case SEI_FPA_TYPE_SIDE_BY_SIDE: | |
326 | ✗ | if (h->content_interpretation_type == 2) | |
327 | ✗ | return "right_left"; | |
328 | else | ||
329 | ✗ | return "left_right"; | |
330 | ✗ | case SEI_FPA_TYPE_TOP_BOTTOM: | |
331 | ✗ | if (h->content_interpretation_type == 2) | |
332 | ✗ | return "bottom_top"; | |
333 | else | ||
334 | ✗ | return "top_bottom"; | |
335 | ✗ | case SEI_FPA_TYPE_INTERLEAVE_TEMPORAL: | |
336 | ✗ | if (h->content_interpretation_type == 2) | |
337 | ✗ | return "block_rl"; | |
338 | else | ||
339 | ✗ | return "block_lr"; | |
340 | ✗ | case SEI_FPA_H264_TYPE_2D: | |
341 | default: | ||
342 | ✗ | return "mono"; | |
343 | } | ||
344 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 23130 times.
|
23130 | } else if (h->arrangement_cancel_flag == 1) { |
345 | ✗ | return "mono"; | |
346 | } else { | ||
347 | 23130 | return NULL; | |
348 | } | ||
349 | } | ||
350 |