Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
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 Libav.
6
*
7
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
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
if
(h->
sps
.
nal_hrd_parameters_present_flag
||
49
h->
sps
.
vcl_hrd_parameters_present_flag
) {
50
h->
sei_cpb_removal_delay
=
get_bits
(&h->
gb
,
51
h->
sps
.
cpb_removal_delay_length
);
52
h->
sei_dpb_output_delay
=
get_bits
(&h->
gb
,
53
h->
sps
.
dpb_output_delay_length
);
54
}
55
if
(h->
sps
.
pic_struct_present_flag
) {
56
unsigned
int
i, num_clock_ts;
57
58
h->
sei_pic_struct
=
get_bits
(&h->
gb
, 4);
59
h->
sei_ct_type
= 0;
60
61
if
(h->
sei_pic_struct
>
SEI_PIC_STRUCT_FRAME_TRIPLING
)
62
return
AVERROR_INVALIDDATA
;
63
64
num_clock_ts =
sei_num_clock_ts_table
[h->
sei_pic_struct
];
65
66
for
(i = 0; i < num_clock_ts; i++) {
67
if
(
get_bits
(&h->
gb
, 1)) {
/* clock_timestamp_flag */
68
unsigned
int
full_timestamp_flag;
69
70
h->
sei_ct_type
|= 1 <<
get_bits
(&h->
gb
, 2);
71
skip_bits
(&h->
gb
, 1);
/* nuit_field_based_flag */
72
skip_bits
(&h->
gb
, 5);
/* counting_type */
73
full_timestamp_flag =
get_bits
(&h->
gb
, 1);
74
skip_bits
(&h->
gb
, 1);
/* discontinuity_flag */
75
skip_bits
(&h->
gb
, 1);
/* cnt_dropped_flag */
76
skip_bits
(&h->
gb
, 8);
/* n_frames */
77
if
(full_timestamp_flag) {
78
skip_bits
(&h->
gb
, 6);
/* seconds_value 0..59 */
79
skip_bits
(&h->
gb
, 6);
/* minutes_value 0..59 */
80
skip_bits
(&h->
gb
, 5);
/* hours_value 0..23 */
81
}
else
{
82
if
(
get_bits
(&h->
gb
, 1)) {
/* seconds_flag */
83
skip_bits
(&h->
gb
, 6);
/* seconds_value range 0..59 */
84
if
(
get_bits
(&h->
gb
, 1)) {
/* minutes_flag */
85
skip_bits
(&h->
gb
, 6);
/* minutes_value 0..59 */
86
if
(
get_bits
(&h->
gb
, 1))
/* hours_flag */
87
skip_bits
(&h->
gb
, 5);
/* hours_value 0..23 */
88
}
89
}
90
}
91
if
(h->
sps
.
time_offset_length
> 0)
92
skip_bits
(&h->
gb
,
93
h->
sps
.
time_offset_length
);
/* time_offset */
94
}
95
}
96
97
if
(h->
avctx
->
debug
&
FF_DEBUG_PICT_INFO
)
98
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"ct_type:%X pic_struct:%d\n"
,
99
h->
sei_ct_type
, h->
sei_pic_struct
);
100
}
101
return
0;
102
}
103
104
static
int
decode_unregistered_user_data
(
H264Context
*h,
int
size
)
105
{
106
uint8_t
user_data[16 + 256];
107
int
e, build, i;
108
109
if
(size < 16)
110
return
AVERROR_INVALIDDATA
;
111
112
for
(i = 0; i <
sizeof
(user_data) - 1 && i < size; i++)
113
user_data[i] =
get_bits
(&h->
gb
, 8);
114
115
user_data[i] = 0;
116
e = sscanf(user_data + 16,
"x264 - core %d"
, &build);
117
if
(e == 1 && build > 0)
118
h->
x264_build
= build;
119
120
if
(h->
avctx
->
debug
&
FF_DEBUG_BUGS
)
121
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"user data:\"%s\"\n"
, user_data + 16);
122
123
for
(; i <
size
; i++)
124
skip_bits
(&h->
gb
, 8);
125
126
return
0;
127
}
128
129
static
int
decode_recovery_point
(
H264Context
*h)
130
{
131
h->
sei_recovery_frame_cnt
=
get_ue_golomb
(&h->
gb
);
132
133
/* 1b exact_match_flag,
134
* 1b broken_link_flag,
135
* 2b changing_slice_group_idc */
136
skip_bits
(&h->
gb
, 4);
137
138
return
0;
139
}
140
141
static
int
decode_buffering_period
(
H264Context
*h)
142
{
143
unsigned
int
sps_id;
144
int
sched_sel_idx;
145
SPS
*sps;
146
147
sps_id =
get_ue_golomb_31
(&h->
gb
);
148
if
(sps_id > 31 || !h->
sps_buffers
[sps_id]) {
149
av_log
(h->
avctx
,
AV_LOG_ERROR
,
150
"non-existing SPS %d referenced in buffering period\n"
, sps_id);
151
return
AVERROR_INVALIDDATA
;
152
}
153
sps = h->
sps_buffers
[sps_id];
154
155
// NOTE: This is really so duplicated in the standard... See H.264, D.1.1
156
if
(sps->
nal_hrd_parameters_present_flag
) {
157
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
158
h->
initial_cpb_removal_delay
[sched_sel_idx] =
159
get_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
160
// initial_cpb_removal_delay_offset
161
skip_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
162
}
163
}
164
if
(sps->
vcl_hrd_parameters_present_flag
) {
165
for
(sched_sel_idx = 0; sched_sel_idx < sps->
cpb_cnt
; sched_sel_idx++) {
166
h->
initial_cpb_removal_delay
[sched_sel_idx] =
167
get_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
168
// initial_cpb_removal_delay_offset
169
skip_bits
(&h->
gb
, sps->
initial_cpb_removal_delay_length
);
170
}
171
}
172
173
h->
sei_buffering_period_present
= 1;
174
return
0;
175
}
176
177
static
int
decode_frame_packing_arrangement
(
H264Context
*h)
178
{
179
get_ue_golomb
(&h->
gb
);
// frame_packing_arrangement_id
180
h->
sei_frame_packing_present
= !
get_bits1
(&h->
gb
);
181
182
if
(h->
sei_frame_packing_present
) {
183
h->
frame_packing_arrangement_type
=
get_bits
(&h->
gb
, 7);
184
h->
quincunx_subsampling
=
get_bits1
(&h->
gb
);
185
h->
content_interpretation_type
=
get_bits
(&h->
gb
, 6);
186
187
// the following skips: spatial_flipping_flag, frame0_flipped_flag,
188
// field_views_flag, current_frame_is_frame0_flag,
189
// frame0_self_contained_flag, frame1_self_contained_flag
190
skip_bits
(&h->
gb
, 6);
191
192
if
(!h->
quincunx_subsampling
&& h->
frame_packing_arrangement_type
!= 5)
193
skip_bits
(&h->
gb
, 16);
// frame[01]_grid_position_[xy]
194
skip_bits
(&h->
gb
, 8);
// frame_packing_arrangement_reserved_byte
195
get_ue_golomb
(&h->
gb
);
// frame_packing_arrangement_repetition_period
196
}
197
skip_bits1
(&h->
gb
);
// frame_packing_arrangement_extension_flag
198
199
return
0;
200
}
201
202
int
ff_h264_decode_sei
(
H264Context
*h)
203
{
204
while
(
get_bits_left
(&h->
gb
) > 16) {
205
int
size
= 0;
206
int
type = 0;
207
int
ret = 0;
208
209
do
210
type +=
show_bits
(&h->
gb
, 8);
211
while
(
get_bits
(&h->
gb
, 8) == 255);
212
213
do
214
size +=
show_bits
(&h->
gb
, 8);
215
while
(
get_bits
(&h->
gb
, 8) == 255);
216
217
if
(size >
get_bits_left
(&h->
gb
) / 8) {
218
av_log
(h->
avctx
,
AV_LOG_ERROR
,
"SEI type %d truncated at %d\n"
,
219
type,
get_bits_left
(&h->
gb
));
220
return
AVERROR_INVALIDDATA
;
221
}
222
223
switch
(type) {
224
case
SEI_TYPE_PIC_TIMING
:
// Picture timing SEI
225
ret =
decode_picture_timing
(h);
226
if
(ret < 0)
227
return
ret;
228
break
;
229
case
SEI_TYPE_USER_DATA_UNREGISTERED
:
230
ret =
decode_unregistered_user_data
(h, size);
231
if
(ret < 0)
232
return
ret;
233
break
;
234
case
SEI_TYPE_RECOVERY_POINT
:
235
ret =
decode_recovery_point
(h);
236
if
(ret < 0)
237
return
ret;
238
break
;
239
case
SEI_TYPE_BUFFERING_PERIOD
:
240
ret =
decode_buffering_period
(h);
241
if
(ret < 0)
242
return
ret;
243
break
;
244
case
SEI_TYPE_FRAME_PACKING
:
245
ret =
decode_frame_packing_arrangement
(h);
246
if
(ret < 0)
247
return
ret;
248
break
;
249
default
:
250
av_log
(h->
avctx
,
AV_LOG_DEBUG
,
"unknown SEI type %d\n"
, type);
251
skip_bits
(&h->
gb
, 8 * size);
252
}
253
254
// FIXME check bits here
255
align_get_bits
(&h->
gb
);
256
}
257
258
return
0;
259
}
Generated on Thu Sep 30 2021 23:03:11 for Libav by
1.8.1.2