2 * H.26L/H.264/AVC/JVT/14496-10/... SEI decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * H.264 / AVC / MPEG-4 part10 SEI decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
30 #include "golomb_legacy.h"
35 static const uint8_t sei_num_clock_ts_table
[9] = {
36 1, 1, 1, 2, 2, 3, 3, 2, 3
39 void ff_h264_sei_uninit(H264SEIContext
*h
)
41 h
->unregistered
.x264_build
= -1;
42 h
->recovery_point
.recovery_frame_cnt
= -1;
44 h
->picture_timing
.dpb_output_delay
= 0;
45 h
->picture_timing
.cpb_removal_delay
= -1;
47 h
->picture_timing
.present
= 0;
48 h
->buffering_period
.present
= 0;
49 h
->frame_packing
.present
= 0;
50 h
->display_orientation
.present
= 0;
53 h
->a53_caption
.a53_caption_size
= 0;
54 av_freep(&h
->a53_caption
.a53_caption
);
57 static int decode_picture_timing(H264SEIPictureTiming
*h
, GetBitContext
*gb
,
58 const SPS
*sps
, void *logctx
)
61 return AVERROR_INVALIDDATA
;
63 if (sps
->nal_hrd_parameters_present_flag
||
64 sps
->vcl_hrd_parameters_present_flag
) {
65 h
->cpb_removal_delay
= get_bits(gb
, sps
->cpb_removal_delay_length
);
66 h
->dpb_output_delay
= get_bits(gb
, sps
->dpb_output_delay_length
);
68 if (sps
->pic_struct_present_flag
) {
69 unsigned int i
, num_clock_ts
;
71 h
->pic_struct
= get_bits(gb
, 4);
74 if (h
->pic_struct
> H264_SEI_PIC_STRUCT_FRAME_TRIPLING
)
75 return AVERROR_INVALIDDATA
;
77 num_clock_ts
= sei_num_clock_ts_table
[h
->pic_struct
];
79 for (i
= 0; i
< num_clock_ts
; i
++) {
80 if (get_bits(gb
, 1)) { /* clock_timestamp_flag */
81 unsigned int full_timestamp_flag
;
83 h
->ct_type
|= 1 << get_bits(gb
, 2);
84 skip_bits(gb
, 1); /* nuit_field_based_flag */
85 skip_bits(gb
, 5); /* counting_type */
86 full_timestamp_flag
= get_bits(gb
, 1);
87 skip_bits(gb
, 1); /* discontinuity_flag */
88 skip_bits(gb
, 1); /* cnt_dropped_flag */
89 skip_bits(gb
, 8); /* n_frames */
90 if (full_timestamp_flag
) {
91 skip_bits(gb
, 6); /* seconds_value 0..59 */
92 skip_bits(gb
, 6); /* minutes_value 0..59 */
93 skip_bits(gb
, 5); /* hours_value 0..23 */
95 if (get_bits(gb
, 1)) { /* seconds_flag */
96 skip_bits(gb
, 6); /* seconds_value range 0..59 */
97 if (get_bits(gb
, 1)) { /* minutes_flag */
98 skip_bits(gb
, 6); /* minutes_value 0..59 */
99 if (get_bits(gb
, 1)) /* hours_flag */
100 skip_bits(gb
, 5); /* hours_value 0..23 */
104 if (sps
->time_offset_length
> 0)
106 sps
->time_offset_length
); /* time_offset */
110 av_log(logctx
, AV_LOG_DEBUG
, "ct_type:%X pic_struct:%d\n",
111 h
->ct_type
, h
->pic_struct
);
118 static int decode_registered_user_data_afd(H264SEIAFD
*h
, GetBitContext
*gb
, int size
)
123 return AVERROR_INVALIDDATA
;
124 skip_bits(gb
, 1); // 0
125 flag
= get_bits(gb
, 1); // active_format_flag
126 skip_bits(gb
, 6); // reserved
130 return AVERROR_INVALIDDATA
;
131 skip_bits(gb
, 4); // reserved
132 h
->active_format_description
= get_bits(gb
, 4);
139 static int decode_registered_user_data_closed_caption(H264SEIA53Caption
*h
,
140 GetBitContext
*gb
, void *logctx
,
144 int user_data_type_code
;
148 return AVERROR(EINVAL
);
150 user_data_type_code
= get_bits(gb
, 8);
151 if (user_data_type_code
== 0x3) {
152 skip_bits(gb
, 1); // reserved
154 flag
= get_bits(gb
, 1); // process_cc_data_flag
156 skip_bits(gb
, 1); // zero bit
157 cc_count
= get_bits(gb
, 5);
158 skip_bits(gb
, 8); // reserved
161 if (cc_count
&& size
>= cc_count
* 3) {
162 const uint64_t new_size
= (h
->a53_caption_size
+ cc_count
166 if (new_size
> INT_MAX
)
167 return AVERROR(EINVAL
);
169 /* Allow merging of the cc data from two fields. */
170 ret
= av_reallocp(&h
->a53_caption
, new_size
);
174 for (i
= 0; i
< cc_count
; i
++) {
175 h
->a53_caption
[h
->a53_caption_size
++] = get_bits(gb
, 8);
176 h
->a53_caption
[h
->a53_caption_size
++] = get_bits(gb
, 8);
177 h
->a53_caption
[h
->a53_caption_size
++] = get_bits(gb
, 8);
180 skip_bits(gb
, 8); // marker_bits
185 avpriv_request_sample(logctx
, "Subtitles with data type 0x%02x",
186 user_data_type_code
);
187 for (i
= 0; i
< size
- 1; i
++)
194 static int decode_registered_user_data(H264SEIContext
*h
, GetBitContext
*gb
,
195 void *logctx
, int size
)
197 uint32_t country_code
;
198 uint32_t user_identifier
;
201 return AVERROR_INVALIDDATA
;
204 country_code
= get_bits(gb
, 8); // itu_t_t35_country_code
205 if (country_code
== 0xFF) {
206 skip_bits(gb
, 8); // itu_t_t35_country_code_extension_byte
210 /* itu_t_t35_payload_byte follows */
211 skip_bits(gb
, 8); // terminal provider code
212 skip_bits(gb
, 8); // terminal provider oriented code
213 user_identifier
= get_bits_long(gb
, 32);
215 switch (user_identifier
) {
216 case MKBETAG('D', 'T', 'G', '1'): // afd_data
217 return decode_registered_user_data_afd(&h
->afd
, gb
, size
);
218 case MKBETAG('G', 'A', '9', '4'): // closed captions
219 return decode_registered_user_data_closed_caption(&h
->a53_caption
, gb
,
222 skip_bits(gb
, size
* 8);
229 static int decode_unregistered_user_data(H264SEIUnregistered
*h
, GetBitContext
*gb
,
230 void *logctx
, int size
)
235 if (size
< 16 || size
>= INT_MAX
- 16)
236 return AVERROR_INVALIDDATA
;
238 user_data
= av_malloc(16 + size
+ 1);
240 return AVERROR(ENOMEM
);
242 for (i
= 0; i
< size
+ 16; i
++)
243 user_data
[i
] = get_bits(gb
, 8);
246 e
= sscanf(user_data
+ 16, "x264 - core %d", &build
);
247 if (e
== 1 && build
> 0)
248 h
->x264_build
= build
;
250 if (strlen(user_data
+ 16) > 0)
251 av_log(logctx
, AV_LOG_DEBUG
, "user data:\"%s\"\n", user_data
+ 16);
257 static int decode_recovery_point(H264SEIRecoveryPoint
*h
, GetBitContext
*gb
)
259 h
->recovery_frame_cnt
= get_ue_golomb(gb
);
261 /* 1b exact_match_flag,
262 * 1b broken_link_flag,
263 * 2b changing_slice_group_idc */
269 static int decode_buffering_period(H264SEIBufferingPeriod
*h
, GetBitContext
*gb
,
270 const H264ParamSets
*ps
, void *logctx
)
276 sps_id
= get_ue_golomb_31(gb
);
277 if (sps_id
> 31 || !ps
->sps_list
[sps_id
]) {
278 av_log(logctx
, AV_LOG_ERROR
,
279 "non-existing SPS %d referenced in buffering period\n", sps_id
);
280 return AVERROR_INVALIDDATA
;
282 sps
= (SPS
*)ps
->sps_list
[sps_id
]->data
;
284 // NOTE: This is really so duplicated in the standard... See H.264, D.1.1
285 if (sps
->nal_hrd_parameters_present_flag
) {
286 for (sched_sel_idx
= 0; sched_sel_idx
< sps
->cpb_cnt
; sched_sel_idx
++) {
287 h
->initial_cpb_removal_delay
[sched_sel_idx
] =
288 get_bits(gb
, sps
->initial_cpb_removal_delay_length
);
289 // initial_cpb_removal_delay_offset
290 skip_bits(gb
, sps
->initial_cpb_removal_delay_length
);
293 if (sps
->vcl_hrd_parameters_present_flag
) {
294 for (sched_sel_idx
= 0; sched_sel_idx
< sps
->cpb_cnt
; sched_sel_idx
++) {
295 h
->initial_cpb_removal_delay
[sched_sel_idx
] =
296 get_bits(gb
, sps
->initial_cpb_removal_delay_length
);
297 // initial_cpb_removal_delay_offset
298 skip_bits(gb
, sps
->initial_cpb_removal_delay_length
);
306 static int decode_frame_packing_arrangement(H264SEIFramePacking
*h
,
309 get_ue_golomb(gb
); // frame_packing_arrangement_id
310 h
->present
= !get_bits1(gb
);
313 h
->arrangement_type
= get_bits(gb
, 7);
314 h
->quincunx_subsampling
= get_bits1(gb
);
315 h
->content_interpretation_type
= get_bits(gb
, 6);
317 // spatial_flipping_flag, frame0_flipped_flag, field_views_flag
319 h
->current_frame_is_frame0_flag
= get_bits1(gb
);
320 // frame0_self_contained_flag, frame1_self_contained_flag
323 if (!h
->quincunx_subsampling
&& h
->arrangement_type
!= 5)
324 skip_bits(gb
, 16); // frame[01]_grid_position_[xy]
325 skip_bits(gb
, 8); // frame_packing_arrangement_reserved_byte
326 get_ue_golomb(gb
); // frame_packing_arrangement_repetition_period
328 skip_bits1(gb
); // frame_packing_arrangement_extension_flag
333 static int decode_display_orientation(H264SEIDisplayOrientation
*h
,
336 h
->present
= !get_bits1(gb
);
339 h
->hflip
= get_bits1(gb
); // hor_flip
340 h
->vflip
= get_bits1(gb
); // ver_flip
342 h
->anticlockwise_rotation
= get_bits(gb
, 16);
343 get_ue_golomb(gb
); // display_orientation_repetition_period
344 skip_bits1(gb
); // display_orientation_extension_flag
350 static int decode_alternative_transfer(H264SEIAlternativeTransfer
*h
,
354 h
->preferred_transfer_characteristics
= get_bits(gb
, 8);
358 int ff_h264_sei_decode(H264SEIContext
*h
, GetBitContext
*gb
,
359 const H264ParamSets
*ps
, void *logctx
)
361 while (get_bits_left(gb
) > 16) {
367 while (get_bits_left(gb
) >= 8 &&
368 (last
= get_bits(gb
, 8)) == 255) {
374 while (get_bits_left(gb
) >= 8 &&
375 (last
= get_bits(gb
, 8)) == 255) {
380 if (size
> get_bits_left(gb
) / 8) {
381 av_log(logctx
, AV_LOG_ERROR
, "SEI type %d truncated at %d\n",
382 type
, get_bits_left(gb
));
383 return AVERROR_INVALIDDATA
;
387 case H264_SEI_TYPE_PIC_TIMING
: // Picture timing SEI
388 ret
= decode_picture_timing(&h
->picture_timing
, gb
, ps
->sps
, logctx
);
390 case H264_SEI_TYPE_USER_DATA_REGISTERED
:
391 ret
= decode_registered_user_data(h
, gb
, logctx
, size
);
393 case H264_SEI_TYPE_USER_DATA_UNREGISTERED
:
394 ret
= decode_unregistered_user_data(&h
->unregistered
, gb
, logctx
, size
);
396 case H264_SEI_TYPE_RECOVERY_POINT
:
397 ret
= decode_recovery_point(&h
->recovery_point
, gb
);
399 case H264_SEI_TYPE_BUFFERING_PERIOD
:
400 ret
= decode_buffering_period(&h
->buffering_period
, gb
, ps
, logctx
);
402 case H264_SEI_TYPE_FRAME_PACKING
:
403 ret
= decode_frame_packing_arrangement(&h
->frame_packing
, gb
);
405 case H264_SEI_TYPE_DISPLAY_ORIENTATION
:
406 ret
= decode_display_orientation(&h
->display_orientation
, gb
);
408 case H264_SEI_TYPE_ALTERNATIVE_TRANSFER
:
409 ret
= decode_alternative_transfer(&h
->alternative_transfer
, gb
);
412 av_log(logctx
, AV_LOG_DEBUG
, "unknown SEI type %d\n", type
);
413 skip_bits(gb
, 8 * size
);
418 // FIXME check bits here