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