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

📄 block.cpp

📁 avs decoder sources, added a command line sample
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/** * Copyright (c) 2006 *      OpenAVS Developers. All Rights Reserved. * * Copyright (c) 2005-2006 *      NSCC. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *//** * ! \file "block.c" * * Implement IDCT transform, luminance interpolation algorithm, and * operations based on block: 8x8 block reconstruct, copy single 8x8 * block, evaluate the average of two blocks, etc. */#include "block.h"#include "global.h"/** * Function: IDCT */void inv_transform_B8(		AVS_SHORT * psBlock  /* block to be inverse transformed */ ){	AVS_SHORT xx, yy;	AVS_SHORT tmp[8];	AVS_SHORT t;	AVS_SHORT b[8];	/* Horizontal inverse transform */	for (yy = 0; yy < 8; yy++) {    		/* Reorder */		tmp[0] = psBlock[yy * 8 + 0];		tmp[1] = psBlock[yy * 8 + 4];		tmp[2] = psBlock[yy * 8 + 2];		tmp[3] = psBlock[yy * 8 + 6];		tmp[4] = psBlock[yy * 8 + 1];		tmp[5] = psBlock[yy * 8 + 3];		tmp[6] = psBlock[yy * 8 + 5];		tmp[7] = psBlock[yy * 8 + 7];		/* Downleft Butterfly */		b[0] = ((tmp[4] - tmp[7]) << 1) + tmp[4];		b[1] = ((tmp[5] + tmp[6]) << 1) + tmp[5];		b[2] = ((tmp[5] - tmp[6]) << 1) - tmp[6];		b[3] = ((tmp[4] + tmp[7]) << 1) + tmp[7];		b[4] = (( b[0] + b[1] + b[3]) << 1) + b[1];		b[5] = (( b[0] - b[1] + b[2]) << 1) + b[0];		b[6] = ((-b[1] - b[2] + b[3]) << 1) + b[3];		b[7] = (( b[0] - b[2] - b[3]) << 1) - b[2];		/* Upleft Butterfly */		t = ((tmp[2] * 10)+(tmp[3] << 2));		tmp[3] = ((tmp[2] << 2) - (tmp[3] * 10));		tmp[2] = t;		t = (tmp[0] + tmp[1]) << 3;		tmp[1] = (tmp[0] - tmp[1]) << 3;		tmp[0] = t;		b[0] = tmp[0] + tmp[2];		b[1] = tmp[1] + tmp[3];		b[2] = tmp[1] - tmp[3];		b[3] = tmp[0] - tmp[2];	 		/* Last Butterfly */		psBlock[yy * 8 + 0] = ((b[0] + b[4]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 1] = ((b[1] + b[5]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 2] = ((b[2] + b[6]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 3] = ((b[3] + b[7]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 7] = ((b[0] - b[4]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 6] = ((b[1] - b[5]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 5] = ((b[2] - b[6]) + (1 << 2)) >> 3;		psBlock[yy * 8 + 4] = ((b[3] - b[7]) + (1 << 2)) >> 3;	}	/* Vertical inverse transform */	for (xx = 0; xx < 8; xx++) {     		/* Reorder */		tmp[0] = psBlock[0 * 8 + xx];		tmp[1] = psBlock[4 * 8 + xx];		tmp[2] = psBlock[2 * 8 + xx];		tmp[3] = psBlock[6 * 8 + xx];		tmp[4] = psBlock[1 * 8 + xx];		tmp[5] = psBlock[3 * 8 + xx];		tmp[6] = psBlock[5 * 8 + xx];		tmp[7] = psBlock[7 * 8 + xx];		/* Downleft Butterfly */		b[0] = ((tmp[4] - tmp[7]) << 1) + tmp[4];		b[1] = ((tmp[5] + tmp[6]) << 1) + tmp[5];		b[2] = ((tmp[5] - tmp[6]) << 1) - tmp[6];		b[3] = ((tmp[4] + tmp[7]) << 1) + tmp[7];		b[4] = (( b[0] + b[1] + b[3]) << 1) + b[1];		b[5] = (( b[0] - b[1] + b[2]) << 1) + b[0];		b[6] = ((-b[1] - b[2] + b[3]) << 1) + b[3];		b[7] = (( b[0] - b[2] - b[3]) << 1) - b[2];		/* Upleft Butterfly */		t = ((tmp[2] * 10) + (tmp[3] << 2));		tmp[3] = ((tmp[2] << 2) - (tmp[3] * 10));		tmp[2] = t;		t = (tmp[0] + tmp[1]) << 3;		tmp[1] = (tmp[0] - tmp[1]) << 3;		tmp[0] = t;		b[0] = tmp[0] + tmp[2];		b[1] = tmp[1] + tmp[3];		b[2] = tmp[1] - tmp[3];		b[3] = tmp[0] - tmp[2];		/* Last Butterfly */		psBlock[0 * 8 + xx] = 			(Clip3(-32768, 32703, b[0] + b[4]) + 64) >> 7;		psBlock[1 * 8 + xx] = 			(Clip3(-32768, 32703, b[1] + b[5]) + 64) >> 7;		psBlock[2 * 8 + xx] = 			(Clip3(-32768, 32703, b[2] + b[6]) + 64) >> 7;		psBlock[3 * 8 + xx] = 			(Clip3(-32768, 32703, b[3] + b[7]) + 64) >> 7;		psBlock[7 * 8 + xx] = 			(Clip3(-32768, 32703, b[0] - b[4]) + 64) >> 7;		psBlock[6 * 8 + xx] = 			(Clip3(-32768, 32703, b[1] - b[5]) + 64) >> 7;		psBlock[5 * 8 + xx] = 			(Clip3(-32768, 32703, b[2] - b[6]) + 64) >> 7;		psBlock[4 * 8 + xx] = 			(Clip3(-32768, 32703, b[3] - b[7]) + 64) >> 7;	}}/** * Function: 8x8 luminance block interpolation prediction */void GetBlock(		MOTIONVECTOR * pMv, 		AVS_INT iImgX, AVS_INT iImgY, 		AVS_INT iImgWidth, AVS_INT iImgHeight, 		const AVS_BYTE * pbRefY, AVS_BYTE* pPred){	int i, j;	int imgX = iImgX;	int imgY = iImgY;	int dx = (imgX * 4 + pMv->x) & 3;	int dy = (imgY * 4 + pMv->y) & 3;	int refX = (imgX * 4 + pMv->x - dx) / 4;	int refY = (imgY * 4 + pMv->y - dy) / 4;	if (dy ==0 && dx == 0) { //D		for (i = 0; i < 8; i++) {			for (j = 0; j < 8; j++) {				pPred[i * 8 + j] = 				  *(pbRefY + 				    max(0, min(iImgHeight - 1, refY + i)) * iImgWidth +				    max(0, min(iImgWidth - 1, refX + j)));			}		}	}	else if (dx == 2 && dy == 0) { //b		for (i = 0; i < 8; i++) {			for (j = 0; j < 8; j++) {				int bpie = 				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j - 1))) 				  + 5 * *(pbRefY +				          max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				          max(0, min(iImgWidth-1, refX + j))) 				  + 5 * *(pbRefY + 				          max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				          max(0, min(iImgWidth - 1, refX + j + 1)))				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j + 2)));				pPred[i * 8 + j] = Clip((bpie + 4) >> 3);			}		}	}	else if (dy == 2 && dx == 0) { //h		for (i = 0; i < 8; i++)			for (j = 0; j < 8; j++) {				int hpie = 				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i - 1)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j)))				  + 5 * *(pbRefY + 				          max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				          max(0, min(iImgWidth - 1, refX + j)))				  + 5 * *(pbRefY + 				          max(0, min(iImgHeight - 1, refY + i + 1)) * iImgWidth + 				          max(0, min(iImgWidth - 1, refX + j)))				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i + 2)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j)));				pPred[i * 8 + j] = Clip((hpie + 4) >> 3);			}	}	else if (dy == 2 && dx == 2) { //j		for (i = 0; i < 8; i++) {			for (j = 0; j < 8; j++) {				int aapie = 				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i - 1)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j - 1))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i - 1)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i - 1)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j + 1))))				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i - 1)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j + 2))));				int bpie =  				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j - 1))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j + 1))))				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j + 2))));				int spie = 				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i + 1)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j - 1))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i + 1)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i + 1)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j + 1))))				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i + 1)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j + 2))));				int ddpie = 				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i + 2)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j - 1))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i + 2)) * iImgWidth + 					   max(0, min(iImgWidth - 1, refX + j))))				  + 5 * (*(pbRefY + 				           max(0, min(iImgHeight - 1, refY + i + 2)) * iImgWidth + 				           max(0, min(iImgWidth - 1, refX + j + 1))))				  - (*(pbRefY + 				       max(0, min(iImgHeight - 1, refY + i + 2)) * iImgWidth + 				       max(0, min(iImgWidth - 1, refX + j + 2))));				int jpie = -aapie + 5 * bpie + 5 * spie - ddpie;				pPred[i * 8 + j] = Clip((jpie + 32) >> 6);			}		}	}	else if (dy==0 && dx==1) { //a		for (i = 0; i < 8; i++) {			for (j = 0; j < 8; j++) {				int eepie = 				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j - 2))) 				  + 5 * *(pbRefY + 				          max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				          max(0, min(iImgWidth - 1, refX + j - 1))) 				  + 5 * *(pbRefY + 				          max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				          max(0, min(iImgWidth - 1, refX + j)))				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j + 1)));				int Dpie = 				  *(pbRefY + 				    max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				    max(0, min(iImgWidth - 1, refX + j))) * 8;				int bpie = 				  - *(pbRefY + 				      max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				      max(0, min(iImgWidth - 1, refX + j - 1))) 				  + 5 * *(pbRefY + 				          max(0, min(iImgHeight - 1, refY + i)) * iImgWidth + 				          max(0, min(iImgWidth - 1, refX + j))) 

⌨️ 快捷键说明

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