📄 basic_prediction.c
字号:
//**********************************************
//File name: basic_prediction.c
//Author: Anna
//Date:
//**********************************************
extern int width;
extern int height;
// Purpose: specialized basic motion compensation routines
void CopyBlock(unsigned char *Src, unsigned char *Dst, int Stride,
int xint,int yint,int orgx,int orgy )
{
// int dy;
int y;
int x;
int new_x,new_y;
#ifndef BIG_ENDIAN
// char *lpSrc = (char *) Src;
// char *lpDst = (char *) Dst;
// int lpStride = Stride;
int w,h;
// w=352;h=240;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0; y < 8; y++)
{
for(x=0;x<8;x++)
{
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
else if(new_x>=w)
new_x=w-1;
if(new_y<0)
new_y=0;
else if(new_y>=h)
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=Src[new_y*Stride+new_x];
}
}
#else
long *lpSrc = (long *) Src;
long *lpDst = (long *) Dst;
int lpStride = Stride >> 2;
for (dy = 0; dy < 8; dy++) {
lpDst[0] = lpSrc[0];
lpDst[1] = lpSrc[1];
lpSrc += lpStride;
lpDst += lpStride;
}
#endif
}
/**/
void CopyBlockHor(unsigned char * Src, unsigned char * Dst, int Stride,
int xint,int yint,int orgx,int orgy)
{
// int dy, dx;
int y;
int x;
int new_x,new_y;
int w,h;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0; y < 8; y++) {
for (x = 0; x< 8; x++) {
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
// else if(new_x>=w-1)
// new_x=w-2;
if(new_y<0)
new_y=0;
else if(new_y>=h)
new_y=h-1;
// Dst[dx] = (Src[dx] + Src[dx+1]+1) >> 1; // hor interpolation with rounding
if(new_x<w-1)
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x+1]+1)>>1;
else if(new_x>=w-1)
{
new_x=w-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x]+1)>>1;
}
}
// Src += Stride;
// Dst += Stride;
}
}
/**/
void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride,
int xint,int yint,int orgx,int orgy)
{
//int dy, dx;
int y;
int x;
int new_x,new_y;
int w,h;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0; y < 8; y++) {
for (x = 0; x < 8; x++) {
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
else if(new_x>=w)
new_x=w-1;
if(new_y<0)
new_y=0;
// else if(new_y>=h-1)
// new_y=h-2;
// Dst[dx] = (Src[dx] + Src[dx+Stride] +1) >> 1; // ver interpolation with rounding
if(new_y<h-1)
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[(new_y+1)*Stride+new_x]+1)>>1;
else if(new_y>=h-1)
{
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x]+1)>>1;
}
}
// Src += Stride;
// Dst += Stride;
}
}
void CopyBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride,
int xint,int yint,int orgx,int orgy)
{
//int dy, dx;
int y;
int x;
int new_x,new_y;
int w,h;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0; y < 8; y++) {
for (x = 0; x < 8; x++) {
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
// else if(new_x>=w-1)
// new_x=w-2;
if(new_y<0)
new_y=0;
// else if(new_y>=h-1)
// new_y=h-2;
// Dst[dx] = (Src[dx] + Src[dx+1] +
// Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
if((new_x<w-1)&&(new_y<h-1))
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x+1]+2)>>2;
else if((new_x>=w-1)&&(new_y>=h-1))
{
new_x=w-1;
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+2)>>2;
}
else if ((new_x<w-1)&&(new_y>=h-1))
{
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+2)>>2;
}
else if((new_x>=w-1)&&(new_y<h-1))
{
new_x=x-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x]+2)>>2;
}
}
// Src += Stride;
// Dst += Stride;
}
}
/**/
void CopyBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride,
int xint,int yint,int orgx,int orgy)
{
//int dy, dx;
int y;
int x;
int new_x,new_y;
int w,h;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0; y < 8; y++) {
for (x = 0; x < 8; x++) {
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
// else if(new_x>=w-1)
// new_x=w-2;
if(new_y<0)
new_y=0;
else if(new_y>=h)
new_y=h-1;
// Dst[dx] = (Src[dx] + Src[dx+1]) >> 1; // hor interpolation with rounding
if(new_x<w-1)
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x+1])>>1;
else if(new_x>=w-1)
{
new_x=w-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x])>>1;
}
}
// Src += Stride;
// Dst += Stride;
}
}
/**/
void CopyBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride,
int xint,int yint,int orgx,int orgy)
{
//int dy, dx;
int y;
int x;
int new_x,new_y;
int w,h;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0;y < 8; y++) {
for (x = 0; x < 8; x++) {
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
else if(new_x>=w)
new_x=w-1;
if(new_y<0)
new_y=0;
// else if(new_y>=h-1)
// new_y=h-2;
// Dst[dx] = (Src[dx] + Src[dx+Stride]) >> 1; // ver interpolation with rounding
if (new_y<h-1)
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[(new_y+1)*Stride+new_x])>>1;
else if(new_y>=h-1)
{
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x])>>1;
}
}
//Src += Stride;
//Dst += Stride;
}
}
/**/
void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride,
int xint,int yint,int orgx,int orgy)
{
// int dy, dx;
int y;
int x;
int new_x;
int new_y;
int w,h;
w=width;
h=height;
// if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
for (y = 0; y < 8; y++) {
for (x = 0; x < 8; x++) {
new_x=xint+x+orgx;
new_y=yint+y+orgy;
if(new_x<0)
new_x=0;
// else if(new_x>=w-1)
// new_x=w-2;
if(new_y<0)
new_y=0;
// else if(new_y>=h-1)
// new_y=h-2;
// Dst[dx] = (Src[dx] + Src[dx+1] +
// Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
if ((new_x<w-1)&&(new_y<h-1))
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x+1])>>2;
else if((new_x>=w-1)&&(new_y>=h-1))
{
new_x=w-1;
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x])>>2;
}
else if ((new_x>=w-1)&&(new_y<h-1))
{
new_x=w-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x])>>2;
}
else if ((new_x<w-1)&&(new_y>=h-1))
{
new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1])>>2;
}
}
// Src += Stride;
// Dst += Stride;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -