📄 umc_h264_pack.cpp
字号:
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 + -