📄 block.cpp
字号:
/** * 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 + -