bool VaapiDecoderH264::fillSlice(VaapiSliceH264 * slice, H264NalUnit * nalu) { H264SliceHdr *const sliceHdr = &slice->m_sliceHdr; VaapiBufObject *sliceParamObj = slice->m_param; VASliceParameterBufferH264 *sliceParam = (VASliceParameterBufferH264 *) sliceParamObj->map(); /* Fill in VASliceParameterBufferH264 */ sliceParam->slice_data_bit_offset = getSliceDataBitOffset(sliceHdr, nalu); sliceParam->first_mb_in_slice = sliceHdr->first_mb_in_slice; sliceParam->slice_type = sliceHdr->type % 5; sliceParam->direct_spatial_mv_pred_flag = sliceHdr->direct_spatial_mv_pred_flag; sliceParam->cabac_init_idc = sliceHdr->cabac_init_idc; sliceParam->slice_qp_delta = sliceHdr->slice_qp_delta; sliceParam->disable_deblocking_filter_idc = sliceHdr->disable_deblocking_filter_idc; sliceParam->slice_alpha_c0_offset_div2 = sliceHdr->slice_alpha_c0_offset_div2; sliceParam->slice_beta_offset_div2 = sliceHdr->slice_beta_offset_div2; sliceParamObj->unmap(); if (!fillRefPicList(slice)) return false; if (!fillPredWeightTable(slice)) return false; return true; }
bool VaapiDecoderH265::fillSlice(const PicturePtr& picture, const H265SliceHdr* const theSlice, const H265NalUnit* const nalu) { const H265SliceHdr* slice = theSlice; VASliceParameterBufferHEVC* sliceParam; if (!picture->newSlice(sliceParam, nalu->data + nalu->offset, nalu->size)) return false; sliceParam->slice_data_byte_offset = getSliceDataByteOffset(slice, nalu->header_bytes); sliceParam->slice_segment_address = slice->segment_address; #define FILL_LONG(f) sliceParam->LongSliceFlags.fields.f = slice->f #define FILL_LONG_SLICE(f) sliceParam->LongSliceFlags.fields.slice_##f = slice->f //how to fill this //LastSliceOfPic FILL_LONG(dependent_slice_segment_flag); //follow spec if (slice->dependent_slice_segment_flag) { slice = m_prevSlice.get(); } if (!fillReferenceIndex(sliceParam, slice)) return false; FILL_LONG_SLICE(type); sliceParam->LongSliceFlags.fields.color_plane_id = slice->colour_plane_id; FILL_LONG_SLICE(sao_luma_flag); FILL_LONG_SLICE(sao_chroma_flag); FILL_LONG(mvd_l1_zero_flag); FILL_LONG(cabac_init_flag); FILL_LONG_SLICE(temporal_mvp_enabled_flag); if (slice->deblocking_filter_override_flag) FILL_LONG_SLICE(deblocking_filter_disabled_flag); else sliceParam->LongSliceFlags.fields.slice_deblocking_filter_disabled_flag= slice->pps->deblocking_filter_disabled_flag; FILL_LONG(collocated_from_l0_flag); FILL_LONG_SLICE(loop_filter_across_slices_enabled_flag); #define FILL(f) sliceParam->f = slice->f #define FILL_SLICE(f) sliceParam->slice_##f = slice->f FILL(collocated_ref_idx); /* following fields fill in fillReference num_ref_idx_l0_active_minus1 num_ref_idx_l1_active_minus1*/ FILL_SLICE(qp_delta); FILL_SLICE(cb_qp_offset); FILL_SLICE(cr_qp_offset); FILL_SLICE(beta_offset_div2); FILL_SLICE(tc_offset_div2); if (!fillPredWeightTable(sliceParam, slice)) return false; FILL(five_minus_max_num_merge_cand); return true; }