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

📄 umc_h264_mc.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            sub_type++;
        };
        }
        break;

    case MBTYPE_B_8x8:
        {
        BlocksBidirInfo *inf = bidir_info.blocks;
        bidir_info.size = 0;

        SBTypeValue *stype = sub_type;
        for (Ipp32s block = 0; block < 4; block++)
        {
            switch (*stype)
            {
                case SBTYPE_DIRECT:
                    *inf = bidir_blocks_infos[52];
                    // inf->block_index = blockpos[block];
                    inf->block_index = block; // Special case !
                    inf++;
                    bidir_info.size++;
                    break;

                case SBTYPE_FORWARD_8x8:
                    *inf = bidir_blocks_infos[39];
                    inf->block_index = blockpos[block];
                    inf++;
                    bidir_info.size++;
                    break;

                case SBTYPE_BIDIR_8x8:
                    *inf = bidir_blocks_infos[47];
                    inf->block_index = blockpos[block];
                    inf++;
                    bidir_info.size++;
                    break;

                case SBTYPE_BACKWARD_8x8:
                    *inf = bidir_blocks_infos[43];
                    inf->block_index = blockpos[block];
                    inf++;
                    bidir_info.size++;
                    break;

                case SBTYPE_FORWARD_8x4:
                    *inf = bidir_blocks_infos[40];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[40];
                    inf->block_index = blockpos[block] + 4;
                    inf++;
                    bidir_info.size += 2;
                    break;

                case SBTYPE_BACKWARD_8x4:
                    *inf = bidir_blocks_infos[44];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[44];
                    inf->block_index = blockpos[block] + 4;
                    inf++;
                    bidir_info.size += 2;
                    break;

                case SBTYPE_BIDIR_8x4:
                    *inf = bidir_blocks_infos[48];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[48];
                    inf->block_index = blockpos[block] + 4;
                    inf++;
                    bidir_info.size += 2;
                    break;

                case SBTYPE_FORWARD_4x8:
                    *inf = bidir_blocks_infos[41];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[41];
                    inf->block_index = blockpos[block] + 1;
                    inf++;
                    bidir_info.size += 2;
                    break;

                case SBTYPE_BACKWARD_4x8:
                    *inf = bidir_blocks_infos[45];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[45];
                    inf->block_index = blockpos[block] + 1;
                    inf++;
                    bidir_info.size += 2;
                    break;

                case SBTYPE_BIDIR_4x8:
                    *inf = bidir_blocks_infos[49];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[49];
                    inf->block_index = blockpos[block] + 1;
                    inf++;
                    bidir_info.size += 2;
                    break;

                case SBTYPE_FORWARD_4x4:
                    *inf = bidir_blocks_infos[42];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[42];
                    inf->block_index = blockpos[block] + 1;
                    inf++;
                    *inf = bidir_blocks_infos[42];
                    inf->block_index = blockpos[block] + 4;
                    inf++;
                    *inf = bidir_blocks_infos[42];
                    inf->block_index = blockpos[block] + 5;
                    inf++;
                    bidir_info.size += 4;
                    break;

                case SBTYPE_BIDIR_4x4:
                    *inf = bidir_blocks_infos[50];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[50];
                    inf->block_index = blockpos[block] + 1;
                    inf++;
                    *inf = bidir_blocks_infos[50];
                    inf->block_index = blockpos[block] + 4;
                    inf++;
                    *inf = bidir_blocks_infos[50];
                    inf->block_index = blockpos[block] + 5;
                    inf++;
                    bidir_info.size += 4;
                    break;

                case SBTYPE_BACKWARD_4x4:
                    *inf = bidir_blocks_infos[46];
                    inf->block_index = blockpos[block];
                    inf++;
                    *inf = bidir_blocks_infos[46];
                    inf->block_index = blockpos[block] + 1;
                    inf++;
                    *inf = bidir_blocks_infos[46];
                    inf->block_index = blockpos[block] + 4;
                    inf++;
                    *inf = bidir_blocks_infos[46];
                    inf->block_index = blockpos[block] + 5;
                    inf++;
                    bidir_info.size += 4;
                    break;

                default:
                    break;
            }

            stype++;
        }
        }
        break;

    default:
        VM_ASSERT(false);
        bidir_info.size = 0;
        break;
    }
}

#define TRUNCATE_LO(val, lim)      \
    { Ipp32s (tmp) = (lim);                      \
    if ((tmp) < (val))                  \
        (val) = (Ipp16s) (tmp);}

#define TRUNCATE_HI(val, lim)      \
    {Ipp32s (tmp) = (lim);                      \
    if ((tmp) > (val))                  \
        (val) = (Ipp16s) (tmp);}

////////////////////////////////////////////////////////////////////////////////
// MCOneMBChroma
//
//  Copy all 4 4x4 chroma blocks from reference source using the input motion
//  vectors to locate and compute the reference pels using interpolation as
//  required. The vectors are in subpel units. Results are stored in the output
//  buffer in a 16x16 block, with a row pitch of DEST_PITCH.
//
////////////////////////////////////////////////////////////////////////////////
template <class PixType, class CoeffsType> void H264CoreEncoder<PixType,CoeffsType>::MCOneMBChroma(
    H264EncoderThreadPrivateSlice<PixType, CoeffsType> *curr_slice,
    const Ipp32u uMB,           // macroblock number
          Ipp32s pitchPixels,              // pitch of source data in pixels
    const H264MotionVector *pMVFwd,   // motion vectors in subpel units
    const H264MotionVector *pMVBwd,   // motion vectors in subpel units
          PixType* pDst,                // put the resulting block here
          bool    is_v_plane
)
{
    H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
    Ipp32s is_cur_mb_field = curr_slice->m_is_cur_mb_field;
    bool is_cur_mb_bottom_field = curr_slice->m_is_cur_mb_bottom_field;
    MBTypeValue mb_type = cur_mb.GlobalMacroblockInfo->mbtype;

    T_RefIdx *pRefIdxL0 = cur_mb.RefIdxs[LIST_0]->RefIdxs;
    T_RefIdx *pRefIdxL1 = cur_mb.RefIdxs[LIST_1]->RefIdxs;
    H264EncoderFrame<PixType> **pRefPicList0 = GetRefPicList(curr_slice, LIST_0,is_cur_mb_field,uMB&1)->m_RefPicList;
    H264EncoderFrame<PixType> **pRefPicList1 = GetRefPicList(curr_slice, LIST_1,is_cur_mb_field,uMB&1)->m_RefPicList;
    Ipp8s *pFields0 = GetRefPicList(curr_slice, LIST_0,is_cur_mb_field,uMB&1)->m_Prediction;
    Ipp8s *pFields1 = GetRefPicList(curr_slice, LIST_1,is_cur_mb_field,uMB&1)->m_Prediction;

    BlocksBidirInfo bidir_info_buf[32];
    Ipp32s mb_offset = m_pMBOffsets[uMB].uChromaOffset[m_is_cur_pic_afrm][is_cur_mb_field];

    Bidir_Blocks_Info info;
    info.blocks = bidir_info_buf;

    if (mb_type == MBTYPE_DIRECT)
    {
        CDirectBOneMB_Interp_Cr(curr_slice, uMB, pitchPixels, pMVFwd, pMVBwd, pFields0, pFields1,
            pDst, curr_slice->m_pTempBuff4DirectB, is_v_plane, -1, size4x4);
        return;
    }

    get_bidir_info(mb_type, cur_mb.GlobalMacroblockInfo->sbtype, info);

    Ipp32s uMBx = curr_slice->m_CurMB_X*16;
    Ipp32s uMBy = curr_slice->m_CurMB_Y*16;
    Ipp32s uFrmWidth = m_WidthInMBs*16;
    Ipp32s uFrmHeight = m_HeightInMBs*16;

    Ipp32u predPitchPixels = 16;
    // Ipp32s uInterpType = use_implicit_weighted_bipred ? 2 : 1;

    Ipp32s blocks_num = info.size;
    BlocksBidirInfo *bidir_blocks = info.blocks;
    for(Ipp32s i = 0; i < blocks_num; i++, bidir_blocks++)
    {
        Ipp32u block_idx = bidir_blocks->block_index;
        IppiSize size;
        Ipp32s dpx, dpy;
        Ipp32s shift_y;

        Ipp32s src_block_offset;// = (((block_idx&3)<<2) + (block_idx&12)*pitch )>>1;
        Ipp32s dst_block_offset;// = (((block_idx&3)<<2) + (block_idx&12)*uPredPitch )>>1;

        switch( m_PicParamSet.chroma_format_idc ){
            case 1:
                size.width = bidir_blocks->block_w*2;
                size.height = bidir_blocks->block_h*2;
                src_block_offset = (((block_idx&3)<<2) + (block_idx&12)*pitchPixels )>>1;
                dst_block_offset = (((block_idx&3)<<2) + (block_idx&12)*predPitchPixels )>>1;
                shift_y = 0;
                break;
            case 2:
                size.width = bidir_blocks->block_w*2;
                size.height = bidir_blocks->block_h*4;
                src_block_offset = ((block_idx&3)<<1) + (block_idx&12)*pitchPixels;
                dst_block_offset = ((block_idx&3)<<1) + (block_idx&12)*predPitchPixels;
                shift_y=1;
                break;
            case 3:
                size.width = bidir_blocks->block_w*4;
                size.height = bidir_blocks->block_h*4;
                src_block_offset = ((block_idx&3)<<2) + (block_idx&12)*pitchPixels ;
                dst_block_offset = ((block_idx&3)<<2) + (block_idx&12)*predPitchPixels;
                shift_y=1;
                break;
        }

        Ipp32s posx = uMBx + ((block_idx&3)<<2);
        Ipp32s posy = uMBy + (block_idx&12);

        switch (bidir_blocks->direction)
        {
        case D_DIR_FWD:
            {
            Ipp32s block_ref = pRefIdxL0[block_idx];
            PixType *ref_prev = get_chroma_ptr<PixType>(pRefPicList0[block_ref], is_v_plane) + mb_offset
                + curr_slice->m_InitialOffset[pFields0[block_ref]];

            H264MotionVector mv_f = pMVFwd[block_idx];
            if( m_PicParamSet.chroma_format_idc == 1 ){
                if(!is_cur_mb_bottom_field && pFields0[block_ref]) mv_f.mvy += - 2;
                else if(is_cur_mb_bottom_field && !pFields0[block_ref]) mv_f.mvy += 2;
            }

            //printf("mvy=%d\n",mv_f.mvy);
            TRUNCATE_LO(mv_f.mvx, (uFrmWidth - posx + 1) * SubPelFactor)
            TRUNCATE_HI(mv_f.mvx, (-16 - posx - 1) * SubPelFactor)
            TRUNCATE_LO(mv_f.mvy, (uFrmHeight - posy + 1) * (SubPelFactor)) // >>shift_y
            TRUNCATE_HI(mv_f.mvy, (-16 - posy - 1) * (SubPelFactor))        // >>shift_y
            //printf("mvy=%d\n",mv_f.mvy);

            // get the previous reference block (with interpolation as needed)
            Ipp32s n = SubpelChromaMVAdjust(&mv_f, pitchPixels, dpx, dpy, m_PicParamSet.chroma_format_idc) + src_block_offset;
#ifdef NEW_INTERPOLATE
            Interpolate_Cr(ref_prev + n, pitchPixels, pDst + dst_block_offset,
                DEST_PITCH, dpx, dpy, size, mv_f.mvy, uMBy, (block_idx&12));
#else
            ippiInterpolateChroma_H264(ref_prev + n, pitchPixels*sizeof(PixType),
                                       pDst + dst_block_offset,
                                       DEST_PITCH*sizeof(PixType), dpx, dpy, size, m_SeqParamSet.bit_depth_chroma);
#endif
            }
            break;

        case D_DIR_BWD:
            {
            Ipp32s block_ref = pRefIdxL1[block_idx];
            PixType *ref_fu

⌨️ 快捷键说明

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