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

📄 pixel_motion_compensation.c

📁 DM642的mpeg4编码
💻 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 + -