/***************************************************************************** * Close *****************************************************************************/ static void Close(vlc_object_t *p_this) { decoder_t *p_dec = (decoder_t*)p_this; decoder_sys_t *p_sys = p_dec->p_sys; packetizer_Clean(&p_sys->packetizer); for(unsigned i=0;i<HEVC_PPS_MAX; i++) { if(p_sys->rgi_p_decpps[i]) hevc_rbsp_release_pps(p_sys->rgi_p_decpps[i]); } for(unsigned i=0;i<HEVC_SPS_MAX; i++) { if(p_sys->rgi_p_decsps[i]) hevc_rbsp_release_sps(p_sys->rgi_p_decsps[i]); } for(unsigned i=0;i<HEVC_VPS_MAX; i++) { if(p_sys->rgi_p_decvps[i]) hevc_rbsp_release_vps(p_sys->rgi_p_decvps[i]); } free(p_sys); }
/***************************************************************************** * Close *****************************************************************************/ static void Close(vlc_object_t *p_this) { decoder_t *p_dec = (decoder_t*)p_this; decoder_sys_t *p_sys = p_dec->p_sys; packetizer_Clean(&p_sys->packetizer); block_ChainRelease(p_sys->frame.p_chain); block_ChainRelease(p_sys->pre.p_chain); block_ChainRelease(p_sys->post.p_chain); 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]); } 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]); } 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]); } cc_storage_delete( p_sys->p_ccs ); free(p_sys); }
static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id, block_t *p_nalb) { decoder_sys_t *p_sys = p_dec->p_sys; switch(i_nal_type) { case HEVC_NAL_VPS: if(i_id >= HEVC_VPS_MAX) return false; break; case HEVC_NAL_SPS: if(i_id >= HEVC_SPS_MAX) return false; break; case HEVC_NAL_PPS: if(i_id >= HEVC_PPS_MAX) return false; 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]); 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]); 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]); p_sys->rgi_p_decvps[i_id] = NULL; } const uint8_t *p_buffer = p_nalb->p_buffer; size_t i_buffer = p_nalb->i_buffer; 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; } } else if(i_nal_type == HEVC_NAL_PPS) { 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; } } else if(i_nal_type == HEVC_NAL_VPS) { 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; } } return true; } return false; }