blob: e478250ddbbd75232f1f49ebc6fe98eda815ecc0 [file] [log] [blame]
/* ///////////////////////////////////////////////////////////////////////
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 2008 Intel Corporation. All Rights Reserved.
//
// Description: Parses VC-1 picture layer for progressive I or BI picture in
// advanced profile bitstream.
//
*/
#include "vc1parse.h"
#include "viddec_fw_debug.h"
/*------------------------------------------------------------------------------
* Parse picture layer. This function parses progressive I or BI picture for
* advanced profile bitstream.
* Table 18 of SMPTE 421M after processing up to POSTPROC by
* vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
* layer.
*------------------------------------------------------------------------------
*/
vc1_Status vc1_ParsePictureHeader_ProgressiveIpicture_Adv(void* ctxt, vc1_Info *pInfo)
{
vc1_Status status = VC1_STATUS_OK;
vc1_metadata_t *md = &pInfo->metadata;
vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB, md->heightMB, BPP_ACPRED)) != VC1_STATUS_OK)
{
return status;
}
if ((md->OVERLAP == 1) && (picLayerHeader->PQUANT <= 8))
{
VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
if (picLayerHeader->CONDOVER)
{
VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
if (! picLayerHeader->CONDOVER)
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_ALL;
else
{
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_SOME;
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB,
md->heightMB, BPP_OVERFLAGS)) != VC1_STATUS_OK)
{
return status;
}
}
}
else
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_NONE;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
if (picLayerHeader->TRANSACFRM)
{
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
picLayerHeader->TRANSACFRM += 2;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
if (picLayerHeader->TRANSACFRM2)
{
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
picLayerHeader->TRANSACFRM2 += 2;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
status = vc1_VOPDQuant(ctxt, pInfo);
/* Skip parsing of macroblock layer. */
return status;
}
/*------------------------------------------------------------------------------
* Parse picture layer. This function parses interlace I or BI frame for
* advanced profile bitstream.
* Table 82 of SMPTE 421M after processing up to POSTPROC by
* vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
* layer.
*------------------------------------------------------------------------------
*/
vc1_Status vc1_ParsePictureHeader_InterlaceIpicture_Adv(void* ctxt, vc1_Info *pInfo)
{
vc1_Status status = VC1_STATUS_OK;
vc1_metadata_t *md = &pInfo->metadata;
vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB, md->heightMB, BPP_FIELDTX)) != VC1_STATUS_OK)
{
return status;
}
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB, md->heightMB, BPP_ACPRED)) != VC1_STATUS_OK)
{
return status;
}
if ((md->OVERLAP == 1) && (picLayerHeader->PQUANT <= 8))
{
VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
if (picLayerHeader->CONDOVER)
{
VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
if (! picLayerHeader->CONDOVER)
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_ALL;
else
{
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_SOME;
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB,
md->heightMB, BPP_OVERFLAGS)) != VC1_STATUS_OK)
{
return status;
}
}
}
else
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_NONE;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
if (picLayerHeader->TRANSACFRM)
{
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
picLayerHeader->TRANSACFRM += 2;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
if (picLayerHeader->TRANSACFRM2)
{
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
picLayerHeader->TRANSACFRM2 += 2;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
status = vc1_VOPDQuant(ctxt, pInfo);
/* Skip parsing of macroblock layer. */
return status;
}
/*------------------------------------------------------------------------------
* Parse picture layer. This function parses interlace I or BI field for
* advanced profile bitstream.
* Table 87 of SMPTE 421M after processing up to BFRACTION by
* vc1_ParseFieldHeader_Adv() but stopping before processing of macroblock
* layer.
*------------------------------------------------------------------------------
*/
vc1_Status vc1_ParseFieldHeader_InterlaceIpicture_Adv(void* ctxt, vc1_Info *pInfo)
{
uint32_t tempValue;
vc1_Status status = VC1_STATUS_OK;
vc1_metadata_t *md = &pInfo->metadata;
vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
// Reset MVMODE when the second field is an I picture
// to avoid carrying forward the mvmode values from previous field
// especially the intensity compensation value
picLayerHeader->MVMODE = 0;
VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK) {
DEB("Error parsing I field \n");
return status;
}
if (picLayerHeader->PQINDEX <= 8)
{
VC1_GET_BITS9(1, picLayerHeader->HALFQP);
}
else
picLayerHeader->HALFQP = 0;
if (md->QUANTIZER == 1) {
VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
}
if (md->POSTPROCFLAG == 1)
VC1_GET_BITS9(2, tempValue); /* POSTPROC. */
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB, (md->heightMB+1)/2, BPP_ACPRED)) !=
VC1_STATUS_OK)
{
DEB("Error parsing I field \n");
return status;
}
if ((md->OVERLAP == 1) && (picLayerHeader->PQUANT <= 8))
{
VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
if (picLayerHeader->CONDOVER)
{
VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
if (! picLayerHeader->CONDOVER)
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_ALL;
else
{
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_SOME;
if ((status = vc1_DecodeBitplane(ctxt, pInfo,
md->widthMB,
(md->heightMB+1)/2, BPP_OVERFLAGS)) !=
VC1_STATUS_OK)
{
DEB("Error parsing I field \n");
return status;
}
}
}
else
picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_NONE;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
if (picLayerHeader->TRANSACFRM)
{
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
picLayerHeader->TRANSACFRM += 2;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
if (picLayerHeader->TRANSACFRM2)
{
VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
picLayerHeader->TRANSACFRM2 += 2;
}
VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
status = vc1_VOPDQuant(ctxt, pInfo);
if (status != VC1_STATUS_OK) {
DEB("Error parsing I field \n");
return status;
}
/* Skip parsing of macroblock layer. */
return status;
}