📄 pixel_motion_compensation.c
字号:
#include "pixel_motion_compensation.h"
#include "../mempry/block.h"
#include "../mempry/mem.h"
#include "../global.h"
#include "../dct/idct.h"
void MvCompesationGetRefBlock(short* iDstRefBlock, unsigned char* Y, short vop_extwidth, short rouding, short iMVx, short iMVy, int x, int y)
{
unsigned char* iSrc = Y + (y + (iMVy>>1) ) * vop_extwidth + x + (iMVx>>1);
short* iDst = iDstRefBlock;
switch ( ((iMVx&1)<<1) | (iMVy&1) )
{
case 0:
TransferImage8ToBlock16(iDst,iSrc,vop_extwidth);
break;
case 1:
TransferImage8ToBlock16_Interpolate_V(iDst, iSrc, vop_extwidth, rouding);
break;
case 2:
TransferImage8ToBlock16_Interpolate_H(iDst, iSrc, vop_extwidth, rouding);
break;
default:
TransferImage8ToBlock16_Interpolate_HV(iDst, iSrc, vop_extwidth, rouding);
break;
}
}
//***********************************************************************************************
//函 数 名:OneMvCompensation_Encoder()
//函数功能:运动补偿,由ME得到的运动矢量和前向帧pForImage,得到参考图象的数据,放到data中,并复制到pRefImage中
//形式参数:
//
//返 回 值:void
//***********************************************************************************************
void OneMvCompensation_Encoder(Encoder* pEncoder, MacroBlock* pCurMB, Image8* pRefImage,short x, short y, short* data, short iFlag)
{
short i;
short iDx,iDy;
short iMVx;
short iMVy;
/* K = 1 */
const unsigned int TabK1[4] =
{ 0, 1, 0, 0 };
if (!iFlag)
{
iMVx = pCurMB->Mv[0].x;
iMVy = pCurMB->Mv[0].y;
}
iDx = (iMVx>>1) + TabK1[iMVx & 0x03];
iDy = (iMVy>>1) + TabK1[iMVy & 0x03];
for (i = 0; i < 4; i++)
{
MvCompesationGetRefBlock(data+i*64, pRefImage->Y, pEncoder->pVol->iExtWidth, pEncoder->pCurFrameInfo->vop_rounding_type, iMVx, iMVy, x*16+(i%2)*8, (i/2)*8);
}
MvCompesationGetRefBlock(data+256, pRefImage->Cb, pEncoder->pVol->iExtWidth/2, pEncoder->pCurFrameInfo->vop_rounding_type, iDx, iDy, x*8,0);
MvCompesationGetRefBlock(data+320, pRefImage->Cr, pEncoder->pVol->iExtWidth/2, pEncoder->pCurFrameInfo->vop_rounding_type, iDx, iDy, x*8,0);
}
//***********************************************************************************************
//函 数 名:FourMVCompensation_Encoder()
//函数功能:运动补偿,由ME得到的运动矢量和前向帧pForImage,得到参考图象的数据,放到data中,并复制到pRefImage中
//形式参数:
//
//返 回 值:void
//***********************************************************************************************
void FourMVCompensation_Encoder(Encoder* pEncoder, MacroBlock* pCurMB, Image8* pRefImage,short x, short y, short* data, short iFlag)
{
short i;
short iDx, iDy;
VECTOR iTempMv[4];
/* K = 4 */
const unsigned int TabK4[16] =
{ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1 };
short iMvx, iMvy;
if (!iFlag)
{
iTempMv[0].x = pCurMB->Mv[0].x;
iTempMv[0].y = pCurMB->Mv[0].y;
iTempMv[1].x = pCurMB->Mv[1].x;
iTempMv[1].y = pCurMB->Mv[1].y;
iTempMv[2].x = pCurMB->Mv[2].x;
iTempMv[2].y = pCurMB->Mv[2].y;
iTempMv[3].x = pCurMB->Mv[3].x;
iTempMv[3].y = pCurMB->Mv[3].y;
}
iMvx = iTempMv[0].x + iTempMv[1].x + iTempMv[2].x + iTempMv[3].x;
iMvy = iTempMv[0].y + iTempMv[1].y + iTempMv[2].y + iTempMv[3].y;
iDx = (iMvx>>3) + TabK4[iMvx & 0x0f];
iDy = (iMvy>>3) + TabK4[iMvy & 0x0f];
if (!iFlag)
{
for (i = 0; i < 4; i++)
{
MvCompesationGetRefBlock(data+i*64, pRefImage->Y, pEncoder->pVol->iExtWidth, pEncoder->pCurFrameInfo->vop_rounding_type, pCurMB->Mv[i].x, pCurMB->Mv[i].y, x*16+(i%2)*8,(i/2)*8);
}
MvCompesationGetRefBlock(data+256, pRefImage->Cb, pEncoder->pVol->iExtWidth/2, pEncoder->pCurFrameInfo->vop_rounding_type, iDx, iDy, x*8, 0);
MvCompesationGetRefBlock(data+320, pRefImage->Cr, pEncoder->pVol->iExtWidth/2, pEncoder->pCurFrameInfo->vop_rounding_type, iDx, iDy, x*8, 0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -