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;
}