142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* ------------------------------------------------------------------
242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * Copyright (C) 1998-2009 PacketVideo
342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *
442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * you may not use this file except in compliance with the License.
642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * You may obtain a copy of the License at
742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *
842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *
1042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * Unless required by applicable law or agreed to in writing, software
1142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
1242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * express or implied.
1442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * See the License for the specific language governing permissions
1542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * and limitations under the License.
1642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * -------------------------------------------------------------------
1742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong */
1842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#include "mp4enc_lib.h"
1942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#include "fastquant_inline.h"
2042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
2142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#define siz 63
2242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#define LSL 18
2342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
2442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
2542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dongconst static UChar imask[8] = {128, 64, 32, 16, 8, 4, 2, 1};
2642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#define SIGN0(a)        ( ((a)<0) ? -1 : (((a)>0) ? 1  : 0) )
2742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
2842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* variable bit precision quantization scale */
2942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* used to avoid using 32-bit multiplication */
3042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dongconst static Short scaleArrayV[32] = {0, 16384, 8192, 5462,  /* 15 */
3142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      4096, 3277, 2731, 2341,
3242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      4096, 3641, 3277, 2979,  /* 16 */
3342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      2731, 2521, 2341, 2185,
3442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      4096, 3856, 3641, 3450,  /* 17 */
3542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      3277, 3121, 2979, 2850,
3642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      5462, 5243, 5042, 4855,  /* 18 */
3742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      4682, 4520, 4370, 4229
3842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                     };
3942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
4042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* scale for dc_scaler and qmat, note, no value smaller than 8 */
4142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dongconst static Short scaleArrayV2[47] = {0, 0, 0, 0, 0, 0, 0, 0, /* 15 */
4242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                       4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185,
4342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                       4096, 3856, 3641, 3450, 3277, 3121, 2979, 2850,  /* 16 */
4442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                       2731, 2622, 2521, 2428, 2341, 2260, 2185, 2115,
4542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                       4096, 3972, 3856, 3745, 3641, 3543, 3450, 3361,  /* 17 */
4642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                       3277, 3197, 3121, 3049, 2979, 2913, 2850
4742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                      };
4842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
4942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* AAN scale and zigzag */
5042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dongconst static Short AANScale[64] =
5142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
5242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 0 */ 0x1000, 0x0B89, 0x0C3E, 0x0D9B, 0x1000, 0x0A2E, 0x0EC8, 0x0E7F,
5342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 1 */ 0x0B89, 0x0851, 0x08D4, 0x09CF, 0x0B89, 0x0757, 0x0AA8, 0x0A73,
5442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 2 */ 0x0C3E, 0x08D4, 0x095F, 0x0A6A, 0x0C3E, 0x07CB, 0x0B50, 0x0B18,
5542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 3 */ 0x0D9B, 0x09CF, 0x0A6A, 0x0B92, 0x0D9B, 0x08A8, 0x0C92, 0x0C54,
5642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 4 */ 0x1000, 0x0B89, 0x0C3E, 0x0D9B, 0x1000, 0x0A2E, 0x0EC8, 0x0E7F,
5742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 5 */ 0x0A2E, 0x0757, 0x07CB, 0x08A8, 0x0A2E, 0x067A, 0x0968, 0x0939,
5842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 6 */ 0x0EC8, 0x0AA8, 0x0B50, 0x0C92, 0x0EC8, 0x0968, 0x0DA8, 0x0D64,
5942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 7 */ 0x0E7F, 0x0A73, 0x0B18, 0x0C54, 0x0E7F, 0x0939, 0x0D64, 0x0D23
6042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong};
6142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
6242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dongconst static UShort ZZTab[64] =
6342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
6442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 0 */ 0x0, 0x2, 0xA, 0xC, 0x1C, 0x1E, 0x36, 0x38,
6542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 1 */ 0x4, 0x8, 0xE, 0x1A, 0x20, 0x34, 0x3A, 0x54,
6642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 2 */ 0x6, 0x10, 0x18, 0x22, 0x32, 0x3C, 0x52, 0x56,
6742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 3 */ 0x12, 0x16, 0x24, 0x30, 0x3E, 0x50, 0x58, 0x6A,
6842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 4 */ 0x14, 0x26, 0x2E, 0x40, 0x4E, 0x5A, 0x68, 0x6C,
6942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 5 */ 0x28, 0x2C, 0x42, 0x4C, 0x5C, 0x66, 0x6E, 0x78,
7042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 6 */ 0x2A, 0x44, 0x4A, 0x5E, 0x64, 0x70, 0x76, 0x7A,
7142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* 7 */ 0x46, 0x48, 0x60, 0x62, 0x72, 0x74, 0x7C, 0x7E
7242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong};
7342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
7442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
7542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong//Tao need to remove, write another version of abs
7642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong//#include <math.h>
7742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
7842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* ======================================================================== */
7942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Function : cal_dc_scalerENC                                             */
8042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Date     : 01/25/2000                                                   */
8142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Purpose  : calculation of DC quantization scale according to the
8242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong               incoming Q and type;                                         */
8342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  In/out   :                                                              */
8442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*      Int Qp      Quantizer                                               */
8542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Return   :                                                              */
8642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*          DC Scaler                                                       */
8742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Modified :                                                              */
8842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* ======================================================================== */
8942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* ======================================================================== */
9042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt cal_dc_scalerENC(Int QP, Int type)
9142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
9242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
9342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int dc_scaler;
9442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (type == 1)
9542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
9642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (QP > 0 && QP < 5)
9742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = 8;
9842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else if (QP > 4 && QP < 9)
9942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = 2 * QP;
10042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else if (QP > 8 && QP < 25)
10142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = QP + 8;
10242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else
10342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = 2 * QP - 16;
10442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
10542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
10642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
10742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (QP > 0 && QP < 5)
10842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = 8;
10942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else if (QP > 4 && QP < 25)
11042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = (QP + 13) / 2;
11142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else
11242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            dc_scaler = QP - 6;
11342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
11442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return dc_scaler;
11542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
11642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
11742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
11842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/***********************************************************************
11942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Function: BlckQuantDequantH263
12042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Date:     June 15, 1999
12142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Purpose:  Combine BlockQuantH263 and BlockDequantH263ENC
12242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Input:   coeff=> DCT coefficient
12342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Output:  qcoeff=> quantized coefficient
12442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          rcoeff=> reconstructed coefficient
12542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          return CBP for this block
12642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          4/2/01,  correct dc_scaler for short_header mode.
12742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          5/14/01,
12842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          changed the division into LUT multiplication/shift and other
12942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          modifications to speed up fastQuant/DeQuant (check for zero 1st, rowq LUT,
13042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          fast bitmaprow mask and borrowed Addition method instead of ifs from , ).
13142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          6/25/01,
13242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          Further optimization (~100K/QCIF), need more testing/comment before integration.
13342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
13442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          7/4/01,  break up Inter / Intra function and merge for different cases.
13542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          7/22/01,  combine AAN scaling here and reordering.
13642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          7/24/01, , reorder already done in FDCT, the input here is in the next block and
13742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            it's the
13842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            transpose of the raster scan. Output the same order (for proof of concenpt).
13942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          8/1/01, , change FDCT to do row/column FDCT without reordering, input is still
14042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            in the next block. The reconstructed DCT output is current block in normal
14142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            order. The quantized output is in zigzag scan order for INTER, row/column for
14242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            INTRA. Use bitmapzz for zigzag RunLevel for INTER.  The quantization is done
14342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            in column/row scanning order.
14442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          8/2/01, , change IDCT to do column/row, change bitmaprow/col to the opposite.
14542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          8/3/01, , add clipping to the reconstructed coefficient [-2047,2047]
14642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          9/4/05, , removed scaling for AAN IDCT, use Chen IDCT instead.
14742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong ********************************************************************/
14842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
14942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantH263Inter(Short *rcoeff, Short *qcoeff, struct QPstruct *QuantParam,
15042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               UChar bitmapcol[ ], UChar *bitmaprow, UInt *bitmapzz,
15142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               Int dctMode, Int comp, Int dummy, UChar shortHeader)
15242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
15342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int i, zz;
15442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp, coeff, q_value;
15542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPdiv2 = QuantParam->QPdiv2;
15642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2 = QuantParam->QPx2;
15742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int Addition = QuantParam->Addition;
15842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2plus = QuantParam->QPx2plus;
15942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int round = 1 << 15;
16042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int q_scale = scaleArrayV[QuantParam->QP];
16142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int shift = 15 + (QPx2 >> 4);
16242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int *temp;
16342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    UChar *bcolptr = bitmapcol;
16442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int ac_clip;    /* quantized coeff bound */
16542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
16642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(comp);
16742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(dummy);
16842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
16942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
17042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (shortHeader) ac_clip = 126; /* clip between [-127,126] (standard allows 127!) */
17142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else ac_clip = 2047;  /* clip between [-2048,2047] */
17242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
17342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* reset all bitmap to zero */
17442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    temp = (Int*) bitmapcol;
17542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    temp[0] = temp[1] = 0;
17642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    bitmapzz[0] = bitmapzz[1] = 0;
17742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
17842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    QPx2plus <<= 4;
17942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    QPx2plus -= 8;
18042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
18142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    rcoeff += 64; /* actual data is 64 item ahead */
18242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    //end  = rcoeff + dctMode - 1;
18342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    //rcoeff--;
18442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    bcolptr--;
18542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = 0;
18642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
18742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    do
18842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
18942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bcolptr++;
19042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        //rcoeff++;
19142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        //i=0;
19242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = rcoeff[i];
19342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff == 0x7fff) /* all zero column */
19442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
19542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            i++;
19642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            continue;
19742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
19842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
19942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        do
20042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
20142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= -QPx2plus && coeff < QPx2plus)  /* quantize to zero */
20242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
20342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
20442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (i < (dctMode << 3))
20542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                {
20642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    coeff = rcoeff[i];
20742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    if (coeff > -QPx2plus && coeff < QPx2plus)  /* quantize to zero */
20842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    {
20942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        i += 8;
21042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        coeff = rcoeff[i];
21142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        continue;
21242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    }
21342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    else
21442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        goto NONZERO1;
21542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                }
21642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
21742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else
21842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
21942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongNONZERO1:
22042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                /* scaling */
22142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = AANScale[i];  /* load scale AAN */
22242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                zz = ZZTab[i];  /* zigzag order */
22342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
22442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = aan_scale(q_value, coeff, round, QPdiv2);
22542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = coeff_quant(coeff, q_scale, shift);
22642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
22742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                /* dequantization  */
22842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (q_value)
22942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                {
23042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
23142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    //coeff = PV_MIN(ac_clip,PV_MAX(-ac_clip-1, q_value));
23242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value = coeff_clip(q_value, ac_clip);
23342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    qcoeff[zz>>1] = q_value;
23442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
23542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    // dequant and clip
23642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    //coeff = PV_MIN(2047,PV_MAX(-2048, q_value));
23742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    tmp = 2047;
23842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    coeff = coeff_dequant(q_value, QPx2, Addition, tmp);
23942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    rcoeff[i-64] = coeff;
24042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
24142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    (*bcolptr) |= imask[i>>3];
24242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    if ((zz >> 1) > 31) bitmapzz[1] |= (1 << (63 - (zz >> 1)));
24342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    else        bitmapzz[0] |= (1 << (31 - (zz >> 1)));
24442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                }
24542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
24642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = rcoeff[i];
24742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
24842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
24942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        while (i < (dctMode << 3));
25042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
25142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i += (1 - (dctMode << 3));
25242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
25342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i < dctMode) ;
25442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
25542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = dctMode;
25642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = 1 << (8 - i);
25742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i--)
25842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
25942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (bitmapcol[i])(*bitmaprow) |= tmp;
26042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp <<= 1;
26142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
26242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
26342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (*bitmaprow)
26442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return 1;
26542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
26642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return 0;
26742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
26842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
26942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantH263Intra(Short *rcoeff, Short *qcoeff, struct QPstruct *QuantParam,
27042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               UChar bitmapcol[ ], UChar *bitmaprow, UInt *bitmapzz,
27142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               Int dctMode, Int comp, Int dc_scaler, UChar shortHeader)
27242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
27342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int i;
27442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp, coeff, q_value;
27542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2 = QuantParam->QPx2;
27642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int Addition = QuantParam->Addition;
27742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2plus = QuantParam->QPx2plus;
27842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int round = 1 << 15;
27942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int q_scale = scaleArrayV[QuantParam->QP];
28042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int shift = 15 + (QPx2 >> 4);
28142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    UChar *bmcolptr = bitmapcol;
28242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int ac_clip;    /* quantized coeff bound */
28342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
28442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(bitmapzz);
28542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(comp);
28642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
28742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
28842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (shortHeader) ac_clip = 126; /* clip between [-127,126] (standard allows 127!) */
28942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else ac_clip = 2047;  /* clip between [-2048,2047] */
29042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
29142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *((Int*)bitmapcol) = *((Int*)(bitmapcol + 4)) = 0;
29242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
29342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
29442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    QPx2plus = QPx2 << 4;
29542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    QPx2plus -= 8;
29642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
29742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    rcoeff += 64; /* actual data is 64 element ahead */
29842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = 0;
29942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
30042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* DC value */
30142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = *rcoeff;
30242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* scaling */
30342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff == 0x7fff && !shortHeader) /* all zero column */
30442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
30542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bmcolptr++;
30642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i++;
30742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
30842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
30942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
31042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff == 0x7fff) /* shortHeader on */
31142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
31242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = 1; /* can't be zero */
31342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            qcoeff[0] = coeff;
31442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = coeff * dc_scaler;
31542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = PV_MAX(-2048, PV_MIN(2047, coeff));
31642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rcoeff[-64] = coeff;
31742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bitmapcol[0] |= 128;
31842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bmcolptr++;
31942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            //qcoeff++;
32042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            //rcoeff++;
32142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            //i=0;
32242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            i++;
32342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
32442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else
32542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
32642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = round + (coeff << 12);
32742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = q_value >> 16;
32842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= 0) coeff += (dc_scaler >> 1) ;
32942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else            coeff -= (dc_scaler >> 1) ;
33042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = scaleArrayV2[dc_scaler];
33142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = coeff * q_value;
33242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff >>= (15 + (dc_scaler >> 4));
33342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff += ((UInt)coeff >> 31);
33442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
33542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (shortHeader)
33642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = PV_MAX(1, PV_MIN(254, coeff));
33742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
33842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff)
33942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
34042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                qcoeff[0] = coeff;
34142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = coeff * dc_scaler;
34242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = PV_MAX(-2048, PV_MIN(2047, coeff));
34342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                rcoeff[-64] = coeff;
34442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                bitmapcol[0] |= 128;
34542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
34642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            i += 8;
34742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
34842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
34942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* AC values */
35042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    do
35142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
35242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = rcoeff[i];
35342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff == 0x7fff) /* all zero row */
35442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
35542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bmcolptr++;
35642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            i++;
35742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            continue;
35842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
35942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        do
36042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
36142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= -QPx2plus && coeff < QPx2plus)  /* quantize to zero */
36242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
36342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
36442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (i < dctMode << 3)
36542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                {
36642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    coeff = rcoeff[i];
36742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    if (coeff > -QPx2plus && coeff < QPx2plus)  /* quantize to zero */
36842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    {
36942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        i += 8;
37042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        coeff = rcoeff[i];
37142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        continue;
37242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    }
37342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    else
37442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                        goto NONZERO2;
37542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                }
37642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
37742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else
37842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
37942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongNONZERO2:   /* scaling */
38042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = AANScale[i]; /*  09/02/05 */
38142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
38242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                /* scale aan */
38342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = smlabb(q_value, coeff, round);
38442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = q_value >> 16;
38542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                /* quant */
38642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = smulbb(q_scale, coeff); /*mov     q_value, coeff, lsl #14 */
38742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                /*smull tmp, coeff, q_value, q_scale*/
38842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value >>= shift;
38942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value += ((UInt)q_value >> 31); /* add 1 if negative */
39042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
39142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (q_value)
39242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                {
39342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    //coeff = PV_MIN(ac_clip,PV_MAX(-ac_clip-1, q_value));
39442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value = coeff_clip(q_value, ac_clip);
39542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    qcoeff[i] = q_value;
39642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
39742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    // dequant and clip
39842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    //coeff = PV_MIN(2047,PV_MAX(-2048, q_value));
39942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    tmp = 2047;
40042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    coeff = coeff_dequant(q_value, QPx2, Addition, tmp);
40142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    rcoeff[i-64] = coeff;
40242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
40342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    (*bmcolptr) |= imask[i>>3];
40442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                }
40542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
40642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                coeff = rcoeff[i];
40742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
40842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
40942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        while (i < (dctMode << 3)) ;
41042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
41142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        //qcoeff++; /* next column */
41242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bmcolptr++;
41342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        //rcoeff++;
41442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i += (1 - (dctMode << 3)); //i = 0;
41542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
41642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i < dctMode);//while(rcoeff < end) ;
41742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
41842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = dctMode;
41942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = 1 << (8 - i);
42042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i--)
42142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
42242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (bitmapcol[i])(*bitmaprow) |= tmp;
42342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp <<= 1;
42442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
42542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
42642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (((*bitmaprow)&127) || (bitmapcol[0]&127)) /* exclude DC */
42742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return 1;
42842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
42942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return 0;
43042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
43142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
43242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
43342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/***********************************************************************
43442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Function: BlckQuantDequantH263DC
43542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Date:     5/3/2001
43642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Purpose:   H.263 quantization mode, only for DC component
43742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong 6/25/01,
43842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          Further optimization (~100K/QCIF), need more testing/comment before integration.
43942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
44042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong ********************************************************************/
44142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantH263DCInter(Short *rcoeff, Short *qcoeff, struct QPstruct *QuantParam,
44242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                 UChar *bitmaprow, UInt *bitmapzz, Int dummy, UChar shortHeader)
44342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
44442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int coeff, scale_q;
44542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int CBP = 0;
44642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QP = QuantParam->QP;
44742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2plus = QuantParam->QPx2plus;
44842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int Addition = QuantParam->Addition;
44942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int shift = 15 + (QP >> 3);
45042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int ac_clip;    /* quantized coeff bound */
45142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp;
45242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
45342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(dummy);
45442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
45542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (shortHeader) ac_clip = 126; /* clip between [-127,126] (standard allows 127!) */
45642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else ac_clip = 2047;  /* clip between [-2048,2047] */
45742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
45842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
45942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    bitmapzz[0] = bitmapzz[1] = 0;
46042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = rcoeff[0];
46142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
46242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff >= -QPx2plus && coeff < QPx2plus)
46342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
46442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        rcoeff[0] = 0;
46542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return CBP;//rcoeff[0] = 0; not needed since CBP will be zero
46642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
46742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
46842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
46942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        scale_q = scaleArrayV[QP];
47042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
47142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = aan_dc_scale(coeff, QP);
47242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
47342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        scale_q = coeff_quant(coeff, scale_q, shift);
47442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
47542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        //coeff = PV_MIN(ac_clip,PV_MAX(-ac_clip-1, tmp));
47642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        scale_q = coeff_clip(scale_q, ac_clip);
47742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
47842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        qcoeff[0] = scale_q;
47942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
48042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        QP <<= 1;
48142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        //coeff = PV_MIN(2047,PV_MAX(-2048, tmp));
48242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp = 2047;
48342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = coeff_dequant(scale_q, QP, Addition, tmp);
48442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
48542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        rcoeff[0] = coeff;
48642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
48742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        (*bitmaprow) = 128;
48842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bitmapzz[0] = (ULong)1 << 31;
48942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        CBP = 1;
49042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
49142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return CBP;
49242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
49342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
49442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
49542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantH263DCIntra(Short *rcoeff, Short *qcoeff, struct QPstruct *QuantParam,
49642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                 UChar *bitmaprow, UInt *bitmapzz, Int dc_scaler, UChar shortHeader)
49742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
49842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp, coeff;
49942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
50042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(QuantParam);
50142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
50242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
50342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = rcoeff[0];
50442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
50542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff >= 0) coeff += (dc_scaler >> 1) ;
50642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else            coeff -= (dc_scaler >> 1) ;
50742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = scaleArrayV2[dc_scaler];
50842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = coeff * tmp;
50942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp >>= (15 + (dc_scaler >> 4));
51042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp += ((UInt)tmp >> 31);
51142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
51242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (shortHeader)
51342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp = PV_MAX(1, PV_MIN(254, tmp));
51442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
51542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (tmp)
51642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
51742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        qcoeff[0] = tmp;
51842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = tmp * dc_scaler;
51942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = PV_MAX(-2048, PV_MIN(2047, coeff));
52042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        rcoeff[0] = coeff;
52142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        *bitmaprow = 128;
52242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bitmapzz[0] = (ULong)1 << 31;
52342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
52442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
52542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return 0;
52642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
52742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
52842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#ifndef NO_MPEG_QUANT
52942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/***********************************************************************
53042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Function: BlckQuantDequantMPEG
53142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Date:     June 15, 1999
53242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Purpose:  Combine BlockQuantMPEG and BlockDequantMPEGENC
53342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Input:   coeff=> DCT coefficient
53442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Output:  qcoeff=> quantized coefficient
53542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          rcoeff=> reconstructed coefficient
53642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Modified:  7/5/01, break up function for Intra/Inter
53742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          8/3/01,  update with changes from H263 quant mode.
53842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          8/3/01,  add clipping to the reconstructed coefficient [-2048,2047]
53942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong          8/6/01,  optimize using multiplicative lookup-table.
54042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     can be further optimized using ARM assembly, e.g.,
54142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     clipping, 16-bit mult., etc !!!!!!!!!!!!!
54242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong ********************************************************************/
54342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
54442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantMPEGInter(Short *rcoeff, Short *qcoeff, Int QP, Int *qmat,
54542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               UChar bitmapcol[ ], UChar *bitmaprow, UInt *bitmapzz,
54642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               Int dctMode, Int comp, Int dc_scaler)
54742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
54842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int i, zz;
54942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp, coeff, q_value = 0;
55042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int sum = 0;
55142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int stepsize, QPx2 = QP << 1;
55242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int CBP = 0;
55342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int round = 1 << 15;
55442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int q_scale = scaleArrayV[QP];
55542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int shift = 15 + (QP >> 3);
55642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    UChar *bcolptr = bitmapcol;
55742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
55842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(dc_scaler);
55942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(comp);
56042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
56142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
56242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *((Int*)bitmapcol) = *((Int*)(bitmapcol + 4)) = 0;
56342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    bitmapzz[0] = bitmapzz[1] = 0;
56442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
56542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
56642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    rcoeff += 64;
56742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = 0;
56842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    bcolptr--;
56942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
57042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    do
57142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
57242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bcolptr++;
57342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = rcoeff[i];
57442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff == 0x7fff) /* all zero column */
57542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
57642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            i++;
57742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            continue;
57842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
57942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        do
58042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
58142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = AANScale[i];  /*  09/02/05 scaling for AAN*/
58242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* aan scaling */
58342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = smlabb(q_value, coeff, round);
58442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
58542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = q_value >> 16;
58642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
58742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            stepsize = qmat[i];
58842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong//          if(coeff>0)     coeff = (16*coeff + (stepsize/2)) / stepsize;
58942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong//          else            coeff = (16*coeff - (stepsize/2)) / stepsize;
59042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff <<= 4;
59142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= 0) coeff += (stepsize >> 1) ;
59242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else            coeff -= (stepsize >> 1) ;
59342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = scaleArrayV2[stepsize];
59442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* mpeg quant table scale */
59542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = smulbb(coeff, q_value);
59642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
59742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff >>= (15 + (stepsize >> 4));
59842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff += ((UInt)coeff >> 31);
59942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
60042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* QP scale */
60142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= -QPx2 && coeff < QPx2)  /* quantized to zero*/
60242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
60342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
60442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
60542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else
60642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
60742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong//              q_value = coeff/(QPx2);
60842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = coeff_quant(coeff, q_scale, shift);
60942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
61042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (q_value)                /* dequant */
61142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                {
61242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
61342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    zz = ZZTab[i];  /* zigzag order */
61442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
61542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    tmp = 2047;
61642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
61742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value = clip_2047(q_value, tmp);
61842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
61942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    qcoeff[zz>>1] = q_value;
62042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
62142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    //q_value=(((coeff*2)+SIGN0(coeff))*stepsize*QP)/16;
62242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    /* no need for SIGN0, no zero coming in this {} */
62342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value = coeff_dequant_mpeg(q_value, stepsize, QP, tmp);
62442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
62542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    rcoeff[i-64] = q_value;
62642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
62742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    sum += q_value;
62842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    (*bcolptr) |= imask[i>>3];
62942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    if ((zz >> 1) > 31) bitmapzz[1] |= (1 << (63 - (zz >> 1)));
63042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    else        bitmapzz[0] |= (1 << (31 - (zz >> 1)));
63142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                }
63242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
63342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
63442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = rcoeff[i];
63542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
63642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        while (i < (dctMode << 3)) ;
63742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
63842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i += (1 - (dctMode << 3));
63942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
64042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i < dctMode) ;
64142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
64242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = dctMode;
64342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = 1 << (8 - i);
64442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i--)
64542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
64642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (bitmapcol[i])(*bitmaprow) |= tmp;
64742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp <<= 1;
64842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
64942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
65042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (*bitmaprow)
65142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        CBP = 1;   /* check CBP before mismatch control,  7/5/01 */
65242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
65342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* Mismatch control,  5/3/01 */
65442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (CBP)
65542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
65642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if ((sum&0x1) == 0)
65742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
65842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rcoeff--;  /* rcoeff[63] */
65942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = *rcoeff;
66042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff ^= 0x1;
66142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            *rcoeff = coeff;
66242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff)
66342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
66442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                bitmapcol[7] |= 1;
66542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                (*bitmaprow) |= 1;
66642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
66742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
66842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
66942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
67042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return CBP;
67142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
67242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
67342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantMPEGIntra(Short *rcoeff, Short *qcoeff, Int QP, Int *qmat,
67442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               UChar bitmapcol[ ], UChar *bitmaprow, UInt *bitmapzz,
67542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                               Int dctMode, Int comp, Int dc_scaler)
67642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
67742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int i;
67842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp, coeff, q_value = 0;
67942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int sum = 0;
68042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int stepsize;
68142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int CBP = 0;
68242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int round = 1 << 15;
68342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int q_scale = scaleArrayV[QP];
68442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int shift = 15 + (QP >> 3);
68542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int round2 = (3 * QP + 2) >> 2;
68642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2plus = (QP << 1) - round2;
68742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    UChar *bmcolptr = bitmapcol;
68842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
68942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(bitmapzz);
69042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(comp);
69142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
69242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *((Int*)bitmapcol) = *((Int*)(bitmapcol + 4)) = 0;
69342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
69442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
69542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    rcoeff += 64;
69642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = 0;
69742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
69842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* DC value */
69942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = *rcoeff;
70042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
70142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff == 0x7fff) /* all zero column */
70242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
70342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bmcolptr++;
70442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i++;
70542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
70642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
70742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
70842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        q_value = round + (coeff << 12);
70942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = q_value >> 16;
71042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        /*if (coeff >= 0)   coeff = (coeff + (dc_scaler/2)) / dc_scaler;
71142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else            coeff = (coeff - (dc_scaler/2)) / dc_scaler;*/
71242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff >= 0) coeff += (dc_scaler >> 1) ;
71342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else            coeff -= (dc_scaler >> 1) ;
71442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        q_value = scaleArrayV2[dc_scaler];
71542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
71642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        /* mpeg quant table scale */
71742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = smulbb(coeff, q_value);
71842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
71942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff >>= (15 + (dc_scaler >> 4));
72042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff += ((UInt)coeff >> 31);
72142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
72242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff)
72342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
72442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = PV_MAX(1, PV_MIN(254, coeff));
72542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            qcoeff[0] = coeff;
72642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
72742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = smulbb(coeff, dc_scaler);
72842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
72942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = clip_2047(coeff, 2047);
73042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
73142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            sum = q_value;
73242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
73342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rcoeff[-64] = q_value;
73442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
73542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bitmapcol[0] |= 128;
73642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
73742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i += 8;
73842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
73942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* AC values */
74042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    do
74142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
74242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = rcoeff[i];
74342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (coeff == 0x7fff) /* all zero row */
74442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
74542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bmcolptr++;
74642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            i++;
74742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            continue;
74842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
74942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        do
75042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
75142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* scaling */
75242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = AANScale[i]; /*  09/02/05 */
75342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
75442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* q_value = coeff*q_value + round */
75542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = smlabb(coeff, q_value, round);
75642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = q_value >> 16;
75742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
75842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            stepsize = qmat[i];
75942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /*if(coeff>0)       coeff = (16*coeff + (stepsize/2)) / stepsize;
76042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else            coeff = (16*coeff - (stepsize/2)) / stepsize;*/
76142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff <<= 4;
76242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= 0) coeff += (stepsize >> 1) ;
76342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else            coeff -= (stepsize >> 1) ;
76442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = scaleArrayV2[stepsize];
76542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
76642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* scale mpeg quant */
76742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = smulbb(coeff, q_value);
76842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
76942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff >>= (15 + (stepsize >> 4));
77042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff += ((UInt)coeff >> 31);
77142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
77242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff >= -QPx2plus && coeff < QPx2plus)
77342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
77442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
77542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
77642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            else
77742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
77842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                //q_value = ( coeff + SIGN0(coeff)*((3*QP+2)/4))/(2*QP);
77942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (coeff > 0) coeff += round2;
78042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                else if (coeff < 0) coeff -= round2;
78142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
78242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value = smulbb(coeff, q_scale);
78342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value >>= shift;
78442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                q_value += ((UInt)q_value >> 31);
78542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
78642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                if (q_value)
78742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                {
78842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    tmp = 2047;
78942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value = clip_2047(q_value, tmp);
79042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
79142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    qcoeff[i] = q_value;
79242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
79342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    stepsize = smulbb(stepsize, QP);
79442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value =  smulbb(q_value, stepsize);
79542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
79642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    q_value = coeff_dequant_mpeg_intra(q_value, tmp);
79742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    //q_value = (coeff*stepsize*QP*2)/16;
79842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
79942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    rcoeff[i-64] = q_value;
80042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
80142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    sum += q_value;
80242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                    (*bmcolptr) |= imask[i>>3];
80342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                }
80442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                i += 8;
80542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
80642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = rcoeff[i];
80742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
80842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        while (i < (dctMode << 3)) ;
80942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
81042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bmcolptr++;
81142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        i += (1 - (dctMode << 3));
81242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
81342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i < dctMode) ;
81442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
81542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    i = dctMode;
81642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = 1 << (8 - i);
81742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    while (i--)
81842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
81942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (bitmapcol[i])(*bitmaprow) |= tmp;
82042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp <<= 1;
82142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
82242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
82342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (((*bitmaprow) &127) || (bitmapcol[0]&127))
82442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        CBP = 1;  /* check CBP before mismatch control,  7/5/01 */
82542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
82642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /* Mismatch control,  5/3/01 */
82742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (CBP || bitmapcol[0])
82842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
82942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if ((sum&0x1) == 0)
83042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
83142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rcoeff--;  /* rcoeff[63] */
83242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff = *rcoeff;
83342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            coeff ^= 0x1;
83442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            *rcoeff = coeff;
83542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if (coeff)
83642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
83742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                bitmapcol[7] |= 1;
83842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                (*bitmaprow) |= 1;
83942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
84042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
84142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
84242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
84342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return CBP;
84442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
84542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
84642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
84742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/***********************************************************************
84842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Function: BlckQuantDequantMPEGDC
84942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Date:     5/3/2001
85042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong Purpose:  MPEG Quant/Dequant for DC only block.
85142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong ********************************************************************/
85242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantMPEGDCInter(Short *rcoeff, Short *qcoeff, Int QP, Int *qmat,
85342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                 UChar bitmapcol[ ], UChar *bitmaprow, UInt *bitmapzz, Int dummy)
85442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
85542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int q_value, coeff, stepsize;
85642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int CBP = 0;
85742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int q_scale = scaleArrayV[QP];
85842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int shift = 15 + (QP >> 3);
85942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int QPx2 = QP << 1;
86042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
86142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(dummy);
86242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
86342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *((Int*)bitmapcol) = *((Int*)(bitmapcol + 4)) = 0;
86442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
86542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    bitmapzz[0] = bitmapzz[1] = 0;
86642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = rcoeff[0];
86742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    stepsize = qmat[0];
86842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
86942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /*if(coeff>0)       coeff = (16*coeff + (stepsize/2)) / stepsize;
87042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else            coeff = (16*coeff - (stepsize/2)) / stepsize;*/
87142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff <<= 4;
87242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff >= 0) coeff += (stepsize >> 1) ;
87342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else            coeff -= (stepsize >> 1) ;
87442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    q_value = scaleArrayV2[stepsize];
87542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
87642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = smulbb(coeff, q_value);
87742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
87842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff >>= (15 + (stepsize >> 4));
87942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff += ((UInt)coeff >> 31);
88042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
88142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff >= -QPx2 && coeff < QPx2)
88242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
88342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        rcoeff[0] = 0;
88442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return CBP;
88542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
88642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else
88742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
88842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong//      q_value = coeff/(QPx2);
88942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        q_value = coeff_quant(coeff, q_scale, shift);
89042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
89142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (q_value)
89242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
89342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
89442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            //PV_MIN(2047,PV_MAX(-2048, q_value));
89542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = clip_2047(q_value, 2047);
89642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            qcoeff[0] = q_value;
89742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            q_value = coeff_dequant_mpeg(q_value, stepsize, QP, 2047);
89842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            //q_value=(((coeff*2)+SIGN0(coeff))*stepsize*QP)/16;
89942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rcoeff[0] = q_value;
90042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
90142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bitmapcol[0] = 128;
90242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            (*bitmaprow) = 128;
90342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bitmapzz[0] = (UInt)1 << 31;
90442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            CBP = 1;
90542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
90642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            /* Mismatch control,  5/3/01 */
90742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            if ((q_value&0x1) == 0)
90842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            {
90942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                rcoeff[63] = 1; /* after scaling it remains the same */
91042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                bitmapcol[7] |= 1;
91142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                (*bitmaprow) |= 1;
91242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            }
91342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
91442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
91542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return CBP;
91642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
91742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
91842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
91942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames DongInt BlockQuantDequantMPEGDCIntra(Short *rcoeff, Short *qcoeff, Int QP, Int *qmat,
92042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                 UChar bitmapcol[ ], UChar *bitmaprow, UInt *bitmapzz,
92142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                                 Int dc_scaler)
92242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
92342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    Int tmp, coeff, q_value;
92442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
92542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(QP);
92642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    OSCL_UNUSED_ARG(qmat);
92742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
92842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
92942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *((Int*)bitmapcol) = *((Int*)(bitmapcol + 4)) = 0;
93042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    *bitmaprow = 0;
93142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    coeff = rcoeff[0];
93242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
93342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    /*if (coeff >= 0)   tmp = (coeff + dc_scaler/2) / dc_scaler;
93442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else            tmp = (coeff - dc_scaler/2) / dc_scaler;*/
93542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (coeff >= 0) coeff += (dc_scaler >> 1) ;
93642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    else            coeff -= (dc_scaler >> 1) ;
93742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = scaleArrayV2[dc_scaler];
93842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
93942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp = smulbb(tmp, coeff);
94042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp >>= (15 + (dc_scaler >> 4));
94142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    tmp += ((UInt)tmp >> 31);
94242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
94342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    if (tmp)
94442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
94542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        coeff = PV_MAX(1, PV_MIN(254, tmp));
94642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        qcoeff[0] = coeff;
94742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
94842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        q_value = smulbb(coeff, dc_scaler);
94942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        q_value = clip_2047(q_value, 2047);
95042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        rcoeff[0] = q_value;
95142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bitmapcol[0] = 128;
95242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        *bitmaprow = 128;
95342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        bitmapzz[0] = (UInt)1 << 31;
95442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
95542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        /* Mismatch control,  5/3/01 */
95642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if ((q_value&0x1) == 0)
95742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
95842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rcoeff[63] = 1; /* after scaling it remains the same */
95942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            bitmapcol[7] |= 1;
96042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            (*bitmaprow) |= 1;
96142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
96242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
96342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
96442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    return 0;
96542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
96642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#endif
96742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
968