vlc/vlc-3.0 | branch: master | Francois Cartegnie <[email protected]> | Tue Jan 16 19:00:12 2018 +0100| [b69550122173930e6320ecce8a7408107440aeb5] | committer: Jean-Baptiste Kempf
packetizer: hevc: rework storage (cherry picked from commit 23be3d9a4654c1e18d13c30ddedf463ee1f1562f) Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=b69550122173930e6320ecce8a7408107440aeb5 --- modules/packetizer/hevc.c | 154 +++++++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 70 deletions(-) diff --git a/modules/packetizer/hevc.c b/modules/packetizer/hevc.c index 6f7c4b945b..9e22003144 100644 --- a/modules/packetizer/hevc.c +++ b/modules/packetizer/hevc.c @@ -85,9 +85,15 @@ struct decoder_sys_t } frame, pre, post; uint8_t i_nal_length_size; - 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]; + + struct + { + block_t *p_nal; + void *p_decoded; + } rg_vps[HEVC_VPS_ID_MAX + 1], + rg_sps[HEVC_SPS_ID_MAX + 1], + rg_pps[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; @@ -253,20 +259,26 @@ static void Close(vlc_object_t *p_this) for(unsigned i=0;i<=HEVC_PPS_ID_MAX; i++) { - if(p_sys->rgi_p_decpps[i]) - hevc_rbsp_release_pps(p_sys->rgi_p_decpps[i]); + if(p_sys->rg_pps[i].p_decoded) + hevc_rbsp_release_pps(p_sys->rg_pps[i].p_decoded); + if(p_sys->rg_pps[i].p_nal) + block_Release(p_sys->rg_pps[i].p_nal); } for(unsigned i=0;i<=HEVC_SPS_ID_MAX; i++) { - if(p_sys->rgi_p_decsps[i]) - hevc_rbsp_release_sps(p_sys->rgi_p_decsps[i]); + if(p_sys->rg_sps[i].p_decoded) + hevc_rbsp_release_sps(p_sys->rg_sps[i].p_decoded); + if(p_sys->rg_sps[i].p_nal) + block_Release(p_sys->rg_sps[i].p_nal); } for(unsigned i=0;i<=HEVC_VPS_ID_MAX; i++) { - if(p_sys->rgi_p_decvps[i]) - hevc_rbsp_release_vps(p_sys->rgi_p_decvps[i]); + if(p_sys->rg_vps[i].p_decoded) + hevc_rbsp_release_vps(p_sys->rg_vps[i].p_decoded); + if(p_sys->rg_vps[i].p_nal) + block_Release(p_sys->rg_vps[i].p_nal); } hevc_release_sei_pic_timing( p_sys->p_timing ); @@ -332,56 +344,56 @@ 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; + void **pp_decoded; + block_t **pp_nal; switch(i_nal_type) { case HEVC_NAL_VPS: if(i_id > HEVC_VPS_ID_MAX) return false; + pp_decoded = &p_sys->rg_vps[i_id].p_decoded; + pp_nal = &p_sys->rg_vps[i_id].p_nal; break; case HEVC_NAL_SPS: if(i_id > HEVC_SPS_ID_MAX) return false; + pp_decoded = &p_sys->rg_sps[i_id].p_decoded; + pp_nal = &p_sys->rg_sps[i_id].p_nal; break; case HEVC_NAL_PPS: if(i_id > HEVC_PPS_ID_MAX) return false; + pp_decoded = &p_sys->rg_pps[i_id].p_decoded; + pp_nal = &p_sys->rg_pps[i_id].p_nal; break; default: return false; } /* Free associated decoded version */ - 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]) + if(*pp_decoded) { - hevc_rbsp_release_pps(p_sys->rgi_p_decpps[i_id]); - if(p_sys->p_active_pps == p_sys->rgi_p_decpps[i_id]) + switch(i_nal_type) { - p_sys->p_active_pps = NULL; - b_active = true; + case HEVC_NAL_VPS: + hevc_rbsp_release_vps(*pp_decoded); + break; + case HEVC_NAL_SPS: + hevc_rbsp_release_sps(*pp_decoded); + break; + case HEVC_NAL_PPS: + hevc_rbsp_release_pps(*pp_decoded); + break; } - p_sys->rgi_p_decpps[i_id] = NULL; + *pp_decoded = NULL; } - else if(i_nal_type == HEVC_NAL_VPS && p_sys->rgi_p_decvps[i_id]) + + /* Free raw stored version */ + if(*pp_nal) { - 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; + block_Release(*pp_nal); + *pp_nal = NULL; } const uint8_t *p_buffer = p_nalb->p_buffer; @@ -389,41 +401,43 @@ static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, if( hxxx_strip_AnnexB_startcode( &p_buffer, &i_buffer ) ) { /* Create decoded entries */ - if(i_nal_type == HEVC_NAL_SPS) - { - p_sys->rgi_p_decsps[i_id] = hevc_decode_sps(p_buffer, i_buffer, true); - if(!p_sys->rgi_p_decsps[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) + switch(i_nal_type) { - p_sys->rgi_p_decpps[i_id] = hevc_decode_pps(p_buffer, i_buffer, true); - if(!p_sys->rgi_p_decpps[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]; + case HEVC_NAL_SPS: + *pp_decoded = hevc_decode_sps(p_buffer, i_buffer, true); + if(!*pp_decoded) + { + msg_Err(p_dec, "Failed decoding SPS id %d", i_id); + return false; + } + break; + case HEVC_NAL_PPS: + *pp_decoded = hevc_decode_pps(p_buffer, i_buffer, true); + if(!*pp_decoded) + { + msg_Err(p_dec, "Failed decoding PPS id %d", i_id); + return false; + } + break; + case HEVC_NAL_VPS: + *pp_decoded = hevc_decode_vps(p_buffer, i_buffer, true); + if(!*pp_decoded) + { + msg_Err(p_dec, "Failed decoding VPS id %d", i_id); + return false; + } + break; } - else if(i_nal_type == HEVC_NAL_VPS) + + *pp_nal = block_Duplicate((block_t *)p_nalb); + if(*pp_nal) { - p_sys->rgi_p_decvps[i_id] = hevc_decode_vps(p_buffer, i_buffer, true); - if(!p_sys->rgi_p_decvps[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]; + size_t off = p_nalb->i_buffer - i_buffer; + (*pp_nal)->p_buffer += off; + (*pp_nal)->i_buffer -= off; } - return true; + return true; } return false; @@ -433,15 +447,15 @@ static bool XPSReady(decoder_sys_t *p_sys) { for(unsigned i=0;i<=HEVC_PPS_ID_MAX; i++) { - const hevc_picture_parameter_set_t *p_pps = p_sys->rgi_p_decpps[i]; + const hevc_picture_parameter_set_t *p_pps = p_sys->rg_pps[i].p_decoded; if (p_pps) { uint8_t id_sps = hevc_get_pps_sps_id(p_pps); - const hevc_sequence_parameter_set_t *p_sps = p_sys->rgi_p_decsps[id_sps]; + const hevc_sequence_parameter_set_t *p_sps = p_sys->rg_sps[id_sps].p_decoded; if(p_sps) { uint8_t id_vps = hevc_get_sps_vps_id(p_sps); - if(p_sys->rgi_p_decvps[id_vps]) + if(p_sys->rg_vps[id_vps].p_decoded) return true; } } @@ -516,9 +530,9 @@ static void GetXPSSet(uint8_t i_pps_id, void *priv, decoder_sys_t *p_sys = priv; *pp_sps = NULL; *pp_vps = NULL; - if((*pp_pps = p_sys->rgi_p_decpps[i_pps_id])) - if((*pp_sps = p_sys->rgi_p_decsps[hevc_get_pps_sps_id(*pp_pps)])) - *pp_vps = p_sys->rgi_p_decvps[hevc_get_sps_vps_id(*pp_sps)]; + if((*pp_pps = p_sys->rg_pps[i_pps_id].p_decoded)) + if((*pp_sps = p_sys->rg_sps[hevc_get_pps_sps_id(*pp_pps)].p_decoded)) + *pp_vps = p_sys->rg_vps[hevc_get_sps_vps_id(*pp_sps)].p_decoded; } static void ParseStoredSEI( decoder_t *p_dec ) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
