blob: 87f84265bbfc5f0a63318e20f3ca44133065be77 [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 simple and main profiles.
//
*/
#include "vc1parse.h"
/*------------------------------------------------------------------------------
* Parse picture layer. This function parses the picture header for simple or
* main profile down to macroblock layer.
* Table 16 of SMPTE 421M after processing up to PTYPE for I picture.
* Table 17 of SMPTE 421M after processing up to PTYPE for BI picture.
* Table 19 of SMPTE 421M after processing up to PTYPE for P picture.
* Table 21 of SMPTE 421M after processing up to PTYPE for B picture.
*------------------------------------------------------------------------------
*/
vc1_Status vc1_ParsePictureHeader(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;
int32_t result;
if (md->PROFILE != VC1_PROFILE_ADVANCED)
{
// As per spec, for main/simple profile, if the size of the coded picture is <= 1B,
// it shall be treated as a skipped frame.
// In content with skipped frames, the data is "00".
// rcv to vc1 conversion process adds an additional byte (0x80) to the picture, hence
// the data looks like "00 80"
// Hence if data is <= 2B, we will consider it skipped (check for 16+1b, if it fails, the frame is skipped).
result = viddec_pm_peek_bits(ctxt, &tempValue, 17);
if (result == -1)
{
picLayerHeader->PTYPE = VC1_SKIPPED_FRAME;
return status;
}
}
if (md->FINTERPFLAG == 1)
{
VC1_GET_BITS9(1, tempValue); /* INTERPFRM. */
}
VC1_GET_BITS9(2, tempValue); /* FRMCNT. */
if (md->RANGERED == 1)
{
VC1_GET_BITS9(1, picLayerHeader->RANGEREDFRM);
}
if (md->MAXBFRAMES == 0)
{
VC1_GET_BITS9(1, picLayerHeader->PTYPE);
if (picLayerHeader->PTYPE == 0)
picLayerHeader->PTYPE = VC1_I_FRAME;
else
picLayerHeader->PTYPE = VC1_P_FRAME;
}
else
{
VC1_GET_BITS9(1, picLayerHeader->PTYPE);
if (picLayerHeader->PTYPE == 0)
{
VC1_GET_BITS9(1, picLayerHeader->PTYPE);
if (picLayerHeader->PTYPE == 0) {
picLayerHeader->PTYPE = VC1_B_FRAME; /* Or VC1_BI_FRAME. */
/* if peek(7) = 0b1111111 then ptype = bi */
VC1_PEEK_BITS( 7, tempValue );
if ( tempValue == 0x7f )
picLayerHeader->PTYPE = VC1_BI_FRAME;
} else
picLayerHeader->PTYPE = VC1_I_FRAME;
}
else
picLayerHeader->PTYPE = VC1_P_FRAME;
}
if (picLayerHeader->PTYPE == VC1_I_FRAME ||
picLayerHeader->PTYPE == VC1_BI_FRAME)
{
status = vc1_ParsePictureHeader_ProgressiveIpicture(ctxt, pInfo);
}
else if (picLayerHeader->PTYPE == VC1_P_FRAME)
status = vc1_ParsePictureHeader_ProgressivePpicture(ctxt, pInfo);
else if (picLayerHeader->PTYPE == VC1_B_FRAME)
status = vc1_ParsePictureHeader_ProgressiveBpicture(ctxt, pInfo);
else
status = VC1_STATUS_PARSE_ERROR;
return status;
}