Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
a0e20c60
Commit
a0e20c60
authored
Dec 17, 2015
by
Francois Cartegnie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
packetizer: hevc: convert all parsers to handle ep3b input
parent
ada921a4
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
54 additions
and
64 deletions
+54
-64
modules/demux/mpeg/hevc.c
modules/demux/mpeg/hevc.c
+5
-6
modules/packetizer/hevc_nal.c
modules/packetizer/hevc_nal.c
+42
-52
modules/packetizer/hevc_nal.h
modules/packetizer/hevc_nal.h
+7
-6
No files found.
modules/demux/mpeg/hevc.c
View file @
a0e20c60
...
@@ -256,15 +256,14 @@ static int32_t getFPS(demux_t *p_demux, uint8_t i_nal_type, block_t *p_block)
...
@@ -256,15 +256,14 @@ static int32_t getFPS(demux_t *p_demux, uint8_t i_nal_type, block_t *p_block)
if
(
p_sys
->
rgp_vps
[
i_id
]
&&
i_nal_type
==
HEVC_NAL_VPS
)
if
(
p_sys
->
rgp_vps
[
i_id
]
&&
i_nal_type
==
HEVC_NAL_VPS
)
return
-
1
;
return
-
1
;
size_t
i_rbsp
;
const
uint8_t
*
p_nald
=
p_block
->
p_buffer
;
uint8_t
*
p_rbsp
=
hxxx_AnnexB_NAL_to_rbsp
(
p_block
->
p_buffer
,
p_block
->
i_buffer
,
&
i_rbsp
)
;
size_t
i_nald
=
p_block
->
i_buffer
;
if
(
p_rbsp
)
if
(
hxxx_strip_AnnexB_startcode
(
&
p_nald
,
&
i_nald
)
)
{
{
if
(
i_nal_type
==
HEVC_NAL_VPS
)
if
(
i_nal_type
==
HEVC_NAL_VPS
)
p_sys
->
rgp_vps
[
i_id
]
=
hevc_
rbsp_decode_vps
(
p_rbsp
,
i_rbsp
);
p_sys
->
rgp_vps
[
i_id
]
=
hevc_
decode_vps
(
p_nald
,
i_nald
,
true
);
else
else
p_sps
=
hevc_rbsp_decode_sps
(
p_rbsp
,
i_rbsp
);
p_sps
=
hevc_decode_sps
(
p_nald
,
i_nald
,
true
);
free
(
p_rbsp
);
}
}
if
(
p_sps
)
if
(
p_sps
)
...
...
modules/packetizer/hevc_nal.c
View file @
a0e20c60
...
@@ -663,22 +663,33 @@ void hevc_rbsp_release_vps( hevc_video_parameter_set_t *p_vps )
...
@@ -663,22 +663,33 @@ void hevc_rbsp_release_vps( hevc_video_parameter_set_t *p_vps )
free
(
p_vps
);
free
(
p_vps
);
}
}
hevc_video_parameter_set_t
*
hevc_rbsp_decode_vps
(
const
uint8_t
*
p_buf
,
size_t
i_buf
)
#define IMPL_hevc_generic_decode( name, hevctype, decode, release ) \
{
hevctype * name( const uint8_t *p_buf, size_t i_buf, bool b_escaped ) \
hevc_video_parameter_set_t
*
p_vps
=
calloc
(
1
,
sizeof
(
hevc_video_parameter_set_t
));
{ \
if
(
likely
(
p_vps
))
hevctype *p_hevctype = calloc(1, sizeof(hevctype)); \
{
if(likely(p_hevctype)) \
bs_t
bs
;
{ \
bs_init
(
&
bs
,
p_buf
,
i_buf
);
bs_t bs; \
bs_skip
(
&
bs
,
16
);
/* Skip nal_unit_header */
bs_init( &bs, p_buf, i_buf ); \
if
(
!
hevc_parse_video_parameter_set_rbsp
(
&
bs
,
p_vps
)
)
unsigned i_bitflow = 0; \
{
if( b_escaped ) \
hevc_rbsp_release_vps
(
p_vps
);
{ \
p_vps
=
NULL
;
bs.p_fwpriv = &i_bitflow; \
bs.pf_forward = hxxx_bsfw_ep3b_to_rbsp;
/* Does the emulated 3bytes conversion to rbsp */
\
} \
else (void) i_bitflow;\
bs_skip( &bs, 16 );
/* Skip nal_unit_header */
\
if( !decode( &bs, p_hevctype ) ) \
{ \
release( p_hevctype ); \
p_hevctype = NULL; \
} \
} \
return p_hevctype; \
}
}
}
return
p_vps
;
IMPL_hevc_generic_decode
(
hevc_decode_vps
,
hevc_video_parameter_set_t
,
}
hevc_parse_video_parameter_set_rbsp
,
hevc_rbsp_release_vps
)
static
bool
hevc_parse_st_ref_pic_set
(
bs_t
*
p_bs
,
unsigned
idx
,
static
bool
hevc_parse_st_ref_pic_set
(
bs_t
*
p_bs
,
unsigned
idx
,
unsigned
num_short_term_ref_pic_sets
,
unsigned
num_short_term_ref_pic_sets
,
...
@@ -862,22 +873,8 @@ void hevc_rbsp_release_sps( hevc_sequence_parameter_set_t *p_sps )
...
@@ -862,22 +873,8 @@ void hevc_rbsp_release_sps( hevc_sequence_parameter_set_t *p_sps )
free
(
p_sps
);
free
(
p_sps
);
}
}
hevc_sequence_parameter_set_t
*
hevc_rbsp_decode_sps
(
const
uint8_t
*
p_buf
,
size_t
i_buf
)
IMPL_hevc_generic_decode
(
hevc_decode_sps
,
hevc_sequence_parameter_set_t
,
{
hevc_parse_sequence_parameter_set_rbsp
,
hevc_rbsp_release_sps
)
hevc_sequence_parameter_set_t
*
p_sps
=
calloc
(
1
,
sizeof
(
hevc_sequence_parameter_set_t
));
if
(
likely
(
p_sps
))
{
bs_t
bs
;
bs_init
(
&
bs
,
p_buf
,
i_buf
);
bs_skip
(
&
bs
,
16
);
/* Skip nal_unit_header */
if
(
!
hevc_parse_sequence_parameter_set_rbsp
(
&
bs
,
p_sps
)
)
{
hevc_rbsp_release_sps
(
p_sps
);
p_sps
=
NULL
;
}
}
return
p_sps
;
}
static
bool
hevc_parse_pic_parameter_set_rbsp
(
bs_t
*
p_bs
,
static
bool
hevc_parse_pic_parameter_set_rbsp
(
bs_t
*
p_bs
,
hevc_picture_parameter_set_t
*
p_pps
)
hevc_picture_parameter_set_t
*
p_pps
)
...
@@ -976,22 +973,8 @@ void hevc_rbsp_release_pps( hevc_picture_parameter_set_t *p_pps )
...
@@ -976,22 +973,8 @@ void hevc_rbsp_release_pps( hevc_picture_parameter_set_t *p_pps )
free
(
p_pps
);
free
(
p_pps
);
}
}
hevc_picture_parameter_set_t
*
hevc_rbsp_decode_pps
(
const
uint8_t
*
p_buf
,
size_t
i_buf
)
IMPL_hevc_generic_decode
(
hevc_decode_pps
,
hevc_picture_parameter_set_t
,
{
hevc_parse_pic_parameter_set_rbsp
,
hevc_rbsp_release_pps
)
hevc_picture_parameter_set_t
*
p_pps
=
calloc
(
1
,
sizeof
(
hevc_picture_parameter_set_t
));
if
(
likely
(
p_pps
))
{
bs_t
bs
;
bs_init
(
&
bs
,
p_buf
,
i_buf
);
bs_skip
(
&
bs
,
16
);
/* Skip nal_unit_header */
if
(
!
hevc_parse_pic_parameter_set_rbsp
(
&
bs
,
p_pps
)
)
{
hevc_rbsp_release_pps
(
p_pps
);
p_pps
=
NULL
;
}
}
return
p_pps
;
}
bool
hevc_get_picture_size
(
const
hevc_sequence_parameter_set_t
*
p_sps
,
bool
hevc_get_picture_size
(
const
hevc_sequence_parameter_set_t
*
p_sps
,
unsigned
*
p_w
,
unsigned
*
p_h
,
unsigned
*
p_vw
,
unsigned
*
p_vh
)
unsigned
*
p_w
,
unsigned
*
p_h
,
unsigned
*
p_vw
,
unsigned
*
p_vh
)
...
@@ -1048,8 +1031,8 @@ bool hevc_get_frame_rate( const hevc_sequence_parameter_set_t *p_sps,
...
@@ -1048,8 +1031,8 @@ bool hevc_get_frame_rate( const hevc_sequence_parameter_set_t *p_sps,
static
bool
hevc_parse_slice_segment_header_rbsp
(
bs_t
*
p_bs
,
static
bool
hevc_parse_slice_segment_header_rbsp
(
bs_t
*
p_bs
,
uint8_t
i_nal_type
,
uint8_t
i_nal_type
,
const
hevc_sequence_parameter_set_t
**
pp_sps
,
hevc_sequence_parameter_set_t
**
pp_sps
,
const
hevc_picture_parameter_set_t
**
pp_pps
,
hevc_picture_parameter_set_t
**
pp_pps
,
hevc_slice_segment_header_t
*
p_sl
)
hevc_slice_segment_header_t
*
p_sl
)
{
{
if
(
bs_remain
(
p_bs
)
<
3
)
if
(
bs_remain
(
p_bs
)
<
3
)
...
@@ -1119,9 +1102,9 @@ void hevc_rbsp_release_slice_header( hevc_slice_segment_header_t *p_sh )
...
@@ -1119,9 +1102,9 @@ void hevc_rbsp_release_slice_header( hevc_slice_segment_header_t *p_sh )
free
(
p_sh
);
free
(
p_sh
);
}
}
hevc_slice_segment_header_t
*
hevc_
rbsp_decode_slice_header
(
const
uint8_t
*
p_buf
,
size_t
i_buf
,
hevc_slice_segment_header_t
*
hevc_
decode_slice_header
(
const
uint8_t
*
p_buf
,
size_t
i_buf
,
bool
b_escaped
,
const
hevc_sequence_parameter_set_t
**
pp_sps
,
hevc_sequence_parameter_set_t
**
pp_sps
,
const
hevc_picture_parameter_set_t
**
pp_pps
)
hevc_picture_parameter_set_t
**
pp_pps
)
{
{
if
(
!
pp_sps
||
!
pp_pps
)
if
(
!
pp_sps
||
!
pp_pps
)
return
NULL
;
return
NULL
;
...
@@ -1132,6 +1115,13 @@ hevc_slice_segment_header_t * hevc_rbsp_decode_slice_header( const uint8_t *p_bu
...
@@ -1132,6 +1115,13 @@ hevc_slice_segment_header_t * hevc_rbsp_decode_slice_header( const uint8_t *p_bu
uint8_t
i_nal_type
=
((
p_buf
[
0
]
&
0x7E
)
>>
1
);
uint8_t
i_nal_type
=
((
p_buf
[
0
]
&
0x7E
)
>>
1
);
bs_t
bs
;
bs_t
bs
;
bs_init
(
&
bs
,
p_buf
,
i_buf
);
bs_init
(
&
bs
,
p_buf
,
i_buf
);
unsigned
i_bitflow
=
0
;
if
(
b_escaped
)
{
bs
.
p_fwpriv
=
&
i_bitflow
;
bs
.
pf_forward
=
hxxx_bsfw_ep3b_to_rbsp
;
/* Does the emulated 3bytes conversion to rbsp */
}
else
(
void
)
i_bitflow
;
bs_skip
(
&
bs
,
16
);
/* Skip nal_unit_header */
bs_skip
(
&
bs
,
16
);
/* Skip nal_unit_header */
if
(
!
hevc_parse_slice_segment_header_rbsp
(
&
bs
,
i_nal_type
,
pp_sps
,
pp_pps
,
p_sh
)
)
if
(
!
hevc_parse_slice_segment_header_rbsp
(
&
bs
,
i_nal_type
,
pp_sps
,
pp_pps
,
p_sh
)
)
{
{
...
...
modules/packetizer/hevc_nal.h
View file @
a0e20c60
...
@@ -141,12 +141,13 @@ typedef struct hevc_sequence_parameter_set_t hevc_sequence_parameter_set_t;
...
@@ -141,12 +141,13 @@ typedef struct hevc_sequence_parameter_set_t hevc_sequence_parameter_set_t;
typedef
struct
hevc_picture_parameter_set_t
hevc_picture_parameter_set_t
;
typedef
struct
hevc_picture_parameter_set_t
hevc_picture_parameter_set_t
;
typedef
struct
hevc_slice_segment_header_t
hevc_slice_segment_header_t
;
typedef
struct
hevc_slice_segment_header_t
hevc_slice_segment_header_t
;
hevc_video_parameter_set_t
*
hevc_rbsp_decode_vps
(
const
uint8_t
*
,
size_t
)
VLC_USED
;
/* Decodes from three bytes emulation prevented or rbsp stream */
hevc_sequence_parameter_set_t
*
hevc_rbsp_decode_sps
(
const
uint8_t
*
,
size_t
)
VLC_USED
;
hevc_video_parameter_set_t
*
hevc_decode_vps
(
const
uint8_t
*
,
size_t
,
bool
);
hevc_picture_parameter_set_t
*
hevc_rbsp_decode_pps
(
const
uint8_t
*
,
size_t
)
VLC_USED
;
hevc_sequence_parameter_set_t
*
hevc_decode_sps
(
const
uint8_t
*
,
size_t
,
bool
);
hevc_slice_segment_header_t
*
hevc_rbsp_decode_slice_header
(
const
uint8_t
*
,
size_t
,
hevc_picture_parameter_set_t
*
hevc_decode_pps
(
const
uint8_t
*
,
size_t
,
bool
);
const
hevc_sequence_parameter_set_t
**
pp_sps
/* HEVC_MAX_SPS */
,
hevc_slice_segment_header_t
*
hevc_decode_slice_header
(
const
uint8_t
*
,
size_t
,
bool
,
const
hevc_picture_parameter_set_t
**
pp_pps
/* HEVC_MAX_PPS */
)
VLC_USED
;
hevc_sequence_parameter_set_t
**
pp_sps
/* HEVC_MAX_SPS */
,
hevc_picture_parameter_set_t
**
pp_pps
/* HEVC_MAX_PPS */
);
void
hevc_rbsp_release_vps
(
hevc_video_parameter_set_t
*
);
void
hevc_rbsp_release_vps
(
hevc_video_parameter_set_t
*
);
void
hevc_rbsp_release_sps
(
hevc_sequence_parameter_set_t
*
);
void
hevc_rbsp_release_sps
(
hevc_sequence_parameter_set_t
*
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment