void VaapiDPBManager::execPictureRefsModification(const PicturePtr& picture, const SliceHeaderPtr& sliceHdr) { /* refPicList0 */ if (!H264_IS_I_SLICE(sliceHdr) && !H264_IS_SI_SLICE(sliceHdr) && sliceHdr->ref_pic_list_modification_flag_l0) execPictureRefsModification1(picture, sliceHdr, 0); /* refPicList1 */ if (H264_IS_B_SLICE(sliceHdr) && sliceHdr->ref_pic_list_modification_flag_l1) execPictureRefsModification1(picture, sliceHdr, 1); }
bool VaapiDecoderH264::fillRefPicList(VaapiSliceH264 * slice) { uint32_t i, numRefLists = 0; VaapiDecPicBufLayer *DPBLayer = m_DPBManager->DPBLayer; H264SliceHdr *const sliceHdr = &slice->m_sliceHdr; VaapiBufObject *sliceParamObj = slice->m_param; VASliceParameterBufferH264 *sliceParam = (VASliceParameterBufferH264 *) sliceParamObj->map(); sliceParam->num_ref_idx_l0_active_minus1 = 0; sliceParam->num_ref_idx_l1_active_minus1 = 0; if (H264_IS_B_SLICE(sliceHdr)) numRefLists = 2; else if (H264_IS_I_SLICE(sliceHdr)) numRefLists = 0; else numRefLists = 1; if (numRefLists < 1) goto out; sliceParam->num_ref_idx_l0_active_minus1 = sliceHdr->num_ref_idx_l0_active_minus1; for (i = 0; i < DPBLayer->refPicList0Count && DPBLayer->refPicList0[i]; i++) vaapiFillPicture(&sliceParam->RefPicList0[i], DPBLayer->refPicList0[i], 0); for (; i <= sliceParam->num_ref_idx_l0_active_minus1; i++) vaapiInitPicture(&sliceParam->RefPicList0[i]); if (numRefLists < 2) goto out; sliceParam->num_ref_idx_l1_active_minus1 = sliceHdr->num_ref_idx_l1_active_minus1; for (i = 0; i < DPBLayer->refPicList1Count && DPBLayer->refPicList1[i]; i++) vaapiFillPicture(&sliceParam->RefPicList1[i], DPBLayer->refPicList1[i], 0); for (; i <= sliceParam->num_ref_idx_l1_active_minus1; i++) vaapiInitPicture(&sliceParam->RefPicList1[i]); out: sliceParamObj->unmap(); return true; }
bool VaapiDecoderH264::fillPredWeightTable(VaapiSliceH264 * slice) { int32_t i, j; uint32_t numWeightTables = 0; H264SliceHdr *const sliceHdr = &slice->m_sliceHdr; H264PPS *const pps = sliceHdr->pps; H264SPS *const sps = pps->sequence; H264PredWeightTable *const w = &sliceHdr->pred_weight_table; VaapiBufObject *sliceParamObj = slice->m_param; VASliceParameterBufferH264 *sliceParam = (VASliceParameterBufferH264 *) sliceParamObj->map(); if (pps->weighted_pred_flag && (H264_IS_P_SLICE(sliceHdr) || H264_IS_SP_SLICE(sliceHdr))) numWeightTables = 1; else if (pps->weighted_bipred_idc == 1 && H264_IS_B_SLICE(sliceHdr)) numWeightTables = 2; else numWeightTables = 0; sliceParam->luma_log2_weight_denom = w->luma_log2_weight_denom; sliceParam->chroma_log2_weight_denom = w->chroma_log2_weight_denom; sliceParam->luma_weight_l0_flag = 0; sliceParam->chroma_weight_l0_flag = 0; sliceParam->luma_weight_l1_flag = 0; sliceParam->chroma_weight_l1_flag = 0; if (numWeightTables < 1) goto out; sliceParam->luma_weight_l0_flag = 1; for (i = 0; i <= sliceParam->num_ref_idx_l0_active_minus1; i++) { sliceParam->luma_weight_l0[i] = w->luma_weight_l0[i]; sliceParam->luma_offset_l0[i] = w->luma_offset_l0[i]; } sliceParam->chroma_weight_l0_flag = sps->chroma_array_type != 0; if (sliceParam->chroma_weight_l0_flag) { for (i = 0; i <= sliceParam->num_ref_idx_l0_active_minus1; i++) { for (j = 0; j < 2; j++) { sliceParam->chroma_weight_l0[i][j] = w->chroma_weight_l0[i][j]; sliceParam->chroma_offset_l0[i][j] = w->chroma_offset_l0[i][j]; } } } if (numWeightTables < 2) goto out; sliceParam->luma_weight_l1_flag = 1; for (i = 0; i <= sliceParam->num_ref_idx_l1_active_minus1; i++) { sliceParam->luma_weight_l1[i] = w->luma_weight_l1[i]; sliceParam->luma_offset_l1[i] = w->luma_offset_l1[i]; } sliceParam->chroma_weight_l1_flag = sps->chroma_array_type != 0; if (sliceParam->chroma_weight_l1_flag) { for (i = 0; i <= sliceParam->num_ref_idx_l1_active_minus1; i++) { for (j = 0; j < 2; j++) { sliceParam->chroma_weight_l1[i][j] = w->chroma_weight_l1[i][j]; sliceParam->chroma_offset_l1[i][j] = w->chroma_offset_l1[i][j]; } } } out: sliceParamObj->unmap(); return true; }