/***************************************************************************** * ParseNALBlock: parses annexB type NALs * All p_frag blocks are required to start with 0 0 0 1 4-byte startcode *****************************************************************************/ static block_t *ParseNALBlock(decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag) { decoder_sys_t *p_sys = p_dec->p_sys; block_t * p_ret = NULL; if(unlikely(p_frag->i_buffer < 5)) { msg_Warn(p_dec,"NAL too small"); block_Release(p_frag); return NULL; } if(p_frag->p_buffer[4] & 0x80) { msg_Warn(p_dec,"Forbidden zero bit not null, corrupted NAL"); block_ChainRelease(p_sys->p_frame); block_Release(p_frag); p_sys->p_frame = NULL; p_sys->pp_frame_last = &p_sys->p_frame; return NULL; } /* Get NALU type */ uint8_t i_nal_type = hevc_getNALType(&p_frag->p_buffer[4]); if (i_nal_type < HEVC_NAL_VPS) { /* NAL is a VCL NAL */ p_ret = ParseVCL(p_dec, i_nal_type, p_frag); } else { p_ret = ParseNonVCL(p_dec, i_nal_type, p_frag); if (p_sys->p_frame) { p_frag = p_ret; if( (p_ret = block_ChainGather(p_sys->p_frame)) ) { p_sys->p_frame = NULL; p_sys->pp_frame_last = &p_sys->p_frame; p_ret->p_next = p_frag; } else p_ret = p_frag; } } *pb_ts_used = false; return p_ret; }
/***************************************************************************** * ParseNALBlock: parses annexB type NALs * All p_frag blocks are required to start with 0 0 0 1 4-byte startcode *****************************************************************************/ static block_t *ParseNALBlock(decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag) { decoder_sys_t *p_sys = p_dec->p_sys; if(unlikely(p_frag->i_buffer < 5)) { msg_Warn(p_dec,"NAL too small"); block_Release(p_frag); *pb_ts_used = false; return NULL; } if(p_frag->p_buffer[4] & 0x80) { msg_Warn(p_dec,"Forbidden zero bit not null, corrupted NAL"); block_Release(p_frag); *pb_ts_used = false; return GatherAndValidateChain(OutputQueues(p_sys, false)); /* will drop */ } /* Get NALU type */ block_t * p_output = NULL; uint8_t i_nal_type = hevc_getNALType(&p_frag->p_buffer[4]); if (i_nal_type < HEVC_NAL_VPS) { /* NAL is a VCL NAL */ p_output = ParseVCL(p_dec, i_nal_type, p_frag); if (p_output && (p_output->i_flags & BLOCK_FLAG_CORRUPTED)) msg_Info(p_dec, "Waiting for VPS/SPS/PPS"); } else { p_output = ParseNonVCL(p_dec, i_nal_type, p_frag); } p_output = GatherAndValidateChain(p_output); *pb_ts_used = (p_output != NULL); return p_output; }