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