OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / media / libstagefright / codecs / m4v_h263 / dec / src / vlc_decode.cpp
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@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@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@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 == 0)
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