13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------ 23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo 33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License"); 53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License. 63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at 73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * http://www.apache.org/licenses/LICENSE-2.0 93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software 113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS, 123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied. 143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions 153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License. 163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * ------------------------------------------------------------------- 173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */ 183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h" 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h" 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h" 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "zigzag.h" 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "scaling.h" 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid doDCACPrediction( 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecData *video, 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int comp, 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *q_block, 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int *direction 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong) 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Define all local variables 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i; 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum = video->mbnum; 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nMBPerRow = video->nMBPerRow; 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int x_pos = video->mbnum_col; 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int y_pos = video->mbnum_row; 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *AC_tmp; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int QP_tmp; 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *QP_store = video->QPMB + mbnum; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int QP = video->QPMB[mbnum]; 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int QP_half = QP >> 1; 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 val; 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int flag_0 = FALSE, flag_1 = FALSE; 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *slice_nb = video->sliceNo; 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCStore *DC_store = video->predDC + mbnum; 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCACStore *DCAC_col = video->predDCAC_col; 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int left_bnd, up_bnd; 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Xpos[6] = { -1, 0, -1, 0, -1, -1}; 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Ypos[6] = { -1, -1, 0, 0, -1, -1}; 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Xtab[6] = {1, 0, 3, 2, 4, 5}; 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Ytab[6] = {2, 3, 0, 1, 4, 5}; 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Ztab[6] = {3, 2, 1, 0, 4, 5}; 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* I added these to speed up comparisons */ 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Pos0[6] = { 1, 1, 0, 0, 1, 1}; 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Pos1[6] = { 1, 0, 1, 0, 1, 1}; 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// int *direction; /* 0: HORIZONTAL, 1: VERTICAL */ 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int block_A, block_B, block_C; 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int DC_pred; 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int y_offset, x_offset, x_tab, y_tab, z_tab; /* speedup coefficients */ 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int b_xtab, b_ytab; 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!comp && x_pos && !(video->headerInfo.Mode[mbnum-1]&INTRA_MASK)) /* not intra */ 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memset(DCAC_col, 0, sizeof(typeDCACStore)); 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!comp && y_pos && !(video->headerInfo.Mode[mbnum-nMBPerRow]&INTRA_MASK)) /* not intra */ 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memset(DCAC_row, 0, sizeof(typeDCACStore)); 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y_offset = Ypos[comp] * nMBPerRow; 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x_offset = Xpos[comp]; 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x_tab = Xtab[comp]; 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y_tab = Ytab[comp]; 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong z_tab = Ztab[comp]; 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong b_xtab = B_Xtab[comp]; 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong b_ytab = B_Ytab[comp]; 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Function body here 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Find the direction of prediction and the DC prediction */ 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (x_pos == 0 && y_pos == 0) 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* top left corner */ 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_B = (comp == 3) ? DC_store[x_offset][z_tab] : mid_gray; 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[0][y_tab] : mid_gray; 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (x_pos == 0) 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* left edge */ 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong up_bnd = Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]; 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_B = ((comp == 1 && up_bnd) || comp == 3) ? DC_store[y_offset+x_offset][z_tab] : mid_gray; 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (y_pos == 0) 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* top row */ 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong left_bnd = Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]; 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_B = ((comp == 2 && left_bnd) || comp == 3) ? DC_store[y_offset + x_offset][z_tab] : mid_gray; 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong up_bnd = Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]; 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong left_bnd = Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]; 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_B = (((comp == 0 || comp == 4 || comp == 5) && slice_nb[mbnum] == slice_nb[mbnum-1-nMBPerRow]) || 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (comp == 1 && up_bnd) || (comp == 2 && left_bnd) || (comp == 3)) ? DC_store[y_offset+x_offset][z_tab] : mid_gray; 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((PV_ABS((block_A - block_B))) < (PV_ABS((block_B - block_C)))) 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DC_pred = block_C; 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *direction = 1; 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (ACpred_flag == 1) 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_1) 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong AC_tmp = DCAC_row[0][b_xtab]; 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_tmp = QP_store[y_offset]; 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (QP_tmp == QP) 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 1; i < 8; i++) 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[i] = *AC_tmp++; 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 1; i < 8; i++) 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong val = (int32)(*AC_tmp++) * QP_tmp; 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[i] = (val < 0) ? (int16)((val - QP_half) / QP) : (int16)((val + QP_half) / QP); 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Vertical, top ROW of block C */ 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DC_pred = block_A; 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *direction = 0; 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (ACpred_flag == 1) 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_0) 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong AC_tmp = DCAC_col[0][b_ytab]; 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_tmp = QP_store[x_offset]; 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (QP_tmp == QP) 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 1; i < 8; i++) 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[i<<3] = *AC_tmp++; 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 1; i < 8; i++) 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong val = (int32)(*AC_tmp++) * QP_tmp; 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[i<<3] = (val < 0) ? (int16)((val - QP_half) / QP) : (int16)((val + QP_half) / QP); 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Vertical, top ROW of block C */ 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Now predict the DC coefficient */ 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_tmp = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr; 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] += (int16)((DC_pred + (QP_tmp >> 1)) * scale[QP_tmp] >> 18); 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// q_block[0] += (DC_pred+(QP_tmp>>1))/QP_tmp; 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Return nothing or data or data pointer 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid doDCACPrediction_I( 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecData *video, 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int comp, 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *q_block 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong) 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Define all local variables 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum = video->mbnum; 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nMBPerRow = video->nMBPerRow; 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int x_pos = video->mbnum_col; 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int y_pos = video->mbnum_row; 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *AC_tmp; 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int flag_0 = FALSE, flag_1 = FALSE; 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *slice_nb = video->sliceNo; 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCStore *DC_store = video->predDC + mbnum; 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCACStore *DCAC_col = video->predDCAC_col; 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int left_bnd, up_bnd; 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *mode = video->headerInfo.Mode; 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Xpos[6] = { -1, 0, -1, 0, -1, -1}; 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Ypos[6] = { -1, -1, 0, 0, -1, -1}; 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Xtab[6] = {1, 0, 3, 2, 4, 5}; 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Ytab[6] = {2, 3, 0, 1, 4, 5}; 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* I added these to speed up comparisons */ 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Pos0[6] = { 1, 1, 0, 0, 1, 1}; 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int Pos1[6] = { 1, 0, 1, 0, 1, 1}; 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong static const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// int *direction; /* 0: HORIZONTAL, 1: VERTICAL */ 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int block_A, block_C; 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int y_offset, x_offset, x_tab, y_tab; /* speedup coefficients */ 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int b_xtab, b_ytab; 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y_offset = Ypos[comp] * nMBPerRow; 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x_offset = Xpos[comp]; 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x_tab = Xtab[comp]; 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y_tab = Ytab[comp]; 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong b_xtab = B_Xtab[comp]; 2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong b_ytab = B_Ytab[comp]; 2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Function body here 2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Find the direction of prediction and the DC prediction */ 2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (x_pos == 0 && y_pos == 0) 2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* top left corner */ 2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[0][y_tab] : mid_gray; 2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (x_pos == 0) 2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* left edge */ 2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong up_bnd = (Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]) 2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong && (mode[mbnum-nMBPerRow] == MODE_INTRA || mode[mbnum-nMBPerRow] == MODE_INTRA_Q);; 2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (y_pos == 0) 2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* top row */ 2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong left_bnd = (Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]) 2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong && (mode[mbnum-1] == MODE_INTRA || mode[mbnum-1] == MODE_INTRA_Q); 2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong up_bnd = (Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]) 2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong && (mode[mbnum-nMBPerRow] == MODE_INTRA || mode[mbnum-nMBPerRow] == MODE_INTRA_Q); 2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong left_bnd = (Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]) 2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong && (mode[mbnum-1] == MODE_INTRA || mode[mbnum-1] == MODE_INTRA_Q); 2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (ACpred_flag == 0) 2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_0 == TRUE) 2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_1 == TRUE) 2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = (int16)((block_A + block_C) >> 1); 3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = (int16)block_A; 3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_1 == TRUE) 3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = (int16)block_C; 3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = mid_gray; 3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->mblock->direction == 1) 3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_1 == TRUE) 3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = (int16)block_C; 3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong AC_tmp = DCAC_row[0][b_xtab]; 3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[1] = AC_tmp[0]; 3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[2] = AC_tmp[1]; 3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[3] = AC_tmp[2]; 3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[4] = AC_tmp[3]; 3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[5] = AC_tmp[4]; 3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[6] = AC_tmp[5]; 3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[7] = AC_tmp[6]; 3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = mid_gray; 3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (flag_0 == TRUE) 3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = (int16)block_A; 3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong AC_tmp = DCAC_col[0][b_ytab]; 3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[8] = AC_tmp[0]; 3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[16] = AC_tmp[1]; 3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[24] = AC_tmp[2]; 3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[32] = AC_tmp[3]; 3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[40] = AC_tmp[4]; 3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[48] = AC_tmp[5]; 3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[56] = AC_tmp[6]; 3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong q_block[0] = mid_gray; 3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Return nothing or data or data pointer 3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 369