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 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 
     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