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 I picture in simple
10 //  or main profile bitstream or progressive BI picture in main profile
11 //  bitstream.
12 //
13 */
14 
15 #include "vc1parse.h"
16 
17 /*------------------------------------------------------------------------------
18  * Parse picture layer.  This function parses progressive I picture for simple
19  * or main profile bitstream or progressive BI picture in main profile
20  * bitstream.  This parser starts after PTYPE was parsed but stops before
21  * parsing of macroblock layer.
22  * Table 16 of SMPTE 421M after processing up to PTYPE for I picture.
23  * Table 17 of SMPTE 421M after processing up to PTYPE for BI picture.
24  *------------------------------------------------------------------------------
25  */
26 
vc1_ParsePictureHeader_ProgressiveIpicture(void * ctxt,vc1_Info * pInfo)27 vc1_Status vc1_ParsePictureHeader_ProgressiveIpicture(void* ctxt, vc1_Info *pInfo)
28 {
29     uint32_t tempValue;
30     vc1_Status status = VC1_STATUS_OK;
31     vc1_metadata_t *md = &pInfo->metadata;
32     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
33 
34     /* rounding control is implied for simple and main profile, SMPTE 421M 8.3.7.
35     For each I or BI frame, RND shall be set to 1 */
36     if (md->PROFILE != VC1_PROFILE_ADVANCED)
37     {
38         picLayerHeader->RNDCTRL = md->RNDCTRL | 1 ;
39         md->RNDCTRL = picLayerHeader->RNDCTRL;
40     }
41 
42 
43     if (picLayerHeader->PTYPE == VC1_BI_FRAME)
44     {
45         if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
46             &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN))
47             != VC1_STATUS_OK)
48         {
49             return status;
50         }
51         if (picLayerHeader->BFRACTION_DEN != VC1_BFRACTION_BI)
52             return VC1_STATUS_PARSE_ERROR;
53     }
54 
55     VC1_GET_BITS9(7, tempValue); /* BF. */
56     VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
57 
58     if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
59         return status;
60 
61     if (picLayerHeader->PQINDEX <= 8)
62     {
63         VC1_GET_BITS9(1, picLayerHeader->HALFQP);
64     }
65     else picLayerHeader->HALFQP=0;
66 
67     if (md->QUANTIZER == 1)
68     {
69         VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
70         picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
71     }
72 
73     /* MVRANGE but only for main profile. */
74     if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
75         return status;
76 
77     if (md->MULTIRES == 1 && picLayerHeader->PTYPE != VC1_BI_FRAME)
78     {
79         VC1_GET_BITS9(2, tempValue); /* RESPIC. */
80     }
81 
82     VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
83     if (picLayerHeader->TRANSACFRM)
84     {
85         VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
86         picLayerHeader->TRANSACFRM += 2;
87     }
88 
89     VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
90     if (picLayerHeader->TRANSACFRM2)
91     {
92         VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
93         picLayerHeader->TRANSACFRM2 += 2;
94     }
95 
96     VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
97 
98     /* Skip parsing of macroblock layer. */
99 
100     return status;
101 }
102