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