Home | History | Annotate | Download | only in parser
      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 
     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 
    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