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 advanced profile.
     10 //
     11 */
     12 
     13 #include "vc1parse.h"
     14 #include "viddec_fw_debug.h"
     15 
     16 /*------------------------------------------------------------------------------
     17  * Parse picture layer.  This function parses the picture header for advanced
     18  * profile down to POSTPROC syntax element.
     19  * Table 18 of SMPTE 421M for progressive I or BI picture.
     20  * Table 20 of SMPTE 421M for progressive P picture.
     21  * Table 22 of SMPTE 421M for progressive B picture.
     22  * Table 23 of SMPTE 421M for skipped picture.
     23  * Table 82 of SMPTE 421M for interlace I or BI frame.
     24  * Table 83 of SMPTE 421M for interlace P frame.
     25  * Table 84 of SMPTE 421M for interlace B frame.
     26  *------------------------------------------------------------------------------
     27  */
     28 
     29 vc1_Status vc1_ParsePictureHeader_Adv(void* ctxt, vc1_Info *pInfo)
     30 {
     31     uint32_t i = 0;
     32     uint32_t tempValue;
     33     vc1_Status status = VC1_STATUS_OK;
     34     uint32_t number_of_pan_scan_window;
     35     vc1_metadata_t *md = &pInfo->metadata;
     36     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
     37 
     38     if (md->INTERLACE == 1)
     39     {
     40         VC1_GET_BITS9(1, picLayerHeader->FCM);
     41         if (picLayerHeader->FCM)
     42         {
     43             VC1_GET_BITS9(1, picLayerHeader->FCM);
     44             if (picLayerHeader->FCM)
     45             {
     46                 picLayerHeader->FCM = VC1_FCM_FIELD_INTERLACE;
     47                 return VC1_STATUS_PARSE_ERROR;
     48             }
     49             else
     50                 picLayerHeader->FCM = VC1_FCM_FRAME_INTERLACE;
     51         }
     52         else
     53             picLayerHeader->FCM = VC1_FCM_PROGRESSIVE;
     54     }
     55     else
     56         picLayerHeader->FCM = VC1_FCM_PROGRESSIVE;
     57 
     58 
     59     VC1_GET_BITS9(1, picLayerHeader->PTYPE);
     60     if (picLayerHeader->PTYPE)
     61     {
     62         VC1_GET_BITS9(1, picLayerHeader->PTYPE);
     63         if (picLayerHeader->PTYPE)
     64         {
     65             VC1_GET_BITS9(1, picLayerHeader->PTYPE);
     66             if (picLayerHeader->PTYPE)
     67             {
     68                 VC1_GET_BITS9(1, picLayerHeader->PTYPE);
     69                 if (picLayerHeader->PTYPE)
     70                     picLayerHeader->PTYPE = VC1_SKIPPED_FRAME;
     71                 else
     72                     picLayerHeader->PTYPE = VC1_BI_FRAME;
     73             }
     74             else
     75                 picLayerHeader->PTYPE = VC1_I_FRAME;
     76         }
     77         else
     78             picLayerHeader->PTYPE = VC1_B_FRAME;
     79     }
     80     else
     81         picLayerHeader->PTYPE = VC1_P_FRAME;
     82 
     83     if (picLayerHeader->PTYPE != VC1_SKIPPED_FRAME)
     84     {
     85         if (md->TFCNTRFLAG)
     86         {
     87             VC1_GET_BITS9(8, picLayerHeader->TFCNTR); /* TFCNTR. */
     88         }
     89     }
     90 
     91     if (md->PULLDOWN)
     92     {
     93         if ((md->INTERLACE == 0) || (md->PSF == 1))
     94         {
     95             VC1_GET_BITS9(2, picLayerHeader->RPTFRM);
     96         }
     97         else
     98         {
     99             VC1_GET_BITS9(1, picLayerHeader->TFF);
    100             VC1_GET_BITS9(1, picLayerHeader->RFF);
    101         }
    102     }
    103 
    104     if (md->PANSCAN_FLAG == 1)
    105     {
    106         VC1_GET_BITS9(1, picLayerHeader->PS_PRESENT); /* PS_PRESENT. */
    107         if (picLayerHeader->PS_PRESENT == 1)
    108         {
    109             if ((md->INTERLACE == 1) &&
    110                 (md->PSF == 0))
    111             {
    112                 if (md->PULLDOWN == 1)
    113                     number_of_pan_scan_window = 2 + picLayerHeader->RFF;
    114                 else
    115                     number_of_pan_scan_window = 2;
    116             }
    117             else
    118             {
    119                 if (md->PULLDOWN == 1)
    120                     number_of_pan_scan_window = 1 + picLayerHeader->RPTFRM;
    121                 else
    122                     number_of_pan_scan_window = 1;
    123             }
    124             picLayerHeader->number_of_pan_scan_window = number_of_pan_scan_window;
    125 
    126             for (i = 0; i < number_of_pan_scan_window; i++)
    127             {
    128                 VC1_GET_BITS(18, picLayerHeader->PAN_SCAN_WINDOW[i].hoffset); /* PS_HOFFSET. */
    129                 VC1_GET_BITS(18, picLayerHeader->PAN_SCAN_WINDOW[i].voffset); /* PS_VOFFSET. */
    130                 VC1_GET_BITS(14, picLayerHeader->PAN_SCAN_WINDOW[i].width); /* PS_WIDTH. */
    131                 VC1_GET_BITS(14, picLayerHeader->PAN_SCAN_WINDOW[i].height); /* PS_HEIGHT. */
    132             }
    133         }
    134     }
    135 
    136     if (picLayerHeader->PTYPE != VC1_SKIPPED_FRAME)
    137     {
    138         VC1_GET_BITS9(1, picLayerHeader->RNDCTRL);
    139         md->RNDCTRL =  picLayerHeader->RNDCTRL;
    140 
    141         if ((md->INTERLACE == 1) ||
    142             (picLayerHeader->FCM != VC1_FCM_PROGRESSIVE))
    143         {
    144             VC1_GET_BITS9(1, picLayerHeader->UVSAMP);
    145         }
    146 
    147         if ((md->FINTERPFLAG == 1) &&
    148             (picLayerHeader->FCM == VC1_FCM_PROGRESSIVE))
    149         {
    150             VC1_GET_BITS9(1, tempValue); /* INTERPFRM. */
    151         }
    152 
    153         if ((picLayerHeader->PTYPE == VC1_B_FRAME) &&
    154             (picLayerHeader->FCM == VC1_FCM_PROGRESSIVE))
    155         {
    156             if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
    157                                                 &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN))
    158                 != VC1_STATUS_OK)
    159             {
    160                 return status;
    161             }
    162         }
    163 
    164         VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
    165         if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
    166             return status;
    167 
    168         if (picLayerHeader->PQINDEX <= 8)
    169         {
    170             VC1_GET_BITS9(1, picLayerHeader->HALFQP);
    171         }
    172         else
    173             picLayerHeader->HALFQP = 0;
    174 
    175         if (md->QUANTIZER == 1)
    176         {
    177             VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
    178             picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
    179         }
    180 
    181         if (md->POSTPROCFLAG == 1)
    182         {
    183             VC1_GET_BITS9(2, picLayerHeader->POSTPROC);
    184         }
    185     }
    186 
    187     return vc1_ParsePictureFieldHeader_Adv(ctxt, pInfo);
    188 }
    189 
    190 /*------------------------------------------------------------------------------
    191  * Parse picture layer.  This function parses the picture header for advanced
    192  * profile down to BFRACTION syntax element.
    193  * Table 85 of SMPTE 421M.
    194  *------------------------------------------------------------------------------
    195  */
    196 
    197 vc1_Status vc1_ParseFieldHeader_Adv(void* ctxt, vc1_Info *pInfo)
    198 {
    199     uint32_t i = 0;
    200     vc1_Status status = VC1_STATUS_OK;
    201     uint32_t number_of_pan_scan_window;
    202     vc1_metadata_t *md = &pInfo->metadata;
    203     vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
    204 
    205     VC1_GET_BITS9(1, picLayerHeader->FCM);
    206     if (picLayerHeader->FCM)
    207     {
    208         VC1_GET_BITS9(1, picLayerHeader->FCM);
    209         if (picLayerHeader->FCM)
    210             picLayerHeader->FCM = VC1_FCM_FIELD_INTERLACE;
    211         else
    212             picLayerHeader->FCM = VC1_FCM_FRAME_INTERLACE;
    213     }
    214     else
    215         picLayerHeader->FCM = VC1_FCM_PROGRESSIVE;
    216     if (picLayerHeader->FCM != VC1_FCM_FIELD_INTERLACE)
    217         return VC1_STATUS_PARSE_ERROR;
    218 
    219     VC1_GET_BITS9(3, picLayerHeader->FPTYPE);
    220     if (picLayerHeader->FPTYPE == 0)
    221     {
    222         picLayerHeader->PTypeField1 = VC1_I_FRAME;
    223         picLayerHeader->PTypeField2 = VC1_I_FRAME;
    224     }
    225     else if (picLayerHeader->FPTYPE == 1)
    226     {
    227         picLayerHeader->PTypeField1 = VC1_I_FRAME;
    228         picLayerHeader->PTypeField2 = VC1_P_FRAME;
    229     }
    230     else if (picLayerHeader->FPTYPE == 2)
    231     {
    232         picLayerHeader->PTypeField1 = VC1_P_FRAME;
    233         picLayerHeader->PTypeField2 = VC1_I_FRAME;
    234     }
    235     else if (picLayerHeader->FPTYPE == 3)
    236     {
    237         picLayerHeader->PTypeField1 = VC1_P_FRAME;
    238         picLayerHeader->PTypeField2 = VC1_P_FRAME;
    239     }
    240     else if (picLayerHeader->FPTYPE == 4)
    241     {
    242         picLayerHeader->PTypeField1 = VC1_B_FRAME;
    243         picLayerHeader->PTypeField2 = VC1_B_FRAME;
    244     }
    245     else if (picLayerHeader->FPTYPE == 5)
    246     {
    247         picLayerHeader->PTypeField1 = VC1_B_FRAME;
    248         picLayerHeader->PTypeField2 = VC1_BI_FRAME;
    249     }
    250     else if (picLayerHeader->FPTYPE == 6)
    251     {
    252         picLayerHeader->PTypeField1 = VC1_BI_FRAME;
    253         picLayerHeader->PTypeField2 = VC1_B_FRAME;
    254     }
    255     else if (picLayerHeader->FPTYPE == 7)
    256     {
    257         picLayerHeader->PTypeField1 = VC1_BI_FRAME;
    258         picLayerHeader->PTypeField2 = VC1_BI_FRAME;
    259     }
    260 
    261     if (md->TFCNTRFLAG)
    262     {
    263         VC1_GET_BITS9(8, picLayerHeader->TFCNTR);
    264     }
    265 
    266     if (md->PULLDOWN == 1)
    267     {
    268         if (md->PSF == 1)
    269         {
    270             VC1_GET_BITS9(2, picLayerHeader->RPTFRM);
    271         }
    272         else
    273         {
    274             VC1_GET_BITS9(1, picLayerHeader->TFF);
    275             VC1_GET_BITS9(1, picLayerHeader->RFF);
    276         }
    277     } else
    278         picLayerHeader->TFF = 1;
    279 
    280     if (md->PANSCAN_FLAG == 1)
    281     {
    282         VC1_GET_BITS9(1, picLayerHeader->PS_PRESENT);
    283         if (picLayerHeader->PS_PRESENT)
    284         {
    285             if (md->PULLDOWN)
    286                 number_of_pan_scan_window = 2 + picLayerHeader->RFF;
    287             else
    288                 number_of_pan_scan_window = 2;
    289             picLayerHeader->number_of_pan_scan_window =number_of_pan_scan_window;
    290 
    291             for (i = 0; i < number_of_pan_scan_window; i++)
    292             {
    293                 VC1_GET_BITS(18, picLayerHeader->PAN_SCAN_WINDOW[i].hoffset); /* PS_HOFFSET. */
    294                 VC1_GET_BITS(18, picLayerHeader->PAN_SCAN_WINDOW[i].voffset); /* PS_VOFFSET. */
    295                 VC1_GET_BITS(14, picLayerHeader->PAN_SCAN_WINDOW[i].width); /* PS_WIDTH. */
    296                 VC1_GET_BITS(14, picLayerHeader->PAN_SCAN_WINDOW[i].height); /* PS_HEIGHT. */
    297             }
    298         }
    299     }
    300     VC1_GET_BITS9(1, md->RNDCTRL);
    301 
    302 #ifdef VBP
    303 	picLayerHeader->RNDCTRL = md->RNDCTRL;
    304 #endif
    305 
    306     VC1_GET_BITS9(1, picLayerHeader->UVSAMP);
    307 
    308     if ((md->REFDIST_FLAG == 1) && (picLayerHeader->FPTYPE <= 3))
    309     {
    310         int32_t tmp;
    311         if ((status = vc1_DecodeHuffmanOne(ctxt, &tmp,
    312                                            VC1_REFDIST_TBL)) != VC1_STATUS_OK)
    313         {
    314             return status;
    315         }
    316         md->REFDIST = tmp;
    317     }
    318 
    319     if ((picLayerHeader->FPTYPE >= 4) && (picLayerHeader->FPTYPE <= 7))
    320     {
    321         if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
    322                                             &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN)) !=
    323             VC1_STATUS_OK)
    324         {
    325             return status;
    326         }
    327     }
    328 
    329     if (picLayerHeader->CurrField == 0)
    330     {
    331         picLayerHeader->PTYPE = picLayerHeader->PTypeField1;
    332         picLayerHeader->BottomField = (uint8_t) (1 - picLayerHeader->TFF);
    333     }
    334     else
    335     {
    336         picLayerHeader->BottomField = (uint8_t) (picLayerHeader->TFF);
    337         picLayerHeader->PTYPE = picLayerHeader->PTypeField2;
    338     }
    339 
    340     return vc1_ParsePictureFieldHeader_Adv(ctxt, pInfo);
    341 }
    342 
    343 /*------------------------------------------------------------------------------
    344  * Parse picture layer.  This function calls the appropriate function to further
    345  * parse the picture header for advanced profile down to macroblock layer.
    346  *------------------------------------------------------------------------------
    347  */
    348 
    349 vc1_Status vc1_ParsePictureFieldHeader_Adv(void* ctxt, vc1_Info *pInfo)
    350 {
    351     vc1_Status status = VC1_STATUS_PARSE_ERROR;
    352 
    353     if (pInfo->picLayerHeader.FCM == VC1_FCM_PROGRESSIVE)
    354     {
    355         if ((pInfo->picLayerHeader.PTYPE == VC1_I_FRAME) ||
    356             (pInfo->picLayerHeader.PTYPE == VC1_BI_FRAME))
    357         {
    358             status = vc1_ParsePictureHeader_ProgressiveIpicture_Adv(ctxt, pInfo);
    359         }
    360         else if (pInfo->picLayerHeader.PTYPE == VC1_P_FRAME)
    361             status = vc1_ParsePictureHeader_ProgressivePpicture_Adv(ctxt, pInfo);
    362         else if (pInfo->picLayerHeader.PTYPE == VC1_B_FRAME)
    363             status = vc1_ParsePictureHeader_ProgressiveBpicture_Adv(ctxt, pInfo);
    364         else if (pInfo->picLayerHeader.PTYPE == VC1_SKIPPED_FRAME)
    365             status = VC1_STATUS_OK;
    366     }
    367     else if (pInfo->picLayerHeader.FCM == VC1_FCM_FRAME_INTERLACE)
    368     {
    369         if ((pInfo->picLayerHeader.PTYPE == VC1_I_FRAME) ||
    370             (pInfo->picLayerHeader.PTYPE == VC1_BI_FRAME))
    371         {
    372             status = vc1_ParsePictureHeader_InterlaceIpicture_Adv(ctxt, pInfo);
    373         }
    374         else if (pInfo->picLayerHeader.PTYPE == VC1_P_FRAME)
    375             status = vc1_ParsePictureHeader_InterlacePpicture_Adv(ctxt, pInfo);
    376         else if (pInfo->picLayerHeader.PTYPE == VC1_B_FRAME)
    377             status = vc1_ParsePictureHeader_InterlaceBpicture_Adv(ctxt, pInfo);
    378         else if (pInfo->picLayerHeader.PTYPE == VC1_SKIPPED_FRAME)
    379             status = VC1_STATUS_OK;
    380     }
    381     else if (pInfo->picLayerHeader.FCM == VC1_FCM_FIELD_INTERLACE)
    382     {
    383         int ptype;
    384         if( pInfo->picLayerHeader.CurrField == 0)
    385             ptype = pInfo->picLayerHeader.PTypeField1;
    386         else
    387             ptype = pInfo->picLayerHeader.PTypeField2;
    388 
    389         if ((ptype == VC1_I_FRAME) ||
    390             (ptype == VC1_BI_FRAME))
    391         {
    392             status = vc1_ParseFieldHeader_InterlaceIpicture_Adv(ctxt, pInfo);
    393         }
    394         else if (ptype == VC1_P_FRAME)
    395             status = vc1_ParseFieldHeader_InterlacePpicture_Adv(ctxt, pInfo);
    396         else if (ptype == VC1_B_FRAME)
    397             status = vc1_ParseFieldHeader_InterlaceBpicture_Adv(ctxt, pInfo);
    398         else if (ptype == VC1_SKIPPED_FRAME)
    399             status = VC1_STATUS_OK;
    400     }
    401 
    402     return status;
    403 }
    404