vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Mar 29 19:07:58 2017 +0200| [d4b4d137517da6735ae5527053c5e7394799e563] | committer: Francois Cartegnie
packetizer: hevc: keep track of active xPS > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d4b4d137517da6735ae5527053c5e7394799e563 --- modules/packetizer/hevc.c | 57 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/modules/packetizer/hevc.c b/modules/packetizer/hevc.c index 390a16f..095296e 100644 --- a/modules/packetizer/hevc.c +++ b/modules/packetizer/hevc.c @@ -86,6 +86,9 @@ struct decoder_sys_t hevc_video_parameter_set_t *rgi_p_decvps[HEVC_VPS_ID_MAX + 1]; hevc_sequence_parameter_set_t *rgi_p_decsps[HEVC_SPS_ID_MAX + 1]; hevc_picture_parameter_set_t *rgi_p_decpps[HEVC_PPS_ID_MAX + 1]; + const hevc_video_parameter_set_t *p_active_vps; + const hevc_sequence_parameter_set_t *p_active_sps; + const hevc_picture_parameter_set_t *p_active_pps; bool b_init_sequence_complete; /* */ @@ -307,6 +310,7 @@ static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, const block_t *p_nalb) { decoder_sys_t *p_sys = p_dec->p_sys; + bool b_active = false; switch(i_nal_type) { @@ -330,16 +334,31 @@ static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, if(i_nal_type == HEVC_NAL_SPS && p_sys->rgi_p_decsps[i_id]) { hevc_rbsp_release_sps(p_sys->rgi_p_decsps[i_id]); + if(p_sys->p_active_sps == p_sys->rgi_p_decsps[i_id]) + { + p_sys->p_active_sps = NULL; + b_active = true; + } p_sys->rgi_p_decsps[i_id] = NULL; } else if(i_nal_type == HEVC_NAL_PPS && p_sys->rgi_p_decpps[i_id]) { hevc_rbsp_release_pps(p_sys->rgi_p_decpps[i_id]); + if(p_sys->p_active_pps == p_sys->rgi_p_decpps[i_id]) + { + p_sys->p_active_pps = NULL; + b_active = true; + } p_sys->rgi_p_decpps[i_id] = NULL; } else if(i_nal_type == HEVC_NAL_VPS && p_sys->rgi_p_decvps[i_id]) { hevc_rbsp_release_vps(p_sys->rgi_p_decvps[i_id]); + if(p_sys->p_active_vps == p_sys->rgi_p_decvps[i_id]) + { + p_sys->p_active_vps = NULL; + b_active = true; + } p_sys->rgi_p_decvps[i_id] = NULL; } @@ -356,6 +375,8 @@ static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, msg_Err(p_dec, "Failed decoding SPS id %d", i_id); return false; } + if(b_active) + p_sys->p_active_sps = p_sys->rgi_p_decsps[i_id]; } else if(i_nal_type == HEVC_NAL_PPS) { @@ -365,6 +386,8 @@ static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, msg_Err(p_dec, "Failed decoding PPS id %d", i_id); return false; } + if(b_active) + p_sys->p_active_pps = p_sys->rgi_p_decpps[i_id]; } else if(i_nal_type == HEVC_NAL_VPS) { @@ -374,6 +397,8 @@ static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, msg_Err(p_dec, "Failed decoding VPS id %d", i_id); return false; } + if(b_active) + p_sys->p_active_vps = p_sys->rgi_p_decvps[i_id]; } return true; @@ -402,6 +427,17 @@ static bool XPSReady(decoder_sys_t *p_sys) return false; } +static void ActivateSets(decoder_t *p_dec, + const hevc_picture_parameter_set_t *p_pps, + const hevc_sequence_parameter_set_t *p_sps, + const hevc_video_parameter_set_t *p_vps) +{ + decoder_sys_t *p_sys = p_dec->p_sys; + p_sys->p_active_pps = p_pps; + p_sys->p_active_sps = p_sps; + p_sys->p_active_vps = p_vps; +} + static void GetXPSSet(uint8_t i_pps_id, void *priv, hevc_picture_parameter_set_t **pp_pps, hevc_sequence_parameter_set_t **pp_sps, @@ -439,6 +475,17 @@ static block_t *ParseVCL(decoder_t *p_dec, uint8_t i_nal_type, block_t *p_frag) p_outputchain = OutputQueues(p_sys, p_sys->b_init_sequence_complete); } + hevc_slice_segment_header_t *p_sli = hevc_decode_slice_header(p_buffer, i_buffer, true, + GetXPSSet, p_sys); + if(p_sli && i_layer == 0) + { + hevc_sequence_parameter_set_t *p_sps; + hevc_picture_parameter_set_t *p_pps; + hevc_video_parameter_set_t *p_vps; + GetXPSSet(hevc_get_slice_pps_id(p_sli), p_sys, &p_pps, &p_sps, &p_vps); + ActivateSets(p_dec, p_pps, p_sps, p_vps); + } + switch(i_nal_type) { case HEVC_NAL_BLA_W_LP: @@ -452,24 +499,24 @@ static block_t *ParseVCL(decoder_t *p_dec, uint8_t i_nal_type, block_t *p_frag) default: { - hevc_slice_segment_header_t *p_sli = hevc_decode_slice_header( p_buffer, i_buffer, true, - GetXPSSet, p_sys ); - if( p_sli ) + if(p_sli) { enum hevc_slice_type_e type; - if( hevc_get_slice_type( p_sli, &type ) ) + if(hevc_get_slice_type( p_sli, &type )) { if( type == HEVC_SLICE_TYPE_P ) p_frag->i_flags |= BLOCK_FLAG_TYPE_P; else p_frag->i_flags |= BLOCK_FLAG_TYPE_B; } - hevc_rbsp_release_slice_header( p_sli ); } else p_frag->i_flags |= BLOCK_FLAG_TYPE_B; } break; } + + if(p_sli) + hevc_rbsp_release_slice_header(p_sli); } if(!p_sys->b_init_sequence_complete && i_layer == 0 && _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
