📄 mem.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 + -