vop.cpp revision 3306cfee3bf38ab207a0504e49c2d492bb73ffbf
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#include "mp4dec_lib.h"
19#include "bitstream.h"
20#include "vlc_decode.h"
21#include "zigzag.h"
22
23#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
24
25#ifdef PV_SUPPORT_MAIN_PROFILE
26/* INTRA */
27const static int mpeg_iqmat_def[NCOEFF_BLOCK] =
28{
29    8, 17, 18, 19, 21, 23, 25, 27,
30    17, 18, 19, 21, 23, 25, 27, 28,
31    20, 21, 22, 23, 24, 26, 28, 30,
32    21, 22, 23, 24, 26, 28, 30, 32,
33    22, 23, 24, 26, 28, 30, 32, 35,
34    23, 24, 26, 28, 30, 32, 35, 38,
35    25, 26, 28, 30, 32, 35, 38, 41,
36    27, 28, 30, 32, 35, 38, 41, 45
37};
38
39/* INTER */
40const static int mpeg_nqmat_def[64]  =
41{
42    16, 17, 18, 19, 20, 21, 22, 23,
43    17, 18, 19, 20, 21, 22, 23, 24,
44    18, 19, 20, 21, 22, 23, 24, 25,
45    19, 20, 21, 22, 23, 24, 26, 27,
46    20, 21, 22, 23, 25, 26, 27, 28,
47    21, 22, 23, 24, 26, 27, 28, 30,
48    22, 23, 24, 26, 27, 28, 30, 31,
49    23, 24, 25, 27, 28, 30, 31, 33
50};
51#endif
52
53/* ======================================================================== */
54/*  Function : CalcNumBits()                                                */
55/*  Purpose  :                                                              */
56/*  In/out   :                                                              */
57/*  Return   : Calculate the minimum number of bits required to             */
58/*              represent x.                                                */
59/*  Note     : This is an equivalent implementation of                      */
60/*                      (long)ceil(log((double)x)/log(2.0))                 */
61/*  Modified :                                                              */
62/* ======================================================================== */
63int CalcNumBits(uint x)
64{
65    int i = 1;
66    while (x >>= 1) i++;
67    return i;
68}
69
70
71
72/***********************************************************CommentBegin******
73*
74* -- DecodeVolHeader -- Decode the header of a VOL
75*
76*   04/10/2000 : initial modification to the new PV-Decoder Lib format.
77*   10/12/2001 : reject non compliant bitstreams
78*
79***********************************************************CommentEnd********/
80PV_STATUS DecodeVOLHeader(VideoDecData *video, int layer)
81{
82    PV_STATUS status;
83    Vol *currVol;
84    BitstreamDecVideo *stream;
85    uint32 tmpvar, vol_shape;
86    uint32 startCode;
87#ifdef PV_SUPPORT_MAIN_PROFILE
88    int *qmat, i, j;
89#endif
90    int version_id = 1;
91#ifdef PV_TOLERATE_VOL_ERRORS
92    uint32 profile = 0x01;
93#endif
94    /*  There's a "currLayer" variable inside videoDecData.          */
95    /*   However, we don't maintain it until we decode frame data.  04/05/2000 */
96    currVol = video->vol[layer];
97    stream  = currVol->bitstream;
98    currVol->moduloTimeBase = 0;
99
100    /* Determine which start code for the decoder to begin with */
101    status = BitstreamShowBits32HC(stream, &startCode);
102
103    if (startCode == VISUAL_OBJECT_SEQUENCE_START_CODE)
104    {   /*  Bitstream Exhchange Fix 9/99 */
105        /* Bitstream Exchange requires we allow start with Video Object Sequence */
106        /* visual_object_sequence_start_code            */
107        (void) BitstreamReadBits32HC(stream);
108        tmpvar = (uint32) BitstreamReadBits16(stream,  8); /* profile */
109#ifndef PV_TOLERATE_VOL_ERRORS
110        if (layer)                                                      /*    */
111        {
112            /* support SSPL0-2  */
113            if (tmpvar != 0x10 && tmpvar != 0x11 && tmpvar != 0x12 &&
114                    tmpvar != 0xA1 && tmpvar != 0xA2  && tmpvar != 0xA3/* Core SP@L1-L3 */)
115                return PV_FAIL;
116        }
117        else
118        {
119            /* support SPL0-3 & SSPL0-2   */
120            if (tmpvar != 0x01 && tmpvar != 0x02 && tmpvar != 0x03 && tmpvar != 0x08 &&
121                    tmpvar != 0x10 && tmpvar != 0x11 && tmpvar != 0x12 &&
122                    tmpvar != 0x21 && tmpvar != 0x22 &&  /* Core Profile Levels */
123                    tmpvar != 0xA1 && tmpvar != 0xA2 && tmpvar != 0xA3 &&
124                    tmpvar != 0xF0 && tmpvar != 0xF1 && /* Advanced Simple Profile Levels*/
125                    tmpvar != 0xF2 && tmpvar != 0xF3 &&
126                    tmpvar != 0xF4 && tmpvar != 0xF5)
127                return PV_FAIL;
128        }
129#else
130        profile = tmpvar;
131#endif
132
133        // save the profile and level for the query
134        currVol->profile_level_id = (uint)tmpvar; //  6/10/04
135
136
137
138        status = BitstreamShowBits32HC(stream, &tmpvar);
139        if (tmpvar == USER_DATA_START_CODE)
140        {
141            /* Something has to be done with user data  11/11/99 */
142            status = DecodeUserData(stream);
143            if (status != PV_SUCCESS) return PV_FAIL;
144        }
145        /* visual_object_start_code                     */
146        BitstreamShowBits32HC(stream, &tmpvar);
147        if (tmpvar != VISUAL_OBJECT_START_CODE)
148        {
149            do
150            {
151                /* Search for VOL_HEADER */
152                status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */
153                if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
154                BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
155                PV_BitstreamFlushBits(stream, 8);
156            }
157            while (tmpvar != VOL_START_CODE);
158            goto decode_vol;
159        }
160        else
161        {
162            BitstreamReadBits32HC(stream);
163        }
164
165        /*  is_visual_object_identifier            */
166        tmpvar = (uint32) BitstreamRead1Bits(stream);
167        if (tmpvar)
168        {
169            /* visual_object_verid                            */
170            tmpvar = (uint32) BitstreamReadBits16(stream, 4);
171            /* visual_object_priority                         */
172            tmpvar = (uint32) BitstreamReadBits16(stream, 3);
173        }
174        /* visual_object_type                                 */
175        BitstreamShowBits32(stream, 4, &tmpvar);
176        if (tmpvar == 1)
177        { /* video_signal_type */
178            PV_BitstreamFlushBits(stream, 4);
179            tmpvar = (uint32) BitstreamRead1Bits(stream);
180            if (tmpvar == 1)
181            {
182                /* video_format */
183                tmpvar = (uint32) BitstreamReadBits16(stream, 3);
184                /* video_range  */
185                tmpvar = (uint32) BitstreamRead1Bits(stream);
186                /* color_description */
187                tmpvar = (uint32) BitstreamRead1Bits(stream);
188                if (tmpvar == 1)
189                {
190                    /* color_primaries */
191                    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
192                    /* transfer_characteristics */
193                    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
194                    /* matrix_coefficients */
195                    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
196                }
197            }
198        }
199        else
200        {
201            do
202            {
203                /* Search for VOL_HEADER */
204                status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */
205                if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
206                BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
207                PV_BitstreamFlushBits(stream, 8);
208            }
209            while (tmpvar != VOL_START_CODE);
210            goto decode_vol;
211        }
212
213        /* next_start_code() */
214        status = PV_BitstreamByteAlign(stream);                            /*  10/12/01 */
215        status = BitstreamShowBits32HC(stream, &tmpvar);
216
217        if (tmpvar == USER_DATA_START_CODE)
218        {
219            /* Something has to be done to deal with user data (parse it)  11/11/99 */
220            status = DecodeUserData(stream);
221            if (status != PV_SUCCESS) return PV_FAIL;
222        }
223        status = BitstreamShowBits32(stream, 27, &tmpvar);   /*  10/12/01 */
224    }
225    else
226    {
227        /*      tmpvar = 0;   */                                             /*  10/12/01 */
228        status = BitstreamShowBits32(stream, 27, &tmpvar);     /* uncomment this line if you want
229                                                                     to start decoding with a
230                                                                     video_object_start_code */
231    }
232
233    if (tmpvar == VO_START_CODE)
234    {
235        /*****
236        *
237        *   Read the VOL header entries from the bitstream
238        *
239        *****/
240        /* video_object_start_code                         */
241        tmpvar = BitstreamReadBits32(stream, 27);
242        tmpvar = (uint32) BitstreamReadBits16(stream, 5);
243
244
245        /* video_object_layer_start_code                   */
246        BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
247        if (tmpvar != VOL_START_CODE)
248        {
249            status = BitstreamCheckEndBuffer(stream);
250            if (status == PV_END_OF_VOP)
251            {
252                video->shortVideoHeader = TRUE;
253                return PV_SUCCESS;
254            }
255            else
256            {
257                do
258                {
259                    /* Search for VOL_HEADER */
260                    status = PVSearchNextM4VFrame(stream);/* search 0x00 0x00 0x01 */
261                    if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
262                    BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
263                    PV_BitstreamFlushBits(stream, 8); /* advance the byte ptr */
264                }
265                while (tmpvar != VOL_START_CODE);
266            }
267        }
268        else
269        {
270            PV_BitstreamFlushBits(stream, 8);
271        }
272
273decode_vol:
274        PV_BitstreamFlushBits(stream, VOL_START_CODE_LENGTH - 8);
275        video->shortVideoHeader = 0;
276
277        /* vol_id (4 bits) */
278        currVol->volID = (int) BitstreamReadBits16(stream, 4);
279
280        /* RandomAccessible flag */
281        tmpvar = (uint32) BitstreamRead1Bits(stream);
282
283        /* object type */
284        tmpvar = (uint32) BitstreamReadBits16(stream, 8);                /*  */
285
286#ifdef PV_TOLERATE_VOL_ERRORS
287        if (tmpvar == 0)
288        {
289            if (layer)                                                      /*    */
290            {
291                /* support SSPL0-2  */
292                if (profile != 0x10 && profile != 0x11 && profile != 0x12)
293                    return PV_FAIL;
294                tmpvar = 0x02;
295            }
296            else
297            {
298                /* support SPL0-3 & SSPL0-2   */
299                if (profile != 0x01 && profile != 0x02 && profile != 0x03 && profile != 0x08 &&
300                        profile != 0x10 && profile != 0x11 && profile != 0x12)
301                    return PV_FAIL;
302                tmpvar = 0x01;
303            }
304            profile |= 0x0100;
305        }
306#endif
307
308        if (layer)
309        {
310            if (tmpvar != 0x02) return PV_FAIL;
311        }
312        else
313        {
314            if (tmpvar != 0x01) return PV_FAIL;
315        }
316
317        /* version id specified? */
318        tmpvar = (uint32) BitstreamRead1Bits(stream);
319        if (tmpvar == 1)
320        {
321            /* version ID */
322            version_id = (uint32) BitstreamReadBits16(stream, 4);
323            /* priority */
324            tmpvar = (uint32) BitstreamReadBits16(stream, 3);
325
326        }
327
328        /* aspect ratio info */
329        tmpvar = (uint32) BitstreamReadBits16(stream, 4);
330        if (tmpvar == 0) return PV_FAIL;
331        if (tmpvar == 0xf /* extended_par */)
332        {
333            /* width */
334            tmpvar = (uint32) BitstreamReadBits16(stream, 8);
335            /* height */
336            tmpvar = (uint32) BitstreamReadBits16(stream, 8);
337        }
338
339
340        /* control parameters present? */
341        tmpvar = (uint32) BitstreamRead1Bits(stream);
342
343        /*  Get the parameters (skipped) */
344        /*  03/10/99 */
345        if (tmpvar)
346        {
347            /* chroma_format                    */
348            tmpvar = BitstreamReadBits16(stream, 2);
349            if (tmpvar != 1) return PV_FAIL;
350            /* low_delay  */
351            tmpvar = BitstreamRead1Bits(stream);
352
353            /* vbv_parameters present? */
354            tmpvar = (uint32) BitstreamRead1Bits(stream);
355            if (tmpvar)
356            {
357                /* first_half_bit_rate    */
358                BitstreamReadBits16(stream, 15);
359                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
360                /* latter_half_bit_rate   */
361                BitstreamReadBits16(stream, 15);
362                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
363                /* first_half_vbv_buffer_size   */
364                BitstreamReadBits16(stream, 15);
365                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
366                /* latter_half_vbv_buffer_size   */
367                BitstreamReadBits16(stream,  3);
368                /* first_half_vbv_occupancy     */
369                BitstreamReadBits16(stream, 11);
370                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
371                /* latter_half_vbv_occupancy  */
372                BitstreamReadBits16(stream, 15);
373                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
374            }
375        }
376
377        /* video_object_layer_shape (2 bits), only 00 (rect) is supported for now */
378        vol_shape = (uint32) BitstreamReadBits16(stream, 2);
379        if (vol_shape) return PV_FAIL;
380
381        /* marker bit,  03/10/99 */
382        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
383
384        /* vop_time_increment_resolution   */
385        currVol->timeIncrementResolution = BitstreamReadBits16(stream, 16);
386        if (currVol->timeIncrementResolution == 0) return PV_FAIL;
387
388        /* . since nbitsTimeIncRes will be used over and over again, */
389        /*    we should put it in Vol structure.  04/12/2000.          */
390        currVol->nbitsTimeIncRes = CalcNumBits((uint)currVol->timeIncrementResolution - 1);
391
392        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
393
394        /* fixed_vop_rate */
395        currVol->fixedVopRate = (int) BitstreamRead1Bits(stream);
396        if (currVol->fixedVopRate)
397        {
398            /* fixed_vop_time_increment */
399            tmpvar = BitstreamReadBits16(stream, currVol->nbitsTimeIncRes);
400        }
401
402        /* marker bit */
403        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
404
405        /* video_object_layer_width (13 bits) */
406        video->displayWidth = video->width = (int) BitstreamReadBits16(stream, 13);
407
408        /* round up to a multiple of MB_SIZE.   08/09/2000 */
409        video->width = (video->width + 15) & -16;
410//      video->displayWidth += (video->displayWidth & 0x1);  /* displayed image should be even size */
411
412        /* marker bit */
413        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
414
415        /* video_object_layer_height (13 bits) */
416        video->displayHeight = video->height = (int) BitstreamReadBits16(stream, 13);
417
418        /* round up to a multiple of MB_SIZE.   08/09/2000 */
419        video->height = (video->height + 15) & -16;
420//      video->displayHeight += (video->displayHeight & 0x1); /* displayed image should be even size */
421        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
422
423        /*  03/10/99 */
424        /* interlaced */
425        tmpvar = (uint32) BitstreamRead1Bits(stream);
426        if (tmpvar != 0)
427        {
428            mp4dec_log("DecodeVOLHeader(): Interlaced video is not supported.\n");
429            return PV_FAIL;
430        }
431
432        /* obmc_disable */
433        tmpvar = (uint32) BitstreamRead1Bits(stream);
434        if (tmpvar == 0) return PV_FAIL;
435
436        if (version_id == 1)
437        {
438            /*  sprite_enable (1 bits) */
439            tmpvar = (uint32) BitstreamRead1Bits(stream);
440            if (tmpvar)
441            {
442                mp4dec_log("DecodeVOLHeader(): Sprite is not supported.\n");
443                return PV_FAIL;
444            }
445        }
446        else
447        {
448            /* For version 2, vol_sprite_usage has two bits. */
449            /* sprite_enable */
450            tmpvar = (uint32) BitstreamReadBits16(stream, 2);
451            if (tmpvar)
452            {
453                mp4dec_log("DecodeVOLHeader(): Sprite is not supported.\n");
454                return PV_FAIL;
455            }
456        }
457
458        /* not_8_bit */
459        if (BitstreamRead1Bits(stream))
460        {
461            /* quant_precision */
462            currVol->quantPrecision = BitstreamReadBits16(stream, 4);
463            /* bits_per_pixel  */
464            currVol->bitsPerPixel = BitstreamReadBits16(stream, 4);
465            mp4dec_log("DecodeVOLHeader(): not an 8-bit stream.\n");    // For the time being we do not support != 8 bits
466
467            return PV_FAIL;
468        }
469        else
470        {
471            currVol->quantPrecision = 5;
472            currVol->bitsPerPixel = 8;
473        }
474
475        /* quant_type (1 bit) */
476        currVol->quantType = BitstreamRead1Bits(stream);
477        if (currVol->quantType)
478        {
479#ifdef PV_SUPPORT_MAIN_PROFILE
480            /* load quantization matrices.   5/22/2000 */
481            /* load_intra_quant_mat (1 bit) */
482            qmat = currVol->iqmat;
483            currVol->loadIntraQuantMat = BitstreamRead1Bits(stream);
484            if (currVol->loadIntraQuantMat)
485            {
486                /* intra_quant_mat (8*64 bits) */
487                i = 0;
488                do
489                {
490                    qmat[*(zigzag_inv+i)] = (int) BitstreamReadBits16(stream, 8);
491                }
492                while ((qmat[*(zigzag_inv+i)] != 0) && (++i < 64));
493
494                for (j = i; j < 64; j++)
495                    qmat[*(zigzag_inv+j)] = qmat[*(zigzag_inv+i-1)];
496            }
497            else
498            {
499                oscl_memcpy(qmat, mpeg_iqmat_def, 64*sizeof(int));
500            }
501
502            qmat[0] = 0;             /* necessary for switched && MPEG quant  07/09/01 */
503
504            /* load_nonintra_quant_mat (1 bit) */
505            qmat = currVol->niqmat;
506            currVol->loadNonIntraQuantMat = BitstreamRead1Bits(stream);
507            if (currVol->loadNonIntraQuantMat)
508            {
509                /* nonintra_quant_mat (8*64 bits) */
510                i = 0;
511                do
512                {
513                    qmat[*(zigzag_inv+i)] = (int) BitstreamReadBits16(stream, 8);
514                }
515                while ((qmat[*(zigzag_inv+i)] != 0) && (++i < 64));
516
517                for (j = i; j < 64; j++)
518                    qmat[*(zigzag_inv+j)] = qmat[*(zigzag_inv+i-1)];
519            }
520            else
521            {
522                oscl_memcpy(qmat, mpeg_nqmat_def, 64*sizeof(int));
523            }
524#else
525            return PV_FAIL;
526#endif
527        }
528
529        if (version_id != 1)
530        {
531            /* quarter_sample enabled */
532            tmpvar = BitstreamRead1Bits(stream);
533            if (tmpvar) return PV_FAIL;
534        }
535
536        /* complexity_estimation_disable */
537        currVol->complexity_estDisable = BitstreamRead1Bits(stream);
538        if (currVol->complexity_estDisable == 0)
539        {
540            currVol->complexity_estMethod = BitstreamReadBits16(stream, 2);
541
542            if (currVol->complexity_estMethod < 2)
543            {
544                /* shape_complexity_estimation_disable */
545                tmpvar = BitstreamRead1Bits(stream);
546                if (tmpvar == 0)
547                {
548                    mp4dec_log("DecodeVOLHeader(): Shape Complexity estimation is not supported.\n");
549                    return PV_FAIL;
550                }
551                /* texture_complexity_estimation_set_1_disable */
552                tmpvar = BitstreamRead1Bits(stream);
553                if (tmpvar == 0)
554                {
555                    currVol->complexity.text_1 = BitstreamReadBits16(stream, 4);
556                }
557                /* marker bit */
558                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
559                /* texture_complexity_estimation_set_2_disable */
560                tmpvar = BitstreamRead1Bits(stream);
561                if (tmpvar == 0)
562                {
563                    currVol->complexity.text_2 = BitstreamReadBits16(stream, 4);
564                }
565                /* motion_compensation_complexity_disable */
566                tmpvar = BitstreamRead1Bits(stream);
567                if (tmpvar == 0)
568                {
569                    currVol->complexity.mc = BitstreamReadBits16(stream, 6);
570                }
571                /* marker bit */
572                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
573
574                if (currVol->complexity_estMethod == 1)
575                {   /* version2_complexity_estimation_disable */
576                    tmpvar = BitstreamRead1Bits(stream);
577                    if (tmpvar == 0)
578                    {
579                        mp4dec_log("DecodeVOLHeader(): sadct, quarter pel not supported.\n");
580                        return PV_FAIL;
581                    }
582                }
583            }
584        }
585
586        /*  03/10/99 */
587        /* resync_marker_disable */
588        currVol->errorResDisable = (int) BitstreamRead1Bits(stream);
589        /* data_partititioned    */
590        currVol->dataPartitioning = (int) BitstreamRead1Bits(stream);
591
592        video->vlcDecCoeffIntra = &VlcDecTCOEFIntra;
593        video->vlcDecCoeffInter = &VlcDecTCOEFInter;
594
595        if (currVol->dataPartitioning)
596        {
597            if (layer) return PV_FAIL;                              /*  */
598            /* reversible_vlc */
599            currVol->useReverseVLC = (int)BitstreamRead1Bits(stream);
600            if (currVol->useReverseVLC)
601            {
602                video->vlcDecCoeffIntra = &RvlcDecTCOEFIntra;
603                video->vlcDecCoeffInter = &RvlcDecTCOEFInter;
604            }
605            currVol->errorResDisable = 0;
606        }
607        else
608        {
609            currVol->useReverseVLC = 0;
610        }
611
612        if (version_id != 1)
613        {
614            /* newpred_enable */
615            tmpvar = BitstreamRead1Bits(stream);
616            if (tmpvar) return PV_FAIL;
617
618            /* reduced_resolution_vop */
619            tmpvar = BitstreamRead1Bits(stream);
620            if (tmpvar) return PV_FAIL;
621
622        }
623
624        /* Intra AC/DC prediction is always true */
625        video->intra_acdcPredDisable = 0;
626        /* scalability */
627        currVol->scalability = (int) BitstreamRead1Bits(stream);
628
629        if (currVol->scalability)
630        {
631            if (layer == 0)  return PV_FAIL;                     /*  */
632            /* hierarchy_type: 1 : temporal, 0 : spatial */
633            /*  03/10/99 */
634            currVol->scalType = (int) BitstreamRead1Bits(stream);              /*  */
635            if (!currVol->scalType) return PV_FAIL;
636
637            /* ref_layer_id (4 bits) */
638            currVol->refVolID = (int) BitstreamReadBits16(stream, 4);
639            if (layer)                                                      /*  */
640            {
641                if (currVol->refVolID != video->vol[0]->volID) return PV_FAIL;
642            }
643            /* ref_layer_sampling_direc (1 bits)              */
644            /*   1 : ref. layer has higher resolution         */
645            /*   0 : ref. layer has equal or lower resolution */
646            currVol->refSampDir = (int) BitstreamRead1Bits(stream);
647            if (currVol->refSampDir) return PV_FAIL;
648
649            /* hor_sampling_factor_n (5 bits) */
650            currVol->horSamp_n = (int) BitstreamReadBits16(stream, 5);
651
652            /* hor_sampling_factor_m (5 bits) */
653            currVol->horSamp_m = (int) BitstreamReadBits16(stream, 5);
654
655            if (currVol->horSamp_m == 0) return PV_FAIL;
656            if (currVol->horSamp_n != currVol->horSamp_m) return PV_FAIL;
657
658            /* ver_sampling_factor_n (5 bits) */
659            currVol->verSamp_n = (int) BitstreamReadBits16(stream, 5);
660
661            /* ver_sampling_factor_m (5 bits) */
662            currVol->verSamp_m = (int) BitstreamReadBits16(stream, 5);
663
664            if (currVol->verSamp_m == 0) return PV_FAIL;
665            if (currVol->verSamp_n != currVol->verSamp_m) return PV_FAIL;
666
667
668            /* enhancement_type: 1 : partial region, 0 : full region */
669            /* 04/10/2000: we only support full region enhancement layer. */
670            if (BitstreamRead1Bits(stream)) return PV_FAIL;
671        }
672
673        PV_BitstreamByteAlign(stream);
674
675        status = BitstreamShowBits32HC(stream, &tmpvar);
676
677        /* if we hit the end of buffer, tmpvar == 0.   08/30/2000 */
678        if (tmpvar == USER_DATA_START_CODE)
679        {
680            status = DecodeUserData(stream);
681            /* you should not check for status here  03/19/2002 */
682            status = PV_SUCCESS;
683        }
684
685        /* Compute some convenience variables:   04/13/2000 */
686        video->nMBPerRow = video->width / MB_SIZE;
687        video->nMBPerCol = video->height / MB_SIZE;
688        video->nTotalMB = video->nMBPerRow * video->nMBPerCol;
689        video->nBitsForMBID = CalcNumBits((uint)video->nTotalMB - 1);
690#ifdef PV_ANNEX_IJKT_SUPPORT
691        video->modified_quant = 0;
692        video->advanced_INTRA = 0;
693        video->deblocking = 0;
694        video->slice_structure = 0;
695#endif
696    }
697    else
698    {
699        /* SHORT_HEADER */
700        status = BitstreamShowBits32(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar);
701
702        if (tmpvar == SHORT_VIDEO_START_MARKER)
703        {
704            video->shortVideoHeader = TRUE;
705        }
706        else
707        {
708            do
709            {
710                /* Search for VOL_HEADER */
711                status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */
712                if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
713                BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
714                PV_BitstreamFlushBits(stream, 8);
715            }
716            while (tmpvar != VOL_START_CODE);
717            goto decode_vol;
718        }
719    }
720#ifdef PV_TOLERATE_VOL_ERRORS
721    if (profile > 0xFF || profile == 0)
722    {
723        return PV_BAD_VOLHEADER;
724    }
725#endif
726
727    return status;
728}
729
730
731/***********************************************************CommentBegin******
732*
733* -- DecodeGOV -- Decodes the Group of VOPs from bitstream
734*
735*   04/20/2000  initial modification to the new PV-Decoder Lib format.
736*
737***********************************************************CommentEnd********/
738PV_STATUS DecodeGOVHeader(BitstreamDecVideo *stream, uint32 *time_base)
739{
740    uint32 tmpvar, time_s;
741    int closed_gov, broken_link;
742
743    /* group_start_code (32 bits) */
744//   tmpvar = BitstreamReadBits32(stream, 32);
745
746    /* hours */
747    tmpvar = (uint32) BitstreamReadBits16(stream, 5);
748    time_s = tmpvar * 3600;
749
750    /* minutes */
751    tmpvar = (uint32) BitstreamReadBits16(stream, 6);
752    time_s += tmpvar * 60;
753
754    /* marker bit */
755    tmpvar = (uint32) BitstreamRead1Bits(stream);
756
757    /* seconds */
758    tmpvar = (uint32) BitstreamReadBits16(stream, 6);
759    time_s += tmpvar;
760
761    /* We have to check the timestamp here.  If the sync timestamp is */
762    /*    earlier than the previous timestamp or longer than 60 sec.  */
763    /*    after the previous timestamp, assume the GOV header is      */
764    /*    corrupted.                                 05/12/2000     */
765    *time_base = time_s;   /*  02/27/2002 */
766//  *time_base = *time_base/1000;
767//  tmpvar = time_s - *time_base;
768//  if (tmpvar <= 60) *time_base = time_s;
769//  else return PV_FAIL;
770
771    tmpvar = (uint32) BitstreamRead1Bits(stream);
772    closed_gov = tmpvar;
773    tmpvar = (uint32) BitstreamRead1Bits(stream);
774    broken_link = tmpvar;
775
776    if ((closed_gov == 0) && (broken_link == 1))
777    {
778        return PV_SUCCESS;        /*  03/15/2002  you can also return PV_FAIL */
779    }
780
781    PV_BitstreamByteAlign(stream);
782
783    BitstreamShowBits32HC(stream, &tmpvar);
784
785    while (tmpvar == USER_DATA_START_CODE)       /*  03/15/2002 */
786    {
787        DecodeUserData(stream);
788        BitstreamShowBits32HC(stream, &tmpvar);
789    }
790
791    return PV_SUCCESS;
792}
793
794/***********************************************************CommentBegin******
795*
796* -- DecodeVopHeader -- Decodes the VOPheader information from the bitstream
797*
798*   04/12/2000  Initial port to the new PV decoder library format.
799*   05/10/2000  Error resilient decoding of vop header.
800*
801***********************************************************CommentEnd********/
802PV_STATUS DecodeVOPHeader(VideoDecData *video, Vop *currVop, Bool use_ext_timestamp)
803{
804    PV_STATUS status = PV_SUCCESS;
805    Vol *currVol = video->vol[video->currLayer];
806    BitstreamDecVideo *stream = currVol->bitstream;
807    uint32 tmpvar;
808    int time_base;
809
810    /*****
811    *   Read the VOP header from the bitstream (No shortVideoHeader Mode here!)
812    *****/
813    BitstreamShowBits32HC(stream, &tmpvar);
814
815    /* check if we have a GOV header here.   08/30/2000 */
816    if (tmpvar == GROUP_START_CODE)
817    {
818        tmpvar = BitstreamReadBits32HC(stream);
819//      rewindBitstream(stream, START_CODE_LENGTH); /* for backward compatibility */
820        status = DecodeGOVHeader(stream, &tmpvar);
821        if (status != PV_SUCCESS)
822        {
823            return status;
824        }
825//      use_ext_timestamp = TRUE;   /*  02/08/2002 */
826        /* We should have a VOP header following the GOV header.  03/15/2001 */
827        BitstreamShowBits32HC(stream, &tmpvar);
828    }
829#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
830    currVop->timeStamp = -1;
831#endif
832    if (tmpvar == VOP_START_CODE)
833    {
834        tmpvar = BitstreamReadBits32HC(stream);
835    }
836    else
837    {
838        PV_BitstreamFlushBits(stream, 8); // advance by a byte
839        status = PV_FAIL;
840        goto return_point;
841    }
842
843
844
845    /* vop_prediction_type (2 bits) */
846    currVop->predictionType = (int) BitstreamReadBits16(stream, 2);
847
848    /* modulo_time_base (? bits) */
849    time_base = -1;
850    do
851    {
852        time_base++;
853        tmpvar = (uint32) BitstreamRead1Bits(stream);
854    }
855    while (tmpvar == 1);
856
857
858
859    if (!use_ext_timestamp)
860    {
861        currVol->moduloTimeBase += 1000 * time_base; /* milliseconds based MTB  11/12/01 */
862    }
863
864    /* marker_bit (1 bit) */
865    if (!BitstreamRead1Bits(stream))
866    {
867        status = PV_FAIL;
868        goto return_point;
869    }
870
871    /* vop_time_increment (1-15 bits) in Nov_Compliant (1-16 bits) */
872    /*    we always assumes fixed vop rate here */
873    currVop->timeInc = BitstreamReadBits16(stream, currVol->nbitsTimeIncRes);
874
875
876    /* marker_bit (1 bit) */
877    if (!BitstreamRead1Bits(stream))
878    {
879        status = PV_FAIL;
880        goto return_point;
881    }
882
883    /* vop_coded */
884    currVop->vopCoded = (int) BitstreamRead1Bits(stream);
885
886
887    if (currVop->vopCoded == 0)
888    {
889        status = PV_SUCCESS;
890        goto return_point;
891    }
892
893
894    /* read vop_rounding_type */
895    if (currVop->predictionType == P_VOP)
896    {
897        currVop->roundingType = (int) BitstreamRead1Bits(stream);
898    }
899    else
900    {
901        currVop->roundingType = 0;
902    }
903
904    if (currVol->complexity_estDisable == 0)
905    {
906        if (currVol->complexity_estMethod < 2)   /*   OCT 2002 */
907        {
908            if ((currVol->complexity.text_1 >> 3) & 0x1)    /* intra        */
909                BitstreamReadBits16(stream, 8);
910            if (currVol->complexity.text_1 & 0x1)           /* not_coded    */
911                BitstreamReadBits16(stream, 8);
912            if ((currVol->complexity.text_2 >> 3) & 0x1)    /* dct_coefs    */
913                BitstreamReadBits16(stream, 8);
914            if ((currVol->complexity.text_2 >> 2) & 0x1)    /* dct_lines    */
915                BitstreamReadBits16(stream, 8);
916            if ((currVol->complexity.text_2 >> 1) & 0x1)    /* vlc_symbols  */
917                BitstreamReadBits16(stream, 8);
918            if (currVol->complexity.text_2 & 0x1)           /* vlc_bits     */
919                BitstreamReadBits16(stream, 4);
920
921            if (currVop->predictionType != I_VOP)
922            {
923                if ((currVol->complexity.text_1 >> 2) & 0x1)    /* inter    */
924                    BitstreamReadBits16(stream, 8);
925                if ((currVol->complexity.text_1 >> 1) & 0x1)    /* inter_4v */
926                    BitstreamReadBits16(stream, 8);
927                if ((currVol->complexity.mc >> 5) & 0x1)        /* apm      */
928                    BitstreamReadBits16(stream, 8);
929                if ((currVol->complexity.mc >> 4) & 0x1)        /* npm      */
930                    BitstreamReadBits16(stream, 8);
931                /* interpolate_mc_q */
932                if ((currVol->complexity.mc >> 2) & 0x1)        /* forw_back_mc_q */
933                    BitstreamReadBits16(stream, 8);
934                if ((currVol->complexity.mc >> 1) & 0x1)        /* halfpel2 */
935                    BitstreamReadBits16(stream, 8);
936                if (currVol->complexity.mc & 0x1)               /* halfpel4 */
937                    BitstreamReadBits16(stream, 8);
938            }
939            if (currVop->predictionType == B_VOP)
940            {
941                if ((currVol->complexity.mc >> 3) & 0x1)        /* interpolate_mc_q */
942                    BitstreamReadBits16(stream, 8);
943            }
944        }
945    }
946
947    /* read intra_dc_vlc_thr */
948    currVop->intraDCVlcThr = (int) BitstreamReadBits16(stream, 3);
949
950    /* read vop_quant (currVol->quantPrecision bits) */
951    currVop->quantizer = (int16) BitstreamReadBits16(stream, currVol->quantPrecision);
952    if (currVop->quantizer == 0)
953    {
954        currVop->quantizer = video->prevVop->quantizer;
955        status = PV_FAIL;
956        goto return_point;
957    }
958
959
960    /* read vop_fcode_forward */
961    if (currVop->predictionType != I_VOP)
962    {
963        tmpvar = (uint32) BitstreamReadBits16(stream, 3);
964        if (tmpvar < 1)
965        {
966            currVop->fcodeForward = 1;
967            status = PV_FAIL;
968            goto return_point;
969        }
970        currVop->fcodeForward = tmpvar;
971    }
972    else
973    {
974        currVop->fcodeForward = 0;
975    }
976
977    /* read vop_fcode_backward */
978    if (currVop->predictionType == B_VOP)
979    {
980        tmpvar = (uint32) BitstreamReadBits16(stream, 3);
981        if (tmpvar < 1)
982        {
983            currVop->fcodeBackward = 1;
984            status = PV_FAIL;
985            goto return_point;
986        }
987        currVop->fcodeBackward = tmpvar;
988    }
989    else
990    {
991        currVop->fcodeBackward = 0;
992    }
993
994    if (currVol->scalability)
995    {
996        currVop->refSelectCode = (int) BitstreamReadBits16(stream, 2);
997    }
998
999return_point:
1000    return status;
1001}
1002
1003
1004/***********************************************************CommentBegin******
1005*
1006* -- VideoPlaneWithShortHeader -- Decodes the short_video_header information from the bitstream
1007* Modified :
1008             04/23/2001.  Remove the codes related to the
1009                 "first pass" decoding.  We use a different function
1010                 to set up the decoder now.
1011***********************************************************CommentEnd********/
1012PV_STATUS DecodeShortHeader(VideoDecData *video, Vop *currVop)
1013{
1014    PV_STATUS status = PV_SUCCESS;
1015    Vol *currVol = video->vol[0];
1016    BitstreamDecVideo *stream = currVol->bitstream;
1017    uint32 tmpvar;
1018    int32 size;
1019
1020    int extended_PTYPE = FALSE;
1021    int UFEP = 0, custom_PFMT = 0, custom_PCF = 0;
1022
1023    status = BitstreamShowBits32(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar);
1024
1025    if (tmpvar !=  SHORT_VIDEO_START_MARKER)
1026    {
1027        status = PV_FAIL;
1028        goto return_point;
1029    }
1030
1031
1032    PV_BitstreamFlushBits(stream, SHORT_VIDEO_START_MARKER_LENGTH);
1033
1034    /* Temporal reference. Using vop_time_increment_resolution = 30000 */
1035    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
1036    currVop->temporalRef = (int) tmpvar;
1037
1038
1039    currVop->timeInc = 0xff & (256 + currVop->temporalRef - video->prevVop->temporalRef);
1040    currVol->moduloTimeBase += currVop->timeInc; /* mseconds   11/12/01 */
1041    /* Marker Bit */
1042    if (!BitstreamRead1Bits(stream))
1043    {
1044        mp4dec_log("DecodeShortHeader(): Market bit wrong.\n");
1045        status = PV_FAIL;
1046        goto return_point;
1047    }
1048
1049    /* Zero Bit */
1050    if (BitstreamRead1Bits(stream))
1051    {
1052        mp4dec_log("DecodeShortHeader(): Zero bit wrong.\n");
1053        status = PV_FAIL;
1054        goto return_point;
1055    }
1056
1057    /*split_screen_indicator*/
1058    if (BitstreamRead1Bits(stream))
1059    {
1060        mp4dec_log("DecodeShortHeader(): Split Screen not supported.\n");
1061        VideoDecoderErrorDetected(video);
1062    }
1063
1064    /*document_freeze_camera*/
1065    if (BitstreamRead1Bits(stream))
1066    {
1067        mp4dec_log("DecodeShortHeader(): Freeze Camera not supported.\n");
1068        VideoDecoderErrorDetected(video);
1069    }
1070
1071    /*freeze_picture_release*/
1072    if (BitstreamRead1Bits(stream))
1073    {
1074        mp4dec_log("DecodeShortHeader(): Freeze Release not supported.\n");
1075        VideoDecoderErrorDetected(video);
1076    }
1077    /* source format */
1078    switch (BitstreamReadBits16(stream, 3))
1079    {
1080        case 1:
1081            if (video->size < 128*96)
1082            {
1083                status = PV_FAIL;
1084                goto return_point;
1085            }
1086            video->displayWidth = video->width =  128;
1087            video->displayHeight = video->height  = 96;
1088            break;
1089
1090        case 2:
1091            if (video->size < 176*144)
1092            {
1093                status = PV_FAIL;
1094                goto return_point;
1095            }
1096            video->displayWidth = video->width  = 176;
1097            video->displayHeight = video->height  = 144;
1098            break;
1099
1100        case 3:
1101            if (video->size < 352*288)
1102            {
1103                status = PV_FAIL;
1104                goto return_point;
1105            }
1106            video->displayWidth = video->width = 352;
1107            video->displayHeight = video->height = 288;
1108            break;
1109
1110        case 4:
1111            if (video->size < 704*576)
1112            {
1113                status = PV_FAIL;
1114                goto return_point;
1115            }
1116            video->displayWidth = video->width = 704;
1117            video->displayHeight = video->height = 576;
1118            break;
1119
1120        case 5:
1121            if (video->size < 1408*1152)
1122            {
1123                status = PV_FAIL;
1124                goto return_point;
1125            }
1126            video->displayWidth = video->width = 1408;
1127            video->displayHeight = video->height = 1152;
1128            break;
1129
1130        case 7:
1131            extended_PTYPE = TRUE;
1132            break;
1133
1134        default:
1135            /* Msg("H.263 source format not legal\n"); */
1136            status = PV_FAIL;
1137            goto return_point;
1138    }
1139
1140
1141    currVop->roundingType = 0;
1142
1143    if (extended_PTYPE == FALSE)
1144    {
1145        currVop->predictionType = (int) BitstreamRead1Bits(stream);
1146
1147        /* four_reserved_zero_bits */
1148        if (BitstreamReadBits16(stream, 4))
1149        {
1150            mp4dec_log("DecodeShortHeader(): Reserved bits wrong.\n");
1151            status = PV_FAIL;
1152            goto return_point;
1153        }
1154    }
1155    else
1156    {
1157        UFEP = BitstreamReadBits16(stream, 3);
1158        if (UFEP == 1)
1159        {
1160            /* source format */
1161            switch (BitstreamReadBits16(stream, 3))
1162            {
1163                case 1:
1164                    if (video->size < 128*96)
1165                    {
1166                        status = PV_FAIL;
1167                        goto return_point;
1168                    }
1169                    video->displayWidth = video->width =  128;
1170                    video->displayHeight = video->height  = 96;
1171                    break;
1172
1173                case 2:
1174                    if (video->size < 176*144)
1175                    {
1176                        status = PV_FAIL;
1177                        goto return_point;
1178                    }
1179                    video->displayWidth = video->width  = 176;
1180                    video->displayHeight = video->height  = 144;
1181                    break;
1182
1183                case 3:
1184                    if (video->size < 352*288)
1185                    {
1186                        status = PV_FAIL;
1187                        goto return_point;
1188                    }
1189                    video->displayWidth = video->width = 352;
1190                    video->displayHeight = video->height = 288;
1191                    break;
1192
1193                case 4:
1194                    if (video->size < 704*576)
1195                    {
1196                        status = PV_FAIL;
1197                        goto return_point;
1198                    }
1199                    video->displayWidth = video->width = 704;
1200                    video->displayHeight = video->height = 576;
1201                    break;
1202
1203                case 5:
1204                    if (video->size < 1408*1152)
1205                    {
1206                        status = PV_FAIL;
1207                        goto return_point;
1208                    }
1209                    video->displayWidth = video->width = 1408;
1210                    video->displayHeight = video->height = 1152;
1211                    break;
1212
1213                case 6:
1214                    custom_PFMT = TRUE;
1215                    break;
1216
1217                default:
1218                    /* Msg("H.263 source format not legal\n"); */
1219                    status = PV_FAIL;
1220                    goto return_point;
1221            }
1222
1223            custom_PCF = BitstreamRead1Bits(stream);
1224            /* unrestricted MV */
1225            if (BitstreamRead1Bits(stream))
1226            {
1227                status = PV_FAIL;
1228                goto return_point;
1229            }
1230            /* SAC */
1231            if (BitstreamRead1Bits(stream))
1232            {
1233                status = PV_FAIL;
1234                goto return_point;
1235            }
1236
1237            /* AP */
1238            if (BitstreamRead1Bits(stream))
1239            {
1240                status = PV_FAIL;
1241                goto return_point;
1242            }
1243
1244            video->advanced_INTRA = BitstreamRead1Bits(stream);
1245
1246            video->deblocking = BitstreamRead1Bits(stream);
1247
1248            video->slice_structure = BitstreamRead1Bits(stream);
1249
1250            /* RPS, ISD, AIV */
1251            if (BitstreamReadBits16(stream, 3))
1252            {
1253                status = PV_FAIL;
1254                goto return_point;
1255            }
1256            video->modified_quant = BitstreamRead1Bits(stream);
1257
1258            /* Marker Bit and reserved*/
1259            if (BitstreamReadBits16(stream, 4) != 8)
1260            {
1261                status = PV_FAIL;
1262                goto return_point;
1263            }
1264        }
1265#ifndef PV_ANNEX_IJKT_SUPPORT
1266        if (video->advanced_INTRA | video->deblocking | video->modified_quant | video->modified_quant)
1267        {
1268            status = PV_FAIL;
1269            goto return_point;
1270        }
1271#endif
1272
1273        if (UFEP == 0 || UFEP == 1)
1274        {
1275            tmpvar = BitstreamReadBits16(stream, 3);
1276            if (tmpvar > 1)
1277            {
1278                status = PV_FAIL;
1279                goto return_point;
1280            }
1281            currVop->predictionType = tmpvar;
1282            /* RPR */
1283            if (BitstreamRead1Bits(stream))
1284            {
1285                status = PV_FAIL;
1286                goto return_point;
1287            }
1288
1289            /* RRU */
1290            if (BitstreamRead1Bits(stream))
1291            {
1292                status = PV_FAIL;
1293                goto return_point;
1294            }
1295            currVop->roundingType = (int) BitstreamRead1Bits(stream);
1296            if (BitstreamReadBits16(stream, 3) != 1)
1297            {
1298                status = PV_FAIL;
1299                goto return_point;
1300            }
1301        }
1302        else
1303        {
1304            status = PV_FAIL;
1305            goto return_point;
1306        }
1307        /* CPM */
1308        if (BitstreamRead1Bits(stream))
1309        {
1310            status = PV_FAIL;
1311            goto return_point;
1312        }
1313        /* CPFMT */
1314        if (custom_PFMT == 1 && UFEP == 1)
1315        {
1316            /* aspect ratio */
1317            tmpvar = BitstreamReadBits16(stream, 4);
1318            if (tmpvar == 0)
1319            {
1320                status = PV_FAIL;
1321                goto return_point;
1322            }
1323            /* Extended PAR */
1324            if (tmpvar == 0xF)
1325            {
1326                /* Read par_width and par_height but do nothing */
1327                /* par_width */
1328                tmpvar = BitstreamReadBits16(stream, 8);
1329
1330                /* par_height */
1331                tmpvar = BitstreamReadBits16(stream, 8);
1332            }
1333            tmpvar = BitstreamReadBits16(stream, 9);
1334
1335            video->displayWidth = (tmpvar + 1) << 2;
1336            video->width = (video->displayWidth + 15) & -16;
1337            /* marker bit */
1338            if (!BitstreamRead1Bits(stream))
1339            {
1340                status = PV_FAIL;
1341                goto return_point;
1342            }
1343            tmpvar = BitstreamReadBits16(stream, 9);
1344            if (tmpvar == 0)
1345            {
1346                status = PV_FAIL;
1347                goto return_point;
1348            }
1349            video->displayHeight = tmpvar << 2;
1350            video->height = (video->displayHeight + 15) & -16;
1351
1352            if (video->height * video->width > video->size)
1353            {
1354                status = PV_FAIL;
1355                goto return_point;
1356            }
1357
1358            video->nTotalMB = video->width / MB_SIZE * video->height / MB_SIZE;
1359
1360            if (video->nTotalMB <= 48)
1361            {
1362                video->nBitsForMBID = 6;
1363            }
1364            else if (video->nTotalMB <= 99)
1365            {
1366                video->nBitsForMBID = 7;
1367            }
1368            else if (video->nTotalMB <= 396)
1369            {
1370                video->nBitsForMBID = 9;
1371            }
1372            else if (video->nTotalMB <= 1584)
1373            {
1374                video->nBitsForMBID = 11;
1375            }
1376            else if (video->nTotalMB <= 6336)
1377            {
1378                video->nBitsForMBID = 13 ;
1379            }
1380            else if (video->nTotalMB <= 9216)
1381            {
1382                video->nBitsForMBID = 14 ;
1383            }
1384            else
1385            {
1386                status = PV_FAIL;
1387                goto return_point;
1388            }
1389        }
1390        if (UFEP == 1 && custom_PCF == 1)
1391        {
1392            BitstreamRead1Bits(stream);
1393
1394            tmpvar = BitstreamReadBits16(stream, 7);
1395            if (tmpvar == 0)
1396            {
1397                status = PV_FAIL;
1398                goto return_point;
1399            }
1400        }
1401
1402        if (custom_PCF == 1)
1403        {
1404            currVop->ETR = BitstreamReadBits16(stream, 2);
1405        }
1406
1407        if (UFEP == 1 && video->slice_structure == 1)
1408        {
1409            /* SSS */
1410            tmpvar = BitstreamReadBits16(stream, 2);
1411            if (tmpvar != 0)
1412            {
1413                status = PV_FAIL;
1414                goto return_point;
1415            }
1416        }
1417    }
1418
1419    /* Recalculate number of macroblocks per row & col since */
1420    /*  the frame size can change.           04/23/2001.   */
1421    video->nMBinGOB = video->nMBPerRow = video->width / MB_SIZE;
1422    video->nGOBinVop = video->nMBPerCol = video->height / MB_SIZE;
1423    video->nTotalMB = video->nMBPerRow * video->nMBPerCol;
1424    if (custom_PFMT == 0  || UFEP == 0)
1425    {
1426        video->nBitsForMBID = CalcNumBits((uint)video->nTotalMB - 1); /* otherwise calculate above */
1427    }
1428    size = (int32)video->width * video->height;
1429    if (video->currVop->predictionType == P_VOP && size > video->videoDecControls->size)
1430    {
1431        status = PV_FAIL;
1432        goto return_point;
1433    }
1434    video->videoDecControls->size = size;
1435    video->currVop->uChan = video->currVop->yChan + size;
1436    video->currVop->vChan = video->currVop->uChan + (size >> 2);
1437    video->prevVop->uChan = video->prevVop->yChan + size;
1438    video->prevVop->vChan = video->prevVop->uChan + (size >> 2);
1439
1440
1441    currVop->quantizer = (int16) BitstreamReadBits16(stream, 5);
1442
1443    if (currVop->quantizer == 0)                          /*  04/03/01 */
1444    {
1445        currVop->quantizer = video->prevVop->quantizer;
1446        status = PV_FAIL;
1447        goto return_point;
1448    }
1449
1450
1451    /* Zero bit */
1452    if (extended_PTYPE == FALSE)
1453    {
1454        if (BitstreamRead1Bits(stream))
1455        {
1456            mp4dec_log("DecodeShortHeader(): Zero bit wrong.\n");
1457            status = PV_FAIL;
1458            goto return_point;
1459        }
1460    }
1461    /* pei */
1462    tmpvar = (uint32) BitstreamRead1Bits(stream);
1463
1464    while (tmpvar)
1465    {
1466        tmpvar = (uint32) BitstreamReadBits16(stream, 8); /* "PSPARE" */
1467        tmpvar = (uint32) BitstreamRead1Bits(stream); /* "PEI" */
1468    }
1469
1470    if (video->slice_structure)  /* ANNEX_K */
1471    {
1472        if (!BitstreamRead1Bits(stream))  /* SEPB1 */
1473        {
1474            status = PV_FAIL;
1475            goto return_point;
1476        }
1477
1478        //  if (currVol->nBitsForMBID //
1479        if (BitstreamReadBits16(stream, video->nBitsForMBID))
1480        {
1481            status = PV_FAIL;             /* no ASO, RS support for Annex K */
1482            goto return_point;
1483        }
1484
1485        if (!BitstreamRead1Bits(stream))  /*SEPB3 */
1486        {
1487            status = PV_FAIL;
1488            goto return_point;
1489        }
1490
1491    }
1492    /* Setting of other VOP-header parameters */
1493    currVop->gobNumber = 0;
1494    currVop->vopCoded = 1;
1495
1496    currVop->intraDCVlcThr = 0;
1497    currVop->gobFrameID = 0; /* initial value,  05/22/00 */
1498    currVol->errorResDisable = 0;
1499    /*PutVopInterlaced(0,curr_vop); no implemented yet */
1500    if (currVop->predictionType != I_VOP)
1501        currVop->fcodeForward = 1;
1502    else
1503        currVop->fcodeForward = 0;
1504
1505return_point:
1506
1507    return status;
1508}
1509/***********************************************************CommentBegin******
1510*
1511* -- PV_DecodeVop -- Decodes the VOP information from the bitstream
1512*
1513*   04/12/2000
1514*                   Initial port to the new PV decoder library format.
1515*                   This function is different from the one in MoMuSys MPEG-4
1516*                   visual decoder.  We handle combined mode with or withput
1517*                   error resilience and H.263 mode through the sam path now.
1518*
1519*   05/04/2000
1520*                   Added temporal scalability to the decoder.
1521*
1522***********************************************************CommentEnd********/
1523PV_STATUS PV_DecodeVop(VideoDecData *video)
1524{
1525    Vol *currVol = video->vol[video->currLayer];
1526    PV_STATUS status;
1527    uint32 tmpvar;
1528
1529    /*****
1530    *   Do scalable or non-scalable decoding of the current VOP
1531    *****/
1532
1533    if (!currVol->scalability)
1534    {
1535        if (currVol->dataPartitioning)
1536        {
1537            /* Data partitioning mode comes here */
1538            status = DecodeFrameDataPartMode(video);
1539        }
1540        else
1541        {
1542            /* Combined mode with or without error resilience */
1543            /*    and short video header comes here.          */
1544            status = DecodeFrameCombinedMode(video);
1545        }
1546    }
1547    else
1548    {
1549#ifdef DO_NOT_FOLLOW_STANDARD
1550        /* according to the standard, only combined mode is allowed */
1551        /*    in the enhancement layer.          06/01/2000.        */
1552        if (currVol->dataPartitioning)
1553        {
1554            /* Data partitioning mode comes here */
1555            status = DecodeFrameDataPartMode(video);
1556        }
1557        else
1558        {
1559            /* Combined mode with or without error resilience */
1560            /*    and short video header comes here.          */
1561            status = DecodeFrameCombinedMode(video);
1562        }
1563#else
1564        status = DecodeFrameCombinedMode(video);
1565#endif
1566    }
1567
1568    /* This part is for consuming Visual_object_sequence_end_code and EOS Code */   /*  10/15/01 */
1569    if (!video->shortVideoHeader)
1570    {
1571        /* at this point bitstream is expected to be byte aligned */
1572        BitstreamByteAlignNoForceStuffing(currVol->bitstream);
1573
1574        status = BitstreamShowBits32HC(currVol->bitstream, &tmpvar);  /*  07/07/01 */
1575        if (tmpvar == VISUAL_OBJECT_SEQUENCE_END_CODE)/* VOS_END_CODE */
1576        {
1577            PV_BitstreamFlushBits(currVol->bitstream, 16);
1578            PV_BitstreamFlushBits(currVol->bitstream, 16);
1579        }
1580
1581    }
1582    else
1583    {
1584#ifdef PV_ANNEX_IJKT_SUPPORT
1585        if (video->deblocking)
1586        {
1587            H263_Deblock(video->currVop->yChan, video->width, video->height, video->QPMB, video->headerInfo.Mode, 0, 0);
1588            H263_Deblock(video->currVop->uChan, video->width >> 1, video->height >> 1, video->QPMB, video->headerInfo.Mode, 1, video->modified_quant);
1589            H263_Deblock(video->currVop->vChan, video->width >> 1, video->height >> 1, video->QPMB, video->headerInfo.Mode, 1, video->modified_quant);
1590        }
1591#endif
1592        /* Read EOS code for shortheader bitstreams    */
1593        status = BitstreamShowBits32(currVol->bitstream, 22, &tmpvar);
1594        if (tmpvar == SHORT_VIDEO_END_MARKER)
1595        {
1596            PV_BitstreamFlushBits(currVol->bitstream, 22);
1597        }
1598        else
1599        {
1600            status = PV_BitstreamShowBitsByteAlign(currVol->bitstream, 22, &tmpvar);
1601            if (tmpvar == SHORT_VIDEO_END_MARKER)
1602            {
1603                PV_BitstreamByteAlign(currVol->bitstream);
1604                PV_BitstreamFlushBits(currVol->bitstream, 22);
1605            }
1606        }
1607    }
1608    return status;
1609}
1610
1611
1612/***********************************************************CommentBegin******
1613*
1614* -- CalcVopDisplayTime -- calculate absolute time when VOP is to be displayed
1615*
1616*   04/12/2000 Initial port to the new PV decoder library format.
1617*
1618***********************************************************CommentEnd********/
1619uint32 CalcVopDisplayTime(Vol *currVol, Vop *currVop, int shortVideoHeader)
1620{
1621    uint32 display_time;
1622
1623
1624    /*****
1625    *   Calculate the time when the VOP is to be displayed next
1626    *****/
1627
1628    if (!shortVideoHeader)
1629    {
1630        display_time = (uint32)(currVol->moduloTimeBase + (((int32)currVop->timeInc - (int32)currVol->timeInc_offset) * 1000) / ((int32)currVol->timeIncrementResolution));  /*  11/12/2001 */
1631        if (currVop->timeStamp >= display_time)
1632        {
1633            display_time += 1000;  /* this case is valid if GOVHeader timestamp is ignored */
1634        }
1635    }
1636    else
1637    {
1638        display_time = (uint32)(currVol->moduloTimeBase * 33 + (currVol->moduloTimeBase * 11) / 30); /*  11/12/2001 */
1639    }
1640
1641    return(display_time);
1642}
1643
1644