FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
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
//#undef NDEBUG
34
#include <assert.h>
35
36
static
const
uint8_t
sei_num_clock_ts_table
[9]={
37
1, 1, 1, 2, 2, 3, 3, 2, 3
38
};
39
40
void
ff_h264_reset_sei
(
H264Context
*h) {
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
MpegEncContext
*
const
s = &h->
s
;
49
if
(h->
sps
.
nal_hrd_parameters_present_flag
|| h->
sps
.
vcl_hrd_parameters_present_flag
){
50
h->
sei_cpb_removal_delay
=
get_bits_long
(&s->
gb
, h->
sps
.
cpb_removal_delay_length
);
51
h->
sei_dpb_output_delay
=
get_bits_long
(&s->
gb
, h->
sps
.
dpb_output_delay_length
);
52
}
53
if
(h->
sps
.
pic_struct_present_flag
){
54
unsigned
int
i, num_clock_ts;
55
h->
sei_pic_struct
=
get_bits
(&s->
gb
, 4);
56
h->
sei_ct_type
= 0;
57
58
if
(h->
sei_pic_struct
>
SEI_PIC_STRUCT_FRAME_TRIPLING
)
59
return
-1;
60
61
num_clock_ts =
sei_num_clock_ts_table
[h->
sei_pic_struct
];
62
63
for
(i = 0 ; i < num_clock_ts ; i++){
64
if
(
get_bits
(&s->
gb
, 1)){
/* clock_timestamp_flag */
65
unsigned
int
full_timestamp_flag;
66
h->
sei_ct_type
|= 1<<
get_bits
(&s->
gb
, 2);
67
skip_bits
(&s->
gb
, 1);
/* nuit_field_based_flag */
68
skip_bits
(&s->
gb
, 5);
/* counting_type */
69
full_timestamp_flag =
get_bits
(&s->
gb
, 1);
70
skip_bits
(&s->
gb
, 1);
/* discontinuity_flag */
71
skip_bits
(&s->
gb
, 1);
/* cnt_dropped_flag */
72
skip_bits
(&s->
gb
, 8);
/* n_frames */
73
if
(full_timestamp_flag){
74
skip_bits
(&s->
gb
, 6);
/* seconds_value 0..59 */
75
skip_bits
(&s->
gb
, 6);
/* minutes_value 0..59 */
76
skip_bits
(&s->
gb
, 5);
/* hours_value 0..23 */
77
}
else
{
78
if
(
get_bits
(&s->
gb
, 1)){
/* seconds_flag */
79
skip_bits
(&s->
gb
, 6);
/* seconds_value range 0..59 */
80
if
(
get_bits
(&s->
gb
, 1)){
/* minutes_flag */
81
skip_bits
(&s->
gb
, 6);
/* minutes_value 0..59 */
82
if
(
get_bits
(&s->
gb
, 1))
/* hours_flag */
83
skip_bits
(&s->
gb
, 5);
/* hours_value 0..23 */
84
}
85
}
86
}
87
if
(h->
sps
.
time_offset_length
> 0)
88
skip_bits
(&s->
gb
, h->
sps
.
time_offset_length
);
/* time_offset */
89
}
90
}
91
92
if
(s->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
93
av_log
(s->
avctx
,
AV_LOG_DEBUG
,
"ct_type:%X pic_struct:%d\n"
, h->
sei_ct_type
, h->
sei_pic_struct
);
94
}
95
return
0;
96
}
97
98
static
int
decode_user_data_itu_t_t35
(
H264Context
*h,
int
size
) {
99
MpegEncContext
*
const
s = &h->
s
;
100
uint32_t user_identifier;
101
int
dtg_active_format;
102
103
if
(size < 7)
104
return
-1;
105
size -= 7;
106
107
skip_bits
(&s->
gb
, 8);
// country_code
108
skip_bits
(&s->
gb
, 16);
// provider_code
109
user_identifier =
get_bits_long
(&s->
gb
, 32);
110
111
switch
(user_identifier) {
112
case
0x44544731:
// "DTG1" - AFD_data
113
if
(size < 1)
114
return
-1;
115
skip_bits
(&s->
gb
, 1);
116
if
(
get_bits
(&s->
gb
, 1)) {
117
skip_bits
(&s->
gb
, 6);
118
if
(size < 2)
119
return
-1;
120
skip_bits
(&s->
gb
, 4);
121
dtg_active_format =
get_bits
(&s->
gb
, 4);
122
s->
avctx
->
dtg_active_format
= dtg_active_format;
123
}
else
{
124
skip_bits
(&s->
gb
, 6);
125
}
126
break
;
127
default
:
128
skip_bits
(&s->
gb
, size * 8);
129
break
;
130
}
131
132
return
0;
133
}
134
135
static
int
decode_unregistered_user_data
(
H264Context
*h,
int
size
){
136
MpegEncContext
*
const
s = &h->
s
;
137
uint8_t
user_data[16+256];
138
int
e, build, i;
139
140
if
(size<16)
141
return
-1;
142
143
for
(i=0; i<
sizeof
(user_data)-1 && i<size; i++){
144
user_data[i]=
get_bits
(&s->
gb
, 8);
145
}
146
147
user_data[i]= 0;
148
e= sscanf(user_data+16,
"x264 - core %d"
/*%s - H.264/MPEG-4 AVC codec - Copyleft 2005 - http://www.videolan.org/x264.html*/
, &build);
149
if
(e==1 && build>0)
150
h->
x264_build
= build;
151
if
(e==1 && build==1 && !strncmp(user_data+16,
"x264 - core 0000"
, 16))
152
h->
x264_build
= 67;
153
154
if
(s->
avctx
->
debug
&
FF_DEBUG_BUGS
)
155
av_log
(s->
avctx
,
AV_LOG_DEBUG
,
"user data:\"%s\"\n"
, user_data+16);
156
157
for
(; i<
size
; i++)
158
skip_bits
(&s->
gb
, 8);
159
160
return
0;
161
}
162
163
static
int
decode_recovery_point
(
H264Context
*h){
164
MpegEncContext
*
const
s = &h->
s
;
165
166
h->
sei_recovery_frame_cnt
=
get_ue_golomb
(&s->
gb
);
167
skip_bits
(&s->
gb
, 4);
/* 1b exact_match_flag, 1b broken_link_flag, 2b changing_slice_group_idc */
168
169
return
0;
170
}
171
172
static
int
decode_buffering_period
(
H264Context
*h){
173
MpegEncContext
*
const
s = &h->
s
;
174
unsigned
int
sps_id;
175
int
sched_sel_idx;
176
SPS
*sps;
177
178
sps_id =
get_ue_golomb_31
(&s->
gb
);
179
if
(sps_id > 31 || !h->
sps_buffers
[sps_id]) {
180
av_log
(h->
s
.
avctx
,
AV_LOG_ERROR
,
"non-existing SPS %d referenced in buffering period\n"
, sps_id);
181
return
-1;
182
}
183
sps = h->
sps_buffers
[sps_id];
184
185
// NOTE: This is really so duplicated in the standard... See H.264, D.1.1
186
if
(sps->
nal_hrd_parameters_present_flag
) {
187
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
188
h->
initial_cpb_removal_delay
[sched_sel_idx] =
get_bits_long
(&s->
gb
, sps->
initial_cpb_removal_delay_length
);
189
skip_bits
(&s->
gb
, sps->
initial_cpb_removal_delay_length
);
// initial_cpb_removal_delay_offset
190
}
191
}
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] =
get_bits_long
(&s->
gb
, sps->
initial_cpb_removal_delay_length
);
195
skip_bits
(&s->
gb
, sps->
initial_cpb_removal_delay_length
);
// initial_cpb_removal_delay_offset
196
}
197
}
198
199
h->
sei_buffering_period_present
= 1;
200
return
0;
201
}
202
203
int
ff_h264_decode_sei
(
H264Context
*h){
204
MpegEncContext
*
const
s = &h->
s
;
205
206
while
(
get_bits_left
(&s->
gb
) > 16) {
207
int
size
, type;
208
209
type=0;
210
do
{
211
if
(
get_bits_left
(&s->
gb
) < 8)
212
return
-1;
213
type+=
show_bits
(&s->
gb
, 8);
214
}
while
(
get_bits
(&s->
gb
, 8) == 255);
215
216
size=0;
217
do
{
218
if
(
get_bits_left
(&s->
gb
) < 8)
219
return
-1;
220
size+=
show_bits
(&s->
gb
, 8);
221
}
while
(
get_bits
(&s->
gb
, 8) == 255);
222
223
if
(s->
avctx
->
debug
&
FF_DEBUG_STARTCODE
)
224
av_log
(h->
s
.
avctx
,
AV_LOG_DEBUG
,
"SEI %d len:%d\n"
, type, size);
225
226
switch
(type){
227
case
SEI_TYPE_PIC_TIMING
:
// Picture timing SEI
228
if
(
decode_picture_timing
(h) < 0)
229
return
-1;
230
break
;
231
case
SEI_TYPE_USER_DATA_ITU_T_T35
:
232
if
(
decode_user_data_itu_t_t35
(h, size) < 0)
233
return
-1;
234
break
;
235
case
SEI_TYPE_USER_DATA_UNREGISTERED
:
236
if
(
decode_unregistered_user_data
(h, size) < 0)
237
return
-1;
238
break
;
239
case
SEI_TYPE_RECOVERY_POINT
:
240
if
(
decode_recovery_point
(h) < 0)
241
return
-1;
242
break
;
243
case
SEI_BUFFERING_PERIOD
:
244
if
(
decode_buffering_period
(h) < 0)
245
return
-1;
246
break
;
247
default
:
248
skip_bits
(&s->
gb
, 8*size);
249
}
250
251
//FIXME check bits here
252
align_get_bits
(&s->
gb
);
253
}
254
255
return
0;
256
}
Generated on Sat May 25 2013 03:58:35 for FFmpeg by
1.8.2