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 "
avcodec.h
"
29
#include "
golomb.h
"
30
#include "
h264.h
"
31
#include "
internal.h
"
32
33
static
const
uint8_t
sei_num_clock_ts_table
[9] = {
34
1, 1, 1, 2, 2, 3, 3, 2, 3
35
};
36
37
void
ff_h264_reset_sei
(
H264Context
*h)
38
{
39
h->
sei_recovery_frame_cnt
= -1;
40
h->
sei_dpb_output_delay
= 0;
41
h->
sei_cpb_removal_delay
= -1;
42
h->
sei_buffering_period_present
= 0;
43
h->
sei_frame_packing_present
= 0;
44
}
45
46
static
int
decode_picture_timing
(
H264Context
*h)
47
{
48
SPS
*sps = &h->
sps
;
49
int
i;
50
51
for
(i = 0; i<
MAX_SPS_COUNT
; i++)
52
if
(!sps->
log2_max_frame_num
&& h->
sps_buffers
[i])
53
sps = h->
sps_buffers
[i];
54
55
if
(sps->
nal_hrd_parameters_present_flag
|| sps->
vcl_hrd_parameters_present_flag
) {
56
h->
sei_cpb_removal_delay
=
get_bits_long
(&h->
gb
,
57
sps->
cpb_removal_delay_length
);
58
h->
sei_dpb_output_delay
=
get_bits_long
(&h->
gb
,
59
sps->
dpb_output_delay_length
);
60
}
61
if
(sps->
pic_struct_present_flag
) {
62
unsigned
int
i, num_clock_ts;
63
64
h->
sei_pic_struct
=
get_bits
(&h->
gb
, 4);
65
h->
sei_ct_type
= 0;
66
67
if
(h->
sei_pic_struct
>
SEI_PIC_STRUCT_FRAME_TRIPLING
)
68
return
AVERROR_INVALIDDATA
;
69
70
num_clock_ts =
sei_num_clock_ts_table
[h->
sei_pic_struct
];
71
72
for
(i = 0; i < num_clock_ts; i++) {
73
if
(
get_bits
(&h->
gb
, 1)) {
/* clock_timestamp_flag */
74
unsigned
int
full_timestamp_flag;
75
76
h->
sei_ct_type
|= 1 <<
get_bits
(&h->
gb
, 2);
77
skip_bits
(&h->
gb
, 1);
/* nuit_field_based_flag */
78
skip_bits
(&h->
gb
, 5);
/* counting_type */
79
full_timestamp_flag =
get_bits
(&h->
gb
, 1);
80
skip_bits
(&h->
gb
, 1);
/* discontinuity_flag */
81
skip_bits
(&h->
gb
, 1);
/* cnt_dropped_flag */
82
skip_bits
(&h->
gb
, 8);
/* n_frames */
83
if
(full_timestamp_flag) {
84
skip_bits
(&h->
gb
, 6);
/* seconds_value 0..59 */
85
skip_bits
(&h->
gb
, 6);
/* minutes_value 0..59 */
86
skip_bits
(&h->
gb
, 5);
/* hours_value 0..23 */
87
}
else
{
88
if
(
get_bits
(&h->
gb
, 1)) {
/* seconds_flag */
89
skip_bits
(&h->
gb
, 6);
/* seconds_value range 0..59 */
90
if
(
get_bits
(&h->
gb
, 1)) {
/* minutes_flag */
91
skip_bits
(&h->
gb
, 6);
/* minutes_value 0..59 */
92
if
(
get_bits
(&h->
gb
, 1))
/* hours_flag */
93
skip_bits
(&h->
gb
, 5);
/* hours_value 0..23 */
94
}
95
}
96
}
97
if
(sps->
time_offset_length
> 0)
98
skip_bits
(&h->
gb
,
99
sps->
time_offset_length
);
/* time_offset */
100
}
101
}
102
103
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
104
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"ct_type:%X pic_struct:%d\n"
,
105
h->
sei_ct_type
, h->
sei_pic_struct
);
106
}
107
return
0;
108
}
109
110
static
int
decode_user_data_itu_t_t35
(
H264Context
*h,
int
size
)
111
{
112
uint32_t user_identifier;
113
int
dtg_active_format;
114
115
if
(size < 7)
116
return
-1;
117
size -= 7;
118
119
skip_bits
(&h->
gb
, 8);
// country_code
120
skip_bits
(&h->
gb
, 16);
// provider_code
121
user_identifier =
get_bits_long
(&h->
gb
, 32);
122
123
switch
(user_identifier) {
124
case
0x44544731:
// "DTG1" - AFD_data
125
if
(size < 1)
126
return
-1;
127
skip_bits
(&h->
gb
, 1);
128
if
(
get_bits
(&h->
gb
, 1)) {
129
skip_bits
(&h->
gb
, 6);
130
if
(size < 2)
131
return
-1;
132
skip_bits
(&h->
gb
, 4);
133
dtg_active_format =
get_bits
(&h->
gb
, 4);
134
h->
avctx
->
dtg_active_format
= dtg_active_format;
135
}
else
{
136
skip_bits
(&h->
gb
, 6);
137
}
138
break
;
139
default
:
140
skip_bits
(&h->
gb
, size * 8);
141
break
;
142
}
143
144
return
0;
145
}
146
147
static
int
decode_unregistered_user_data
(
H264Context
*h,
int
size
)
148
{
149
uint8_t
user_data
[16 + 256];
150
int
e, build, i;
151
152
if
(size < 16)
153
return
AVERROR_INVALIDDATA
;
154
155
for
(i = 0; i <
sizeof
(
user_data
) - 1 && i < size; i++)
156
user_data[i] =
get_bits
(&h->
gb
, 8);
157
158
user_data[i] = 0;
159
e = sscanf(user_data + 16,
"x264 - core %d"
, &build);
160
if
(e == 1 && build > 0)
161
h->
x264_build
= build;
162
if
(e == 1 && build == 1 && !strncmp(user_data+16,
"x264 - core 0000"
, 16))
163
h->
x264_build
= 67;
164
165
if
(h->
avctx
->
debug
&
FF_DEBUG_BUGS
)
166
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"user data:\"%s\"\n"
, user_data + 16);
167
168
for
(; i <
size
; i++)
169
skip_bits
(&h->
gb
, 8);
170
171
return
0;
172
}
173
174
static
int
decode_recovery_point
(
H264Context
*h)
175
{
176
h->
sei_recovery_frame_cnt
=
get_ue_golomb
(&h->
gb
);
177
178
/* 1b exact_match_flag,
179
* 1b broken_link_flag,
180
* 2b changing_slice_group_idc */
181
skip_bits
(&h->
gb
, 4);
182
183
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
184
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"sei_recovery_frame_cnt: %d\n"
, h->
sei_recovery_frame_cnt
);
185
186
return
0;
187
}
188
189
static
int
decode_buffering_period
(
H264Context
*h)
190
{
191
unsigned
int
sps_id;
192
int
sched_sel_idx;
193
SPS
*sps;
194
195
sps_id =
get_ue_golomb_31
(&h->
gb
);
196
if
(sps_id > 31 || !h->
sps_buffers
[sps_id]) {
197
av_log
(h->
avctx
,
AV_LOG_ERROR
,
198
"non-existing SPS %d referenced in buffering period\n"
, sps_id);
199
return
AVERROR_INVALIDDATA
;
200
}
201
sps = h->
sps_buffers
[sps_id];
202
203
// NOTE: This is really so duplicated in the standard... See H.264, D.1.1
204
if
(sps->
nal_hrd_parameters_present_flag
) {
205
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
206
h->
initial_cpb_removal_delay
[sched_sel_idx] =
207
get_bits_long
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
208
// initial_cpb_removal_delay_offset
209
skip_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
210
}
211
}
212
if
(sps->
vcl_hrd_parameters_present_flag
) {
213
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
214
h->
initial_cpb_removal_delay
[sched_sel_idx] =
215
get_bits_long
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
216
// initial_cpb_removal_delay_offset
217
skip_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
218
}
219
}
220
221
h->
sei_buffering_period_present
= 1;
222
return
0;
223
}
224
225
static
int
decode_frame_packing_arrangement
(
H264Context
*h)
226
{
227
h->
sei_fpa
.
frame_packing_arrangement_id
=
get_ue_golomb
(&h->
gb
);
228
h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
=
get_bits1
(&h->
gb
);
229
h->
sei_frame_packing_present
= !h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
;
230
231
if
(h->
sei_frame_packing_present
) {
232
h->
sei_fpa
.
frame_packing_arrangement_type
=
233
h->
frame_packing_arrangement_type
=
get_bits
(&h->
gb
, 7);
234
h->
sei_fpa
.
quincunx_sampling_flag
=
235
h->
quincunx_subsampling
=
get_bits1
(&h->
gb
);
236
h->
sei_fpa
.
content_interpretation_type
=
237
h->
content_interpretation_type
=
get_bits
(&h->
gb
, 6);
238
239
// the following skips: spatial_flipping_flag, frame0_flipped_flag,
240
// field_views_flag, current_frame_is_frame0_flag,
241
// frame0_self_contained_flag, frame1_self_contained_flag
242
skip_bits
(&h->
gb
, 6);
243
244
if
(!h->
quincunx_subsampling
&& h->
frame_packing_arrangement_type
!= 5)
245
skip_bits
(&h->
gb
, 16);
// frame[01]_grid_position_[xy]
246
skip_bits
(&h->
gb
, 8);
// frame_packing_arrangement_reserved_byte
247
h->
sei_fpa
.
frame_packing_arrangement_repetition_period
=
get_ue_golomb
(&h->
gb
)
/* frame_packing_arrangement_repetition_period */
;
248
}
249
skip_bits1
(&h->
gb
);
// frame_packing_arrangement_extension_flag
250
251
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
252
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"SEI FPA %d %d %d %d %d %d\n"
,
253
h->
sei_fpa
.
frame_packing_arrangement_id
,
254
h->
sei_fpa
.
frame_packing_arrangement_cancel_flag
,
255
h->
sei_fpa
.
frame_packing_arrangement_type
,
256
h->
sei_fpa
.
quincunx_sampling_flag
,
257
h->
sei_fpa
.
content_interpretation_type
,
258
h->
sei_fpa
.
frame_packing_arrangement_repetition_period
);
259
260
return
0;
261
}
262
263
int
ff_h264_decode_sei
(
H264Context
*h)
264
{
265
while
(
get_bits_left
(&h->
gb
) > 16) {
266
int
type
= 0;
267
unsigned
size
= 0;
268
unsigned
next;
269
int
ret
= 0;
270
271
do
{
272
if
(
get_bits_left
(&h->
gb
) < 8)
273
return
AVERROR_INVALIDDATA
;
274
type +=
show_bits
(&h->
gb
, 8);
275
}
while
(
get_bits
(&h->
gb
, 8) == 255);
276
277
do
{
278
if
(
get_bits_left
(&h->
gb
) < 8)
279
return
AVERROR_INVALIDDATA
;
280
size +=
show_bits
(&h->
gb
, 8);
281
}
while
(
get_bits
(&h->
gb
, 8) == 255);
282
283
if
(h->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
284
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"SEI %d len:%d\n"
, type, size);
285
286
if
(size >
get_bits_left
(&h->
gb
) / 8) {
287
av_log
(h->
avctx
,
AV_LOG_ERROR
,
"SEI type %d size %d truncated at %d\n"
,
288
type, 8*size,
get_bits_left
(&h->
gb
));
289
return
AVERROR_INVALIDDATA
;
290
}
291
next =
get_bits_count
(&h->
gb
) + 8 *
size
;
292
293
switch
(type) {
294
case
SEI_TYPE_PIC_TIMING
:
// Picture timing SEI
295
ret =
decode_picture_timing
(h);
296
if
(ret < 0)
297
return
ret
;
298
break
;
299
case
SEI_TYPE_USER_DATA_ITU_T_T35
:
300
if
(
decode_user_data_itu_t_t35
(h, size) < 0)
301
return
-1;
302
break
;
303
case
SEI_TYPE_USER_DATA_UNREGISTERED
:
304
ret =
decode_unregistered_user_data
(h, size);
305
if
(ret < 0)
306
return
ret
;
307
break
;
308
case
SEI_TYPE_RECOVERY_POINT
:
309
ret =
decode_recovery_point
(h);
310
if
(ret < 0)
311
return
ret
;
312
break
;
313
case
SEI_TYPE_BUFFERING_PERIOD
:
314
ret =
decode_buffering_period
(h);
315
if
(ret < 0)
316
return
ret
;
317
break
;
318
case
SEI_TYPE_FRAME_PACKING
:
319
ret =
decode_frame_packing_arrangement
(h);
320
if
(ret < 0)
321
return
ret
;
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 Sun Mar 23 2014 23:49:56 for FFmpeg by
1.8.2