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