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