⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_h264_pack.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
    CH264pBs<PixType,CoeffsType>  *pBitstream = curr_slice->m_pbitstream;
    MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;
    bool noSubMbPartSizeLessThan8x8Flag = 1;
    switch (mb_type)
    {
    case MBTYPE_INTER:
    case MBTYPE_SKIPPED:
        N = 0;
        break;

    case MBTYPE_INTER_16x8:
        N = 1;
        break;

    case MBTYPE_INTER_8x16:
        N = 2;
        break;

    case MBTYPE_INTER_8x8:
        N = 3;
        break;
    case MBTYPE_INTER_8x8_REF0:
        N = 4;
        // P_8x8ref0 is not allowed for CABAC coding => for CAVLC we
        // do code P_8x8ref0 and for CABAC we switch to P_8x8.
        if(m_PicParamSet.entropy_coding_mode) {
            mb_type = cur_mb.GlobalMacroblockInfo->mbtype = MBTYPE_INTER_8x8;
            N -= 1;//for cabac
        }
        break;
    default:
        N = -1;
        break;
    }

    if (m_PicParamSet.entropy_coding_mode)
    {
        Ipp32s uLeftMBType = cur_mb.CurrentMacroblockNeighbours.mb_A < 0 ? NUMBER_OF_MBTYPES :
                m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentMacroblockNeighbours.mb_A].mbtype;
        Ipp32s uTopMBType = cur_mb.CurrentMacroblockNeighbours.mb_B < 0 ? NUMBER_OF_MBTYPES :
                m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentMacroblockNeighbours.mb_B].mbtype;;
        pBitstream->MBTypeInfo_CABAC(slice_type,N,(MB_Type)mb_type,(MB_Type)uLeftMBType,(MB_Type)uTopMBType);
    } else
        length = pBitstream->PutVLCCode(N);

    if (mb_type == MBTYPE_INTER_8x8 || mb_type == MBTYPE_INTER_8x8_REF0) {
        // for each of the 8x8 blocks
        for (Ipp32u block=0; block<4; block++) {
            switch (cur_mb.GlobalMacroblockInfo->sbtype[block]) {
                case SBTYPE_8x8:
                    N = 0;
                    break;
                case SBTYPE_8x4:
                    N = 1;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;
                case SBTYPE_4x8:
                    N = 2;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;
                case SBTYPE_4x4:
                    N = 3;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;
                default:
                    break;
            }

            // Sub MB Type
            if (m_PicParamSet.entropy_coding_mode)
                pBitstream->SubTypeInfo_CABAC(slice_type,N);
            else
                length = pBitstream->PutVLCCode(N);
        }
    }

    return noSubMbPartSizeLessThan8x8Flag;
}   // Encode_Inter_Type

////////////////////////////////////////////////////////////////////////////////
//
// Encode_BiPred_Type
//
////////////////////////////////////////////////////////////////////////////////
template <class PixType, class CoeffsType>
bool H264CoreEncoder<PixType,CoeffsType>::Encode_BiPred_Type(H264EncoderThreadPrivateSlice<PixType, CoeffsType> *curr_slice)
{
    Ipp32s N;
    H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
    MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;
    CH264pBs<PixType,CoeffsType>  *pBitstream = curr_slice->m_pbitstream;
    EnumSliceType slice_type = curr_slice->m_slice_type;
    bool noSubMbPartSizeLessThan8x8Flag = 1;

    switch (mb_type) {

    case MBTYPE_DIRECT:
        N = 0;
        break;

    case MBTYPE_FORWARD:
        N = 1;
        break;

    case MBTYPE_BACKWARD:
        N = 2;
        break;

    case MBTYPE_BIDIR:
        N = 3;
        break;

    case MBTYPE_FWD_FWD_16x8:
        N = 4;
        break;

    case MBTYPE_FWD_FWD_8x16:
        N = 5;
        break;

    case MBTYPE_BWD_BWD_16x8:
        N = 6;
        break;

    case MBTYPE_BWD_BWD_8x16:
        N = 7;
        break;

    case MBTYPE_FWD_BWD_16x8:
        N = 8;
        break;

    case MBTYPE_FWD_BWD_8x16:
        N = 9;
        break;

    case MBTYPE_BWD_FWD_16x8:
        N = 10;
        break;

    case MBTYPE_BWD_FWD_8x16:
        N = 11;
        break;

    case MBTYPE_FWD_BIDIR_16x8:
        N = 12;
        break;

    case MBTYPE_FWD_BIDIR_8x16:
        N = 13;
        break;

    case MBTYPE_BWD_BIDIR_16x8:
        N = 14;
        break;

    case MBTYPE_BWD_BIDIR_8x16:
        N = 15;
        break;

    case MBTYPE_BIDIR_FWD_16x8:
        N = 16;
        break;

    case MBTYPE_BIDIR_FWD_8x16:
        N = 17;
        break;

    case MBTYPE_BIDIR_BWD_16x8:
        N = 18;
        break;

    case MBTYPE_BIDIR_BWD_8x16:
        N = 19;
        break;

    case MBTYPE_BIDIR_BIDIR_16x8:
        N = 20;
        break;

    case MBTYPE_BIDIR_BIDIR_8x16:
        N = 21;
        break;

    case MBTYPE_B_8x8:
        N = 22;
        break;

    default:
        N = -1;
        break;
    }

    if (m_PicParamSet.entropy_coding_mode)
    {
        MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;

        Ipp32s uLeftMBType = cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num < 0 ? NUMBER_OF_MBTYPES :
                m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num].mbtype;
        Ipp32s uTopMBType = cur_mb.CurrentBlockNeighbours.mb_above.mb_num < 0 ? NUMBER_OF_MBTYPES :
                m_pCurrentFrame->m_mbinfo.mbs[cur_mb.CurrentBlockNeighbours.mb_above.mb_num].mbtype;

        pBitstream->MBTypeInfo_CABAC(slice_type,N,(MB_Type)mb_type,(MB_Type)uLeftMBType,(MB_Type)uTopMBType);
    }
    else {
        pBitstream->PutVLCCode(N);
    }
    if (mb_type == MBTYPE_B_8x8) {
        // for each of the 8x8 blocks
        for (Ipp32u block=0; block<4; block++)
        {
            switch (cur_mb.GlobalMacroblockInfo->sbtype[block])
            {
                case SBTYPE_DIRECT:
                    N = 0;
                    if( !m_SeqParamSet.direct_8x8_inference_flag )
                       noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_FORWARD_8x8:
                    N = 1;
                    break;

                case SBTYPE_BACKWARD_8x8:
                    N = 2;
                    break;

                case SBTYPE_BIDIR_8x8:
                    N = 3;
                    break;

                case SBTYPE_FORWARD_8x4:
                    N = 4;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_FORWARD_4x8:
                    N = 5;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_BACKWARD_8x4:
                    N = 6;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_BACKWARD_4x8:
                    N = 7;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_BIDIR_8x4:
                    N = 8;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_BIDIR_4x8:
                    N = 9;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_FORWARD_4x4:
                    N = 10;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_BACKWARD_4x4:
                    N = 11;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                case SBTYPE_BIDIR_4x4:
                    N = 12;
                    noSubMbPartSizeLessThan8x8Flag = 0;
                    break;

                default:    // Unknown SBTYPE!
                    break;
            }

            // Sub MB Type
            if (m_PicParamSet.entropy_coding_mode)
                pBitstream->SubTypeInfo_CABAC(slice_type,N);
            else
                pBitstream->PutVLCCode(N);
        }
    }

    return noSubMbPartSizeLessThan8x8Flag;
}   // Encode_BiPred_Type

template <class PixType, class CoeffsType>
Ipp32s H264CoreEncoder<PixType,CoeffsType>::Derive_ctxIdxInc_CABAC(
    H264EncoderThreadPrivateSlice<PixType, CoeffsType> *curr_slice,
    Ipp32s list_num, Ipp32s block_idx)
{
    H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
    Ipp32s ref_idx_ctxIdxInc;
    H264BlockLocation block_a, block_b;

    if (BLOCK_IS_ON_LEFT_EDGE(block_idx))
    {
        block_a = cur_mb.CurrentBlockNeighbours.mbs_left[block_idx / 4];
    } else {
        block_a.mb_num = curr_slice->m_CurMBAddr;
        block_a.block_num = block_idx - 1;
    }

    if (BLOCK_IS_ON_TOP_EDGE(block_idx))
    {
        block_b = cur_mb.CurrentBlockNeighbours.mb_above;
        if (block_b.mb_num >= 0)
        {
            block_b.block_num += block_idx;
        }
    } else {
        block_b.mb_num = curr_slice->m_CurMBAddr;
        block_b.block_num = block_idx - 4;
    }

    Ipp32s condTermFlagA = 0;
    if (block_a.mb_num >= 0)
    {
        Ipp8u lval = (Ipp8u) (pGetMBFieldDecodingFlag(cur_mb.GlobalMacroblockInfo) <
                            GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[block_a.mb_num]));

        MBTypeValue mb_type = m_pCurrentFrame->m_mbinfo.mbs[block_a.mb_num].mbtype;
        Ipp32s ref_idx = m_pCurrentFrame->m_mbinfo.RefIdxs[list_num][block_a.mb_num].RefIdxs[block_a.block_num];
        Ipp32s refIdxZeroFlag = ref_idx > lval ? 0 : 1; // predModeEqualFlag here

        Ipp32s block_8x8 = block_subblock_mapping[block_a.block_num] / 4;
        SBTypeValue sbtype = m_pCurrentFrame->m_mbinfo.mbs[block_a.mb_num].sbtype[block_8x8];

        condTermFlagA = (IS_SKIP_MBTYPE(mb_type)
                    || IS_INTRA_MBTYPE(mb_type)
                    || (sbtype == SBTYPE_DIRECT)
                    || refIdxZeroFlag) ? 0 : 1;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -