102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------ 202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo 302f5b5447de349216a40086ca6061efefb5a3025James Dong * 402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License. 602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at 702f5b5447de349216a40086ca6061efefb5a3025James Dong * 802f5b5447de349216a40086ca6061efefb5a3025James Dong * http://www.apache.org/licenses/LICENSE-2.0 902f5b5447de349216a40086ca6061efefb5a3025James Dong * 1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software 1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied. 1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions 1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License. 1602f5b5447de349216a40086ca6061efefb5a3025James Dong * ------------------------------------------------------------------- 1702f5b5447de349216a40086ca6061efefb5a3025James Dong */ 1802f5b5447de349216a40086ca6061efefb5a3025James Dong 1902f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 2002f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES 2102f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 2202f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h" 2302f5b5447de349216a40086ca6061efefb5a3025James Dong#include "vlc_decode.h" 2402f5b5447de349216a40086ca6061efefb5a3025James Dong#include "bitstream.h" 2502f5b5447de349216a40086ca6061efefb5a3025James Dong#include "zigzag.h" 2602f5b5447de349216a40086ca6061efefb5a3025James Dong#include "scaling.h" 2702f5b5447de349216a40086ca6061efefb5a3025James Dong 2802f5b5447de349216a40086ca6061efefb5a3025James Dongvoid doDCACPrediction( 2902f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecData *video, 3002f5b5447de349216a40086ca6061efefb5a3025James Dong int comp, 3102f5b5447de349216a40086ca6061efefb5a3025James Dong int16 *q_block, 3202f5b5447de349216a40086ca6061efefb5a3025James Dong int *direction 3302f5b5447de349216a40086ca6061efefb5a3025James Dong) 3402f5b5447de349216a40086ca6061efefb5a3025James Dong{ 3502f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 3602f5b5447de349216a40086ca6061efefb5a3025James Dong ; Define all local variables 3702f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 3802f5b5447de349216a40086ca6061efefb5a3025James Dong int i; 3902f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum = video->mbnum; 4002f5b5447de349216a40086ca6061efefb5a3025James Dong int nMBPerRow = video->nMBPerRow; 4102f5b5447de349216a40086ca6061efefb5a3025James Dong int x_pos = video->mbnum_col; 4202f5b5447de349216a40086ca6061efefb5a3025James Dong int y_pos = video->mbnum_row; 4302f5b5447de349216a40086ca6061efefb5a3025James Dong int16 *AC_tmp; 4402f5b5447de349216a40086ca6061efefb5a3025James Dong int QP_tmp; 4502f5b5447de349216a40086ca6061efefb5a3025James Dong int16 *QP_store = video->QPMB + mbnum; 4602f5b5447de349216a40086ca6061efefb5a3025James Dong int QP = video->QPMB[mbnum]; 4702f5b5447de349216a40086ca6061efefb5a3025James Dong int QP_half = QP >> 1; 4802f5b5447de349216a40086ca6061efefb5a3025James Dong int32 val; 4902f5b5447de349216a40086ca6061efefb5a3025James Dong int flag_0 = FALSE, flag_1 = FALSE; 5002f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *slice_nb = video->sliceNo; 5102f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCStore *DC_store = video->predDC + mbnum; 5202f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 5302f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCACStore *DCAC_col = video->predDCAC_col; 5402f5b5447de349216a40086ca6061efefb5a3025James Dong 5502f5b5447de349216a40086ca6061efefb5a3025James Dong uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 5602f5b5447de349216a40086ca6061efefb5a3025James Dong 5702f5b5447de349216a40086ca6061efefb5a3025James Dong int left_bnd, up_bnd; 5802f5b5447de349216a40086ca6061efefb5a3025James Dong 5902f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Xpos[6] = { -1, 0, -1, 0, -1, -1}; 6002f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Ypos[6] = { -1, -1, 0, 0, -1, -1}; 6102f5b5447de349216a40086ca6061efefb5a3025James Dong 6202f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Xtab[6] = {1, 0, 3, 2, 4, 5}; 6302f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Ytab[6] = {2, 3, 0, 1, 4, 5}; 6402f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Ztab[6] = {3, 2, 1, 0, 4, 5}; 6502f5b5447de349216a40086ca6061efefb5a3025James Dong 6602f5b5447de349216a40086ca6061efefb5a3025James Dong /* I added these to speed up comparisons */ 6702f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Pos0[6] = { 1, 1, 0, 0, 1, 1}; 6802f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Pos1[6] = { 1, 0, 1, 0, 1, 1}; 6902f5b5447de349216a40086ca6061efefb5a3025James Dong 7002f5b5447de349216a40086ca6061efefb5a3025James Dong static const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 7102f5b5447de349216a40086ca6061efefb5a3025James Dong static const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 7202f5b5447de349216a40086ca6061efefb5a3025James Dong 7302f5b5447de349216a40086ca6061efefb5a3025James Dong// int *direction; /* 0: HORIZONTAL, 1: VERTICAL */ 7402f5b5447de349216a40086ca6061efefb5a3025James Dong int block_A, block_B, block_C; 7502f5b5447de349216a40086ca6061efefb5a3025James Dong int DC_pred; 7602f5b5447de349216a40086ca6061efefb5a3025James Dong int y_offset, x_offset, x_tab, y_tab, z_tab; /* speedup coefficients */ 7702f5b5447de349216a40086ca6061efefb5a3025James Dong int b_xtab, b_ytab; 7802f5b5447de349216a40086ca6061efefb5a3025James Dong 7902f5b5447de349216a40086ca6061efefb5a3025James Dong if (!comp && x_pos && !(video->headerInfo.Mode[mbnum-1]&INTRA_MASK)) /* not intra */ 8002f5b5447de349216a40086ca6061efefb5a3025James Dong { 8102f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memset(DCAC_col, 0, sizeof(typeDCACStore)); 8202f5b5447de349216a40086ca6061efefb5a3025James Dong } 8302f5b5447de349216a40086ca6061efefb5a3025James Dong if (!comp && y_pos && !(video->headerInfo.Mode[mbnum-nMBPerRow]&INTRA_MASK)) /* not intra */ 8402f5b5447de349216a40086ca6061efefb5a3025James Dong { 8502f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memset(DCAC_row, 0, sizeof(typeDCACStore)); 8602f5b5447de349216a40086ca6061efefb5a3025James Dong } 8702f5b5447de349216a40086ca6061efefb5a3025James Dong 8802f5b5447de349216a40086ca6061efefb5a3025James Dong y_offset = Ypos[comp] * nMBPerRow; 8902f5b5447de349216a40086ca6061efefb5a3025James Dong x_offset = Xpos[comp]; 9002f5b5447de349216a40086ca6061efefb5a3025James Dong x_tab = Xtab[comp]; 9102f5b5447de349216a40086ca6061efefb5a3025James Dong y_tab = Ytab[comp]; 9202f5b5447de349216a40086ca6061efefb5a3025James Dong z_tab = Ztab[comp]; 9302f5b5447de349216a40086ca6061efefb5a3025James Dong 9402f5b5447de349216a40086ca6061efefb5a3025James Dong b_xtab = B_Xtab[comp]; 9502f5b5447de349216a40086ca6061efefb5a3025James Dong b_ytab = B_Ytab[comp]; 9602f5b5447de349216a40086ca6061efefb5a3025James Dong 9702f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 9802f5b5447de349216a40086ca6061efefb5a3025James Dong ; Function body here 9902f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 10002f5b5447de349216a40086ca6061efefb5a3025James Dong /* Find the direction of prediction and the DC prediction */ 10102f5b5447de349216a40086ca6061efefb5a3025James Dong 10202f5b5447de349216a40086ca6061efefb5a3025James Dong if (x_pos == 0 && y_pos == 0) 10302f5b5447de349216a40086ca6061efefb5a3025James Dong { /* top left corner */ 10402f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 10502f5b5447de349216a40086ca6061efefb5a3025James Dong block_B = (comp == 3) ? DC_store[x_offset][z_tab] : mid_gray; 10602f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[0][y_tab] : mid_gray; 10702f5b5447de349216a40086ca6061efefb5a3025James Dong } 10802f5b5447de349216a40086ca6061efefb5a3025James Dong else if (x_pos == 0) 10902f5b5447de349216a40086ca6061efefb5a3025James Dong { /* left edge */ 11002f5b5447de349216a40086ca6061efefb5a3025James Dong up_bnd = Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]; 11102f5b5447de349216a40086ca6061efefb5a3025James Dong 11202f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 11302f5b5447de349216a40086ca6061efefb5a3025James Dong block_B = ((comp == 1 && up_bnd) || comp == 3) ? DC_store[y_offset+x_offset][z_tab] : mid_gray; 11402f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 11502f5b5447de349216a40086ca6061efefb5a3025James Dong } 11602f5b5447de349216a40086ca6061efefb5a3025James Dong else if (y_pos == 0) 11702f5b5447de349216a40086ca6061efefb5a3025James Dong { /* top row */ 11802f5b5447de349216a40086ca6061efefb5a3025James Dong left_bnd = Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]; 11902f5b5447de349216a40086ca6061efefb5a3025James Dong 12002f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 12102f5b5447de349216a40086ca6061efefb5a3025James Dong block_B = ((comp == 2 && left_bnd) || comp == 3) ? DC_store[y_offset + x_offset][z_tab] : mid_gray; 12202f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 12302f5b5447de349216a40086ca6061efefb5a3025James Dong } 12402f5b5447de349216a40086ca6061efefb5a3025James Dong else 12502f5b5447de349216a40086ca6061efefb5a3025James Dong { 12602f5b5447de349216a40086ca6061efefb5a3025James Dong up_bnd = Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]; 12702f5b5447de349216a40086ca6061efefb5a3025James Dong left_bnd = Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]; 12802f5b5447de349216a40086ca6061efefb5a3025James Dong 12902f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 13002f5b5447de349216a40086ca6061efefb5a3025James Dong block_B = (((comp == 0 || comp == 4 || comp == 5) && slice_nb[mbnum] == slice_nb[mbnum-1-nMBPerRow]) || 13102f5b5447de349216a40086ca6061efefb5a3025James Dong (comp == 1 && up_bnd) || (comp == 2 && left_bnd) || (comp == 3)) ? DC_store[y_offset+x_offset][z_tab] : mid_gray; 13202f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 13302f5b5447de349216a40086ca6061efefb5a3025James Dong } 13402f5b5447de349216a40086ca6061efefb5a3025James Dong 13502f5b5447de349216a40086ca6061efefb5a3025James Dong 13602f5b5447de349216a40086ca6061efefb5a3025James Dong if ((PV_ABS((block_A - block_B))) < (PV_ABS((block_B - block_C)))) 13702f5b5447de349216a40086ca6061efefb5a3025James Dong { 13802f5b5447de349216a40086ca6061efefb5a3025James Dong DC_pred = block_C; 13902f5b5447de349216a40086ca6061efefb5a3025James Dong *direction = 1; 14002f5b5447de349216a40086ca6061efefb5a3025James Dong if (ACpred_flag == 1) 14102f5b5447de349216a40086ca6061efefb5a3025James Dong { 14202f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_1) 14302f5b5447de349216a40086ca6061efefb5a3025James Dong { 14402f5b5447de349216a40086ca6061efefb5a3025James Dong AC_tmp = DCAC_row[0][b_xtab]; 14502f5b5447de349216a40086ca6061efefb5a3025James Dong QP_tmp = QP_store[y_offset]; 14602f5b5447de349216a40086ca6061efefb5a3025James Dong if (QP_tmp == QP) 14702f5b5447de349216a40086ca6061efefb5a3025James Dong { 14802f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = 1; i < 8; i++) 14902f5b5447de349216a40086ca6061efefb5a3025James Dong { 15002f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[i] = *AC_tmp++; 15102f5b5447de349216a40086ca6061efefb5a3025James Dong } 15202f5b5447de349216a40086ca6061efefb5a3025James Dong } 15302f5b5447de349216a40086ca6061efefb5a3025James Dong else 15402f5b5447de349216a40086ca6061efefb5a3025James Dong { 15502f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = 1; i < 8; i++) 15602f5b5447de349216a40086ca6061efefb5a3025James Dong { 15702f5b5447de349216a40086ca6061efefb5a3025James Dong val = (int32)(*AC_tmp++) * QP_tmp; 15802f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[i] = (val < 0) ? (int16)((val - QP_half) / QP) : (int16)((val + QP_half) / QP); 15902f5b5447de349216a40086ca6061efefb5a3025James Dong /* Vertical, top ROW of block C */ 16002f5b5447de349216a40086ca6061efefb5a3025James Dong } 16102f5b5447de349216a40086ca6061efefb5a3025James Dong } 16202f5b5447de349216a40086ca6061efefb5a3025James Dong } 16302f5b5447de349216a40086ca6061efefb5a3025James Dong } 16402f5b5447de349216a40086ca6061efefb5a3025James Dong } 16502f5b5447de349216a40086ca6061efefb5a3025James Dong else 16602f5b5447de349216a40086ca6061efefb5a3025James Dong { 16702f5b5447de349216a40086ca6061efefb5a3025James Dong DC_pred = block_A; 16802f5b5447de349216a40086ca6061efefb5a3025James Dong *direction = 0; 16902f5b5447de349216a40086ca6061efefb5a3025James Dong if (ACpred_flag == 1) 17002f5b5447de349216a40086ca6061efefb5a3025James Dong { 17102f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_0) 17202f5b5447de349216a40086ca6061efefb5a3025James Dong { 17302f5b5447de349216a40086ca6061efefb5a3025James Dong AC_tmp = DCAC_col[0][b_ytab]; 17402f5b5447de349216a40086ca6061efefb5a3025James Dong QP_tmp = QP_store[x_offset]; 17502f5b5447de349216a40086ca6061efefb5a3025James Dong if (QP_tmp == QP) 17602f5b5447de349216a40086ca6061efefb5a3025James Dong { 17702f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = 1; i < 8; i++) 17802f5b5447de349216a40086ca6061efefb5a3025James Dong { 17902f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[i<<3] = *AC_tmp++; 18002f5b5447de349216a40086ca6061efefb5a3025James Dong } 18102f5b5447de349216a40086ca6061efefb5a3025James Dong } 18202f5b5447de349216a40086ca6061efefb5a3025James Dong else 18302f5b5447de349216a40086ca6061efefb5a3025James Dong { 18402f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = 1; i < 8; i++) 18502f5b5447de349216a40086ca6061efefb5a3025James Dong { 18602f5b5447de349216a40086ca6061efefb5a3025James Dong val = (int32)(*AC_tmp++) * QP_tmp; 18702f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[i<<3] = (val < 0) ? (int16)((val - QP_half) / QP) : (int16)((val + QP_half) / QP); 18802f5b5447de349216a40086ca6061efefb5a3025James Dong /* Vertical, top ROW of block C */ 18902f5b5447de349216a40086ca6061efefb5a3025James Dong } 19002f5b5447de349216a40086ca6061efefb5a3025James Dong } 19102f5b5447de349216a40086ca6061efefb5a3025James Dong } 19202f5b5447de349216a40086ca6061efefb5a3025James Dong } 19302f5b5447de349216a40086ca6061efefb5a3025James Dong } 19402f5b5447de349216a40086ca6061efefb5a3025James Dong 19502f5b5447de349216a40086ca6061efefb5a3025James Dong /* Now predict the DC coefficient */ 19602f5b5447de349216a40086ca6061efefb5a3025James Dong QP_tmp = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr; 19702f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] += (int16)((DC_pred + (QP_tmp >> 1)) * scale[QP_tmp] >> 18); 19802f5b5447de349216a40086ca6061efefb5a3025James Dong// q_block[0] += (DC_pred+(QP_tmp>>1))/QP_tmp; 19902f5b5447de349216a40086ca6061efefb5a3025James Dong 20002f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 20102f5b5447de349216a40086ca6061efefb5a3025James Dong ; Return nothing or data or data pointer 20202f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 20302f5b5447de349216a40086ca6061efefb5a3025James Dong return; 20402f5b5447de349216a40086ca6061efefb5a3025James Dong} 20502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 20602f5b5447de349216a40086ca6061efefb5a3025James Dongvoid doDCACPrediction_I( 20702f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecData *video, 20802f5b5447de349216a40086ca6061efefb5a3025James Dong int comp, 20902f5b5447de349216a40086ca6061efefb5a3025James Dong int16 *q_block 21002f5b5447de349216a40086ca6061efefb5a3025James Dong) 21102f5b5447de349216a40086ca6061efefb5a3025James Dong{ 21202f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 21302f5b5447de349216a40086ca6061efefb5a3025James Dong ; Define all local variables 21402f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 21502f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum = video->mbnum; 21602f5b5447de349216a40086ca6061efefb5a3025James Dong int nMBPerRow = video->nMBPerRow; 21702f5b5447de349216a40086ca6061efefb5a3025James Dong int x_pos = video->mbnum_col; 21802f5b5447de349216a40086ca6061efefb5a3025James Dong int y_pos = video->mbnum_row; 21902f5b5447de349216a40086ca6061efefb5a3025James Dong int16 *AC_tmp; 22002f5b5447de349216a40086ca6061efefb5a3025James Dong int flag_0 = FALSE, flag_1 = FALSE; 22102f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *slice_nb = video->sliceNo; 22202f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCStore *DC_store = video->predDC + mbnum; 22302f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 22402f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCACStore *DCAC_col = video->predDCAC_col; 22502f5b5447de349216a40086ca6061efefb5a3025James Dong int left_bnd, up_bnd; 22602f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *mode = video->headerInfo.Mode; 22702f5b5447de349216a40086ca6061efefb5a3025James Dong uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 22802f5b5447de349216a40086ca6061efefb5a3025James Dong 22902f5b5447de349216a40086ca6061efefb5a3025James Dong 23002f5b5447de349216a40086ca6061efefb5a3025James Dong 23102f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Xpos[6] = { -1, 0, -1, 0, -1, -1}; 23202f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Ypos[6] = { -1, -1, 0, 0, -1, -1}; 23302f5b5447de349216a40086ca6061efefb5a3025James Dong 23402f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Xtab[6] = {1, 0, 3, 2, 4, 5}; 23502f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Ytab[6] = {2, 3, 0, 1, 4, 5}; 23602f5b5447de349216a40086ca6061efefb5a3025James Dong 23702f5b5447de349216a40086ca6061efefb5a3025James Dong /* I added these to speed up comparisons */ 23802f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Pos0[6] = { 1, 1, 0, 0, 1, 1}; 23902f5b5447de349216a40086ca6061efefb5a3025James Dong static const int Pos1[6] = { 1, 0, 1, 0, 1, 1}; 24002f5b5447de349216a40086ca6061efefb5a3025James Dong 24102f5b5447de349216a40086ca6061efefb5a3025James Dong static const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 24202f5b5447de349216a40086ca6061efefb5a3025James Dong static const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 24302f5b5447de349216a40086ca6061efefb5a3025James Dong 24402f5b5447de349216a40086ca6061efefb5a3025James Dong// int *direction; /* 0: HORIZONTAL, 1: VERTICAL */ 24502f5b5447de349216a40086ca6061efefb5a3025James Dong int block_A, block_C; 24602f5b5447de349216a40086ca6061efefb5a3025James Dong int y_offset, x_offset, x_tab, y_tab; /* speedup coefficients */ 24702f5b5447de349216a40086ca6061efefb5a3025James Dong int b_xtab, b_ytab; 24802f5b5447de349216a40086ca6061efefb5a3025James Dong y_offset = Ypos[comp] * nMBPerRow; 24902f5b5447de349216a40086ca6061efefb5a3025James Dong x_offset = Xpos[comp]; 25002f5b5447de349216a40086ca6061efefb5a3025James Dong x_tab = Xtab[comp]; 25102f5b5447de349216a40086ca6061efefb5a3025James Dong y_tab = Ytab[comp]; 25202f5b5447de349216a40086ca6061efefb5a3025James Dong 25302f5b5447de349216a40086ca6061efefb5a3025James Dong b_xtab = B_Xtab[comp]; 25402f5b5447de349216a40086ca6061efefb5a3025James Dong b_ytab = B_Ytab[comp]; 25502f5b5447de349216a40086ca6061efefb5a3025James Dong 25602f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 25702f5b5447de349216a40086ca6061efefb5a3025James Dong ; Function body here 25802f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 25902f5b5447de349216a40086ca6061efefb5a3025James Dong /* Find the direction of prediction and the DC prediction */ 26002f5b5447de349216a40086ca6061efefb5a3025James Dong 26102f5b5447de349216a40086ca6061efefb5a3025James Dong if (x_pos == 0 && y_pos == 0) 26202f5b5447de349216a40086ca6061efefb5a3025James Dong { /* top left corner */ 26302f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 26402f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[0][y_tab] : mid_gray; 26502f5b5447de349216a40086ca6061efefb5a3025James Dong } 26602f5b5447de349216a40086ca6061efefb5a3025James Dong else if (x_pos == 0) 26702f5b5447de349216a40086ca6061efefb5a3025James Dong { /* left edge */ 26802f5b5447de349216a40086ca6061efefb5a3025James Dong up_bnd = (Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]) 26902f5b5447de349216a40086ca6061efefb5a3025James Dong && (mode[mbnum-nMBPerRow] == MODE_INTRA || mode[mbnum-nMBPerRow] == MODE_INTRA_Q);; 27002f5b5447de349216a40086ca6061efefb5a3025James Dong 27102f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3) ? flag_0 = TRUE, DC_store[0][x_tab] : mid_gray; 27202f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 27302f5b5447de349216a40086ca6061efefb5a3025James Dong } 27402f5b5447de349216a40086ca6061efefb5a3025James Dong else if (y_pos == 0) 27502f5b5447de349216a40086ca6061efefb5a3025James Dong { /* top row */ 27602f5b5447de349216a40086ca6061efefb5a3025James Dong left_bnd = (Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]) 27702f5b5447de349216a40086ca6061efefb5a3025James Dong && (mode[mbnum-1] == MODE_INTRA || mode[mbnum-1] == MODE_INTRA_Q); 27802f5b5447de349216a40086ca6061efefb5a3025James Dong 27902f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 28002f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 28102f5b5447de349216a40086ca6061efefb5a3025James Dong } 28202f5b5447de349216a40086ca6061efefb5a3025James Dong else 28302f5b5447de349216a40086ca6061efefb5a3025James Dong { 28402f5b5447de349216a40086ca6061efefb5a3025James Dong up_bnd = (Pos0[comp] && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow]) 28502f5b5447de349216a40086ca6061efefb5a3025James Dong && (mode[mbnum-nMBPerRow] == MODE_INTRA || mode[mbnum-nMBPerRow] == MODE_INTRA_Q); 28602f5b5447de349216a40086ca6061efefb5a3025James Dong left_bnd = (Pos1[comp] && slice_nb[mbnum] == slice_nb[mbnum-1]) 28702f5b5447de349216a40086ca6061efefb5a3025James Dong && (mode[mbnum-1] == MODE_INTRA || mode[mbnum-1] == MODE_INTRA_Q); 28802f5b5447de349216a40086ca6061efefb5a3025James Dong 28902f5b5447de349216a40086ca6061efefb5a3025James Dong block_A = (comp == 1 || comp == 3 || left_bnd) ? flag_0 = TRUE, DC_store[x_offset][x_tab] : mid_gray; 29002f5b5447de349216a40086ca6061efefb5a3025James Dong block_C = (comp == 2 || comp == 3 || up_bnd) ? flag_1 = TRUE, DC_store[y_offset][y_tab] : mid_gray; 29102f5b5447de349216a40086ca6061efefb5a3025James Dong } 29202f5b5447de349216a40086ca6061efefb5a3025James Dong 29302f5b5447de349216a40086ca6061efefb5a3025James Dong if (ACpred_flag == 0) 29402f5b5447de349216a40086ca6061efefb5a3025James Dong { 29502f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_0 == TRUE) 29602f5b5447de349216a40086ca6061efefb5a3025James Dong { 29702f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_1 == TRUE) 29802f5b5447de349216a40086ca6061efefb5a3025James Dong { 29902f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = (int16)((block_A + block_C) >> 1); 30002f5b5447de349216a40086ca6061efefb5a3025James Dong } 30102f5b5447de349216a40086ca6061efefb5a3025James Dong else 30202f5b5447de349216a40086ca6061efefb5a3025James Dong { 30302f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = (int16)block_A; 30402f5b5447de349216a40086ca6061efefb5a3025James Dong } 30502f5b5447de349216a40086ca6061efefb5a3025James Dong } 30602f5b5447de349216a40086ca6061efefb5a3025James Dong else 30702f5b5447de349216a40086ca6061efefb5a3025James Dong { 30802f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_1 == TRUE) 30902f5b5447de349216a40086ca6061efefb5a3025James Dong { 31002f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = (int16)block_C; 31102f5b5447de349216a40086ca6061efefb5a3025James Dong } 31202f5b5447de349216a40086ca6061efefb5a3025James Dong else 31302f5b5447de349216a40086ca6061efefb5a3025James Dong { 31402f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = mid_gray; 31502f5b5447de349216a40086ca6061efefb5a3025James Dong } 31602f5b5447de349216a40086ca6061efefb5a3025James Dong } 31702f5b5447de349216a40086ca6061efefb5a3025James Dong 31802f5b5447de349216a40086ca6061efefb5a3025James Dong } 31902f5b5447de349216a40086ca6061efefb5a3025James Dong else 32002f5b5447de349216a40086ca6061efefb5a3025James Dong { 32102f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->mblock->direction == 1) 32202f5b5447de349216a40086ca6061efefb5a3025James Dong { 32302f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_1 == TRUE) 32402f5b5447de349216a40086ca6061efefb5a3025James Dong { 32502f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = (int16)block_C; 32602f5b5447de349216a40086ca6061efefb5a3025James Dong 32702f5b5447de349216a40086ca6061efefb5a3025James Dong AC_tmp = DCAC_row[0][b_xtab]; 32802f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[1] = AC_tmp[0]; 32902f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[2] = AC_tmp[1]; 33002f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[3] = AC_tmp[2]; 33102f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[4] = AC_tmp[3]; 33202f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[5] = AC_tmp[4]; 33302f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[6] = AC_tmp[5]; 33402f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[7] = AC_tmp[6]; 33502f5b5447de349216a40086ca6061efefb5a3025James Dong } 33602f5b5447de349216a40086ca6061efefb5a3025James Dong else 33702f5b5447de349216a40086ca6061efefb5a3025James Dong { 33802f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = mid_gray; 33902f5b5447de349216a40086ca6061efefb5a3025James Dong } 34002f5b5447de349216a40086ca6061efefb5a3025James Dong } 34102f5b5447de349216a40086ca6061efefb5a3025James Dong else 34202f5b5447de349216a40086ca6061efefb5a3025James Dong { 34302f5b5447de349216a40086ca6061efefb5a3025James Dong if (flag_0 == TRUE) 34402f5b5447de349216a40086ca6061efefb5a3025James Dong { 34502f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = (int16)block_A; 34602f5b5447de349216a40086ca6061efefb5a3025James Dong 34702f5b5447de349216a40086ca6061efefb5a3025James Dong AC_tmp = DCAC_col[0][b_ytab]; 34802f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[8] = AC_tmp[0]; 34902f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[16] = AC_tmp[1]; 35002f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[24] = AC_tmp[2]; 35102f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[32] = AC_tmp[3]; 35202f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[40] = AC_tmp[4]; 35302f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[48] = AC_tmp[5]; 35402f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[56] = AC_tmp[6]; 35502f5b5447de349216a40086ca6061efefb5a3025James Dong } 35602f5b5447de349216a40086ca6061efefb5a3025James Dong else 35702f5b5447de349216a40086ca6061efefb5a3025James Dong { 35802f5b5447de349216a40086ca6061efefb5a3025James Dong q_block[0] = mid_gray; 35902f5b5447de349216a40086ca6061efefb5a3025James Dong } 36002f5b5447de349216a40086ca6061efefb5a3025James Dong } 36102f5b5447de349216a40086ca6061efefb5a3025James Dong } 36202f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 36302f5b5447de349216a40086ca6061efefb5a3025James Dong ; Return nothing or data or data pointer 36402f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 36502f5b5447de349216a40086ca6061efefb5a3025James Dong return; 36602f5b5447de349216a40086ca6061efefb5a3025James Dong} 36702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 36802f5b5447de349216a40086ca6061efefb5a3025James Dong 369