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