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 syntax elements VOPDQUANT and DQUANT.
10 //
11 */
12 
13 #include "vc1parse.h"
14 
15 #define VC1_UNDEF_PQUANT 0
16 
17 static const uint8_t MapPQIndToQuant_Impl[] =
18 {
19     VC1_UNDEF_PQUANT,
20     1,  2,  3,  4,  5, 6,   7,  8,
21     6,  7,  8,  9, 10, 11, 12, 13,
22     14, 15, 16, 17, 18, 19, 20, 21,
23     22, 23, 24, 25, 27, 29, 31
24 };
25 
26 /*------------------------------------------------------------------------------
27  * Parse syntax element VOPDQuant as defined in Table 24 of SMPTE 421M.
28  *------------------------------------------------------------------------------
29  */
30 
vc1_VOPDQuant(void * ctxt,vc1_Info * pInfo)31 vc1_Status vc1_VOPDQuant(void* ctxt, vc1_Info *pInfo)
32 {
33     vc1_Status status = VC1_STATUS_OK;
34     vc1_metadata_t *md = &pInfo->metadata;
35     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
36 
37     if (md->DQUANT == 0)
38         return status;
39 
40     if (md->DQUANT == 2)
41     {
42         VC1_GET_BITS9(3, picLayerHeader->PQDIFF);
43         if (picLayerHeader->PQDIFF == 7)
44         {
45             VC1_GET_BITS9(5, picLayerHeader->ABSPQ);
46         }
47     }
48     else
49     {
50         VC1_GET_BITS9(1, picLayerHeader->DQUANTFRM);
51         if (picLayerHeader->DQUANTFRM == 1)
52         {
53             VC1_GET_BITS9(2, picLayerHeader->DQPROFILE);
54             if (picLayerHeader->DQPROFILE == VC1_DQPROFILE_SNGLEDGES)
55             {
56                 VC1_GET_BITS9(2, picLayerHeader->DQSBEDGE);
57             }
58             else if (picLayerHeader->DQPROFILE == VC1_DQPROFILE_DBLEDGES)
59             {
60 #ifdef VBP
61                 VC1_GET_BITS9(2, picLayerHeader->DQDBEDGE);
62 #else
63       			VC1_GET_BITS9(2, picLayerHeader->DQSBEDGE); /* DQDBEDGE. */
64 #endif
65             }
66             else if (picLayerHeader->DQPROFILE == VC1_DQPROFILE_ALLMBLKS)
67             {
68                 VC1_GET_BITS9(1, picLayerHeader->DQBILEVEL);
69             }
70             if (! (picLayerHeader->DQPROFILE == VC1_DQPROFILE_ALLMBLKS &&
71                    picLayerHeader->DQBILEVEL == 0))
72             {
73                 VC1_GET_BITS9(3, picLayerHeader->PQDIFF);
74                 if (picLayerHeader->PQDIFF == 7)
75                 {
76                     VC1_GET_BITS9(5, picLayerHeader->ABSPQ);
77                 }
78             }
79         }
80     }
81 #ifdef VBP
82 	if ((picLayerHeader->DQUANTFRM == 1 && md->DQUANT == 1) || (md->DQUANT == 2))
83 	{
84 		if (picLayerHeader->PQDIFF == 7)
85 		{
86 			picLayerHeader->ALTPQUANT = picLayerHeader->ABSPQ;
87 		}
88 		else
89 		{
90 			picLayerHeader->ALTPQUANT = picLayerHeader->PQUANT + picLayerHeader->PQDIFF + 1;
91 		}
92 	}
93 #endif
94     return status;
95 }
96 
97 /*------------------------------------------------------------------------------
98  * Compute value for PQUANT syntax element that does not exist in bitstreams for
99  * progressive I and BI pictures.
100  *------------------------------------------------------------------------------
101  */
102 
vc1_CalculatePQuant(vc1_Info * pInfo)103 vc1_Status vc1_CalculatePQuant(vc1_Info *pInfo)
104 {
105     vc1_Status status = VC1_STATUS_OK;
106     vc1_metadata_t *md = &pInfo->metadata;
107     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
108 
109     picLayerHeader->PQUANT = picLayerHeader->PQINDEX;
110     picLayerHeader->UniformQuant = VC1_QUANTIZER_UNIFORM;
111 
112     if (md->QUANTIZER == 0)
113     {
114         if (picLayerHeader->PQINDEX < 9)
115             picLayerHeader->UniformQuant = VC1_QUANTIZER_UNIFORM;
116         else
117         {
118             picLayerHeader->UniformQuant = VC1_QUANTIZER_NONUNIFORM;
119             picLayerHeader->PQUANT =
120                 MapPQIndToQuant_Impl[picLayerHeader->PQINDEX];
121         }
122     }
123     else
124     {
125         if (md->QUANTIZER == 2)
126             picLayerHeader->UniformQuant = VC1_QUANTIZER_NONUNIFORM;
127     }
128 
129     return status;
130 }
131