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 FFmpeg.
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.
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.
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
24 * H.264 / AVC / MPEG-4 part10 SEI decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
31 #include "libavutil/error.h"
32 #include "libavutil/log.h"
33 #include "libavutil/macros.h"
34 #include "libavutil/mem.h"
35 #include "bytestream.h"
42 #define AVERROR_PS_NOT_FOUND FFERRTAG(0xF8,'?','P','S')
44 static const uint8_t sei_num_clock_ts_table
[9] = {
45 1, 1, 1, 2, 2, 3, 3, 2, 3
48 void ff_h264_sei_uninit(H264SEIContext
*h
)
50 h
->recovery_point
.recovery_frame_cnt
= -1;
52 h
->picture_timing
.dpb_output_delay
= 0;
53 h
->picture_timing
.cpb_removal_delay
= -1;
55 h
->picture_timing
.present
= 0;
56 h
->buffering_period
.present
= 0;
57 h
->common
.frame_packing
.present
= 0;
58 h
->common
.display_orientation
.present
= 0;
59 h
->common
.afd
.present
= 0;
61 ff_h2645_sei_reset(&h
->common
);
64 int ff_h264_sei_process_picture_timing(H264SEIPictureTiming
*h
, const SPS
*sps
,
70 ret
= init_get_bits8(&gb
, h
->payload
, h
->payload_size_bytes
);
73 if (sps
->nal_hrd_parameters_present_flag
||
74 sps
->vcl_hrd_parameters_present_flag
) {
75 h
->cpb_removal_delay
= get_bits_long(&gb
, sps
->cpb_removal_delay_length
);
76 h
->dpb_output_delay
= get_bits_long(&gb
, sps
->dpb_output_delay_length
);
78 if (sps
->pic_struct_present_flag
) {
79 unsigned int i
, num_clock_ts
;
81 h
->pic_struct
= get_bits(&gb
, 4);
84 if (h
->pic_struct
> H264_SEI_PIC_STRUCT_FRAME_TRIPLING
)
85 return AVERROR_INVALIDDATA
;
87 num_clock_ts
= sei_num_clock_ts_table
[h
->pic_struct
];
89 for (i
= 0; i
< num_clock_ts
; i
++) {
90 if (get_bits(&gb
, 1)) { /* clock_timestamp_flag */
91 H264SEITimeCode
*tc
= &h
->timecode
[h
->timecode_cnt
++];
92 unsigned int full_timestamp_flag
;
93 unsigned int counting_type
, cnt_dropped_flag
;
94 h
->ct_type
|= 1 << get_bits(&gb
, 2);
95 skip_bits(&gb
, 1); /* nuit_field_based_flag */
96 counting_type
= get_bits(&gb
, 5); /* counting_type */
97 full_timestamp_flag
= get_bits(&gb
, 1);
98 skip_bits(&gb
, 1); /* discontinuity_flag */
99 cnt_dropped_flag
= get_bits(&gb
, 1); /* cnt_dropped_flag */
100 if (cnt_dropped_flag
&& counting_type
> 1 && counting_type
< 7)
102 tc
->frame
= get_bits(&gb
, 8); /* n_frames */
103 if (full_timestamp_flag
) {
105 tc
->seconds
= get_bits(&gb
, 6); /* seconds_value 0..59 */
106 tc
->minutes
= get_bits(&gb
, 6); /* minutes_value 0..59 */
107 tc
->hours
= get_bits(&gb
, 5); /* hours_value 0..23 */
109 tc
->seconds
= tc
->minutes
= tc
->hours
= tc
->full
= 0;
110 if (get_bits(&gb
, 1)) { /* seconds_flag */
111 tc
->seconds
= get_bits(&gb
, 6);
112 if (get_bits(&gb
, 1)) { /* minutes_flag */
113 tc
->minutes
= get_bits(&gb
, 6);
114 if (get_bits(&gb
, 1)) /* hours_flag */
115 tc
->hours
= get_bits(&gb
, 5);
120 if (sps
->time_offset_length
> 0)
122 sps
->time_offset_length
); /* time_offset */
126 av_log(logctx
, AV_LOG_DEBUG
, "ct_type:%X pic_struct:%d\n",
127 h
->ct_type
, h
->pic_struct
);
133 static int decode_picture_timing(H264SEIPictureTiming
*h
, GetByteContext
*gb
,
136 int size
= bytestream2_get_bytes_left(gb
);
138 if (size
> sizeof(h
->payload
)) {
139 av_log(logctx
, AV_LOG_ERROR
, "Picture timing SEI payload too large\n");
140 return AVERROR_INVALIDDATA
;
142 bytestream2_get_bufferu(gb
, h
->payload
, size
);
144 h
->payload_size_bytes
= size
;
150 static int decode_recovery_point(H264SEIRecoveryPoint
*h
, GetBitContext
*gb
, void *logctx
)
152 unsigned recovery_frame_cnt
= get_ue_golomb_long(gb
);
154 if (recovery_frame_cnt
>= (1<<MAX_LOG2_MAX_FRAME_NUM
)) {
155 av_log(logctx
, AV_LOG_ERROR
, "recovery_frame_cnt %u is out of range\n", recovery_frame_cnt
);
156 return AVERROR_INVALIDDATA
;
159 h
->recovery_frame_cnt
= recovery_frame_cnt
;
160 /* 1b exact_match_flag,
161 * 1b broken_link_flag,
162 * 2b changing_slice_group_idc */
168 static int decode_buffering_period(H264SEIBufferingPeriod
*h
, GetBitContext
*gb
,
169 const H264ParamSets
*ps
, void *logctx
)
175 sps_id
= get_ue_golomb_31(gb
);
176 if (sps_id
> 31 || !ps
->sps_list
[sps_id
]) {
177 av_log(logctx
, AV_LOG_ERROR
,
178 "non-existing SPS %d referenced in buffering period\n", sps_id
);
179 return sps_id
> 31 ? AVERROR_INVALIDDATA
: AVERROR_PS_NOT_FOUND
;
181 sps
= ps
->sps_list
[sps_id
];
183 // NOTE: This is really so duplicated in the standard... See H.264, D.1.1
184 if (sps
->nal_hrd_parameters_present_flag
) {
185 for (sched_sel_idx
= 0; sched_sel_idx
< sps
->cpb_cnt
; sched_sel_idx
++) {
186 h
->initial_cpb_removal_delay
[sched_sel_idx
] =
187 get_bits_long(gb
, sps
->initial_cpb_removal_delay_length
);
188 // initial_cpb_removal_delay_offset
189 skip_bits(gb
, sps
->initial_cpb_removal_delay_length
);
192 if (sps
->vcl_hrd_parameters_present_flag
) {
193 for (sched_sel_idx
= 0; sched_sel_idx
< sps
->cpb_cnt
; sched_sel_idx
++) {
194 h
->initial_cpb_removal_delay
[sched_sel_idx
] =
195 get_bits_long(gb
, sps
->initial_cpb_removal_delay_length
);
196 // initial_cpb_removal_delay_offset
197 skip_bits(gb
, sps
->initial_cpb_removal_delay_length
);
205 static int decode_green_metadata(H264SEIGreenMetaData
*h
, GetByteContext
*gb
)
207 h
->green_metadata_type
= bytestream2_get_byte(gb
);
209 if (h
->green_metadata_type
== 0) {
210 h
->period_type
= bytestream2_get_byte(gb
);
212 if (h
->period_type
== 2)
213 h
->num_seconds
= bytestream2_get_be16(gb
);
214 else if (h
->period_type
== 3)
215 h
->num_pictures
= bytestream2_get_be16(gb
);
217 h
->percent_non_zero_macroblocks
= bytestream2_get_byte(gb
);
218 h
->percent_intra_coded_macroblocks
= bytestream2_get_byte(gb
);
219 h
->percent_six_tap_filtering
= bytestream2_get_byte(gb
);
220 h
->percent_alpha_point_deblocking_instance
= bytestream2_get_byte(gb
);
222 } else if (h
->green_metadata_type
== 1) {
223 h
->xsd_metric_type
= bytestream2_get_byte(gb
);
224 h
->xsd_metric_value
= bytestream2_get_be16(gb
);
230 int ff_h264_sei_decode(H264SEIContext
*h
, GetBitContext
*gb
,
231 const H264ParamSets
*ps
, void *logctx
)
233 GetByteContext gbyte
;
236 av_assert1((get_bits_count(gb
) % 8) == 0);
237 bytestream2_init(&gbyte
, gb
->buffer
+ get_bits_count(gb
) / 8,
238 get_bits_left(gb
) / 8);
240 while (bytestream2_get_bytes_left(&gbyte
) > 2 && bytestream2_peek_ne16(&gbyte
)) {
241 GetByteContext gbyte_payload
;
242 GetBitContext gb_payload
;
248 if (bytestream2_get_bytes_left(&gbyte
) <= 0)
249 return AVERROR_INVALIDDATA
;
250 type
+= bytestream2_peek_byteu(&gbyte
);
251 } while (bytestream2_get_byteu(&gbyte
) == 255);
254 if (bytestream2_get_bytes_left(&gbyte
) <= 0)
255 return AVERROR_INVALIDDATA
;
256 size
+= bytestream2_peek_byteu(&gbyte
);
257 } while (bytestream2_get_byteu(&gbyte
) == 255);
259 if (size
> bytestream2_get_bytes_left(&gbyte
)) {
260 av_log(logctx
, AV_LOG_ERROR
, "SEI type %d size %d truncated at %d\n",
261 type
, size
, bytestream2_get_bytes_left(&gbyte
));
262 return AVERROR_INVALIDDATA
;
265 bytestream2_init (&gbyte_payload
, gbyte
.buffer
, size
);
266 ret
= init_get_bits8(&gb_payload
, gbyte
.buffer
, size
);
271 case SEI_TYPE_PIC_TIMING
: // Picture timing SEI
272 ret
= decode_picture_timing(&h
->picture_timing
, &gbyte_payload
, logctx
);
274 case SEI_TYPE_RECOVERY_POINT
:
275 ret
= decode_recovery_point(&h
->recovery_point
, &gb_payload
, logctx
);
277 case SEI_TYPE_BUFFERING_PERIOD
:
278 ret
= decode_buffering_period(&h
->buffering_period
, &gb_payload
, ps
, logctx
);
280 case SEI_TYPE_GREEN_METADATA
:
281 ret
= decode_green_metadata(&h
->green_metadata
, &gbyte_payload
);
284 ret
= ff_h2645_sei_message_decode(&h
->common
, type
, AV_CODEC_ID_H264
,
285 &gb_payload
, &gbyte_payload
, logctx
);
286 if (ret
== FF_H2645_SEI_MESSAGE_UNHANDLED
)
287 av_log(logctx
, AV_LOG_DEBUG
, "unknown SEI type %d\n", type
);
289 if (ret
< 0 && ret
!= AVERROR_PS_NOT_FOUND
)
294 if (get_bits_left(&gb_payload
) < 0) {
295 av_log(logctx
, AV_LOG_WARNING
, "SEI type %d overread by %d bits\n",
296 type
, -get_bits_left(&gb_payload
));
299 bytestream2_skipu(&gbyte
, size
);
305 const char *ff_h264_sei_stereo_mode(const H2645SEIFramePacking
*h
)
307 if (h
->arrangement_cancel_flag
== 0) {
308 switch (h
->arrangement_type
) {
309 case SEI_FPA_H264_TYPE_CHECKERBOARD
:
310 if (h
->content_interpretation_type
== 2)
311 return "checkerboard_rl";
313 return "checkerboard_lr";
314 case SEI_FPA_H264_TYPE_INTERLEAVE_COLUMN
:
315 if (h
->content_interpretation_type
== 2)
316 return "col_interleaved_rl";
318 return "col_interleaved_lr";
319 case SEI_FPA_H264_TYPE_INTERLEAVE_ROW
:
320 if (h
->content_interpretation_type
== 2)
321 return "row_interleaved_rl";
323 return "row_interleaved_lr";
324 case SEI_FPA_TYPE_SIDE_BY_SIDE
:
325 if (h
->content_interpretation_type
== 2)
329 case SEI_FPA_TYPE_TOP_BOTTOM
:
330 if (h
->content_interpretation_type
== 2)
334 case SEI_FPA_TYPE_INTERLEAVE_TEMPORAL
:
335 if (h
->content_interpretation_type
== 2)
339 case SEI_FPA_H264_TYPE_2D
:
343 } else if (h
->arrangement_cancel_flag
== 1) {