13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*     -------------------------------------------------------------------       *
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                    MPEG-4 Simple Profile Video Decoder                        *
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*     -------------------------------------------------------------------       *
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* This software module was originally developed by
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   Paulo Nunes (IST / ACTS-MoMuSyS)
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   Robert Danielsen (Telenor / ACTS-MoMuSyS)
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* in the course of development of the MPEG-4 Video (ISO/IEC 14496-2) standard.
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* This software module is an implementation of a part of one or more MPEG-4
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Video (ISO/IEC 14496-2) tools as specified by the MPEG-4 Video (ISO/IEC
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 14496-2) standard.
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* ISO/IEC gives users of the MPEG-4 Video (ISO/IEC 14496-2) standard free
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* license to this software module or modifications thereof for use in hardware
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* or software products claiming conformance to the MPEG-4 Video (ISO/IEC
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 14496-2) standard.
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Those intending to use this software module in hardware or software products
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* are advised that its use may infringe existing patents. The original
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* developer of this software module and his/her company, the subsequent
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* editors and their companies, and ISO/IEC have no liability for use of this
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* software module or modifications thereof in an implementation. Copyright is
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* not released for non MPEG-4 Video (ISO/IEC 14496-2) Standard conforming
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* products.
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* ACTS-MoMuSys partners retain full right to use the code for his/her own
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* purpose, assign or donate the code to a third party and to inhibit third
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* parties from using the code for non MPEG-4 Video (ISO/IEC 14496-2) Standard
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* conforming products. This copyright notice must be included in all copies or
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* derivative works.
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Copyright (c) 1996
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*****************************************************************************/
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************HeaderBegin*******
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* File: vlc_dec.c
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Author:   Paulo Nunes (IST) - Paulo.Nunes@lx.it.pt
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Created:  1-Mar-96
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Description: This file contains the VLC functions needed to decode a
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       bitstream.
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Notes:
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       The functions contained in this file were adapted from
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       tmndecode
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       Written by Karl Olav Lillevold <kol@nta.no>,
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       1995 Telenor R&D.
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       Donated to the Momusys-project as background code by
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       Telenor.
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       based on mpeg2decode, (C) 1994, MPEG Software Simulation Group
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       and mpeg2play, (C) 1994 Stefan Eckart
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   <stefan@lis.e-technik.tu-muenchen.de>
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Modified: 9-May-96 Paulo Nunes: Reformatted. New headers.
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*              17-Jan-97 Jan De Lameillieure (HHI) : corrected in
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*              01.05.97 Luis Ducla-Soares: added RvlcDecTCOEF() to allow decoding
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                                          of Reversible VLCs.
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       09.03.98 Paulo Nunes: Cleaning.
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************HeaderEnd*********/
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_dec_tab.h"
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h"
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "max_level.h"
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ====================================================================== /
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Function : DecodeUserData()
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Date     : 04/10/2000
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    History  :
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Modified : 04/16/2001 : removed status checking of PV_BitstreamFlushBits
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        This is simply a realization of the user_data() function
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        in the ISO/IEC 14496-2 manual.
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/ ====================================================================== */
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeUserData(BitstreamDecVideo *stream)
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 code;
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamReadBits32HC(stream);
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits32(stream, 24, &code);
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (code != 1)
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Discard user data for now.   04/05/2000 */
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamReadBits16(stream, 8);
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32(stream, 24, &code);
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP) return status;    /*  03/19/2002 */
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/10/00  : initial modification to the
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                new PV-Decoder Lib format.
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/29/00  : added return code check to some functions and
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                optimize the code.
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_GetMBvectors(VideoDecData *video, uint mode)
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  f_code_f = video->currVop->fcodeForward;
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  vlc_code_mag;
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT *mot_x = video->motX;
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT *mot_y = video->motY;
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int k, offset;
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int y_pos = video->mbnum_row;
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int doubleWidth = video->nMBPerRow << 1;
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int pos = (x_pos + y_pos * doubleWidth) << 1;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT mvx = 0, mvy = 0;
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (f_code_f == 1)
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mode == MODE_INTER4V || mode == MODE_INTER4V_Q)
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mode == MODE_INTER4V)
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 0; k < 4; k++)
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                offset = (k & 1) + (k >> 1) * doubleWidth;
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mv_prediction(video, k, &mvx, &mvy);
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* decode component x */
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_VlcDecMV(stream, &vlc_code_mag);
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS)
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return status;
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mvx += (MOT)vlc_code_mag;
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mvx = (MOT)(((mvx + 32) & 0x3F) - 32);
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_VlcDecMV(stream, &vlc_code_mag);
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS)
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return status;
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mvy += (MOT)vlc_code_mag;
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mvy = (MOT)(((mvy + 32) & 0x3F) - 32);
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mot_x[pos+offset] = (MOT) mvx;
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mot_y[pos+offset] = (MOT) mvy;
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mv_prediction(video, 0, &mvx, &mvy);
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* For PVOPs, field  appears only in MODE_INTER & MODE_INTER_Q */
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_VlcDecMV(stream, &vlc_code_mag);
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS)
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return status;
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mvx += (MOT)vlc_code_mag;
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mvx = (MOT)(((mvx + 32) & 0x3F) - 32);
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_VlcDecMV(stream, &vlc_code_mag);
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS)
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return status;
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mvy += (MOT)vlc_code_mag;
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mvy = (MOT)(((mvy + 32) & 0x3F) - 32);
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pos += doubleWidth;
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mode == MODE_INTER4V || mode == MODE_INTER4V_Q)
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mode == MODE_INTER4V)
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 0; k < 4; k++)
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                offset = (k & 1) + (k >> 1) * doubleWidth;
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mv_prediction(video, k, &mvx, &mvy);
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_DecodeMBVec(stream, &mvx, &mvy, f_code_f);
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mot_x[pos+offset] = (MOT) mvx;
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mot_y[pos+offset] = (MOT) mvy;
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS)
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return status;
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mv_prediction(video, 0, &mvx, &mvy);
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* For PVOPs, field  appears only in MODE_INTER & MODE_INTER_Q */
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_DecodeMBVec(stream, &mvx, &mvy, f_code_f);
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pos += doubleWidth;
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS)
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return status;
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/10/00  : initial modification to the
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                new PV-Decoder Lib format.
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/29/00  : added return code check to some functions
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       5/10/00  : check whether the decoded vector is legal.
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/17/01  : use MOT type
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_DecodeMBVec(BitstreamDecVideo *stream, MOT *mv_x, MOT *mv_y, int f_code_f)
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  vlc_code_magx, vlc_code_magy;
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  residualx = 0, residualy = 0;
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decode component x */
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = PV_VlcDecMV(stream, &vlc_code_magx);
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (status != PV_SUCCESS)
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return status;
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (vlc_code_magx)
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        residualx = (int) BitstreamReadBits16_INLINE(stream, (int)(f_code_f - 1));
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decode component y */
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = PV_VlcDecMV(stream, &vlc_code_magy);
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (status != PV_SUCCESS)
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return status;
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (vlc_code_magy)
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        residualy = (int) BitstreamReadBits16_INLINE(stream, (int)(f_code_f - 1));
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (PV_DeScaleMVD(f_code_f, residualx, vlc_code_magx, mv_x) != PV_SUCCESS)
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (PV_DeScaleMVD(f_code_f, residualy, vlc_code_magy, mv_y) != PV_SUCCESS)
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/31/2000 : initial modification to the new PV-Decoder Lib format.
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       5/10/2000 : check to see if the decoded vector falls within
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           the legal fcode range.
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_DeScaleMVD(
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  f_code,       /* <-- MV range in 1/2 units: 1=32,2=64,...,7=2048     */
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  residual,     /* <-- part of the MV Diff. FLC coded                  */
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  vlc_code_mag, /* <-- part of the MV Diff. VLC coded                  */
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT  *vector       /* --> Obtained MV component in 1/2 units              */
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int   half_range = (1 << (f_code + 4));
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int   mask = (half_range << 1) - 1;
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int   diff_vector;
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (vlc_code_mag == 0)
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        diff_vector = vlc_code_mag;
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        diff_vector = ((PV_ABS(vlc_code_mag) - 1) << (f_code - 1)) + residual + 1;
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (vlc_code_mag < 0)
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            diff_vector = -diff_vector;
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *vector += (MOT)(diff_vector);
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *vector = (MOT)((*vector + half_range) & mask) - half_range;
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid mv_prediction(
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video,
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int block,
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT *mvx,
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT *mvy
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT *motxdata = video->motX;
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT *motydata = video->motY;
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum_col = video->mbnum_col;
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum_row = video->mbnum_row;
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *slice_nb = video->sliceNo;
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMBPerRow = video->nMBPerRow;
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMVPerRow = nMBPerRow << 1;
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int p1x = 0, p2x = 0, p3x = 0;
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int p1y = 0, p2y = 0, p3y = 0;
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int rule1 = 0, rule2 = 0, rule3 = 0;
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int     indx;
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    indx = ((mbnum_col << 1) + (block & 1)) + ((mbnum_row << 1)  + (block >> 1)) * nMVPerRow - 1; /* left block */
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (block & 1)           /* block 1, 3 */
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        p1x = motxdata[indx];
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        p1y = motydata[indx];
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        rule1 = 1;
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else                    /* block 0, 2 */
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mbnum_col > 0 && slice_nb[mbnum] == slice_nb[mbnum-1])
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            p1x = motxdata[indx];
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            p1y = motydata[indx];
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            rule1 = 1;
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    indx = indx + 1 - nMVPerRow; /* upper_block */
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (block >> 1)
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        indx -= (block & 1);
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        p2x = motxdata[indx];
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        p2y = motydata[indx];
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        p3x = motxdata[indx + 1];
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        p3y = motydata[indx + 1];
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        rule2 = rule3 = 1;
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {                           /* block 0,1 */
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mbnum_row)
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow])
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                p2x = motxdata[indx];
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                p2y = motydata[indx];
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                rule2 = 1;
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (mbnum_col < nMBPerRow - 1 && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow+1])
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                indx = indx + 2 - (block & 1);
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                p3x = motxdata[indx];
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                p3y = motydata[indx];
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                rule3 = 1;
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (rule1 + rule2 + rule3 > 1)
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mvx = (MOT)PV_MEDIAN(p1x, p2x, p3x);
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mvy = (MOT)PV_MEDIAN(p1y, p2y, p3y);
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else if (rule1 + rule2 + rule3 == 1)
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* two of three are zero */
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mvx = (MOT)(p1x + p2x + p3x);
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mvy = (MOT)(p1y + p2y + p3y);
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* all MBs are outside the VOP */
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mvx = *mvy = 0;
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/30/2000 : initial modification to the new PV-Decoder Lib format.
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/16/2001 : removed checking of status for PV_BitstreamFlushBits
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_VlcDecMV(BitstreamDecVideo *stream, int *mv)
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >> 12)
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mv = 0; /* Vector difference = 0 */
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 1);
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 512)
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code = (code >> 8) - 2;
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, PV_TMNMVtab0[code].len + 1);
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mv = PV_TMNMVtab0[code].val;
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return status;
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 128)
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code = (code >> 2) - 32;
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, PV_TMNMVtab1[code].len + 1);
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mv = PV_TMNMVtab1[code].val;
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return status;
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code < 4)
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *mv = -1;
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code -= 4;
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, PV_TMNMVtab2[code].len + 1);
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *mv = PV_TMNMVtab2[code].val;
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/30/2000 : initial modification to the new PV-Decoder Lib
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           format and the change of error-handling method.
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/16/01   : removed status checking of PV_BitstreamFlushBits
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PV_VlcDecMCBPC_com_intra(BitstreamDecVideo *stream)
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, 9, &code);
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code < 8)
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return VLC_CODE_ERROR;
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code >>= 3;
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 32)
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 1);
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return 3;
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, PV_MCBPCtabintra[code].len);
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_MCBPCtabintra[code].val;
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/30/2000 : initial modification to the new PV-Decoder Lib
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           format and the change of error-handling method.
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/16/2001 : removed checking of return status of PV_BitstreamFlushBits
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PV_VlcDecMCBPC_com_inter(BitstreamDecVideo *stream)
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, 9, &code);
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code == 0)
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return VLC_CODE_ERROR;
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else if (code >= 256)
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 1);
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return 0;
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, PV_MCBPCtab[code].len);
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_MCBPCtab[code].val;
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PV_VlcDecMCBPC_com_inter_H263(BitstreamDecVideo *stream)
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code == 0)
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return VLC_CODE_ERROR;
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else if (code >= 4096)
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 1);
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return 0;
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 16)
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, PV_MCBPCtab[code >> 4].len);
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_MCBPCtab[code >> 4].val;
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, PV_MCBPCtab1[code - 8].len);
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_MCBPCtab1[code - 8].val;
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/30/2000 : initial modification to the new PV-Decoder Lib
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           format and the change of error-handling method.
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/16/2001 : removed status checking for PV_BitstreamFlushBits
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PV_VlcDecCBPY(BitstreamDecVideo *stream, int intra)
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int CBPY = 0;
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, 6, &code);
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code < 2)
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return -1;
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else if (code >= 48)
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 2);
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CBPY = 15;
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, PV_CBPYtab[code].len);
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CBPY = PV_CBPYtab[code].val;
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (intra == 0) CBPY = 15 - CBPY;
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    CBPY = CBPY & 15;
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return CBPY;
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/31/2000 : initial modification to the new PV-Decoder Lib format.
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       8/23/2000 : optimize the function by removing unnecessary BitstreamShowBits()
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                       function calls.
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       9/6/2000 : change the API to check for end-of-buffer for proper
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           termination of decoding process.
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_VlcDecIntraDCPredSize(BitstreamDecVideo *stream, int compnum, uint *DC_size)
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_FAIL;      /*  07/09/01 */
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint  code;
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *DC_size = 0;
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (compnum < 4)  /* luminance block */
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits16(stream, 11, &code);
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 12;
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 11);
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 11;
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 10);
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 10;
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 9);
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 9;
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 8);
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 8;
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 7);
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 7;
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 6);
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 6;
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 5);
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 5;
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 4);
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 4;
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 3);
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (code == 2)
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 3;
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 3);
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (code == 3)
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 0;
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 3);
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 2)
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 2;
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 2);
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (code == 3)
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 1;
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 2);
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else /* chrominance block */
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShow13Bits(stream, &code);
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 12;
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 12);
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 11;
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 11);
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 10;
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 10);
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 9;
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 9);
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 8;
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 8);
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 7;
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 7);
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 6;
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 6);
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 5;
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 5);
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 4;
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 4);
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code == 1)
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = 3;
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 3);
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code >>= 1;
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *DC_size = (int)(3 - code);
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 2);
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/30/2000 : initial modification to the new PV-Decoder Lib
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           format and the change of error-handling method.
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS VlcDecTCOEFIntra(BitstreamDecVideo *stream, Tcoef *pTcoef)
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
8423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab;
8433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
8453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFIntra */
8473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  if(GetTcoeffIntra(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
8483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 1024)
8493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tab = &PV_DCT3Dtab3[(code >> 6) - 16];
8513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
8533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 256)
8553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tab = &PV_DCT3Dtab4[(code >> 3) - 32];
8573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
8593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 16)
8613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tab = &PV_DCT3Dtab5[(code>>1) - 8];
8633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
8653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
8673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, tab->len + 1);
8723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = (code >> (12 - tab->len)) & 1;
8733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint) tab->run; //(tab->val >> 8) & 255;
8743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int) tab->level; //tab->val & 255;
8753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint) tab->last; //(tab->val >> 16) & 1;
8763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* the following is modified for 3-mode escape -- boon */
8793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tab->level != 0xFF)
8803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
8823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    //if (((tab->run<<8)|(tab->level)|(tab->last<<16)) == VLC_ESCAPE_CODE)
8853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!pTcoef->sign)
8873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* first escape mode. level is offset */
8893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShow13Bits(stream, &code);
8903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFIntra */
8923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*          if(GetTcoeffIntra(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
8933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 1024)
8943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tab = &PV_DCT3Dtab3[(code >> 6) - 16];
8963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
8983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 256)
9003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tab = &PV_DCT3Dtab4[(code >> 3) - 32];
9023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
9043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (code >= 16)
9063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tab = &PV_DCT3Dtab5[(code>>1) - 8];
9083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
9103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
9123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, tab->len + 1);
9173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* sign bit */
9193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = (code >> (12 - tab->len)) & 1;
9203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->run = (uint)tab->run; //(tab->val >> 8) & 255;
9213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = (int)tab->level; //tab->val & 255;
9223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->last = (uint)tab->last; //(tab->val >> 16) & 1;
9233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* need to add back the max level */
9263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((pTcoef->last == 0 && pTcoef->run > 14) || (pTcoef->last == 1 && pTcoef->run > 20))
9273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
9293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = pTcoef->level + intra_max_level[pTcoef->last][pTcoef->run];
9313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
9353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        uint run_offset;
9373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        run_offset = BitstreamRead1Bits_INLINE(stream);
9383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!run_offset)
9403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* second escape mode. run is offset */
9423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamShow13Bits(stream, &code);
9433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFIntra */
9453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*              if(GetTcoeffIntra(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
9463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 1024)
9473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tab = &PV_DCT3Dtab3[(code >> 6) - 16];
9493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
9513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (code >= 256)
9533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tab = &PV_DCT3Dtab4[(code >> 3) - 32];
9553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
9573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (code >= 16)
9593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
9603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        tab = &PV_DCT3Dtab5[(code>>1) - 8];
9613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
9623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
9633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
9643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        return PV_FAIL;
9653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
9663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, tab->len + 1);
9703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* sign bit */
9713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->sign = (code >> (12 - tab->len)) & 1;
9723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->run = (uint)tab->run; //(tab->val >> 8) & 255;
9733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = (int)tab->level; //tab->val & 255;
9743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->last = (uint)tab->last; //(tab->val >> 16) & 1;
9753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* need to add back the max run */
9793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (pTcoef->last)
9803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (pTcoef->level > 8)
9823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
9843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->run = pTcoef->run + intra_max_run1[pTcoef->level] + 1;
9863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
9883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (pTcoef->level > 27)
9903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
9923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->run = pTcoef->run + intra_max_run0[pTcoef->level] + 1;
9943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
9993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            code = BitstreamReadBits16_INLINE(stream, 8);
10023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->last = code >> 7;
10033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->run = (code >> 1) & 0x3F;
10043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 13) >> 1);
10053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (pTcoef->level >= 2048)
10073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->sign = 1;
10093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->level = 4096 - pTcoef->level;
10103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
10123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->sign = 0;
10143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        } /* flc */
10163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
10193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} /* VlcDecTCOEFIntra */
10213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS VlcDecTCOEFInter(BitstreamDecVideo *stream, Tcoef *pTcoef)
10233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
10243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
10253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab;
10263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
10283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFInter */
10303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  if(GetTcoeffInter(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
10313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 1024)
10323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tab = &PV_DCT3Dtab0[(code >> 6) - 16];
10343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
10363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 256)
10383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tab = &PV_DCT3Dtab1[(code >> 3) - 32];
10403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
10423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 16)
10443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tab = &PV_DCT3Dtab2[(code>>1) - 8];
10463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
10483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
10503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, tab->len + 1);
10543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = (code >> (12 - tab->len)) & 1;
10553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab->run;     //(tab->val >> 4) & 255;
10563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab->level; //tab->val & 15;
10573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab->last;   //(tab->val >> 12) & 1;
10583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* the following is modified for 3-mode escape -- boon */
10603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tab->run != 0xBF)
10613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
10633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    //if (((tab->run<<4)|(tab->level)|(tab->last<<12)) == VLC_ESCAPE_CODE)
10653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!pTcoef->sign)
10683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* first escape mode. level is offset */
10703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShow13Bits(stream, &code);
10713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFInter */
10733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*          if(GetTcoeffInter(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
10743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 1024)
10753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tab = &PV_DCT3Dtab0[(code >> 6) - 16];
10773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
10793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 256)
10813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tab = &PV_DCT3Dtab1[(code >> 3) - 32];
10833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
10853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (code >= 16)
10873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
10883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tab = &PV_DCT3Dtab2[(code>>1) - 8];
10893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
10903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
10913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
10923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
10933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
10943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, tab->len + 1);
10973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = (code >> (12 - tab->len)) & 1;
10983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->run = (uint)tab->run;     //(tab->val >> 4) & 255;
10993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = (int)tab->level; //tab->val & 15;
11003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->last = (uint)tab->last;   //(tab->val >> 12) & 1;
11013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* need to add back the max level */
11033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((pTcoef->last == 0 && pTcoef->run > 26) || (pTcoef->last == 1 && pTcoef->run > 40))
11043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
11063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = pTcoef->level + inter_max_level[pTcoef->last][pTcoef->run];
11083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
11103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
11113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        uint run_offset;
11123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        run_offset = BitstreamRead1Bits_INLINE(stream);
11133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!run_offset)
11153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* second escape mode. run is offset */
11173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamShow13Bits(stream, &code);
11183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFInter */
11203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*if(GetTcoeffInter(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
11213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 1024)
11223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tab = &PV_DCT3Dtab0[(code >> 6) - 16];
11243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
11263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (code >= 256)
11283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tab = &PV_DCT3Dtab1[(code >> 3) - 32];
11303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
11323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (code >= 16)
11343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        tab = &PV_DCT3Dtab2[(code>>1) - 8];
11363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
11383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        return PV_FAIL;
11403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, tab->len + 1);
11443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->sign = (code >> (12 - tab->len)) & 1;
11453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->run = (uint)tab->run;     //(tab->val >> 4) & 255;
11463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = (int)tab->level; //tab->val & 15;
11473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->last = (uint)tab->last;   //(tab->val >> 12) & 1;
11483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* need to add back the max run */
11503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (pTcoef->last)
11513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (pTcoef->level > 3)
11533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
11553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->run = pTcoef->run + inter_max_run1[pTcoef->level] + 1;
11573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
11593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (pTcoef->level > 12)
11613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
11633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->run = pTcoef->run + inter_max_run0[pTcoef->level] + 1;
11653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
11683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            code = BitstreamReadBits16_INLINE(stream, 8);
11713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->last = code >> 7;
11723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->run = (code >> 1) & 0x3F;
11733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 13) >> 1);
11743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (pTcoef->level >= 2048)
11783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->sign = 1;
11803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->level = 4096 - pTcoef->level;
11813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
11833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pTcoef->sign = 0;
11853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        } /* flc */
11873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
11903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} /* VlcDecTCOEFInter */
11923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*=======================================================
11943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Function:   VlcDecTCOEFShortHeader()
11953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Date    :   04/27/99
11963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Purpose :   New function used in decoding of video planes
11973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                with short header
11983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Modified:   05/23/2000
11993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                for new decoder structure.
12003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong=========================================================*/
12013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS VlcDecTCOEFShortHeader(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
12023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
12033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
12043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab;
12053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
12073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*intra = 0;*/
12093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 1024) tab = &PV_DCT3Dtab0[(code >> 6) - 16];
12113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
12123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 256) tab = &PV_DCT3Dtab1[(code >> 3) - 32];
12143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
12153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
12163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 16) tab = &PV_DCT3Dtab2[(code>>1) - 8];
12173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else return PV_FAIL;
12183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
12193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, tab->len + 1);
12223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = (code >> (12 - tab->len)) & 1;
12233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
12243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab->level;//tab->val & 15;
12253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
12263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* the following is modified for 3-mode escape -- boon */
12283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (((tab->run << 4) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
12293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
12313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* escape mode 4 - H.263 type */
12353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = pTcoef->sign; /* Last */
12363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = BitstreamReadBits16_INLINE(stream, 6); /* Run */
12373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int) BitstreamReadBits16_INLINE(stream, 8); /* Level */
12383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level == 0 || pTcoef->level == 128)
12403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
12423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level > 128)
12453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 1;
12473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = 256 - pTcoef->level;
12483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
12503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 0;
12523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
12573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}   /* VlcDecTCOEFShortHeader */
12593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
12613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS VlcDecTCOEFShortHeader_AnnexI(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
12623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
12633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
12643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab;
12653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
12673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*intra = 0;*/
12693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 1024) tab = &PV_DCT3Dtab6[(code >> 6) - 16];
12713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
12723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 256) tab = &PV_DCT3Dtab7[(code >> 3) - 32];
12743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
12753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
12763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 16) tab = &PV_DCT3Dtab8[(code>>1) - 8];
12773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else return PV_FAIL;
12783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
12793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, tab->len + 1);
12823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = (code >> (12 - tab->len)) & 1;
12833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
12843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab->level;//tab->val & 15;
12853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
12863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* the following is modified for 3-mode escape -- boon */
12883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (((tab->run << 6) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
12893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
12913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* escape mode 4 - H.263 type */
12933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = pTcoef->sign; /* Last */
12943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = BitstreamReadBits16(stream, 6); /* Run */
12953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int) BitstreamReadBits16(stream, 8); /* Level */
12963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level == 0 || pTcoef->level == 128)
12983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
12993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
13003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level > 128)
13043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 1;
13063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = 256 - pTcoef->level;
13073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else pTcoef->sign = 0;
13093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
13133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}   /* VlcDecTCOEFShortHeader_AnnexI */
13153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS VlcDecTCOEFShortHeader_AnnexT(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
13173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
13183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
13193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab;
13203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
13223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*intra = 0;*/
13243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 1024) tab = &PV_DCT3Dtab0[(code >> 6) - 16];
13263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
13273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 256) tab = &PV_DCT3Dtab1[(code >> 3) - 32];
13293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
13303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 16) tab = &PV_DCT3Dtab2[(code>>1) - 8];
13323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else return PV_FAIL;
13333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, tab->len + 1);
13373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = (code >> (12 - tab->len)) & 1;
13383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
13393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab->level;//tab->val & 15;
13403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
13413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* the following is modified for 3-mode escape --  */
13433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (((tab->run << 4) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
13443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
13463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* escape mode 4 - H.263 type */
13483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = pTcoef->sign; /* Last */
13493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = BitstreamReadBits16(stream, 6); /* Run */
13503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int) BitstreamReadBits16(stream, 8); /* Level */
13513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level == 0)
13533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
13553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level >= 128)
13583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 1;
13603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = 256 - pTcoef->level;
13613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
13633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 0;
13653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level == 128)
13683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code = BitstreamReadBits16(stream, 11);        /* ANNEX_T */
13703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code = (code >> 6 & 0x1F) | (code << 5 & 0x7ff);
13723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code > 1024)
13733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->sign = 1;
13753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = (2048 - code);
13763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
13783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->sign = 0;
13803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = code;
13813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
13853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}   /* VlcDecTCOEFShortHeader */
13873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS VlcDecTCOEFShortHeader_AnnexIT(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
13903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
13913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
13923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab;
13933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow13Bits(stream, &code);
13953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*intra = 0;*/
13973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code >= 1024) tab = &PV_DCT3Dtab6[(code >> 6) - 16];
13993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
14003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code >= 256) tab = &PV_DCT3Dtab7[(code >> 3) - 32];
14023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
14033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code >= 16) tab = &PV_DCT3Dtab8[(code>>1) - 8];
14053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else return PV_FAIL;
14063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, tab->len + 1);
14103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = (code >> (12 - tab->len)) & 1;
14113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
14123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab->level;//tab->val & 15;
14133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
14143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* the following is modified for 3-mode escape --  */
14163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (((tab->run << 6) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
14173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
14193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* escape mode 4 - H.263 type */
14213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = pTcoef->sign; /* Last */
14223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = BitstreamReadBits16(stream, 6); /* Run */
14233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int) BitstreamReadBits16(stream, 8); /* Level */
14243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level == 0)
14263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
14283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level >= 128)
14313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 1;
14333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = 256 - pTcoef->level;
14343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
14363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = 0;
14383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pTcoef->level == 128)
14413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code = BitstreamReadBits16(stream, 11);        /* ANNEX_T */
14433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        code = (code >> 6 & 0x1F) | (code << 5 & 0x7ff);
14453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (code > 1024)
14463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->sign = 1;
14483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = (2048 - code);
14493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
14513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->sign = 0;
14533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pTcoef->level = code;
14543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
14593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}   /* VlcDecTCOEFShortHeader_AnnexI */
14613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
14623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
14633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/30/2000 : initial modification to the new PV-Decoder Lib
14643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           format and the change of error-handling method.
14653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           The coefficient is now returned thru a pre-
14663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                           initialized parameters for speedup.
14673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
14683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
14693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS RvlcDecTCOEFInter(BitstreamDecVideo *stream, Tcoef *pTcoef)
14723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
14733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code, mask;
14743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab2;
14753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int count, len, num[2] = {0, 0} /*  01/30/01 */;
14763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mask = 0x4000;      /* mask  100000000000000   */
14783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow15Bits(stream, &code);   /*  03/07/01 */
14793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    len = 1;
14813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    //  09/20/99 Escape mode
14833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /// Bitstream Exchange
14843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code < 2048)
14853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 5);
14873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->last = BitstreamRead1Bits_INLINE(stream);
14883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->run = BitstreamReadBits16_INLINE(stream, 6);
14893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  09/20/99 New marker bit
14903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 1);
14913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  09/20/99 The length for LEVEL used to be 7 in the old version
14923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 12) >> 1);
14933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  09/20/99 Another new marker bit
14943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      PV_BitstreamFlushBitsCheck(stream, 1);
14953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = BitstreamReadBits16_INLINE(stream, 5) & 0x1;  /* fix   3/13/01  */
14963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
14973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code & mask)
15003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        count = 1;
15023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (mask && count > 0)       /* fix  3/28/01  */
15033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mask = mask >> 1;
15053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code & mask)
15063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                count--;
15073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
15083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                num[0]++; /* number of zeros in the middle */
15093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            len++;
15103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
15133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        count = 2;
15153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (mask && count > 0)           /* fix  3/28/01  */
15163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mask = mask >> 1;
15183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!(code & mask))
15193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                count--;
15203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
15213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                num[count-1]++; /* number of ones in the middle */
15223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            len++;
15233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = code & 0x7fff;
15273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = code >> (15 - (len + 1));
15283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  1/30/01, add fast decoding algorithm here */
15303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* code is in two forms : 0xxxx0xxx00 or 0xxx0xxx01
15313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                         num[1] and num[0] x
15323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        or  : 1xxxxx10 or 1xxxxx11
15333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                num[0]  x      */
15343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* len+1 is the length of the above */
15363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (num[1] > 10 || num[0] > 11) /* invalid RVLC code */
15383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
15393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code&(1 << len))
15413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tab2 = RvlcDCTtabInter + 146 + (num[0] << 1) + (code & 1);
15423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
15433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tab2 = RvlcDCTtabInter + ptrRvlcTab[num[1]] + (num[0] << 1) + (code & 1);
15443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, (int) tab2->len);
15463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab2->run;//(tab->val >> 8) & 255;
15473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab2->level;//tab->val & 255;
15483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab2->last;//(tab->val >> 16) & 1;
15493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = BitstreamRead1Bits_INLINE(stream);
15513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
15523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}               /* RvlcDecTCOEFInter */
15533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS RvlcDecTCOEFIntra(BitstreamDecVideo *stream, Tcoef *pTcoef)
15553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
15563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code, mask;
15573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const VLCtab2 *tab2;
15583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int count, len, num[2] = {0, 0} /*  01/30/01 */;
15593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mask = 0x4000;      /* mask  100000000000000   */
15613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShow15Bits(stream, &code);
15623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    len = 1;
15643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    //  09/20/99 Escape mode
15663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /// Bitstream Exchange
15673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code < 2048)
15683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 5);
15703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->last = BitstreamRead1Bits_INLINE(stream);
15713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->run = BitstreamReadBits16_INLINE(stream, 6);
15723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  09/20/99 New marker bit
15733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 1);
15743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  09/20/99 The length for LEVEL used to be 7 in the old version
15753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 12) >> 1);
15763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  09/20/99 Another new marker bit
15773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      PV_BitstreamFlushBitsCheck(stream, 1);
15783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pTcoef->sign = BitstreamReadBits16_INLINE(stream, 5) & 0x1; /* fix   03/13/01 */
15793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
15803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code & mask)
15833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        count = 1;
15853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (mask && count > 0)                          /* fix  03/28/01 */
15863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mask = mask >> 1;
15883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (code & mask)
15893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                count--;
15903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
15913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                num[0]++; /* number of zeros in the middle */
15923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            len++;
15933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
15963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        count = 2;
15983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (mask && count > 0)              /* fix  03/28/01 */
15993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mask = mask >> 1;
16013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!(code & mask))
16023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                count--;
16033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
16043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                num[count-1]++; /* number of ones in the middle */
16053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            len++;
16063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = code & 0x7fff;
16103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = code >> (15 - (len + 1));
16113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  1/30/01, add fast decoding algorithm here */
16133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* code is in two forms : 0xxxx0xxx00 or 0xxx0xxx01
16143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                         num[1] and num[0] x
16153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        or  : 1xxxxx10 or 1xxxxx11
16163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                num[0]  x      */
16173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* len+1 is the length of the above */
16193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (num[1] > 10 || num[0] > 11) /* invalid RVLC code */
16213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
16223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (code & (1 << len))
16243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tab2 = RvlcDCTtabIntra + 146 + (num[0] << 1) + (code & 1);
16253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
16263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tab2 = RvlcDCTtabIntra + ptrRvlcTab[num[1]] + (num[0] << 1) + (code & 1);
16273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, (int) tab2->len);
16293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->run = (uint)tab2->run;//(tab->val >> 8) & 255;
16303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->level = (int)tab2->level;//tab->val & 255;
16313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->last = (uint)tab2->last;//(tab->val >> 16) & 1;
16323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pTcoef->sign = BitstreamRead1Bits_INLINE(stream);
16343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
16353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}               /* RvlcDecTCOEFIntra */
16363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1637