Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19 *     -------------------------------------------------------------------       *
     20 *                    MPEG-4 Simple Profile Video Decoder                        *
     21 *     -------------------------------------------------------------------       *
     22 *
     23 * This software module was originally developed by
     24 *
     25 *   Paulo Nunes (IST / ACTS-MoMuSyS)
     26 *   Robert Danielsen (Telenor / ACTS-MoMuSyS)
     27 *
     28 * in the course of development of the MPEG-4 Video (ISO/IEC 14496-2) standard.
     29 * This software module is an implementation of a part of one or more MPEG-4
     30 * Video (ISO/IEC 14496-2) tools as specified by the MPEG-4 Video (ISO/IEC
     31 * 14496-2) standard.
     32 *
     33 * ISO/IEC gives users of the MPEG-4 Video (ISO/IEC 14496-2) standard free
     34 * license to this software module or modifications thereof for use in hardware
     35 * or software products claiming conformance to the MPEG-4 Video (ISO/IEC
     36 * 14496-2) standard.
     37 *
     38 * Those intending to use this software module in hardware or software products
     39 * are advised that its use may infringe existing patents. The original
     40 * developer of this software module and his/her company, the subsequent
     41 * editors and their companies, and ISO/IEC have no liability for use of this
     42 * software module or modifications thereof in an implementation. Copyright is
     43 * not released for non MPEG-4 Video (ISO/IEC 14496-2) Standard conforming
     44 * products.
     45 *
     46 * ACTS-MoMuSys partners retain full right to use the code for his/her own
     47 * purpose, assign or donate the code to a third party and to inhibit third
     48 * parties from using the code for non MPEG-4 Video (ISO/IEC 14496-2) Standard
     49 * conforming products. This copyright notice must be included in all copies or
     50 * derivative works.
     51 *
     52 * Copyright (c) 1996
     53 *
     54 *****************************************************************************/
     55 
     56 /***********************************************************HeaderBegin*******
     57 *
     58 * File: vlc_dec.c
     59 *
     60 * Author:   Paulo Nunes (IST) - Paulo.Nunes (at) lx.it.pt
     61 * Created:  1-Mar-96
     62 *
     63 * Description: This file contains the VLC functions needed to decode a
     64 *       bitstream.
     65 *
     66 * Notes:
     67 *       The functions contained in this file were adapted from
     68 *       tmndecode
     69 *       Written by Karl Olav Lillevold <kol (at) nta.no>,
     70 *       1995 Telenor R&D.
     71 *       Donated to the Momusys-project as background code by
     72 *       Telenor.
     73 *
     74 *       based on mpeg2decode, (C) 1994, MPEG Software Simulation Group
     75 *       and mpeg2play, (C) 1994 Stefan Eckart
     76 *                   <stefan (at) lis.e-technik.tu-muenchen.de>
     77 *
     78 *
     79 * Modified: 9-May-96 Paulo Nunes: Reformatted. New headers.
     80 *              17-Jan-97 Jan De Lameillieure (HHI) : corrected in
     81 *              01.05.97 Luis Ducla-Soares: added RvlcDecTCOEF() to allow decoding
     82 *                                          of Reversible VLCs.
     83 *       09.03.98 Paulo Nunes: Cleaning.
     84 *
     85 ***********************************************************HeaderEnd*********/
     86 
     87 #include "mp4dec_lib.h"
     88 #include "vlc_dec_tab.h"
     89 #include "vlc_decode.h"
     90 #include "bitstream.h"
     91 #include "max_level.h"
     92 
     93 
     94 /* ====================================================================== /
     95     Function : DecodeUserData()
     96     Date     : 04/10/2000
     97     History  :
     98     Modified : 04/16/2001 : removed status checking of PV_BitstreamFlushBits
     99 
    100         This is simply a realization of the user_data() function
    101         in the ISO/IEC 14496-2 manual.
    102 / ====================================================================== */
    103 PV_STATUS DecodeUserData(BitstreamDecVideo *stream)
    104 {
    105     PV_STATUS status;
    106     uint32 code;
    107 
    108     BitstreamReadBits32HC(stream);
    109     BitstreamShowBits32(stream, 24, &code);
    110 
    111     while (code != 1)
    112     {
    113         /* Discard user data for now.   04/05/2000 */
    114         BitstreamReadBits16(stream, 8);
    115         BitstreamShowBits32(stream, 24, &code);
    116         status = BitstreamCheckEndBuffer(stream);
    117         if (status == PV_END_OF_VOP) return status;    /*  03/19/2002 */
    118     }
    119     return PV_SUCCESS;
    120 }
    121 
    122 
    123 
    124 /***********************************************************CommentBegin******
    125 *
    126 *       3/10/00  : initial modification to the
    127 *                new PV-Decoder Lib format.
    128 *       3/29/00  : added return code check to some functions and
    129 *                optimize the code.
    130 *
    131 ***********************************************************CommentEnd********/
    132 PV_STATUS PV_GetMBvectors(VideoDecData *video, uint mode)
    133 {
    134     PV_STATUS status;
    135     BitstreamDecVideo *stream = video->bitstream;
    136     int  f_code_f = video->currVop->fcodeForward;
    137     int  vlc_code_mag;
    138 
    139 
    140     MOT *mot_x = video->motX;
    141     MOT *mot_y = video->motY;
    142 
    143     int k, offset;
    144     int x_pos = video->mbnum_col;
    145     int y_pos = video->mbnum_row;
    146     int doubleWidth = video->nMBPerRow << 1;
    147     int pos = (x_pos + y_pos * doubleWidth) << 1;
    148     MOT mvx = 0, mvy = 0;
    149 
    150 
    151     if (f_code_f == 1)
    152     {
    153 #ifdef PV_ANNEX_IJKT_SUPPORT
    154         if (mode == MODE_INTER4V || mode == MODE_INTER4V_Q)
    155 #else
    156         if (mode == MODE_INTER4V)
    157 #endif
    158         {
    159             for (k = 0; k < 4; k++)
    160             {
    161                 offset = (k & 1) + (k >> 1) * doubleWidth;
    162                 mv_prediction(video, k, &mvx, &mvy);
    163                 /* decode component x */
    164                 status = PV_VlcDecMV(stream, &vlc_code_mag);
    165                 if (status != PV_SUCCESS)
    166                 {
    167                     return status;
    168                 }
    169 
    170                 mvx += (MOT)vlc_code_mag;
    171                 mvx = (MOT)(((mvx + 32) & 0x3F) - 32);
    172 
    173 
    174                 status = PV_VlcDecMV(stream, &vlc_code_mag);
    175                 if (status != PV_SUCCESS)
    176                 {
    177                     return status;
    178                 }
    179 
    180                 mvy += (MOT)vlc_code_mag;
    181                 mvy = (MOT)(((mvy + 32) & 0x3F) - 32);
    182 
    183                 mot_x[pos+offset] = (MOT) mvx;
    184                 mot_y[pos+offset] = (MOT) mvy;
    185             }
    186         }
    187         else
    188         {
    189             mv_prediction(video, 0, &mvx, &mvy);
    190             /* For PVOPs, field  appears only in MODE_INTER & MODE_INTER_Q */
    191             status = PV_VlcDecMV(stream, &vlc_code_mag);
    192             if (status != PV_SUCCESS)
    193             {
    194                 return status;
    195             }
    196 
    197             mvx += (MOT)vlc_code_mag;
    198             mvx = (MOT)(((mvx + 32) & 0x3F) - 32);
    199 
    200 
    201             status = PV_VlcDecMV(stream, &vlc_code_mag);
    202             if (status != PV_SUCCESS)
    203             {
    204                 return status;
    205             }
    206 
    207 
    208             mvy += (MOT)vlc_code_mag;
    209             mvy = (MOT)(((mvy + 32) & 0x3F) - 32);
    210 
    211 
    212             mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
    213             mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
    214             pos += doubleWidth;
    215             mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
    216             mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
    217         }
    218     }
    219     else
    220     {
    221 #ifdef PV_ANNEX_IJKT_SUPPORT
    222         if (mode == MODE_INTER4V || mode == MODE_INTER4V_Q)
    223 #else
    224         if (mode == MODE_INTER4V)
    225 #endif
    226         {
    227             for (k = 0; k < 4; k++)
    228             {
    229                 offset = (k & 1) + (k >> 1) * doubleWidth;
    230                 mv_prediction(video, k, &mvx, &mvy);
    231                 status = PV_DecodeMBVec(stream, &mvx, &mvy, f_code_f);
    232                 mot_x[pos+offset] = (MOT) mvx;
    233                 mot_y[pos+offset] = (MOT) mvy;
    234                 if (status != PV_SUCCESS)
    235                 {
    236                     return status;
    237                 }
    238             }
    239         }
    240         else
    241         {
    242             mv_prediction(video, 0, &mvx, &mvy);
    243             /* For PVOPs, field  appears only in MODE_INTER & MODE_INTER_Q */
    244             status = PV_DecodeMBVec(stream, &mvx, &mvy, f_code_f);
    245             mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
    246             mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
    247             pos += doubleWidth;
    248             mot_x[pos] = mot_x[pos+1] = (MOT) mvx;
    249             mot_y[pos] = mot_y[pos+1] = (MOT) mvy;
    250             if (status != PV_SUCCESS)
    251             {
    252                 return status;
    253             }
    254         }
    255     }
    256     return PV_SUCCESS;
    257 }
    258 
    259 
    260 /***********************************************************CommentBegin******
    261 *       3/10/00  : initial modification to the
    262 *                new PV-Decoder Lib format.
    263 *       3/29/00  : added return code check to some functions
    264 *       5/10/00  : check whether the decoded vector is legal.
    265 *       4/17/01  : use MOT type
    266 ***********************************************************CommentEnd********/
    267 PV_STATUS PV_DecodeMBVec(BitstreamDecVideo *stream, MOT *mv_x, MOT *mv_y, int f_code_f)
    268 {
    269     PV_STATUS status;
    270     int  vlc_code_magx, vlc_code_magy;
    271     int  residualx = 0, residualy = 0;
    272 
    273     /* decode component x */
    274     status = PV_VlcDecMV(stream, &vlc_code_magx);
    275     if (status != PV_SUCCESS)
    276     {
    277         return status;
    278     }
    279 
    280     if (vlc_code_magx)
    281     {
    282         residualx = (int) BitstreamReadBits16_INLINE(stream, (int)(f_code_f - 1));
    283     }
    284 
    285 
    286     /* decode component y */
    287     status = PV_VlcDecMV(stream, &vlc_code_magy);
    288     if (status != PV_SUCCESS)
    289     {
    290         return status;
    291     }
    292 
    293     if (vlc_code_magy)
    294     {
    295         residualy = (int) BitstreamReadBits16_INLINE(stream, (int)(f_code_f - 1));
    296     }
    297 
    298 
    299     if (PV_DeScaleMVD(f_code_f, residualx, vlc_code_magx, mv_x) != PV_SUCCESS)
    300     {
    301         return PV_FAIL;
    302     }
    303 
    304     if (PV_DeScaleMVD(f_code_f, residualy, vlc_code_magy, mv_y) != PV_SUCCESS)
    305     {
    306         return PV_FAIL;
    307     }
    308 
    309     return PV_SUCCESS;
    310 }
    311 
    312 
    313 /***********************************************************CommentBegin******
    314 *       3/31/2000 : initial modification to the new PV-Decoder Lib format.
    315 *       5/10/2000 : check to see if the decoded vector falls within
    316 *                           the legal fcode range.
    317 *
    318 ***********************************************************CommentEnd********/
    319 PV_STATUS PV_DeScaleMVD(
    320     int  f_code,       /* <-- MV range in 1/2 units: 1=32,2=64,...,7=2048     */
    321     int  residual,     /* <-- part of the MV Diff. FLC coded                  */
    322     int  vlc_code_mag, /* <-- part of the MV Diff. VLC coded                  */
    323     MOT  *vector       /* --> Obtained MV component in 1/2 units              */
    324 )
    325 {
    326     int   half_range = (1 << (f_code + 4));
    327     int   mask = (half_range << 1) - 1;
    328     int   diff_vector;
    329 
    330 
    331     if (vlc_code_mag == 0)
    332     {
    333         diff_vector = vlc_code_mag;
    334     }
    335     else
    336     {
    337         diff_vector = ((PV_ABS(vlc_code_mag) - 1) << (f_code - 1)) + residual + 1;
    338         if (vlc_code_mag < 0)
    339         {
    340             diff_vector = -diff_vector;
    341         }
    342     }
    343 
    344     *vector += (MOT)(diff_vector);
    345 
    346     *vector = (MOT)((*vector + half_range) & mask) - half_range;
    347 
    348     return PV_SUCCESS;
    349 }
    350 
    351 
    352 
    353 void mv_prediction(
    354     VideoDecData *video,
    355     int block,
    356     MOT *mvx,
    357     MOT *mvy
    358 )
    359 {
    360     /*----------------------------------------------------------------------------
    361     ; Define all local variables
    362     ----------------------------------------------------------------------------*/
    363     MOT *motxdata = video->motX;
    364     MOT *motydata = video->motY;
    365     int mbnum_col = video->mbnum_col;
    366     int mbnum_row = video->mbnum_row;
    367     uint8 *slice_nb = video->sliceNo;
    368     int nMBPerRow = video->nMBPerRow;
    369     int nMVPerRow = nMBPerRow << 1;
    370     int mbnum = video->mbnum;
    371     int p1x = 0, p2x = 0, p3x = 0;
    372     int p1y = 0, p2y = 0, p3y = 0;
    373     int rule1 = 0, rule2 = 0, rule3 = 0;
    374     int     indx;
    375 
    376     indx = ((mbnum_col << 1) + (block & 1)) + ((mbnum_row << 1)  + (block >> 1)) * nMVPerRow - 1; /* left block */
    377 
    378     if (block & 1)           /* block 1, 3 */
    379     {
    380         p1x = motxdata[indx];
    381         p1y = motydata[indx];
    382         rule1 = 1;
    383     }
    384     else                    /* block 0, 2 */
    385     {
    386         if (mbnum_col > 0 && slice_nb[mbnum] == slice_nb[mbnum-1])
    387         {
    388             p1x = motxdata[indx];
    389             p1y = motydata[indx];
    390             rule1 = 1;
    391         }
    392     }
    393 
    394     indx = indx + 1 - nMVPerRow; /* upper_block */
    395     if (block >> 1)
    396     {
    397         indx -= (block & 1);
    398         p2x = motxdata[indx];
    399         p2y = motydata[indx];
    400         p3x = motxdata[indx + 1];
    401         p3y = motydata[indx + 1];
    402         rule2 = rule3 = 1;
    403     }
    404     else
    405     {                           /* block 0,1 */
    406         if (mbnum_row)
    407         {
    408             if (slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow])
    409             {
    410                 p2x = motxdata[indx];
    411                 p2y = motydata[indx];
    412                 rule2 = 1;
    413             }
    414             if (mbnum_col < nMBPerRow - 1 && slice_nb[mbnum] == slice_nb[mbnum-nMBPerRow+1])
    415             {
    416                 indx = indx + 2 - (block & 1);
    417                 p3x = motxdata[indx];
    418                 p3y = motydata[indx];
    419                 rule3 = 1;
    420             }
    421         }
    422     }
    423 
    424     if (rule1 + rule2 + rule3 > 1)
    425     {
    426         *mvx = (MOT)PV_MEDIAN(p1x, p2x, p3x);
    427         *mvy = (MOT)PV_MEDIAN(p1y, p2y, p3y);
    428     }
    429     else if (rule1 + rule2 + rule3 == 1)
    430     {
    431         /* two of three are zero */
    432         *mvx = (MOT)(p1x + p2x + p3x);
    433         *mvy = (MOT)(p1y + p2y + p3y);
    434     }
    435     else
    436     {
    437         /* all MBs are outside the VOP */
    438         *mvx = *mvy = 0;
    439     }
    440     /*----------------------------------------------------------------------------
    441     ; Return nothing or data or data pointer
    442     ----------------------------------------------------------------------------*/
    443     return;
    444 }
    445 
    446 /***********************************************************CommentBegin******
    447 *
    448 *       3/30/2000 : initial modification to the new PV-Decoder Lib format.
    449 *       4/16/2001 : removed checking of status for PV_BitstreamFlushBits
    450 ***********************************************************CommentEnd********/
    451 
    452 PV_STATUS PV_VlcDecMV(BitstreamDecVideo *stream, int *mv)
    453 {
    454     PV_STATUS status = PV_SUCCESS;
    455     uint code;
    456 
    457     BitstreamShow13Bits(stream, &code);
    458 
    459     if (code >> 12)
    460     {
    461         *mv = 0; /* Vector difference = 0 */
    462         PV_BitstreamFlushBits(stream, 1);
    463         return PV_SUCCESS;
    464     }
    465 
    466     if (code >= 512)
    467     {
    468         code = (code >> 8) - 2;
    469         PV_BitstreamFlushBits(stream, PV_TMNMVtab0[code].len + 1);
    470         *mv = PV_TMNMVtab0[code].val;
    471         return status;
    472     }
    473 
    474     if (code >= 128)
    475     {
    476         code = (code >> 2) - 32;
    477         PV_BitstreamFlushBits(stream, PV_TMNMVtab1[code].len + 1);
    478         *mv = PV_TMNMVtab1[code].val;
    479         return status;
    480     }
    481 
    482     if (code < 4)
    483     {
    484         *mv = -1;
    485         return PV_FAIL;
    486     }
    487 
    488     code -= 4;
    489 
    490     PV_BitstreamFlushBits(stream, PV_TMNMVtab2[code].len + 1);
    491 
    492     *mv = PV_TMNMVtab2[code].val;
    493     return status;
    494 }
    495 
    496 
    497 /***********************************************************CommentBegin******
    498 *       3/30/2000 : initial modification to the new PV-Decoder Lib
    499 *                           format and the change of error-handling method.
    500 *       4/16/01   : removed status checking of PV_BitstreamFlushBits
    501 ***********************************************************CommentEnd********/
    502 
    503 int PV_VlcDecMCBPC_com_intra(BitstreamDecVideo *stream)
    504 {
    505     uint code;
    506 
    507     BitstreamShowBits16(stream, 9, &code);
    508 
    509 
    510     if (code < 8)
    511     {
    512         return VLC_CODE_ERROR;
    513     }
    514 
    515     code >>= 3;
    516 
    517     if (code >= 32)
    518     {
    519         PV_BitstreamFlushBits(stream, 1);
    520         return 3;
    521     }
    522 
    523     PV_BitstreamFlushBits(stream, PV_MCBPCtabintra[code].len);
    524 
    525     return PV_MCBPCtabintra[code].val;
    526 }
    527 
    528 
    529 /***********************************************************CommentBegin******
    530 *
    531 *       3/30/2000 : initial modification to the new PV-Decoder Lib
    532 *                           format and the change of error-handling method.
    533 *       4/16/2001 : removed checking of return status of PV_BitstreamFlushBits
    534 ***********************************************************CommentEnd********/
    535 
    536 int PV_VlcDecMCBPC_com_inter(BitstreamDecVideo *stream)
    537 {
    538     uint code;
    539 
    540     BitstreamShowBits16(stream, 9, &code);
    541 
    542     if (code == 0)
    543     {
    544         return VLC_CODE_ERROR;
    545     }
    546     else if (code >= 256)
    547     {
    548         PV_BitstreamFlushBits(stream, 1);
    549         return 0;
    550     }
    551 
    552     PV_BitstreamFlushBits(stream, PV_MCBPCtab[code].len);
    553     return PV_MCBPCtab[code].val;
    554 }
    555 
    556 #ifdef PV_ANNEX_IJKT_SUPPORT
    557 int PV_VlcDecMCBPC_com_inter_H263(BitstreamDecVideo *stream)
    558 {
    559     uint code;
    560 
    561     BitstreamShow13Bits(stream, &code);
    562 
    563     if (code < 8)
    564     {
    565         return VLC_CODE_ERROR;
    566     }
    567     else if (code >= 4096)
    568     {
    569         PV_BitstreamFlushBits(stream, 1);
    570         return 0;
    571     }
    572     if (code >= 16)
    573     {
    574         PV_BitstreamFlushBits(stream, PV_MCBPCtab[code >> 4].len);
    575         return PV_MCBPCtab[code >> 4].val;
    576     }
    577     else
    578     {
    579         PV_BitstreamFlushBits(stream, PV_MCBPCtab1[code - 8].len);
    580         return PV_MCBPCtab1[code - 8].val;
    581     }
    582 }
    583 #endif
    584 /***********************************************************CommentBegin******
    585 *       3/30/2000 : initial modification to the new PV-Decoder Lib
    586 *                           format and the change of error-handling method.
    587 *       4/16/2001 : removed status checking for PV_BitstreamFlushBits
    588 ***********************************************************CommentEnd********/
    589 
    590 int PV_VlcDecCBPY(BitstreamDecVideo *stream, int intra)
    591 {
    592     int CBPY = 0;
    593     uint code;
    594 
    595     BitstreamShowBits16(stream, 6, &code);
    596 
    597 
    598     if (code < 2)
    599     {
    600         return -1;
    601     }
    602     else if (code >= 48)
    603     {
    604         PV_BitstreamFlushBits(stream, 2);
    605         CBPY = 15;
    606     }
    607     else
    608     {
    609         PV_BitstreamFlushBits(stream, PV_CBPYtab[code].len);
    610         CBPY = PV_CBPYtab[code].val;
    611     }
    612 
    613     if (intra == 0) CBPY = 15 - CBPY;
    614     CBPY = CBPY & 15;
    615     return CBPY;
    616 }
    617 
    618 
    619 /***********************************************************CommentBegin******
    620 *       3/31/2000 : initial modification to the new PV-Decoder Lib format.
    621 *
    622 *       8/23/2000 : optimize the function by removing unnecessary BitstreamShowBits()
    623 *                       function calls.
    624 *
    625 *       9/6/2000 : change the API to check for end-of-buffer for proper
    626 *                           termination of decoding process.
    627 ***********************************************************CommentEnd********/
    628 PV_STATUS PV_VlcDecIntraDCPredSize(BitstreamDecVideo *stream, int compnum, uint *DC_size)
    629 {
    630     PV_STATUS status = PV_FAIL;      /*  07/09/01 */
    631     uint  code;
    632 
    633     *DC_size = 0;
    634     if (compnum < 4)  /* luminance block */
    635     {
    636 
    637         BitstreamShowBits16(stream, 11, &code);
    638 
    639         if (code == 1)
    640         {
    641             *DC_size = 12;
    642             PV_BitstreamFlushBits(stream, 11);
    643             return PV_SUCCESS;
    644         }
    645         code >>= 1;
    646         if (code == 1)
    647         {
    648             *DC_size = 11;
    649             PV_BitstreamFlushBits(stream, 10);
    650             return PV_SUCCESS;
    651         }
    652         code >>= 1;
    653         if (code == 1)
    654         {
    655             *DC_size = 10;
    656             PV_BitstreamFlushBits(stream, 9);
    657             return PV_SUCCESS;
    658         }
    659 
    660         code >>= 1;
    661         if (code == 1)
    662         {
    663             *DC_size = 9;
    664             PV_BitstreamFlushBits(stream, 8);
    665             return PV_SUCCESS;
    666         }
    667 
    668         code >>= 1;
    669         if (code == 1)
    670         {
    671             *DC_size = 8;
    672             PV_BitstreamFlushBits(stream, 7);
    673             return PV_SUCCESS;
    674         }
    675 
    676         code >>= 1;
    677         if (code == 1)
    678         {
    679             *DC_size = 7;
    680             PV_BitstreamFlushBits(stream, 6);
    681             return PV_SUCCESS;
    682         }
    683 
    684         code >>= 1;
    685         if (code == 1)
    686         {
    687             *DC_size = 6;
    688             PV_BitstreamFlushBits(stream, 5);
    689             return PV_SUCCESS;
    690         }
    691 
    692         code >>= 1;
    693         if (code == 1)
    694         {
    695             *DC_size = 5;
    696             PV_BitstreamFlushBits(stream, 4);
    697             return PV_SUCCESS;
    698         }
    699 
    700         code >>= 1;
    701         if (code == 1)
    702         {
    703             *DC_size = 4;
    704             PV_BitstreamFlushBits(stream, 3);
    705             return PV_SUCCESS;
    706         }
    707         else if (code == 2)
    708         {
    709             *DC_size = 3;
    710             PV_BitstreamFlushBits(stream, 3);
    711             return PV_SUCCESS;
    712         }
    713         else if (code == 3)
    714         {
    715             *DC_size = 0;
    716             PV_BitstreamFlushBits(stream, 3);
    717             return PV_SUCCESS;
    718         }
    719 
    720         code >>= 1;
    721         if (code == 2)
    722         {
    723             *DC_size = 2;
    724             PV_BitstreamFlushBits(stream, 2);
    725             return PV_SUCCESS;
    726         }
    727         else if (code == 3)
    728         {
    729             *DC_size = 1;
    730             PV_BitstreamFlushBits(stream, 2);
    731             return PV_SUCCESS;
    732         }
    733     }
    734     else /* chrominance block */
    735     {
    736 
    737         BitstreamShow13Bits(stream, &code);
    738         code >>= 1;
    739         if (code == 1)
    740         {
    741             *DC_size = 12;
    742             PV_BitstreamFlushBits(stream, 12);
    743             return PV_SUCCESS;
    744         }
    745 
    746         code >>= 1;
    747         if (code == 1)
    748         {
    749             *DC_size = 11;
    750             PV_BitstreamFlushBits(stream, 11);
    751             return PV_SUCCESS;
    752         }
    753 
    754         code >>= 1;
    755         if (code == 1)
    756         {
    757             *DC_size = 10;
    758             PV_BitstreamFlushBits(stream, 10);
    759             return PV_SUCCESS;
    760         }
    761 
    762         code >>= 1;
    763         if (code == 1)
    764         {
    765             *DC_size = 9;
    766             PV_BitstreamFlushBits(stream, 9);
    767             return PV_SUCCESS;
    768         }
    769 
    770         code >>= 1;
    771         if (code == 1)
    772         {
    773             *DC_size = 8;
    774             PV_BitstreamFlushBits(stream, 8);
    775             return PV_SUCCESS;
    776         }
    777 
    778         code >>= 1;
    779         if (code == 1)
    780         {
    781             *DC_size = 7;
    782             PV_BitstreamFlushBits(stream, 7);
    783             return PV_SUCCESS;
    784         }
    785 
    786         code >>= 1;
    787         if (code == 1)
    788         {
    789             *DC_size = 6;
    790             PV_BitstreamFlushBits(stream, 6);
    791             return PV_SUCCESS;
    792         }
    793 
    794         code >>= 1;
    795         if (code == 1)
    796         {
    797             *DC_size = 5;
    798             PV_BitstreamFlushBits(stream, 5);
    799             return PV_SUCCESS;
    800         }
    801 
    802         code >>= 1;
    803         if (code == 1)
    804         {
    805             *DC_size = 4;
    806             PV_BitstreamFlushBits(stream, 4);
    807             return PV_SUCCESS;
    808         }
    809 
    810         code >>= 1;
    811         if (code == 1)
    812         {
    813             *DC_size = 3;
    814             PV_BitstreamFlushBits(stream, 3);
    815             return PV_SUCCESS;
    816         }
    817 
    818         code >>= 1;
    819         {
    820             *DC_size = (int)(3 - code);
    821             PV_BitstreamFlushBits(stream, 2);
    822             return PV_SUCCESS;
    823         }
    824     }
    825 
    826     return status;
    827 }
    828 
    829 /***********************************************************CommentBegin******
    830 *
    831 *
    832 *       3/30/2000 : initial modification to the new PV-Decoder Lib
    833 *                           format and the change of error-handling method.
    834 *
    835 ***********************************************************CommentEnd********/
    836 
    837 
    838 
    839 PV_STATUS VlcDecTCOEFIntra(BitstreamDecVideo *stream, Tcoef *pTcoef)
    840 {
    841     uint code;
    842     const VLCtab2 *tab;
    843 
    844     BitstreamShow13Bits(stream, &code);
    845 
    846     /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFIntra */
    847     /*  if(GetTcoeffIntra(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
    848     if (code >= 1024)
    849     {
    850         tab = &PV_DCT3Dtab3[(code >> 6) - 16];
    851     }
    852     else
    853     {
    854         if (code >= 256)
    855         {
    856             tab = &PV_DCT3Dtab4[(code >> 3) - 32];
    857         }
    858         else
    859         {
    860             if (code >= 16)
    861             {
    862                 tab = &PV_DCT3Dtab5[(code>>1) - 8];
    863             }
    864             else
    865             {
    866                 return PV_FAIL;
    867             }
    868         }
    869     }
    870 
    871     PV_BitstreamFlushBits(stream, tab->len + 1);
    872     pTcoef->sign = (code >> (12 - tab->len)) & 1;
    873     pTcoef->run = (uint) tab->run; //(tab->val >> 8) & 255;
    874     pTcoef->level = (int) tab->level; //tab->val & 255;
    875     pTcoef->last = (uint) tab->last; //(tab->val >> 16) & 1;
    876 
    877 
    878     /* the following is modified for 3-mode escape -- boon */
    879     if (tab->level != 0xFF)
    880     {
    881         return PV_SUCCESS;
    882     }
    883 
    884     //if (((tab->run<<8)|(tab->level)|(tab->last<<16)) == VLC_ESCAPE_CODE)
    885 
    886     if (!pTcoef->sign)
    887     {
    888         /* first escape mode. level is offset */
    889         BitstreamShow13Bits(stream, &code);
    890 
    891         /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFIntra */
    892         /*          if(GetTcoeffIntra(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
    893         if (code >= 1024)
    894         {
    895             tab = &PV_DCT3Dtab3[(code >> 6) - 16];
    896         }
    897         else
    898         {
    899             if (code >= 256)
    900             {
    901                 tab = &PV_DCT3Dtab4[(code >> 3) - 32];
    902             }
    903             else
    904             {
    905                 if (code >= 16)
    906                 {
    907                     tab = &PV_DCT3Dtab5[(code>>1) - 8];
    908                 }
    909                 else
    910                 {
    911                     return PV_FAIL;
    912                 }
    913             }
    914         }
    915 
    916         PV_BitstreamFlushBits(stream, tab->len + 1);
    917 
    918         /* sign bit */
    919         pTcoef->sign = (code >> (12 - tab->len)) & 1;
    920         pTcoef->run = (uint)tab->run; //(tab->val >> 8) & 255;
    921         pTcoef->level = (int)tab->level; //tab->val & 255;
    922         pTcoef->last = (uint)tab->last; //(tab->val >> 16) & 1;
    923 
    924 
    925         /* need to add back the max level */
    926         if ((pTcoef->last == 0 && pTcoef->run > 14) || (pTcoef->last == 1 && pTcoef->run > 20))
    927         {
    928             return PV_FAIL;
    929         }
    930         pTcoef->level = pTcoef->level + intra_max_level[pTcoef->last][pTcoef->run];
    931 
    932 
    933     }
    934     else
    935     {
    936         uint run_offset;
    937         run_offset = BitstreamRead1Bits_INLINE(stream);
    938 
    939         if (!run_offset)
    940         {
    941             /* second escape mode. run is offset */
    942             BitstreamShow13Bits(stream, &code);
    943 
    944             /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFIntra */
    945             /*              if(GetTcoeffIntra(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
    946             if (code >= 1024)
    947             {
    948                 tab = &PV_DCT3Dtab3[(code >> 6) - 16];
    949             }
    950             else
    951             {
    952                 if (code >= 256)
    953                 {
    954                     tab = &PV_DCT3Dtab4[(code >> 3) - 32];
    955                 }
    956                 else
    957                 {
    958                     if (code >= 16)
    959                     {
    960                         tab = &PV_DCT3Dtab5[(code>>1) - 8];
    961                     }
    962                     else
    963                     {
    964                         return PV_FAIL;
    965                     }
    966                 }
    967             }
    968 
    969             PV_BitstreamFlushBits(stream, tab->len + 1);
    970             /* sign bit */
    971             pTcoef->sign = (code >> (12 - tab->len)) & 1;
    972             pTcoef->run = (uint)tab->run; //(tab->val >> 8) & 255;
    973             pTcoef->level = (int)tab->level; //tab->val & 255;
    974             pTcoef->last = (uint)tab->last; //(tab->val >> 16) & 1;
    975 
    976 
    977 
    978             /* need to add back the max run */
    979             if (pTcoef->last)
    980             {
    981                 if (pTcoef->level > 8)
    982                 {
    983                     return PV_FAIL;
    984                 }
    985                 pTcoef->run = pTcoef->run + intra_max_run1[pTcoef->level] + 1;
    986             }
    987             else
    988             {
    989                 if (pTcoef->level > 27)
    990                 {
    991                     return PV_FAIL;
    992                 }
    993                 pTcoef->run = pTcoef->run + intra_max_run0[pTcoef->level] + 1;
    994             }
    995 
    996 
    997         }
    998         else
    999         {
   1000 
   1001             code = BitstreamReadBits16_INLINE(stream, 8);
   1002             pTcoef->last = code >> 7;
   1003             pTcoef->run = (code >> 1) & 0x3F;
   1004             pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 13) >> 1);
   1005 
   1006             if (pTcoef->level >= 2048)
   1007             {
   1008                 pTcoef->sign = 1;
   1009                 pTcoef->level = 4096 - pTcoef->level;
   1010             }
   1011             else
   1012             {
   1013                 pTcoef->sign = 0;
   1014             }
   1015         } /* flc */
   1016     }
   1017 
   1018     return PV_SUCCESS;
   1019 
   1020 } /* VlcDecTCOEFIntra */
   1021 
   1022 PV_STATUS VlcDecTCOEFInter(BitstreamDecVideo *stream, Tcoef *pTcoef)
   1023 {
   1024     uint code;
   1025     const VLCtab2 *tab;
   1026 
   1027     BitstreamShow13Bits(stream, &code);
   1028 
   1029     /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFInter */
   1030     /*  if(GetTcoeffInter(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
   1031     if (code >= 1024)
   1032     {
   1033         tab = &PV_DCT3Dtab0[(code >> 6) - 16];
   1034     }
   1035     else
   1036     {
   1037         if (code >= 256)
   1038         {
   1039             tab = &PV_DCT3Dtab1[(code >> 3) - 32];
   1040         }
   1041         else
   1042         {
   1043             if (code >= 16)
   1044             {
   1045                 tab = &PV_DCT3Dtab2[(code>>1) - 8];
   1046             }
   1047             else
   1048             {
   1049                 return PV_FAIL;
   1050             }
   1051         }
   1052     }
   1053     PV_BitstreamFlushBits(stream, tab->len + 1);
   1054     pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1055     pTcoef->run = (uint)tab->run;     //(tab->val >> 4) & 255;
   1056     pTcoef->level = (int)tab->level; //tab->val & 15;
   1057     pTcoef->last = (uint)tab->last;   //(tab->val >> 12) & 1;
   1058 
   1059     /* the following is modified for 3-mode escape -- boon */
   1060     if (tab->run != 0xBF)
   1061     {
   1062         return PV_SUCCESS;
   1063     }
   1064     //if (((tab->run<<4)|(tab->level)|(tab->last<<12)) == VLC_ESCAPE_CODE)
   1065 
   1066 
   1067     if (!pTcoef->sign)
   1068     {
   1069         /* first escape mode. level is offset */
   1070         BitstreamShow13Bits(stream, &code);
   1071 
   1072         /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFInter */
   1073         /*          if(GetTcoeffInter(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
   1074         if (code >= 1024)
   1075         {
   1076             tab = &PV_DCT3Dtab0[(code >> 6) - 16];
   1077         }
   1078         else
   1079         {
   1080             if (code >= 256)
   1081             {
   1082                 tab = &PV_DCT3Dtab1[(code >> 3) - 32];
   1083             }
   1084             else
   1085             {
   1086                 if (code >= 16)
   1087                 {
   1088                     tab = &PV_DCT3Dtab2[(code>>1) - 8];
   1089                 }
   1090                 else
   1091                 {
   1092                     return PV_FAIL;
   1093                 }
   1094             }
   1095         }
   1096         PV_BitstreamFlushBits(stream, tab->len + 1);
   1097         pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1098         pTcoef->run = (uint)tab->run;     //(tab->val >> 4) & 255;
   1099         pTcoef->level = (int)tab->level; //tab->val & 15;
   1100         pTcoef->last = (uint)tab->last;   //(tab->val >> 12) & 1;
   1101 
   1102         /* need to add back the max level */
   1103         if ((pTcoef->last == 0 && pTcoef->run > 26) || (pTcoef->last == 1 && pTcoef->run > 40))
   1104         {
   1105             return PV_FAIL;
   1106         }
   1107         pTcoef->level = pTcoef->level + inter_max_level[pTcoef->last][pTcoef->run];
   1108     }
   1109     else
   1110     {
   1111         uint run_offset;
   1112         run_offset = BitstreamRead1Bits_INLINE(stream);
   1113 
   1114         if (!run_offset)
   1115         {
   1116             /* second escape mode. run is offset */
   1117             BitstreamShow13Bits(stream, &code);
   1118 
   1119             /* 10/17/2000, perform a little bit better on ARM by putting the whole function in VlcDecTCOEFFInter */
   1120             /*if(GetTcoeffInter(code,pTcoef,&tab,stream)!=PV_SUCCESS) return status;*/
   1121             if (code >= 1024)
   1122             {
   1123                 tab = &PV_DCT3Dtab0[(code >> 6) - 16];
   1124             }
   1125             else
   1126             {
   1127                 if (code >= 256)
   1128                 {
   1129                     tab = &PV_DCT3Dtab1[(code >> 3) - 32];
   1130                 }
   1131                 else
   1132                 {
   1133                     if (code >= 16)
   1134                     {
   1135                         tab = &PV_DCT3Dtab2[(code>>1) - 8];
   1136                     }
   1137                     else
   1138                     {
   1139                         return PV_FAIL;
   1140                     }
   1141                 }
   1142             }
   1143             PV_BitstreamFlushBits(stream, tab->len + 1);
   1144             pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1145             pTcoef->run = (uint)tab->run;     //(tab->val >> 4) & 255;
   1146             pTcoef->level = (int)tab->level; //tab->val & 15;
   1147             pTcoef->last = (uint)tab->last;   //(tab->val >> 12) & 1;
   1148 
   1149             /* need to add back the max run */
   1150             if (pTcoef->last)
   1151             {
   1152                 if (pTcoef->level > 3)
   1153                 {
   1154                     return PV_FAIL;
   1155                 }
   1156                 pTcoef->run = pTcoef->run + inter_max_run1[pTcoef->level] + 1;
   1157             }
   1158             else
   1159             {
   1160                 if (pTcoef->level > 12)
   1161                 {
   1162                     return PV_FAIL;
   1163                 }
   1164                 pTcoef->run = pTcoef->run + inter_max_run0[pTcoef->level] + 1;
   1165             }
   1166         }
   1167         else
   1168         {
   1169 
   1170             code = BitstreamReadBits16_INLINE(stream, 8);
   1171             pTcoef->last = code >> 7;
   1172             pTcoef->run = (code >> 1) & 0x3F;
   1173             pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 13) >> 1);
   1174 
   1175 
   1176 
   1177             if (pTcoef->level >= 2048)
   1178             {
   1179                 pTcoef->sign = 1;
   1180                 pTcoef->level = 4096 - pTcoef->level;
   1181             }
   1182             else
   1183             {
   1184                 pTcoef->sign = 0;
   1185             }
   1186         } /* flc */
   1187     }
   1188 
   1189     return PV_SUCCESS;
   1190 
   1191 } /* VlcDecTCOEFInter */
   1192 
   1193 /*=======================================================
   1194     Function:   VlcDecTCOEFShortHeader()
   1195     Date    :   04/27/99
   1196     Purpose :   New function used in decoding of video planes
   1197                 with short header
   1198     Modified:   05/23/2000
   1199                 for new decoder structure.
   1200 =========================================================*/
   1201 PV_STATUS VlcDecTCOEFShortHeader(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
   1202 {
   1203     uint code;
   1204     const VLCtab2 *tab;
   1205 
   1206     BitstreamShow13Bits(stream, &code);
   1207 
   1208     /*intra = 0;*/
   1209 
   1210     if (code >= 1024) tab = &PV_DCT3Dtab0[(code >> 6) - 16];
   1211     else
   1212     {
   1213         if (code >= 256) tab = &PV_DCT3Dtab1[(code >> 3) - 32];
   1214         else
   1215         {
   1216             if (code >= 16) tab = &PV_DCT3Dtab2[(code>>1) - 8];
   1217             else return PV_FAIL;
   1218         }
   1219     }
   1220 
   1221     PV_BitstreamFlushBits(stream, tab->len + 1);
   1222     pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1223     pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
   1224     pTcoef->level = (int)tab->level;//tab->val & 15;
   1225     pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
   1226 
   1227     /* the following is modified for 3-mode escape -- boon */
   1228     if (((tab->run << 4) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
   1229     {
   1230         return PV_SUCCESS;
   1231     }
   1232 
   1233 
   1234     /* escape mode 4 - H.263 type */
   1235     pTcoef->last = pTcoef->sign; /* Last */
   1236     pTcoef->run = BitstreamReadBits16_INLINE(stream, 6); /* Run */
   1237     pTcoef->level = (int) BitstreamReadBits16_INLINE(stream, 8); /* Level */
   1238 
   1239     if (pTcoef->level == 0 || pTcoef->level == 128)
   1240     {
   1241         return PV_FAIL;
   1242     }
   1243 
   1244     if (pTcoef->level > 128)
   1245     {
   1246         pTcoef->sign = 1;
   1247         pTcoef->level = 256 - pTcoef->level;
   1248     }
   1249     else
   1250     {
   1251         pTcoef->sign = 0;
   1252     }
   1253 
   1254 
   1255 
   1256     return PV_SUCCESS;
   1257 
   1258 }   /* VlcDecTCOEFShortHeader */
   1259 
   1260 #ifdef PV_ANNEX_IJKT_SUPPORT
   1261 PV_STATUS VlcDecTCOEFShortHeader_AnnexI(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
   1262 {
   1263     uint code;
   1264     const VLCtab2 *tab;
   1265 
   1266     BitstreamShow13Bits(stream, &code);
   1267 
   1268     /*intra = 0;*/
   1269 
   1270     if (code >= 1024) tab = &PV_DCT3Dtab6[(code >> 6) - 16];
   1271     else
   1272     {
   1273         if (code >= 256) tab = &PV_DCT3Dtab7[(code >> 3) - 32];
   1274         else
   1275         {
   1276             if (code >= 16) tab = &PV_DCT3Dtab8[(code>>1) - 8];
   1277             else return PV_FAIL;
   1278         }
   1279     }
   1280 
   1281     PV_BitstreamFlushBits(stream, tab->len + 1);
   1282     pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1283     pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
   1284     pTcoef->level = (int)tab->level;//tab->val & 15;
   1285     pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
   1286 
   1287     /* the following is modified for 3-mode escape -- boon */
   1288     if (((tab->run << 6) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
   1289     {
   1290         return PV_SUCCESS;
   1291     }
   1292     /* escape mode 4 - H.263 type */
   1293     pTcoef->last = pTcoef->sign; /* Last */
   1294     pTcoef->run = BitstreamReadBits16(stream, 6); /* Run */
   1295     pTcoef->level = (int) BitstreamReadBits16(stream, 8); /* Level */
   1296 
   1297     if (pTcoef->level == 0 || pTcoef->level == 128)
   1298     {
   1299         return PV_FAIL;
   1300     }
   1301 
   1302 
   1303     if (pTcoef->level > 128)
   1304     {
   1305         pTcoef->sign = 1;
   1306         pTcoef->level = 256 - pTcoef->level;
   1307     }
   1308     else pTcoef->sign = 0;
   1309 
   1310 
   1311 
   1312     return PV_SUCCESS;
   1313 
   1314 }   /* VlcDecTCOEFShortHeader_AnnexI */
   1315 
   1316 PV_STATUS VlcDecTCOEFShortHeader_AnnexT(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
   1317 {
   1318     uint code;
   1319     const VLCtab2 *tab;
   1320 
   1321     BitstreamShow13Bits(stream, &code);
   1322 
   1323     /*intra = 0;*/
   1324 
   1325     if (code >= 1024) tab = &PV_DCT3Dtab0[(code >> 6) - 16];
   1326     else
   1327     {
   1328         if (code >= 256) tab = &PV_DCT3Dtab1[(code >> 3) - 32];
   1329         else
   1330         {
   1331             if (code >= 16) tab = &PV_DCT3Dtab2[(code>>1) - 8];
   1332             else return PV_FAIL;
   1333         }
   1334     }
   1335 
   1336     PV_BitstreamFlushBits(stream, tab->len + 1);
   1337     pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1338     pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
   1339     pTcoef->level = (int)tab->level;//tab->val & 15;
   1340     pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
   1341 
   1342     /* the following is modified for 3-mode escape --  */
   1343     if (((tab->run << 4) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
   1344     {
   1345         return PV_SUCCESS;
   1346     }
   1347     /* escape mode 4 - H.263 type */
   1348     pTcoef->last = pTcoef->sign; /* Last */
   1349     pTcoef->run = BitstreamReadBits16(stream, 6); /* Run */
   1350     pTcoef->level = (int) BitstreamReadBits16(stream, 8); /* Level */
   1351 
   1352     if (pTcoef->level == 0)
   1353     {
   1354         return PV_FAIL;
   1355     }
   1356 
   1357     if (pTcoef->level >= 128)
   1358     {
   1359         pTcoef->sign = 1;
   1360         pTcoef->level = 256 - pTcoef->level;
   1361     }
   1362     else
   1363     {
   1364         pTcoef->sign = 0;
   1365     }
   1366 
   1367     if (pTcoef->level == 128)
   1368     {
   1369         code = BitstreamReadBits16(stream, 11);        /* ANNEX_T */
   1370 
   1371         code = (code >> 6 & 0x1F) | (code << 5 & 0x7ff);
   1372         if (code > 1024)
   1373         {
   1374             pTcoef->sign = 1;
   1375             pTcoef->level = (2048 - code);
   1376         }
   1377         else
   1378         {
   1379             pTcoef->sign = 0;
   1380             pTcoef->level = code;
   1381         }
   1382     }
   1383 
   1384     return PV_SUCCESS;
   1385 
   1386 }   /* VlcDecTCOEFShortHeader */
   1387 
   1388 
   1389 PV_STATUS VlcDecTCOEFShortHeader_AnnexIT(BitstreamDecVideo *stream, Tcoef *pTcoef/*, int intra*/)
   1390 {
   1391     uint code;
   1392     const VLCtab2 *tab;
   1393 
   1394     BitstreamShow13Bits(stream, &code);
   1395 
   1396     /*intra = 0;*/
   1397 
   1398     if (code >= 1024) tab = &PV_DCT3Dtab6[(code >> 6) - 16];
   1399     else
   1400     {
   1401         if (code >= 256) tab = &PV_DCT3Dtab7[(code >> 3) - 32];
   1402         else
   1403         {
   1404             if (code >= 16) tab = &PV_DCT3Dtab8[(code>>1) - 8];
   1405             else return PV_FAIL;
   1406         }
   1407     }
   1408 
   1409     PV_BitstreamFlushBits(stream, tab->len + 1);
   1410     pTcoef->sign = (code >> (12 - tab->len)) & 1;
   1411     pTcoef->run = (uint)tab->run;//(tab->val >> 4) & 255;
   1412     pTcoef->level = (int)tab->level;//tab->val & 15;
   1413     pTcoef->last = (uint)tab->last;//(tab->val >> 12) & 1;
   1414 
   1415     /* the following is modified for 3-mode escape --  */
   1416     if (((tab->run << 6) | (tab->level) | (tab->last << 12)) != VLC_ESCAPE_CODE)    /* ESCAPE */
   1417     {
   1418         return PV_SUCCESS;
   1419     }
   1420     /* escape mode 4 - H.263 type */
   1421     pTcoef->last = pTcoef->sign; /* Last */
   1422     pTcoef->run = BitstreamReadBits16(stream, 6); /* Run */
   1423     pTcoef->level = (int) BitstreamReadBits16(stream, 8); /* Level */
   1424 
   1425     if (pTcoef->level == 0)
   1426     {
   1427         return PV_FAIL;
   1428     }
   1429 
   1430     if (pTcoef->level >= 128)
   1431     {
   1432         pTcoef->sign = 1;
   1433         pTcoef->level = 256 - pTcoef->level;
   1434     }
   1435     else
   1436     {
   1437         pTcoef->sign = 0;
   1438     }
   1439 
   1440     if (pTcoef->level == 128)
   1441     {
   1442         code = BitstreamReadBits16(stream, 11);        /* ANNEX_T */
   1443 
   1444         code = (code >> 6 & 0x1F) | (code << 5 & 0x7ff);
   1445         if (code > 1024)
   1446         {
   1447             pTcoef->sign = 1;
   1448             pTcoef->level = (2048 - code);
   1449         }
   1450         else
   1451         {
   1452             pTcoef->sign = 0;
   1453             pTcoef->level = code;
   1454         }
   1455     }
   1456 
   1457 
   1458     return PV_SUCCESS;
   1459 
   1460 }   /* VlcDecTCOEFShortHeader_AnnexI */
   1461 #endif
   1462 /***********************************************************CommentBegin******
   1463 *       3/30/2000 : initial modification to the new PV-Decoder Lib
   1464 *                           format and the change of error-handling method.
   1465 *                           The coefficient is now returned thru a pre-
   1466 *                           initialized parameters for speedup.
   1467 *
   1468 ***********************************************************CommentEnd********/
   1469 
   1470 
   1471 PV_STATUS RvlcDecTCOEFInter(BitstreamDecVideo *stream, Tcoef *pTcoef)
   1472 {
   1473     uint code, mask;
   1474     const VLCtab2 *tab2;
   1475     int count, len, num[2] = {0, 0} /*  01/30/01 */;
   1476 
   1477     mask = 0x4000;      /* mask  100000000000000   */
   1478     BitstreamShow15Bits(stream, &code);   /*  03/07/01 */
   1479 
   1480     len = 1;
   1481 
   1482     //  09/20/99 Escape mode
   1483     /// Bitstream Exchange
   1484     if (code < 2048)
   1485     {
   1486         PV_BitstreamFlushBits(stream, 5);
   1487         pTcoef->last = BitstreamRead1Bits_INLINE(stream);
   1488         pTcoef->run = BitstreamReadBits16_INLINE(stream, 6);
   1489         //  09/20/99 New marker bit
   1490         PV_BitstreamFlushBits(stream, 1);
   1491         //  09/20/99 The length for LEVEL used to be 7 in the old version
   1492         pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 12) >> 1);
   1493         //  09/20/99 Another new marker bit
   1494 //      PV_BitstreamFlushBitsCheck(stream, 1);
   1495         pTcoef->sign = BitstreamReadBits16_INLINE(stream, 5) & 0x1;  /* fix   3/13/01  */
   1496         return PV_SUCCESS;
   1497     }
   1498 
   1499     if (code & mask)
   1500     {
   1501         count = 1;
   1502         while (mask && count > 0)       /* fix  3/28/01  */
   1503         {
   1504             mask = mask >> 1;
   1505             if (code & mask)
   1506                 count--;
   1507             else
   1508                 num[0]++; /* number of zeros in the middle */
   1509             len++;
   1510         }
   1511     }
   1512     else
   1513     {
   1514         count = 2;
   1515         while (mask && count > 0)           /* fix  3/28/01  */
   1516         {
   1517             mask = mask >> 1;
   1518             if (!(code & mask))
   1519                 count--;
   1520             else
   1521                 num[count-1]++; /* number of ones in the middle */
   1522             len++;
   1523         }
   1524     }
   1525 
   1526     code = code & 0x7fff;
   1527     code = code >> (15 - (len + 1));
   1528 
   1529     /*  1/30/01, add fast decoding algorithm here */
   1530     /* code is in two forms : 0xxxx0xxx00 or 0xxx0xxx01
   1531                          num[1] and num[0] x
   1532                         or  : 1xxxxx10 or 1xxxxx11
   1533                                 num[0]  x      */
   1534 
   1535     /* len+1 is the length of the above */
   1536 
   1537     if (num[1] > 10 || num[0] > 11) /* invalid RVLC code */
   1538         return PV_FAIL;
   1539 
   1540     if (code&(1 << len))
   1541         tab2 = RvlcDCTtabInter + 146 + (num[0] << 1) + (code & 1);
   1542     else
   1543         tab2 = RvlcDCTtabInter + ptrRvlcTab[num[1]] + (num[0] << 1) + (code & 1);
   1544 
   1545     PV_BitstreamFlushBits(stream, (int) tab2->len);
   1546     pTcoef->run = (uint)tab2->run;//(tab->val >> 8) & 255;
   1547     pTcoef->level = (int)tab2->level;//tab->val & 255;
   1548     pTcoef->last = (uint)tab2->last;//(tab->val >> 16) & 1;
   1549 
   1550     pTcoef->sign = BitstreamRead1Bits_INLINE(stream);
   1551     return PV_SUCCESS;
   1552 }               /* RvlcDecTCOEFInter */
   1553 
   1554 PV_STATUS RvlcDecTCOEFIntra(BitstreamDecVideo *stream, Tcoef *pTcoef)
   1555 {
   1556     uint code, mask;
   1557     const VLCtab2 *tab2;
   1558     int count, len, num[2] = {0, 0} /*  01/30/01 */;
   1559 
   1560     mask = 0x4000;      /* mask  100000000000000   */
   1561     BitstreamShow15Bits(stream, &code);
   1562 
   1563     len = 1;
   1564 
   1565     //  09/20/99 Escape mode
   1566     /// Bitstream Exchange
   1567     if (code < 2048)
   1568     {
   1569         PV_BitstreamFlushBits(stream, 5);
   1570         pTcoef->last = BitstreamRead1Bits_INLINE(stream);
   1571         pTcoef->run = BitstreamReadBits16_INLINE(stream, 6);
   1572         //  09/20/99 New marker bit
   1573         PV_BitstreamFlushBits(stream, 1);
   1574         //  09/20/99 The length for LEVEL used to be 7 in the old version
   1575         pTcoef->level = (int)(BitstreamReadBits16_INLINE(stream, 12) >> 1);
   1576         //  09/20/99 Another new marker bit
   1577 //      PV_BitstreamFlushBitsCheck(stream, 1);
   1578         pTcoef->sign = BitstreamReadBits16_INLINE(stream, 5) & 0x1; /* fix   03/13/01 */
   1579         return PV_SUCCESS;
   1580     }
   1581 
   1582     if (code & mask)
   1583     {
   1584         count = 1;
   1585         while (mask && count > 0)                          /* fix  03/28/01 */
   1586         {
   1587             mask = mask >> 1;
   1588             if (code & mask)
   1589                 count--;
   1590             else
   1591                 num[0]++; /* number of zeros in the middle */
   1592             len++;
   1593         }
   1594     }
   1595     else
   1596     {
   1597         count = 2;
   1598         while (mask && count > 0)              /* fix  03/28/01 */
   1599         {
   1600             mask = mask >> 1;
   1601             if (!(code & mask))
   1602                 count--;
   1603             else
   1604                 num[count-1]++; /* number of ones in the middle */
   1605             len++;
   1606         }
   1607     }
   1608 
   1609     code = code & 0x7fff;
   1610     code = code >> (15 - (len + 1));
   1611 
   1612     /*  1/30/01, add fast decoding algorithm here */
   1613     /* code is in two forms : 0xxxx0xxx00 or 0xxx0xxx01
   1614                          num[1] and num[0] x
   1615                         or  : 1xxxxx10 or 1xxxxx11
   1616                                 num[0]  x      */
   1617 
   1618     /* len+1 is the length of the above */
   1619 
   1620     if (num[1] > 10 || num[0] > 11) /* invalid RVLC code */
   1621         return PV_FAIL;
   1622 
   1623     if (code & (1 << len))
   1624         tab2 = RvlcDCTtabIntra + 146 + (num[0] << 1) + (code & 1);
   1625     else
   1626         tab2 = RvlcDCTtabIntra + ptrRvlcTab[num[1]] + (num[0] << 1) + (code & 1);
   1627 
   1628     PV_BitstreamFlushBits(stream, (int) tab2->len);
   1629     pTcoef->run = (uint)tab2->run;//(tab->val >> 8) & 255;
   1630     pTcoef->level = (int)tab2->level;//tab->val & 255;
   1631     pTcoef->last = (uint)tab2->last;//(tab->val >> 16) & 1;
   1632 
   1633     pTcoef->sign = BitstreamRead1Bits_INLINE(stream);
   1634     return PV_SUCCESS;
   1635 }               /* RvlcDecTCOEFIntra */
   1636 
   1637