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