[vlc-commits] packetizer: hevc: convert all parsers to handle ep3b input
Francois Cartegnie
git at videolan.org
Thu Dec 17 17:31:10 CET 2015
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Dec 17 17:27:43 2015 +0100| [a0e20c607d937c550fa3a73715277af940e22e51] | committer: Francois Cartegnie
packetizer: hevc: convert all parsers to handle ep3b input
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a0e20c607d937c550fa3a73715277af940e22e51
---
modules/demux/mpeg/hevc.c | 11 +++--
modules/packetizer/hevc_nal.c | 94 ++++++++++++++++++-----------------------
modules/packetizer/hevc_nal.h | 13 +++---
3 files changed, 54 insertions(+), 64 deletions(-)
diff --git a/modules/demux/mpeg/hevc.c b/modules/demux/mpeg/hevc.c
index b984d25..b3a2c8b 100644
--- a/modules/demux/mpeg/hevc.c
+++ b/modules/demux/mpeg/hevc.c
@@ -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 )
return -1;
- size_t i_rbsp;
- uint8_t *p_rbsp = hxxx_AnnexB_NAL_to_rbsp( p_block->p_buffer, p_block->i_buffer, &i_rbsp );
- if( p_rbsp )
+ const uint8_t *p_nald = p_block->p_buffer;
+ size_t i_nald = p_block->i_buffer;
+ if( hxxx_strip_AnnexB_startcode( &p_nald, &i_nald ) )
{
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
- p_sps = hevc_rbsp_decode_sps( p_rbsp, i_rbsp );
- free( p_rbsp );
+ p_sps = hevc_decode_sps( p_nald, i_nald, true );
}
if( p_sps )
diff --git a/modules/packetizer/hevc_nal.c b/modules/packetizer/hevc_nal.c
index 8ea8ea9..caf2a67 100644
--- a/modules/packetizer/hevc_nal.c
+++ b/modules/packetizer/hevc_nal.c
@@ -663,22 +663,33 @@ void hevc_rbsp_release_vps( hevc_video_parameter_set_t *p_vps )
free( p_vps );
}
-hevc_video_parameter_set_t * hevc_rbsp_decode_vps( const uint8_t *p_buf, size_t i_buf )
-{
- hevc_video_parameter_set_t *p_vps = calloc(1, sizeof(hevc_video_parameter_set_t));
- if(likely(p_vps))
- {
- bs_t bs;
- bs_init( &bs, p_buf, i_buf );
- bs_skip( &bs, 16 ); /* Skip nal_unit_header */
- if( !hevc_parse_video_parameter_set_rbsp( &bs, p_vps ) )
- {
- hevc_rbsp_release_vps( p_vps );
- p_vps = NULL;
- }
+#define IMPL_hevc_generic_decode( name, hevctype, decode, release ) \
+ hevctype * name( const uint8_t *p_buf, size_t i_buf, bool b_escaped ) \
+ { \
+ hevctype *p_hevctype = calloc(1, sizeof(hevctype)); \
+ if(likely(p_hevctype)) \
+ { \
+ bs_t bs; \
+ 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 */ \
+ 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,
unsigned num_short_term_ref_pic_sets,
@@ -862,22 +873,8 @@ void hevc_rbsp_release_sps( hevc_sequence_parameter_set_t *p_sps )
free( p_sps );
}
-hevc_sequence_parameter_set_t * hevc_rbsp_decode_sps( const uint8_t *p_buf, size_t i_buf )
-{
- 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;
-}
+IMPL_hevc_generic_decode( hevc_decode_sps, hevc_sequence_parameter_set_t,
+ hevc_parse_sequence_parameter_set_rbsp, hevc_rbsp_release_sps )
static bool hevc_parse_pic_parameter_set_rbsp( bs_t *p_bs,
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 );
}
-hevc_picture_parameter_set_t * hevc_rbsp_decode_pps( const uint8_t *p_buf, size_t i_buf )
-{
- 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;
-}
+IMPL_hevc_generic_decode( hevc_decode_pps, hevc_picture_parameter_set_t,
+ hevc_parse_pic_parameter_set_rbsp, hevc_rbsp_release_pps )
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 )
@@ -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,
uint8_t i_nal_type,
- const hevc_sequence_parameter_set_t **pp_sps,
- const hevc_picture_parameter_set_t **pp_pps,
+ hevc_sequence_parameter_set_t **pp_sps,
+ hevc_picture_parameter_set_t **pp_pps,
hevc_slice_segment_header_t *p_sl )
{
if( bs_remain( p_bs ) < 3 )
@@ -1119,9 +1102,9 @@ void hevc_rbsp_release_slice_header( hevc_slice_segment_header_t *p_sh )
free( p_sh );
}
-hevc_slice_segment_header_t * hevc_rbsp_decode_slice_header( const uint8_t *p_buf, size_t i_buf,
- const hevc_sequence_parameter_set_t **pp_sps,
- const hevc_picture_parameter_set_t **pp_pps )
+hevc_slice_segment_header_t * hevc_decode_slice_header( const uint8_t *p_buf, size_t i_buf, bool b_escaped,
+ hevc_sequence_parameter_set_t **pp_sps,
+ hevc_picture_parameter_set_t **pp_pps )
{
if(!pp_sps || !pp_pps)
return NULL;
@@ -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);
bs_t bs;
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 */
if( !hevc_parse_slice_segment_header_rbsp( &bs, i_nal_type, pp_sps, pp_pps, p_sh ) )
{
diff --git a/modules/packetizer/hevc_nal.h b/modules/packetizer/hevc_nal.h
index a3c256b..5829905 100644
--- a/modules/packetizer/hevc_nal.h
+++ b/modules/packetizer/hevc_nal.h
@@ -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_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;
-hevc_sequence_parameter_set_t * hevc_rbsp_decode_sps( const uint8_t *, size_t ) VLC_USED;
-hevc_picture_parameter_set_t * hevc_rbsp_decode_pps( const uint8_t *, size_t ) VLC_USED;
-hevc_slice_segment_header_t * hevc_rbsp_decode_slice_header( const uint8_t *, size_t,
- const hevc_sequence_parameter_set_t **pp_sps/* HEVC_MAX_SPS */,
- const hevc_picture_parameter_set_t **pp_pps /* HEVC_MAX_PPS */) VLC_USED;
+/* Decodes from three bytes emulation prevented or rbsp stream */
+hevc_video_parameter_set_t * hevc_decode_vps( const uint8_t *, size_t, bool );
+hevc_sequence_parameter_set_t * hevc_decode_sps( const uint8_t *, size_t, bool );
+hevc_picture_parameter_set_t * hevc_decode_pps( const uint8_t *, size_t, bool );
+hevc_slice_segment_header_t * hevc_decode_slice_header( const uint8_t *, size_t, bool,
+ 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_sps( hevc_sequence_parameter_set_t * );
More information about the vlc-commits
mailing list