FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
h264_sei.c
Go to the documentation of this file.
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 / MPEG4 part10 sei decoding.
25
* @author Michael Niedermayer <michaelni@gmx.at>
26
*/
27
28
#include "
internal.h
"
29
#include "
avcodec.h
"
30
#include "
h264.h
"
31
#include "
golomb.h
"
32
33
#include <assert.h>
34
35
static
const
uint8_t
sei_num_clock_ts_table
[9] = {
36
1, 1, 1, 2, 2, 3, 3, 2, 3
37
};
38
39
void
ff_h264_reset_sei
(
H264Context
*h)
40
{
41
h->
sei_recovery_frame_cnt
= -1;
42
h->
sei_dpb_output_delay
= 0;
43
h->
sei_cpb_removal_delay
= -1;
44
h->
sei_buffering_period_present
= 0;
45
}
46
47
static
int
decode_picture_timing
(
H264Context
*h)
48
{
49
SPS
*sps = &h->
sps
;
50
int
i;
51
52
for
(i = 0; i<
MAX_SPS_COUNT
; i++)
53
if
(!sps->
log2_max_frame_num
&& h->
sps_buffers
[i])
54
sps = h->
sps_buffers
[i];
55
56
if
(sps->
nal_hrd_parameters_present_flag
|| sps->
vcl_hrd_parameters_present_flag
) {
57
h->
sei_cpb_removal_delay
=
get_bits_long
(&h->
gb
,
58
sps->
cpb_removal_delay_length
);
59
h->
sei_dpb_output_delay
=
get_bits_long
(&h->
gb
,
60
sps->
dpb_output_delay_length
);
61
}
62
if
(sps->
pic_struct_present_flag
) {
63
unsigned
int
i, num_clock_ts;
64
65
h->
sei_pic_struct
=
get_bits
(&h->
gb
, 4);
66
h->
sei_ct_type
= 0;
67
68
if
(h->
sei_pic_struct
>
SEI_PIC_STRUCT_FRAME_TRIPLING
)
69
return
AVERROR_INVALIDDATA
;
70
71
num_clock_ts =
sei_num_clock_ts_table
[h->
sei_pic_struct
];
72
73
for
(i = 0; i < num_clock_ts; i++) {
74
if
(
get_bits
(&h->
gb
, 1)) {
/* clock_timestamp_flag */
75
unsigned
int
full_timestamp_flag;
76
77
h->
sei_ct_type
|= 1 <<
get_bits
(&h->
gb
, 2);
78
skip_bits
(&h->
gb
, 1);
/* nuit_field_based_flag */
79
skip_bits
(&h->
gb
, 5);
/* counting_type */
80
full_timestamp_flag =
get_bits
(&h->
gb
, 1);
81
skip_bits
(&h->
gb
, 1);
/* discontinuity_flag */
82
skip_bits
(&h->
gb
, 1);
/* cnt_dropped_flag */
83
skip_bits
(&h->
gb
, 8);
/* n_frames */
84
if
(full_timestamp_flag) {
85
skip_bits
(&h->
gb
, 6);
/* seconds_value 0..59 */
86
skip_bits
(&h->
gb
, 6);
/* minutes_value 0..59 */
87
skip_bits
(&h->
gb
, 5);
/* hours_value 0..23 */
88
}
else
{
89
if
(
get_bits
(&h->
gb
, 1)) {
/* seconds_flag */
90
skip_bits
(&h->
gb
, 6);
/* seconds_value range 0..59 */
91
if
(
get_bits
(&h->
gb
, 1)) {
/* minutes_flag */
92
skip_bits
(&h->
gb
, 6);
/* minutes_value 0..59 */
93
if
(
get_bits
(&h->
gb
, 1))
/* hours_flag */
94
skip_bits
(&h->
gb
, 5);
/* hours_value 0..23 */
95
}
96
}
97
}
98
if
(sps->
time_offset_length
> 0)
99
skip_bits
(&h->
gb
,
100
sps->
time_offset_length
);
/* time_offset */
101
}
102
}
103
104
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
105
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"ct_type:%X pic_struct:%d\n"
,
106
h->
sei_ct_type
, h->
sei_pic_struct
);
107
}
108
return
0;
109
}
110
111
static
int
decode_user_data_itu_t_t35
(
H264Context
*h,
int
size
)
112
{
113
uint32_t user_identifier;
114
int
dtg_active_format;
115
116
if
(size < 7)
117
return
-1;
118
size -= 7;
119
120
skip_bits
(&h->
gb
, 8);
// country_code
121
skip_bits
(&h->
gb
, 16);
// provider_code
122
user_identifier =
get_bits_long
(&h->
gb
, 32);
123
124
switch
(user_identifier) {
125
case
0x44544731:
// "DTG1" - AFD_data
126
if
(size < 1)
127
return
-1;
128
skip_bits
(&h->
gb
, 1);
129
if
(
get_bits
(&h->
gb
, 1)) {
130
skip_bits
(&h->
gb
, 6);
131
if
(size < 2)
132
return
-1;
133
skip_bits
(&h->
gb
, 4);
134
dtg_active_format =
get_bits
(&h->
gb
, 4);
135
h->
avctx
->
dtg_active_format
= dtg_active_format;
136
}
else
{
137
skip_bits
(&h->
gb
, 6);
138
}
139
break
;
140
default
:
141
skip_bits
(&h->
gb
, size * 8);
142
break
;
143
}
144
145
return
0;
146
}
147
148
static
int
decode_unregistered_user_data
(
H264Context
*h,
int
size
)
149
{
150
uint8_t
user_data
[16 + 256];
151
int
e, build, i;
152
153
if
(size < 16)
154
return
AVERROR_INVALIDDATA
;
155
156
for
(i = 0; i <
sizeof
(
user_data
) - 1 && i < size; i++)
157
user_data[i] =
get_bits
(&h->
gb
, 8);
158
159
user_data[i] = 0;
160
e = sscanf(user_data + 16,
"x264 - core %d"
, &build);
161
if
(e == 1 && build > 0)
162
h->
x264_build
= build;
163
if
(e == 1 && build == 1 && !strncmp(user_data+16,
"x264 - core 0000"
, 16))
164
h->
x264_build
= 67;
165
166
if
(h->
avctx
->
debug
&
FF_DEBUG_BUGS
)
167
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"user data:\"%s\"\n"
, user_data + 16);
168
169
for
(; i <
size
; i++)
170
skip_bits
(&h->
gb
, 8);
171
172
return
0;
173
}
174
175
static
int
decode_recovery_point
(
H264Context
*h)
176
{
177
h->
sei_recovery_frame_cnt
=
get_ue_golomb
(&h->
gb
);
178
179
/* 1b exact_match_flag,
180
* 1b broken_link_flag,
181
* 2b changing_slice_group_idc */
182
skip_bits
(&h->
gb
, 4);
183
184
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
185
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"sei_recovery_frame_cnt: %d\n"
, h->
sei_recovery_frame_cnt
);
186
187
return
0;
188
}
189
190
static
int
decode_buffering_period
(
H264Context
*h)
191
{
192
unsigned
int
sps_id;
193
int
sched_sel_idx;
194
SPS
*sps;
195
196
sps_id =
get_ue_golomb_31
(&h->
gb
);
197
if
(sps_id > 31 || !h->
sps_buffers
[sps_id]) {
198
av_log
(h->
avctx
,
AV_LOG_ERROR
,
199
"non-existing SPS %d referenced in buffering period\n"
, sps_id);
200
return
AVERROR_INVALIDDATA
;
201
}
202
sps = h->
sps_buffers
[sps_id];
203
204
// NOTE: This is really so duplicated in the standard... See H.264, D.1.1
205
if
(sps->
nal_hrd_parameters_present_flag
) {
206
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
207
h->
initial_cpb_removal_delay
[sched_sel_idx] =
208
get_bits_long
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
209
// initial_cpb_removal_delay_offset
210
skip_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
211
}
212
}
213
if
(sps->
vcl_hrd_parameters_present_flag
) {
214
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
215
h->
initial_cpb_removal_delay
[sched_sel_idx] =
216
get_bits_long
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
217
// initial_cpb_removal_delay_offset
218
skip_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
219
}
220
}
221
222
h->
sei_buffering_period_present
= 1;
223
return
0;
224
}
225
226
static
int
decode_frame_packing
(
H264Context
*h,
int
size
) {
227
int
bits
=
get_bits_left
(&h->
gb
);
228
229
h->
sei_fpa
.
frame_packing_arrangement_id
=
get_ue_golomb
(&h->
gb
);
230
h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
=
get_bits
(&h->
gb
, 1);
231
if
(!h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
) {
232
h->
sei_fpa
.
frame_packing_arrangement_type
=
get_bits
(&h->
gb
, 7);
233
h->
sei_fpa
.
quincunx_sampling_flag
=
get_bits
(&h->
gb
, 1);
234
h->
sei_fpa
.
content_interpretation_type
=
get_bits
(&h->
gb
, 6);
235
skip_bits
(&h->
gb
, 1);
/* spatial_flipping_flag */
236
skip_bits
(&h->
gb
, 1);
/* frame0_flipped_flag */
237
skip_bits
(&h->
gb
, 1);
/* field_views_flag */
238
skip_bits
(&h->
gb
, 1);
/* current_frame_is_frame0_flag */
239
skip_bits
(&h->
gb
, 1);
/* frame0_self_contained_flag */
240
skip_bits
(&h->
gb
, 1);
/* frame1_self_contained_flag */
241
if
(!h->
sei_fpa
.
quincunx_sampling_flag
&& h->
sei_fpa
.
frame_packing_arrangement_type
!= 5) {
242
skip_bits
(&h->
gb
, 4);
/* frame0_grid_position_x */
243
skip_bits
(&h->
gb
, 4);
/* frame0_grid_position_y */
244
skip_bits
(&h->
gb
, 4);
/* frame1_grid_position_x */
245
skip_bits
(&h->
gb
, 4);
/* frame1_grid_position_y */
246
}
247
skip_bits
(&h->
gb
, 8);
/* frame_packing_arrangement_reserved_byte */
248
h->
sei_fpa
.
frame_packing_arrangement_repetition_period
=
get_ue_golomb
(&h->
gb
)
/* frame_packing_arrangement_repetition_period */
;
249
}
250
skip_bits
(&h->
gb
, 1);
/* frame_packing_arrangement_extension_flag */
251
252
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
253
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"SEI FPA %d %d %d %d %d %d\n"
,
254
h->
sei_fpa
.
frame_packing_arrangement_id
,
255
h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
,
256
h->
sei_fpa
.
frame_packing_arrangement_type
,
257
h->
sei_fpa
.
quincunx_sampling_flag
,
258
h->
sei_fpa
.
content_interpretation_type
,
259
h->
sei_fpa
.
frame_packing_arrangement_repetition_period
);
260
skip_bits_long
(&h->
gb
, 8 * size - (bits -
get_bits_left
(&h->
gb
)));
261
return
0;
262
}
263
264
int
ff_h264_decode_sei
(
H264Context
*h)
265
{
266
while
(
get_bits_left
(&h->
gb
) > 16) {
267
int
type
= 0;
268
unsigned
size
= 0;
269
unsigned
next;
270
int
ret
= 0;
271
272
do
{
273
if
(
get_bits_left
(&h->
gb
) < 8)
274
return
AVERROR_INVALIDDATA
;
275
type +=
show_bits
(&h->
gb
, 8);
276
}
while
(
get_bits
(&h->
gb
, 8) == 255);
277
278
do
{
279
if
(
get_bits_left
(&h->
gb
) < 8)
280
return
AVERROR_INVALIDDATA
;
281
size +=
show_bits
(&h->
gb
, 8);
282
}
while
(
get_bits
(&h->
gb
, 8) == 255);
283
284
if
(h->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
285
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"SEI %d len:%d\n"
, type, size);
286
287
if
(size >
get_bits_left
(&h->
gb
) / 8) {
288
av_log
(h->
avctx
,
AV_LOG_ERROR
,
"SEI type %d size %d truncated at %d\n"
,
289
type, 8*size,
get_bits_left
(&h->
gb
));
290
return
AVERROR_INVALIDDATA
;
291
}
292
next =
get_bits_count
(&h->
gb
) + 8 *
size
;
293
294
switch
(type) {
295
case
SEI_TYPE_PIC_TIMING
:
// Picture timing SEI
296
ret =
decode_picture_timing
(h);
297
if
(ret < 0)
298
return
ret
;
299
break
;
300
case
SEI_TYPE_USER_DATA_ITU_T_T35
:
301
if
(
decode_user_data_itu_t_t35
(h, size) < 0)
302
return
-1;
303
break
;
304
case
SEI_TYPE_USER_DATA_UNREGISTERED
:
305
ret =
decode_unregistered_user_data
(h, size);
306
if
(ret < 0)
307
return
ret
;
308
break
;
309
case
SEI_TYPE_RECOVERY_POINT
:
310
ret =
decode_recovery_point
(h);
311
if
(ret < 0)
312
return
ret
;
313
break
;
314
case
SEI_BUFFERING_PERIOD
:
315
ret =
decode_buffering_period
(h);
316
if
(ret < 0)
317
return
ret
;
318
break
;
319
case
SEI_TYPE_FRAME_PACKING
:
320
if
(
decode_frame_packing
(h, size) < 0)
321
return
-1;
322
break
;
323
default
:
324
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"unknown SEI type %d\n"
, type);
325
}
326
skip_bits_long
(&h->
gb
, next -
get_bits_count
(&h->
gb
));
327
328
// FIXME check bits here
329
align_get_bits
(&h->
gb
);
330
}
331
332
return
0;
333
}
334
335
const
char
*
ff_h264_sei_stereo_mode
(
H264Context
*h)
336
{
337
if
(h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
== 0) {
338
switch
(h->
sei_fpa
.
frame_packing_arrangement_type
) {
339
case
SEI_FPA_TYPE_CHECKERBOARD
:
340
if
(h->
sei_fpa
.
content_interpretation_type
== 2)
341
return
"checkerboard_rl"
;
342
else
343
return
"checkerboard_lr"
;
344
case
SEI_FPA_TYPE_INTERLEAVE_COLUMN
:
345
if
(h->
sei_fpa
.
content_interpretation_type
== 2)
346
return
"col_interleaved_rl"
;
347
else
348
return
"col_interleaved_lr"
;
349
case
SEI_FPA_TYPE_INTERLEAVE_ROW
:
350
if
(h->
sei_fpa
.
content_interpretation_type
== 2)
351
return
"row_interleaved_rl"
;
352
else
353
return
"row_interleaved_lr"
;
354
case
SEI_FPA_TYPE_SIDE_BY_SIDE
:
355
if
(h->
sei_fpa
.
content_interpretation_type
== 2)
356
return
"right_left"
;
357
else
358
return
"left_right"
;
359
case
SEI_FPA_TYPE_TOP_BOTTOM
:
360
if
(h->
sei_fpa
.
content_interpretation_type
== 2)
361
return
"bottom_top"
;
362
else
363
return
"top_bottom"
;
364
case
SEI_FPA_TYPE_INTERLEAVE_TEMPORAL
:
365
if
(h->
sei_fpa
.
content_interpretation_type
== 2)
366
return
"block_rl"
;
367
else
368
return
"block_lr"
;
369
case
SEI_FPA_TYPE_2D
:
370
default
:
371
return
"mono"
;
372
}
373
}
else
if
(h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
== 1) {
374
return
"mono"
;
375
}
else
{
376
return
NULL;
377
}
378
}
Generated on Sat Jan 25 2014 19:51:48 for FFmpeg by
1.8.2