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 picture layer for progressive P picture in simple
     10 //  or main profile bitstream.
     11 //
     12 */
     13 
     14 #include "vc1parse.h"
     15 
     16 /*------------------------------------------------------------------------------
     17  * Parse picture layer.  This function parses progressive P picture for simple
     18  * or main profile bitstream.  This parser starts after PTYPE was parsed but
     19  * stops before parsing of macroblock layer.
     20  * Table 19 of SMPTE 421M after processing up to PTYPE for P picture.
     21  *------------------------------------------------------------------------------
     22  */
     23 
     24 vc1_Status vc1_ParsePictureHeader_ProgressivePpicture(void* ctxt, vc1_Info *pInfo)
     25 {
     26     uint8_t bit_count;
     27     const uint8_t *table;
     28     uint32_t tempValue;
     29     vc1_Status status = VC1_STATUS_OK;
     30     vc1_metadata_t *md = &pInfo->metadata;
     31     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
     32 
     33     /* rounding control is implied for simple and main profile, SMPTE 421M 8.3.7.
     34        It toggles back and forth between 0 and 1 for P frames */
     35     if (md->PROFILE != VC1_PROFILE_ADVANCED)
     36     {
     37         picLayerHeader->RNDCTRL = md->RNDCTRL ^ 1 ;
     38         md->RNDCTRL = picLayerHeader->RNDCTRL;
     39     }
     40 
     41     VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
     42     if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
     43         return status;
     44 
     45     if (picLayerHeader->PQINDEX <= 8)
     46     {
     47         VC1_GET_BITS9(1, picLayerHeader->HALFQP);
     48     }
     49     else picLayerHeader->HALFQP=0;
     50 
     51     if (md->QUANTIZER == 1)
     52     {
     53         VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
     54         picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
     55     }
     56 
     57     /* MVRANGE. */
     58     if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
     59         return status;
     60 
     61     if (md->MULTIRES == 1)
     62         VC1_GET_BITS9(2, tempValue); /* RESPIC. */
     63 
     64     if (picLayerHeader->PQUANT > 12)
     65         table = VC1_MVMODE_LOW_TBL;
     66     else
     67         table = VC1_MVMODE_HIGH_TBL;
     68 
     69     bit_count = 0;
     70     VC1_GET_BITS9(1, picLayerHeader->MVMODE);
     71     while ((picLayerHeader->MVMODE == 0) && (bit_count < 3))
     72     {
     73         VC1_GET_BITS9(1, picLayerHeader->MVMODE);
     74         bit_count++;
     75     }
     76     if (bit_count == 3)
     77         bit_count += picLayerHeader->MVMODE;
     78     picLayerHeader->MVMODE = table[bit_count];
     79 
     80     if (picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP)
     81     {
     82         bit_count = 0;
     83         VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
     84         while ((picLayerHeader->MVMODE2 == 0) && (bit_count < 2))
     85         {
     86             VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
     87             bit_count++;
     88         }
     89         if (bit_count == 2 && picLayerHeader->MVMODE2 == 0)
     90             bit_count++;
     91         picLayerHeader->MVMODE2 = table[bit_count];
     92         VC1_GET_BITS9(6, picLayerHeader->LUMSCALE);
     93         VC1_GET_BITS9(6, picLayerHeader->LUMSHIFT);
     94     }
     95 #ifdef VBP
     96     else
     97         picLayerHeader->MVMODE2 = 0;
     98 #else
     99     else
    100         picLayerHeader->MVMODE2 = picLayerHeader->MVMODE;
    101 #endif
    102 
    103     if ((picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) ||
    104         ((picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP) &&
    105          (picLayerHeader->MVMODE2 == VC1_MVMODE_MIXED_MV)))
    106     {
    107         if ((status = vc1_DecodeBitplane(ctxt, pInfo,
    108             md->widthMB, md->heightMB, BPP_MVTYPEMB))
    109             != VC1_STATUS_OK)
    110         {
    111             return status;
    112         }
    113     }
    114 
    115     if ((status = vc1_DecodeBitplane(ctxt, pInfo,
    116         md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
    117     {
    118         return status;
    119     }
    120 
    121     VC1_GET_BITS9(2, picLayerHeader->MVTAB);
    122     VC1_GET_BITS9(2, picLayerHeader->CBPTAB);
    123 
    124     if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
    125         return status;
    126 
    127     if (md->VSTRANSFORM == 1)
    128     {
    129         VC1_GET_BITS9(1, picLayerHeader->TTMBF);
    130         if (picLayerHeader->TTMBF == 1)
    131         {
    132             VC1_GET_BITS9(2, picLayerHeader->TTFRM);
    133         }
    134     }
    135 
    136     VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
    137     if (picLayerHeader->TRANSACFRM == 1)
    138     {
    139         VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
    140         picLayerHeader->TRANSACFRM += 2;
    141     }
    142 
    143     VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
    144 
    145     /* Skip parsing of macroblock layer. */
    146 
    147     return status;
    148 }
    149 
    150