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

📄 mem.c

📁 DM642的mpeg4编码
💻 C
字号:
//**********************************************************************************************
//文件名:mem.c
//功能:完成图象、块之间内存拷贝,以及扩边等处理
//作者:吕旭光
//版权:BraveVideo
//**********************************************************************************************

//*********************************************************************************************
//INCLUDE
//*********************************************************************************************
#include "mem.h"
#include "../global.h"

#include "bvedma.h"

//***********************************************************************************************
//函 数 名:TransferImage8ToBlock16()
//函数功能:从8位图象数据按块取出放到16位的块中
//形式参数:void
//返 回 值:void
//***********************************************************************************************
/*
#pragma CODE_SECTION(TransferImage8ToBlock16,".internal_code1");
void TransferImage8ToBlock16(short* Dst, unsigned char * Src, short iStride)
{
 
         unsigned char i, j;
//	unsigned char tt[64];	
	 
//	BVDM642_edma_2D1D(EDMA_open(50,EDMA_OPEN_RESET),50,Src,tt,8,8,iStride);
//	BVDM642_EDMA_WAIT_HIGH(50);	 
//	IMG_pix_expand(64,tt,Dst);

	 for (i = 0; i < 8; i++)
	 {
		 for (j = 0; j < 8; j++)
		 {
			 Dst[i*8+j] = Src[i*iStride+j];
		 }
	 }

	
//	nTransferImage8ToBlock16(Dst,Src,iStride);
	
}
*/
//***********************************************************************************************
//函 数 名:TransferBlock16ToImage()
//函数功能:将块中的16位数据取出,放到图象8位的相应位置
//形式参数:void
//返 回 值:void
//***********************************************************************************************
/*
#pragma CODE_SECTION(TransferBlock16ToImage8,".internal_code1");
void TransferBlock16ToImage8(unsigned char * Dst, short* Src, short iStride)
{
    unsigned char i, j;
//	unsigned char tt[64];

//	IMG_pix_sat(64,Src,tt);
//	BVDM642_edma_1D2D(EDMA_open(51,EDMA_OPEN_RESET),51,tt,Dst,8,8,iStride);
//	BVDM642_EDMA_WAIT_HIGH(51);	 
	

	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			Dst[i*iStride+j] = (unsigned char)Src[i*8+j];
		}
	}

}
*/
//***********************************************************************************************
//函 数 名:SetImage8Edge()
//函数功能:完成对image的扩边处理(上下左右、左上、左下、右上、右下)
//形式参数:
//返 回 值:void
//***********************************************************************************************
void SetImage8Edge(Image8* image, short iExtWidth, short iExtHeight, short iWidth, short iHeight )
{
	int i;
	unsigned char * pDst;
	unsigned char * pSrc;
	short size = 32;
    unsigned short  sizehalf =  size/2;

	//是否是判断iWidth,iHeight为16的整数倍,若不是则变为16的整数倍
	if (1)
	{
		iWidth  = (iWidth+15)&~15;
		iHeight = (iHeight+15)&~15;
	}
	
	// Y 扩边处理

	//将亮度块的指针指向开始的地方
	pDst = image->Y - (size + size * iExtWidth);
	pSrc = image->Y;

	//填充左上、上、右上扩边的值
	for (i = 0; i < size; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];

		//填充扩边后的左上角32×32的四个宏块为原图象的第一行的第一个值
		//填充扩边后的右上角32×32的四个宏块为原图象的第一行的最后一个值
		for (j = 0; j < size; j++)
		{
			pDst[j] = temp1;					//左上扩边的值
			pDst[j + iExtWidth - size] = temp2;					//右上扩边的值
		}
		memcpy(pDst + size, pSrc, sizeof(unsigned char) * iWidth);	//将原图象的第一行拷贝到上扩边图象的第一行。
		
		//转移到了下一行
		pDst += iExtWidth;
	}

	//填充左右扩边的值,左边为填充图象最左边的值,右边填充原始图象对应行的最右边的值
	for (i = 0; i < iHeight; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < size; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - size] = temp2;			
		}

		pDst += iExtWidth;
		pSrc += iExtWidth;
	}
	
	pSrc -= iExtWidth;			//将原始图象的指针移动到扩边后的最后一行的起始地址
	//左下、下、右下扩边
	for (i = 0; i < size; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < size; j++)
		{
			pDst[j] = temp1;						
			pDst[j + iExtWidth - size] = temp2;			
		}

		memcpy(pDst + size, pSrc, sizeof(unsigned char) * iWidth);	
		pDst += iExtWidth;
	}

	//对于色差分量,扩边值减半
	iWidth /= 2;
	iExtWidth  /= 2;
	iExtHeight /= 2;

	// U 扩边处理
	pDst = image->Cb - (sizehalf + sizehalf * iExtWidth);
	pSrc = image->Cb;

	for (i = 0; i < sizehalf; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < sizehalf; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - sizehalf] = temp2;			
		}

		memcpy(pDst + sizehalf, pSrc,  sizeof(unsigned char) * iWidth);		
		pDst += iExtWidth;
	}
	
	for (i = 0; i < iHeight/2; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < sizehalf; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - sizehalf] = temp2;			
		}

		pDst += iExtWidth;
		pSrc += iExtWidth;
	}
	
	pSrc -= iExtWidth;
	for (i = 0; i < sizehalf; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < sizehalf; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - sizehalf] = temp2;			
		}
		
		memcpy(pDst + sizehalf, pSrc,  sizeof(unsigned char) * iWidth);
		pDst += iExtWidth;
	}

	//V 扩边处理 
	pDst = image->Cr - (sizehalf + sizehalf * iExtWidth);
	pSrc = image->Cr;


	for (i = 0; i < sizehalf; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < sizehalf; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - sizehalf] = temp2;			
		}
		
		memcpy(pDst + sizehalf, pSrc,  sizeof(unsigned char) * iWidth);		
		pDst += iExtWidth;
	}
	
	for (i = 0; i < iHeight/2; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < sizehalf; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - sizehalf] = temp2;			
		}

		pDst += iExtWidth;
		pSrc += iExtWidth;
	}

	pSrc -= iExtWidth;
	for (i = 0; i < sizehalf; i++) 
	{
		int j;
		unsigned char temp1, temp2;
		temp1 = pSrc[0];
		temp2 = pSrc[iWidth - 1];
		for (j = 0; j < sizehalf; j++)
		{
			pDst[j] = temp1;
			pDst[j + iExtWidth - sizehalf] = temp2;			
		}
		
		memcpy(pDst + sizehalf, pSrc, sizeof(unsigned char) * iWidth);
		pDst += iExtWidth;
	}
}

void Transfer8_ImageToImage_Interpolate_HV(unsigned char* Dst, unsigned char* Src, short iStride, short iRounding)
{
	 short i, j;
	 for (j = 0; j < 8; j++)
	 {
		 for (i = 0; i < 8; i++)
		 {
			 Dst[j * iStride + i] = (Src[j*iStride+i] + Src[j*iStride+i+1] + Src[(j+1) * iStride+i] + Src[(j+1) * iStride + i + 1] + 2 - iRounding) >> 2;
		 }
	 }
}

void TransferImage8ToImage8(unsigned char* Dst, unsigned char* Src, short iStride)
{
	short i, j;

	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			Dst[i * iStride + j] = Src[i * iStride + j];
		}
	}
}

#pragma CODE_SECTION(TransferBlock16SubBlock16,".internal_code1");
void TransferBlock16SubBlock16(short* Dst, short* Src)
{
	short i, j;

	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			Dst[i * 8 + j] -= Src[i * 8 + j];
		}
	}
}
//***********************************************************************************************
//函 数 名:TransferBlock16AddBlock16()
//函数功能:将对应位置上的Dst=Src+Dst,并对Dst进行0-255限制范围
//形式参数:void
//返 回 值:void
//***********************************************************************************************
#pragma CODE_SECTION(TransferBlock16AddBlock16,".internal_code1");
void TransferBlock16AddBlock16(short* Dst, short* Src)
{
    short i, j;

	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			Dst[i * 8 + j] += Src[i * 8 + j];
			Dst[i*8+j]=CLIP(Dst[i*8+j], 0, 255);
		}
	}
}


void TransferImage8ToBlock16_Interpolate_H(short* Dst, unsigned char* Src, short iStride, short iRounding)
{
     short i, j;

	 unsigned char * Src1 = Src + 1;

	 for (j = 0; j < 8; j++)
	 {
		 for (i = 0; i < 8; i++)
		 {
			 Dst[j*8+i] = (Src[j*iStride+i] + Src1[j*iStride+i] + 1 - iRounding)>>1;
		 }

	 }
}

void TransferImage8ToBlock16_Interpolate_V(short* Dst, unsigned char* Src, short iStride, short iRounding)
{
	 short i, j;

	 unsigned char* Src1 = Src + iStride;

	 for (j = 0; j < 8; j++)
	 {
		 for (i = 0; i < 8; i++)
		 {
			 Dst[j*8+i] = (Src[j*iStride+i] + Src1[j*iStride+i] + 1 - iRounding)>>1;
		 }

	 }
}

void TransferImage8ToBlock16_Interpolate_HV(short* Dst, unsigned char* Src, short iStride, short iRounding)
{
     short i, j;
	 for (j = 0; j < 8; j++)
	 {
		 for (i = 0; i < 8; i++)
		 {
			 Dst[j*8+i] = (Src[j*iStride+i] + Src[j*iStride+i+1] + Src[(j+1) * iStride+i] + Src[(j+1) * iStride + i + 1] + 2 - iRounding) >> 2;
		 }
	 }

}


⌨️ 快捷键说明

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