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

📄 umc_h264_mc.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            {
                // next block is lower left
                ref_off += 4*2 - 2;
                uOffset += pitchPixels*8 - 8;
                pMVFwd += 4*2 - 2;
                pMVBwd += 4*2 - 2;
                pDst += DEST_PITCH*8 - 8;
                sb_pos += 8;
            }
            else
            {
                // next block is to the right (except when uBlock==3, then
                // don't care
                ref_off += 2;
                uOffset += 8;
                pMVFwd += 2;
                pMVBwd += 2;
                pDst += 8;
            }
        }   // for uBlock
        }
        break;

    default:
        // not supposed to be here
        break;
    }   // switch
}   // MCOneMBLuma

template <class PixType>
inline PixType * get_chroma_ptr(H264EncoderFrame<PixType> * frame, bool is_v_plane)
{
    return !frame ? 0 : (is_v_plane ? frame->m_pVPlane : frame->m_pUPlane);
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
typedef struct{
    Ipp32s block_index;
    Ipp32s block_w;
    Ipp32s block_h;
    Direction_t direction;
} BlocksBidirInfo;

BlocksBidirInfo bidir_blocks_infos[] =
{
    {0, 4, 4, D_DIR_FWD}, // 0 - MBTYPE_INTER

    {0, 4, 4, D_DIR_BWD}, // 1 - MBTYPE_BACKWARD

    {0, 4, 2, D_DIR_FWD}, // 2 - MBTYPE_FWD_FWD_16x8, MBTYPE_INTER_16x8
    {8, 4, 2, D_DIR_FWD}, // 3 - MBTYPE_FWD_FWD_16x8, MBTYPE_INTER_16x8

    {0, 2, 4, D_DIR_FWD}, // 4 - MBTYPE_FWD_FWD_8x16, MBTYPE_INTER_8x16
    {2, 2, 4, D_DIR_FWD}, // 5 - MBTYPE_FWD_FWD_8x16, MBTYPE_INTER_8x16

    {0, 4, 2, D_DIR_BWD}, // 6 - MBTYPE_BWD_BWD_16x8
    {8, 4, 2, D_DIR_BWD}, // 7 - MBTYPE_BWD_BWD_16x8

    {0, 2, 4, D_DIR_BWD}, // 8 - MBTYPE_BWD_BWD_8x16
    {2, 2, 4, D_DIR_BWD}, // 9 - MBTYPE_BWD_BWD_8x16

    {0, 4, 2, D_DIR_FWD}, // 10 - MBTYPE_FWD_BWD_16x8
    {8, 4, 2, D_DIR_BWD}, // 11 - MBTYPE_FWD_BWD_16x8

    {0, 2, 4, D_DIR_FWD}, // 12 - MBTYPE_FWD_BWD_8x16
    {2, 2, 4, D_DIR_BWD}, // 13 - MBTYPE_FWD_BWD_8x16

    {8, 4, 2, D_DIR_FWD}, // 14 - MBTYPE_BWD_FWD_16x8
    {0, 4, 2, D_DIR_BWD}, // 15 - MBTYPE_BWD_FWD_16x8

    {2, 2, 4, D_DIR_FWD}, // 16 - MBTYPE_BWD_FWD_8x16
    {0, 2, 4, D_DIR_BWD}, // 17 - MBTYPE_BWD_FWD_8x16

    {0, 4, 2, D_DIR_BIDIR}, // 18 - MBTYPE_BIDIR_FWD_16x8
    {8, 4, 2, D_DIR_FWD},   // 19 - MBTYPE_BIDIR_FWD_16x8

    {0, 4, 2, D_DIR_FWD},   // 20 - MBTYPE_FWD_BIDIR_16x8
    {8, 4, 2, D_DIR_BIDIR}, // 21 - MBTYPE_FWD_BIDIR_16x8

    {0, 4, 2, D_DIR_BIDIR}, // 22 - MBTYPE_BIDIR_BWD_16x8
    {8, 4, 2, D_DIR_BWD},   // 23 - MBTYPE_BIDIR_BWD_16x8

    {0, 4, 2, D_DIR_BWD},   // 24 - MBTYPE_BWD_BIDIR_16x8
    {8, 4, 2, D_DIR_BIDIR}, // 25 - MBTYPE_BWD_BIDIR_16x8

    {0, 4, 2, D_DIR_BIDIR}, // 26 - MBTYPE_BIDIR_BIDIR_16x8
    {8, 4, 2, D_DIR_BIDIR}, // 27 - MBTYPE_BIDIR_BIDIR_16x8

    {0, 2, 4, D_DIR_BIDIR}, // 28 - MBTYPE_BIDIR_FWD_8x16
    {2, 2, 4, D_DIR_FWD},   // 29 - MBTYPE_BIDIR_FWD_8x16

    {0, 2, 4, D_DIR_FWD},   // 30 - MBTYPE_FWD_BIDIR_8x16
    {2, 2, 4, D_DIR_BIDIR}, // 31 - MBTYPE_FWD_BIDIR_8x16

    {0, 2, 4, D_DIR_BIDIR}, // 32 - MBTYPE_BIDIR_BWD_8x16
    {2, 2, 4, D_DIR_BWD},   // 33 - MBTYPE_BIDIR_BWD_8x16

    {0, 2, 4, D_DIR_BWD},   // 34 - MBTYPE_BWD_BIDIR_8x16
    {2, 2, 4, D_DIR_BIDIR}, // 35 - MBTYPE_BWD_BIDIR_8x16

    {0, 2, 4, D_DIR_BIDIR}, // 36 - MBTYPE_BIDIR_BIDIR_8x16
    {2, 2, 4, D_DIR_BIDIR}, // 37 - MBTYPE_BIDIR_BIDIR_8x16

    {0, 4, 4, D_DIR_BIDIR}, // 38 - MBTYPE_BIDIR

    {0, 2, 2, D_DIR_FWD}, // 39 - MBTYPE_B_8x8 / SBTYPE_FORWARD_8x8
    {0, 2, 1, D_DIR_FWD}, // 40 - MBTYPE_B_8x8 / SBTYPE_FORWARD_8x4
    {0, 1, 2, D_DIR_FWD}, // 41 - MBTYPE_B_8x8 / SBTYPE_FORWARD_4x8
    {0, 1, 1, D_DIR_FWD}, // 42 - MBTYPE_B_8x8 / SBTYPE_FORWARD_4x4

    {0, 2, 2, D_DIR_BWD}, // 43 - MBTYPE_B_8x8 / SBTYPE_BACKWARD_8x8
    {0, 2, 1, D_DIR_BWD}, // 44 - MBTYPE_B_8x8 / SBTYPE_BACKWARD_8x4
    {0, 1, 2, D_DIR_BWD}, // 45 - MBTYPE_B_8x8 / SBTYPE_BACKWARD_4x8
    {0, 1, 1, D_DIR_BWD}, // 46 - MBTYPE_B_8x8 / SBTYPE_BACKWARD_4x4

    {0, 2, 2, D_DIR_BIDIR}, // 47 - MBTYPE_B_8x8 / SBTYPE_BIDIR_8x8
    {0, 2, 1, D_DIR_BIDIR}, // 48 - MBTYPE_B_8x8 / SBTYPE_BIDIR_8x4
    {0, 1, 2, D_DIR_BIDIR}, // 49 - MBTYPE_B_8x8 / SBTYPE_BIDIR_4x8
    {0, 1, 1, D_DIR_BIDIR}, // 50 - MBTYPE_B_8x8 / SBTYPE_BIDIR_4x4

    {-1, 4, 4, D_DIR_DIRECT}, // 51 - MBTYPE_DIRECT
    {0, 4, 4, D_DIR_DIRECT},  // 52 - MBTYPE_DIRECT
};

typedef struct{
    Ipp32s size;
    BlocksBidirInfo *blocks;
} Bidir_Blocks_Info;

void get_bidir_info(MBTypeValue mb_type, SBTypeValue *sub_type, Bidir_Blocks_Info & bidir_info)
{
    const Ipp32s blockpos[4] = {0, 2, 8, 10};

    switch (mb_type)
    {
    case MBTYPE_DIRECT:
        bidir_info.blocks = &bidir_blocks_infos[51];
        bidir_info.size = 1;
        break;

    case MBTYPE_INTER:
    case MBTYPE_SKIPPED:
    case MBTYPE_FORWARD:
        bidir_info.blocks = &bidir_blocks_infos[0];
        bidir_info.size = 1;
        break;

    case MBTYPE_BACKWARD:
        bidir_info.blocks = &bidir_blocks_infos[1];
        bidir_info.size = 1;
        break;

    case MBTYPE_FWD_FWD_16x8:
    case MBTYPE_INTER_16x8:
        bidir_info.blocks = &bidir_blocks_infos[2];
        bidir_info.size = 2;
        break;

    case MBTYPE_FWD_FWD_8x16:
    case MBTYPE_INTER_8x16:
        bidir_info.blocks = &bidir_blocks_infos[4];
        bidir_info.size = 2;
        break;

    case MBTYPE_BWD_BWD_16x8:
        bidir_info.blocks = &bidir_blocks_infos[6];
        bidir_info.size = 2;
        break;

    case MBTYPE_BWD_BWD_8x16:
        bidir_info.blocks = &bidir_blocks_infos[8];
        bidir_info.size = 2;
        break;

    case MBTYPE_FWD_BWD_16x8:
        bidir_info.blocks = &bidir_blocks_infos[10];
        bidir_info.size = 2;
        break;

    case MBTYPE_FWD_BWD_8x16:
        bidir_info.blocks = &bidir_blocks_infos[12];
        bidir_info.size = 2;
        break;

    case MBTYPE_BWD_FWD_16x8:
        bidir_info.blocks = &bidir_blocks_infos[14];
        bidir_info.size = 2;
        break;

    case MBTYPE_BWD_FWD_8x16:
        bidir_info.blocks = &bidir_blocks_infos[16];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR_FWD_16x8:
        bidir_info.blocks = &bidir_blocks_infos[18];
        bidir_info.size = 2;
        break;

    case MBTYPE_FWD_BIDIR_16x8:
        bidir_info.blocks = &bidir_blocks_infos[20];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR_BWD_16x8:
        bidir_info.blocks = &bidir_blocks_infos[22];
        bidir_info.size = 2;
        break;

    case MBTYPE_BWD_BIDIR_16x8:
        bidir_info.blocks = &bidir_blocks_infos[24];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR_BIDIR_16x8:
        bidir_info.blocks = &bidir_blocks_infos[26];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR_FWD_8x16:
        bidir_info.blocks = &bidir_blocks_infos[28];
        bidir_info.size = 2;
        break;

    case MBTYPE_FWD_BIDIR_8x16:
        bidir_info.blocks = &bidir_blocks_infos[30];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR_BWD_8x16:
        bidir_info.blocks = &bidir_blocks_infos[32];
        bidir_info.size = 2;
        break;

    case MBTYPE_BWD_BIDIR_8x16:
        bidir_info.blocks = &bidir_blocks_infos[34];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR_BIDIR_8x16:
        bidir_info.blocks = &bidir_blocks_infos[36];
        bidir_info.size = 2;
        break;

    case MBTYPE_BIDIR:
        bidir_info.blocks = &bidir_blocks_infos[38];
        bidir_info.size = 1;
        break;

    case MBTYPE_INTER_8x8_REF0:
    case MBTYPE_INTER_8x8:
        {
        BlocksBidirInfo *inf = bidir_info.blocks;
        bidir_info.size = 0;
        for (Ipp32s block = 0; block < 4; block++)
        {
            switch (*sub_type)
            {
                case SBTYPE_8x8:
                    *inf = bidir_blocks_infos[39];
                    inf->block_index = blockpos[block];
                    inf++;
                    bidir_info.size++;
                    break;

                case SBTYPE_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_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_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;

                default:
                    VM_ASSERT(false);
                    break;
            }

⌨️ 快捷键说明

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