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

📄 umc_h264_pack.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    mv_inf->block_idx = blockpos[block];
                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.ref_l0_cnt++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[53];
                    mv_inf->block_idx = blockpos[block] + 4;
                    mv_inf++;
                    mv_ref_info.mvs_l0_cnt += 2;
                    mv_ref_info.size_mv += 2;
                    break;

                case SBTYPE_4x8:
                    *mv_inf = blocks_infos[54];
                    mv_inf->block_idx = blockpos[block];
                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.ref_l0_cnt++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[54];
                    mv_inf->block_idx = blockpos[block] + 1;
                    mv_inf++;
                    mv_ref_info.mvs_l0_cnt += 2;
                    mv_ref_info.size_mv += 2;
                    break;

                case SBTYPE_4x4:
                    *mv_inf = blocks_infos[55];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.ref_l0_cnt++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[55];
                    mv_inf->block_idx = blockpos[block] + 1;
                    mv_inf++;
                    *mv_inf = blocks_infos[55];
                    mv_inf->block_idx = blockpos[block] + 4;
                    mv_inf++;
                    *mv_inf = blocks_infos[55];
                    mv_inf->block_idx = blockpos[block] + 5;
                    mv_inf++;

                    mv_ref_info.mvs_l0_cnt += 4;
                    mv_ref_info.size_mv += 4;
                    break;

                default:
                    VM_ASSERT(false);
                    break;
            }

            sub_type++;
        };

        if (mb_type == MBTYPE_INTER_8x8_REF0)
        {
            mv_ref_info.ref_l0_cnt = mv_ref_info.size_ref = 0;
        }
        }
        break;

    case MBTYPE_B_8x8:
        {
        BlocksInfo *mv_inf = mv_ref_info.mv_blocks;
        BlocksInfo *ref_inf = mv_ref_info.ref_blocks;
        mv_ref_info.size_mv = mv_ref_info.size_ref = 0;
        SBTypeValue *stype = sub_type;
        Ipp32s block;
        for (block = 0; block < 4; block++)
        {
            switch (*stype)
            {
                case SBTYPE_DIRECT:
                    // nothing to do
                    break;

                case SBTYPE_FORWARD_8x8:
                case SBTYPE_BIDIR_8x8:
                    mv_ref_info.mvs_l0_cnt++;
                    mv_ref_info.ref_l0_cnt++;
                    *mv_inf = blocks_infos[56];
                    mv_inf->block_idx = blockpos[block];
                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.size_mv++;
                    mv_ref_info.size_ref++;
                    break;

                case SBTYPE_FORWARD_8x4:
                case SBTYPE_BIDIR_8x4:
                    *mv_inf = blocks_infos[57];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    ref_inf++;
                    mv_inf++;
                    mv_ref_info.ref_l0_cnt++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[57];
                    mv_inf->block_idx = blockpos[block] + 4;
                    mv_inf++;
                    mv_ref_info.mvs_l0_cnt += 2;
                    mv_ref_info.size_mv += 2;
                    break;

                case SBTYPE_FORWARD_4x8:
                case SBTYPE_BIDIR_4x8:
                    *mv_inf = blocks_infos[58];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.ref_l0_cnt++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[58];
                    mv_inf->block_idx = blockpos[block] + 1;
                    mv_inf++;
                    mv_ref_info.mvs_l0_cnt += 2;
                    mv_ref_info.size_mv += 2;
                    break;

                case SBTYPE_FORWARD_4x4:
                case SBTYPE_BIDIR_4x4:
                    *mv_inf = blocks_infos[59];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.size_ref++;
                    mv_ref_info.ref_l0_cnt++;

                    *mv_inf = blocks_infos[59];
                    mv_inf->block_idx = blockpos[block] + 1;
                    mv_inf++;
                    *mv_inf = blocks_infos[59];
                    mv_inf->block_idx = blockpos[block] + 4;
                    mv_inf++;
                    *mv_inf = blocks_infos[59];
                    mv_inf->block_idx = blockpos[block] + 5;
                    mv_inf++;

                    mv_ref_info.mvs_l0_cnt += 4;
                    mv_ref_info.size_mv += 4;
                    break;

                default:
                    break;
            }

            stype++;
        }

        stype = sub_type;
        for (block = 0; block < 4; block++)
        {
            switch (*stype)
            {
                case SBTYPE_DIRECT:
                    // nothing to do
                    break;

                case SBTYPE_BIDIR_8x8:
                case SBTYPE_BACKWARD_8x8:
                    *mv_inf = blocks_infos[60];
                    mv_inf->block_idx = blockpos[block];
                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.size_mv++;
                    mv_ref_info.size_ref++;
                    break;

                case SBTYPE_BACKWARD_8x4:
                case SBTYPE_BIDIR_8x4:
                    *mv_inf = blocks_infos[61];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[61];
                    mv_inf->block_idx = blockpos[block] + 4;
                    mv_inf++;

                    mv_ref_info.size_mv += 2;
                    break;

                case SBTYPE_BACKWARD_4x8:
                case SBTYPE_BIDIR_4x8:
                    *mv_inf = blocks_infos[62];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[62];
                    mv_inf->block_idx = blockpos[block] + 1;
                    mv_inf++;

                    mv_ref_info.size_mv += 2;
                    break;

                case SBTYPE_BACKWARD_4x4:
                case SBTYPE_BIDIR_4x4:
                    *mv_inf = blocks_infos[63];
                    mv_inf->block_idx = blockpos[block];

                    *ref_inf = *mv_inf;
                    mv_inf++;
                    ref_inf++;
                    mv_ref_info.size_ref++;

                    *mv_inf = blocks_infos[63];
                    mv_inf->block_idx = blockpos[block] + 1;
                    mv_inf++;
                    *mv_inf = blocks_infos[63];
                    mv_inf->block_idx = blockpos[block] + 4;
                    mv_inf++;
                    *mv_inf = blocks_infos[63];
                    mv_inf->block_idx = blockpos[block] + 5;
                    mv_inf++;

                    mv_ref_info.size_mv += 4;
                    break;

                default:
                    break;
            }

            stype++;
        }

        }
        break;


    default:
        VM_ASSERT(false);
        mv_ref_info.size_mv =
        mv_ref_info.size_ref = 0;
        break;
    }
}

////////////////////////////////////////////////////////////////////////////////
//
// Encode_MB_Vectors
//
////////////////////////////////////////////////////////////////////////////////
template <class PixType, class CoeffsType>
void H264CoreEncoder<PixType,CoeffsType>::Encode_MB_Vectors(H264EncoderThreadPrivateSlice<PixType, CoeffsType> *curr_slice)
{
    Ipp32s num_vectors, ref0_vectors = 0;
    H264MotionVector    mvd[32];  // for the up to 16 deltas for the MB in each direction
    Ipp32s              block_index[32];    // for the up to 16 indexes for the blocks in each direction

    BlocksInfo mv_info_buf[32];
    BlocksInfo ref_info_buf[8];
    MV_Ref_Info info;
    info.mv_blocks = mv_info_buf;
    info.ref_blocks = ref_info_buf;
    H264CurrentMacroblockDescriptor<PixType, CoeffsType> &cur_mb = curr_slice->m_cur_mb;
    CH264pBs<PixType,CoeffsType>  *pBitstream = curr_slice->m_pbitstream;

    get_blocks_info(cur_mb.GlobalMacroblockInfo->mbtype, cur_mb.GlobalMacroblockInfo->sbtype, info);

    num_vectors = 0;
    BlocksInfo * mv_blocks_info = info.mv_blocks;
    for(Ipp32s i = 0; i < info.size_mv; i++, mv_blocks_info++)
    {
        H264MotionVector mv;

        block_index[i] = mv_blocks_info->block_idx;

        Calc_One_MV_Predictor(curr_slice, cur_mb.uMB, mv_blocks_info->block_idx, mv_blocks_info->list_num,
            mv_blocks_info->block_w, mv_blocks_info->block_h,
            &mv, &mvd[i]);

        StoreDMVs((&cur_mb.MVs[mv_blocks_info->list_num + 2]->MotionVectors[mv_blocks_info->block_idx]),
            0, mv_blocks_info->block_w, 1,
            0, mv_blocks_info->block_h, 1, mvd[i]);
    }

    ref0_vectors = info.mvs_l0_cnt;
    num_vectors = info.size_mv;

    // Note, right now, ref_idx_l0 and ref_idx_l1 values assumed to be zero are
    // written because we don't implement multiple reference frames.
    if ((curr_slice->num_ref_idx_l0_active<<pGetMBFieldDecodingFlag(cur_mb.GlobalMacroblockInfo)) - 1)
    {
        BlocksInfo * ref_blocks_info = info.ref_blocks;
        for(Ipp32s i = 0; i < info.ref_l0_cnt; i++, ref_blocks_info++)
            Encode_ref_idx(curr_slice, ref_blocks_info->block_idx, ref_blocks_info->list_num);
    }

    if ((curr_slice->num_ref_idx_l1_active<<pGetMBFieldDecodingFlag(cur_mb.GlobalMacroblockInfo)) - 1)
    {
        BlocksInfo * ref_blocks_info = info.ref_blocks + info.ref_l0_cnt;
        for(Ipp32s i = info.ref_l0_cnt; i < info.size_ref; i++, ref_blocks_info++)
            Encode_ref_idx(curr_slice, ref_blocks_info->block_idx, ref_blocks_info->list_num);
    }

    // Put vectors into bitstream.
    if (m_PicParamSet.entropy_coding_mode)
    {
        for (Ipp32s i = 0; i < num_vectors; i++)
        {
            H264MotionVector top_mv, left_mv;

            Ipp32s list_num = i < ref0_vectors ? LIST_0 : LIST_1;

            Ipp32s block_num = block_index[i];

            if (BLOCK_IS_ON_TOP_EDGE(block_num))
            {
                H264BlockLocation block = cur_mb.CurrentBlockNeighbours.mb_above;
                if (block.mb_num >= 0)
                {
                    block.block_num += block_num;

⌨️ 快捷键说明

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