1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* /////////////////////////////////////////////////////////////////////// 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// INTEL CORPORATION PROPRIETARY INFORMATION 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This software is supplied under the terms of a license agreement or 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// nondisclosure agreement with Intel Corporation and may not be copied 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// or disclosed except in accordance with the terms of that agreement. 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Copyright (c) 2008 Intel Corporation. All Rights Reserved. 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Description: Parses VC-1 syntax elements VOPDQUANT and DQUANT. 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/ 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "vc1parse.h" 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define VC1_UNDEF_PQUANT 0 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic const uint8_t MapPQIndToQuant_Impl[] = 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_UNDEF_PQUANT, 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1, 2, 3, 4, 5, 6, 7, 8, 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 6, 7, 8, 9, 10, 11, 12, 13, 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 14, 15, 16, 17, 18, 19, 20, 21, 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 22, 23, 24, 25, 27, 29, 31 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}; 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*------------------------------------------------------------------------------ 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Parse syntax element VOPDQuant as defined in Table 24 of SMPTE 421M. 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *------------------------------------------------------------------------------ 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevc1_Status vc1_VOPDQuant(void* ctxt, vc1_Info *pInfo) 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vc1_Status status = VC1_STATUS_OK; 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vc1_metadata_t *md = &pInfo->metadata; 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader; 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (md->DQUANT == 0) 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return status; 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (md->DQUANT == 2) 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(3, picLayerHeader->PQDIFF); 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picLayerHeader->PQDIFF == 7) 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(5, picLayerHeader->ABSPQ); 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(1, picLayerHeader->DQUANTFRM); 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picLayerHeader->DQUANTFRM == 1) 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(2, picLayerHeader->DQPROFILE); 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picLayerHeader->DQPROFILE == VC1_DQPROFILE_SNGLEDGES) 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(2, picLayerHeader->DQSBEDGE); 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (picLayerHeader->DQPROFILE == VC1_DQPROFILE_DBLEDGES) 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(2, picLayerHeader->DQDBEDGE); 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(2, picLayerHeader->DQSBEDGE); /* DQDBEDGE. */ 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (picLayerHeader->DQPROFILE == VC1_DQPROFILE_ALLMBLKS) 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(1, picLayerHeader->DQBILEVEL); 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (! (picLayerHeader->DQPROFILE == VC1_DQPROFILE_ALLMBLKS && 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->DQBILEVEL == 0)) 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(3, picLayerHeader->PQDIFF); 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picLayerHeader->PQDIFF == 7) 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VC1_GET_BITS9(5, picLayerHeader->ABSPQ); 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((picLayerHeader->DQUANTFRM == 1 && md->DQUANT == 1) || (md->DQUANT == 2)) 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picLayerHeader->PQDIFF == 7) 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->ALTPQUANT = picLayerHeader->ABSPQ; 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->ALTPQUANT = picLayerHeader->PQUANT + picLayerHeader->PQDIFF + 1; 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return status; 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*------------------------------------------------------------------------------ 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Compute value for PQUANT syntax element that does not exist in bitstreams for 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * progressive I and BI pictures. 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *------------------------------------------------------------------------------ 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevc1_Status vc1_CalculatePQuant(vc1_Info *pInfo) 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vc1_Status status = VC1_STATUS_OK; 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vc1_metadata_t *md = &pInfo->metadata; 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader; 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->PQUANT = picLayerHeader->PQINDEX; 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->UniformQuant = VC1_QUANTIZER_UNIFORM; 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (md->QUANTIZER == 0) 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picLayerHeader->PQINDEX < 9) 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->UniformQuant = VC1_QUANTIZER_UNIFORM; 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->UniformQuant = VC1_QUANTIZER_NONUNIFORM; 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->PQUANT = 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MapPQIndToQuant_Impl[picLayerHeader->PQINDEX]; 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (md->QUANTIZER == 2) 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picLayerHeader->UniformQuant = VC1_QUANTIZER_NONUNIFORM; 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return status; 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 131