Ejemplo n.º 1
0
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;
}