1 /* ///////////////////////////////////////////////////////////////////////
2 //
3 //               INTEL CORPORATION PROPRIETARY INFORMATION
4 //  This software is supplied under the terms of a license agreement or
5 //  nondisclosure agreement with Intel Corporation and may not be copied
6 //  or disclosed except in accordance with the terms of that agreement.
7 //        Copyright (c) 2008 Intel Corporation. All Rights Reserved.
8 //
9 //  Description: Parses VC-1 picture layer for progressive B picture in simple
10 //  or main profile bitstream.
11 //
12 */
13 
14 #include "vc1parse.h"
15 #include "viddec_fw_debug.h"    // For DEB
16 
17 /*------------------------------------------------------------------------------
18  * Parse picture layer.  This function parses progressive B picture for main
19  * profile bitstream.  This parser starts after PTYPE was parsed but stops
20  * before parsing of macroblock layer.
21  * Table 21 of SMPTE 421M after processing up to PTYPE for B picture.
22  *------------------------------------------------------------------------------
23  */
24 
vc1_ParsePictureHeader_ProgressiveBpicture(void * ctxt,vc1_Info * pInfo)25 vc1_Status vc1_ParsePictureHeader_ProgressiveBpicture(void* ctxt, vc1_Info *pInfo)
26 {
27     vc1_Status status = VC1_STATUS_OK;
28     vc1_metadata_t *md = &pInfo->metadata;
29     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
30 
31     if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
32         &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN)) !=
33         VC1_STATUS_OK)
34     {
35         return status;
36     }
37 
38     VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
39     if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
40         return status;
41 
42     if (picLayerHeader->PQINDEX <= 8)
43     {
44         VC1_GET_BITS9(1, picLayerHeader->HALFQP);
45     }
46     else picLayerHeader->HALFQP=0;
47 
48     if (md->QUANTIZER == 1)
49     {
50         VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
51     }
52 
53     if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
54         return status;
55 
56     VC1_GET_BITS9(1, picLayerHeader->MVMODE);
57     picLayerHeader->MVMODE = (picLayerHeader->MVMODE == 1) ?
58         VC1_MVMODE_1MV : VC1_MVMODE_HPELBI_1MV;
59 
60     if ((status = vc1_DecodeBitplane(ctxt, pInfo,
61         md->widthMB, md->heightMB, BPP_DIRECTMB)) != VC1_STATUS_OK)
62     {
63         return VC1_STATUS_OK;
64     }
65 
66     if ((status = vc1_DecodeBitplane(ctxt, pInfo,
67         md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
68     {
69         return status;
70     }
71 
72     VC1_GET_BITS9(2, picLayerHeader->MVTAB);
73     VC1_GET_BITS9(2, picLayerHeader->CBPTAB);
74 
75     if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
76         return status;
77 
78     if (md->VSTRANSFORM == 1)
79     {
80         VC1_GET_BITS9(1, picLayerHeader->TTMBF);
81         if (picLayerHeader->TTMBF)
82         {
83             VC1_GET_BITS9(2, picLayerHeader->TTFRM);
84         }
85     }
86 
87     VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
88     if (picLayerHeader->TRANSACFRM == 1)
89     {
90         VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
91         picLayerHeader->TRANSACFRM += 2;
92     }
93 
94     VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
95 
96     /* Skip parsing of macroblock layer. */
97 
98     return status;
99 }
100 
101