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 B picture in advanced 10// profile bitstream. 11// 12*/ 13 14#include "vc1parse.h" 15#include "viddec_fw_debug.h" // For DEB 16 17/*------------------------------------------------------------------------------ 18 * Parse picture layer. This function parses progressive B picture for advanced 19 * profile bitstream. 20 * Table 22 of SMPTE 421M after processing up to POSTPROC by 21 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock 22 * layer. 23 *------------------------------------------------------------------------------ 24 */ 25 26vc1_Status vc1_ParsePictureHeader_ProgressiveBpicture_Adv(void* ctxt, vc1_Info *pInfo) 27{ 28 vc1_Status status = VC1_STATUS_OK; 29 vc1_metadata_t *md = &pInfo->metadata; 30 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader; 31 32 if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK) 33 return status; 34 35 VC1_GET_BITS9(1, picLayerHeader->MVMODE); 36 picLayerHeader->MVMODE = (picLayerHeader->MVMODE == 1) ? 37 VC1_MVMODE_1MV : VC1_MVMODE_HPELBI_1MV; 38 39 if ((status = vc1_DecodeBitplane(ctxt, pInfo, 40 md->widthMB, md->heightMB, BPP_DIRECTMB)) != VC1_STATUS_OK) 41 { 42 return status; 43 } 44 45 if ((status = vc1_DecodeBitplane(ctxt, pInfo, 46 md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK) 47 { 48 return status; 49 } 50 51 VC1_GET_BITS9(2, picLayerHeader->MVTAB); 52 VC1_GET_BITS9(2, picLayerHeader->CBPTAB); 53 54 if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK) 55 return status; 56 57 if (md->VSTRANSFORM == 1) 58 { 59 VC1_GET_BITS9(1, picLayerHeader->TTMBF); 60 if (picLayerHeader->TTMBF == 1) 61 { 62 VC1_GET_BITS9(2, picLayerHeader->TTFRM); 63 } 64 } 65 66 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM); 67 if (picLayerHeader->TRANSACFRM == 1) 68 { 69 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM); 70 picLayerHeader->TRANSACFRM += 2; 71 } 72 73 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB); 74 75 /* Skip parsing of macroblock layer. */ 76 77 return status; 78} 79 80/*------------------------------------------------------------------------------ 81 * Parse picture layer. This function parses interlace B frame for advanced 82 * profile bitstream. 83 * Table 84 of SMPTE 421M after processing up to POSTPROC by 84 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock 85 * layer. 86 *------------------------------------------------------------------------------ 87 */ 88 89vc1_Status vc1_ParsePictureHeader_InterlaceBpicture_Adv(void* ctxt, vc1_Info *pInfo) 90{ 91 vc1_Status status = VC1_STATUS_OK; 92 vc1_metadata_t *md = &pInfo->metadata; 93 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader; 94 95 if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL, 96 &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN)) != 97 VC1_STATUS_OK) 98 { 99 return status; 100 } 101 102 if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK) 103 return status; 104 105 if ((status = vc1_DMVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK) 106 return status; 107 108 VC1_GET_BITS9(1, picLayerHeader->INTCOMP); 109 110 if ((status = vc1_DecodeBitplane(ctxt, pInfo, 111 md->widthMB, md->heightMB, BPP_DIRECTMB)) != VC1_STATUS_OK) 112 { 113 return status; 114 } 115 116 if ((status = vc1_DecodeBitplane(ctxt, pInfo, 117 md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK) 118 { 119 return status; 120 } 121 122 // EPC picLayerHeader->MVMODE = VC1_MVMODE_1MV; 123 VC1_GET_BITS9(2, picLayerHeader->MBMODETAB); 124 VC1_GET_BITS9(2, picLayerHeader->MVTAB); /* IMVTAB. */ 125 VC1_GET_BITS9(3, picLayerHeader->CBPTAB); /* ICBPTAB. */ 126 VC1_GET_BITS9(2, picLayerHeader->MV2BPTAB); /* 2MVBPTAB. */ 127 VC1_GET_BITS9(2, picLayerHeader->MV4BPTAB); /* 4MVBPTAB. */ 128 129 if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK) 130 return status; 131 132 if (md->VSTRANSFORM == 1) 133 { 134 VC1_GET_BITS9(1, picLayerHeader->TTMBF); 135 if (picLayerHeader->TTMBF == 1) 136 { 137 VC1_GET_BITS9(2, picLayerHeader->TTFRM); 138 } 139 } 140 141 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM); 142 if (picLayerHeader->TRANSACFRM == 1) 143 { 144 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM); 145 picLayerHeader->TRANSACFRM += 2; 146 } 147 148 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB); 149 150 /* Skip parsing of macroblock layer. */ 151 152 return status; 153} 154 155/*------------------------------------------------------------------------------ 156 * Parse picture layer. This function parses interlace B field for advanced 157 * profile bitstream. 158 * Table 89 of SMPTE 421M after processing up to BFRACTION by 159 * vc1_ParseFieldHeader_Adv() but stopping before processing of macroblock 160 * layer. 161 *------------------------------------------------------------------------------ 162 */ 163 164vc1_Status vc1_ParseFieldHeader_InterlaceBpicture_Adv(void* ctxt, vc1_Info *pInfo) 165{ 166 uint8_t bit_count; 167 const uint8_t *table; 168 vc1_Status status = VC1_STATUS_OK; 169 vc1_metadata_t *md = &pInfo->metadata; 170 vc1_PictureLayerHeader* picLayerHeader = &pInfo->picLayerHeader; 171 172 VC1_GET_BITS9(5, picLayerHeader->PQINDEX); 173 174 if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK) 175 return status; 176 177 if (picLayerHeader->PQINDEX <= 8) 178 { 179 VC1_GET_BITS9(1, picLayerHeader->HALFQP); 180 } 181 else 182 picLayerHeader->HALFQP = 0; 183 184 if (md->QUANTIZER == 1) 185 { 186 VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER); 187 picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER; 188 } 189 190 if (md->POSTPROCFLAG == 1) 191 { 192 VC1_GET_BITS9(2, picLayerHeader->POSTPROC); 193 } 194 195 if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK) 196 return status; 197 198 if ((status = vc1_DMVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK) 199 return status; 200 201 if (picLayerHeader->PQUANT > 12) 202 table = VC1_MVMODE_LOW_TBL; 203 else 204 table = VC1_MVMODE_HIGH_TBL; 205 206 bit_count = 0; 207 VC1_GET_BITS9(1, picLayerHeader->MVMODE); 208 while ((picLayerHeader->MVMODE == 0) && (bit_count < 2)) 209 { 210 VC1_GET_BITS9(1, picLayerHeader->MVMODE); 211 bit_count++; 212 } 213 if ((bit_count == 2) && (picLayerHeader->MVMODE == 0)) 214 bit_count++; 215 picLayerHeader->MVMODE = table[bit_count]; 216 217 if ((status = vc1_DecodeBitplane(ctxt, pInfo, 218 md->widthMB, (md->heightMB+1)/2, BPP_FORWARDMB)) != 219 VC1_STATUS_OK) 220 { 221 return status; 222 } 223 224 VC1_GET_BITS9(3, picLayerHeader->MBMODETAB); 225 VC1_GET_BITS9(3, picLayerHeader->MVTAB); /* IMVTAB. */ 226 VC1_GET_BITS9(3, picLayerHeader->CBPTAB); /* ICBPTAB. */ 227 228 if (picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) 229 { 230 VC1_GET_BITS9(2, picLayerHeader->MV4BPTAB); /* 4MVBPTAB. */ 231 } 232 233 if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK) 234 return status; 235 236 if (md->VSTRANSFORM == 1) 237 { 238 VC1_GET_BITS9(1, picLayerHeader->TTMBF); 239 if (picLayerHeader->TTMBF == 1) 240 { 241 VC1_GET_BITS9(2, picLayerHeader->TTFRM); 242 } 243 } 244 245 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM); 246 if (picLayerHeader->TRANSACFRM == 1) 247 { 248 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM); 249 picLayerHeader->TRANSACFRM += 2; 250 } 251 252 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB); 253 254 /* Skip parsing of macroblock layer. */ 255 256 return status; 257} 258