Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
VLC
Manage
Activity
Members
Labels
Plan
Issues
4k
Issue boards
Milestones
Code
Merge requests
454
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Analyze
Contributor analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
VideoLAN
VLC
Commits
d7526718
Commit
d7526718
authored
10 years ago
by
François Cartegnie
Browse files
Options
Downloads
Patches
Plain Diff
packetizer: h264: parse vui and timing info
Extract frame duration and interlacing
parent
918f4453
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
modules/packetizer/h264.c
+106
-0
106 additions, 0 deletions
modules/packetizer/h264.c
with
106 additions
and
0 deletions
modules/packetizer/h264.c
+
106
−
0
View file @
d7526718
...
...
@@ -117,6 +117,17 @@ struct decoder_sys_t
/* Value from Picture Parameter Set */
int
i_pic_order_present_flag
;
/* VUI */
bool
b_timing_info_present_flag
;
uint32_t
i_num_units_in_tick
;
uint32_t
i_time_scale
;
bool
b_fixed_frame_rate
;
bool
b_pic_struct_present_flag
;
uint8_t
i_pic_struct
;
bool
b_cpb_dpb_delays_present_flag
;
uint8_t
i_cpb_removal_delay_length_minus1
;
uint8_t
i_dpb_output_delay_length_minus1
;
/* Useful values of the Slice Header */
slice_t
slice
;
...
...
@@ -151,6 +162,7 @@ enum nal_unit_type_e
/* Defined in H.264 annex D */
enum
sei_type_e
{
SEI_PIC_TIMING
=
1
,
SEI_USER_DATA_REGISTERED
=
4
,
SEI_RECOVERY_POINT
=
6
};
...
...
@@ -231,6 +243,12 @@ static int Open( vlc_object_t *p_this )
p_sys
->
slice
.
i_pic_order_cnt_lsb
=
-
1
;
p_sys
->
slice
.
i_delta_pic_order_cnt_bottom
=
-
1
;
p_sys
->
b_timing_info_present_flag
=
false
;
p_sys
->
b_pic_struct_present_flag
=
false
;
p_sys
->
b_cpb_dpb_delays_present_flag
=
false
;
p_sys
->
i_cpb_removal_delay_length_minus1
=
0
;
p_sys
->
i_dpb_output_delay_length_minus1
=
0
;
p_sys
->
i_frame_dts
=
VLC_TS_INVALID
;
p_sys
->
i_frame_pts
=
VLC_TS_INVALID
;
...
...
@@ -946,6 +964,71 @@ static void PutSPS( decoder_t *p_dec, block_t *p_frag )
p_dec
->
fmt_out
.
video
.
i_sar_den
=
1
;
}
}
/* overscan */
i_tmp
=
bs_read
(
&
s
,
1
);
if
(
i_tmp
)
bs_read
(
&
s
,
1
);
/* video signal type */
i_tmp
=
bs_read
(
&
s
,
1
);
if
(
i_tmp
)
{
bs_read
(
&
s
,
4
);
/* colour desc */
bs_read
(
&
s
,
1
);
if
(
i_tmp
)
bs_read
(
&
s
,
24
);
}
/* chroma loc info */
i_tmp
=
bs_read
(
&
s
,
1
);
if
(
i_tmp
)
{
bs_read_ue
(
&
s
);
bs_read_ue
(
&
s
);
}
/* timing info */
p_sys
->
b_timing_info_present_flag
=
bs_read
(
&
s
,
1
);
if
(
p_sys
->
b_timing_info_present_flag
)
{
p_sys
->
i_num_units_in_tick
=
bs_read
(
&
s
,
32
);
p_sys
->
i_time_scale
=
bs_read
(
&
s
,
32
);
p_sys
->
b_fixed_frame_rate
=
bs_read
(
&
s
,
1
);
}
/* Nal hrd & VC1 hrd parameters */
p_sys
->
b_cpb_dpb_delays_present_flag
=
false
;
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
i_tmp
=
bs_read
(
&
s
,
1
);
if
(
i_tmp
)
{
p_sys
->
b_cpb_dpb_delays_present_flag
=
true
;
uint32_t
count
=
bs_read_ue
(
&
s
)
+
1
;
bs_read
(
&
s
,
4
);
bs_read
(
&
s
,
4
);
for
(
uint32_t
i
=
0
;
i
<
count
;
i
++
)
{
bs_read_ue
(
&
s
);
bs_read_ue
(
&
s
);
bs_read
(
&
s
,
1
);
}
bs_read
(
&
s
,
5
);
p_sys
->
i_cpb_removal_delay_length_minus1
=
bs_read
(
&
s
,
5
);
p_sys
->
i_dpb_output_delay_length_minus1
=
bs_read
(
&
s
,
5
);
bs_read
(
&
s
,
5
);
}
}
if
(
p_sys
->
b_cpb_dpb_delays_present_flag
)
bs_read
(
&
s
,
1
);
/* pic struct info */
p_sys
->
b_pic_struct_present_flag
=
bs_read
(
&
s
,
1
);
/* + unparsed remains */
}
free
(
pb_dec
);
...
...
@@ -1136,6 +1219,29 @@ static void ParseSei( decoder_t *p_dec, block_t *p_frag )
if
(
i_used
+
i_size
+
1
>
i_dec
)
break
;
/* Look for pic timing */
if
(
i_type
==
SEI_PIC_TIMING
)
{
bs_t
s
;
const
int
i_tim
=
i_size
;
const
uint8_t
*
p_tim
=
&
pb_dec
[
i_used
];
bs_init
(
&
s
,
p_tim
,
i_tim
);
if
(
p_sys
->
b_cpb_dpb_delays_present_flag
)
{
bs_read
(
&
s
,
p_sys
->
i_cpb_removal_delay_length_minus1
+
1
);
bs_read
(
&
s
,
p_sys
->
i_dpb_output_delay_length_minus1
+
1
);
}
if
(
p_sys
->
b_pic_struct_present_flag
)
{
p_sys
->
i_pic_struct
=
bs_read
(
&
s
,
4
);
msg_Err
(
p_dec
,
"PIC STRUCT %d"
,
p_sys
->
i_pic_struct
);
}
/* + unparsed remains */
}
/* Look for user_data_registered_itu_t_t35 */
if
(
i_type
==
SEI_USER_DATA_REGISTERED
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment