/* ///////////////////////////////////////////////////////////////////////
//
//               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 P picture in advanced
//  profile bitstream.
//
*/

#include "vc1parse.h"
#include "viddec_fw_debug.h"
/*------------------------------------------------------------------------------
 * Parse picture layer.  This function parses progressive P picture for advanced
 * profile bitstream.
 * Table 20 of SMPTE 421M after processing up to POSTPROC by
 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
 * layer.
 *------------------------------------------------------------------------------
 */

vc1_Status vc1_ParsePictureHeader_ProgressivePpicture_Adv(void* ctxt, vc1_Info *pInfo)
{
    uint8_t bit_count;
    const uint8_t *table;
    vc1_Status status = VC1_STATUS_OK;
    vc1_metadata_t *md = &pInfo->metadata;
    vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;

    /* MVRANGE. */
    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    if (picLayerHeader->PQUANT > 12)
        table = VC1_MVMODE_LOW_TBL;
    else
        table = VC1_MVMODE_HIGH_TBL;

    bit_count = 0;
    VC1_GET_BITS9(1, picLayerHeader->MVMODE);
    while ((picLayerHeader->MVMODE == 0) && (bit_count < 3))
    {
        VC1_GET_BITS9(1, picLayerHeader->MVMODE);
        bit_count++;
    }
    if (bit_count == 3)
        bit_count += picLayerHeader->MVMODE;
    picLayerHeader->MVMODE = table[bit_count];

    if (picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP)
    {
        bit_count = 0;
        VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
        while ((picLayerHeader->MVMODE2 == 0) && (bit_count < 2))
        {
            VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
            bit_count++;
        }
        if (bit_count == 2 && picLayerHeader->MVMODE2 == 0)
            bit_count++;
        picLayerHeader->MVMODE2 = table[bit_count];
        VC1_GET_BITS9(6, picLayerHeader->LUMSCALE);
        VC1_GET_BITS9(6, picLayerHeader->LUMSHIFT);
        md->LUMSCALE2 = picLayerHeader->LUMSCALE;
        md->LUMSHIFT2 = picLayerHeader->LUMSHIFT;
    }
    else
#ifdef VBP    
		picLayerHeader->MVMODE2 = 0;
#else		
        picLayerHeader->MVMODE2 = picLayerHeader->MVMODE;
#endif

    if ((picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) ||
        ((picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP) &&
         (picLayerHeader->MVMODE2 == VC1_MVMODE_MIXED_MV)))
    {
        if ((status = vc1_DecodeBitplane(ctxt, pInfo,
            md->widthMB, md->heightMB, BPP_MVTYPEMB)) !=
            VC1_STATUS_OK)
        {
            return status;
        }
    }

    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
        md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
    {
        return status;
    }

    VC1_GET_BITS9(2, picLayerHeader->MVTAB);
    VC1_GET_BITS9(2, picLayerHeader->CBPTAB);

    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    if (md->VSTRANSFORM == 1)
    {
        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
        if (picLayerHeader->TTMBF == 1)
        {
            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
        }
    }

    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
    if (picLayerHeader->TRANSACFRM == 1)
    {
        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
        picLayerHeader->TRANSACFRM += 2;
    }

    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);

    /* Skip parsing of macroblock layer. */

    return status;
}

/*------------------------------------------------------------------------------
 * Parse picture layer.  This function parses interlace P frame for advanced
 * profile bitstream.
 * Table 83 of SMPTE 421M after processing up to POSTPROC by
 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
 * layer.
 *------------------------------------------------------------------------------
 */

vc1_Status vc1_ParsePictureHeader_InterlacePpicture_Adv(void* ctxt, vc1_Info *pInfo)
{
    vc1_Status status = VC1_STATUS_OK;
    vc1_metadata_t *md = &pInfo->metadata;
    vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;

    /* MVRANGE. */
    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    /* DMVRANGE. */
    if ((status = vc1_DMVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    VC1_GET_BITS9(1, picLayerHeader->MV4SWITCH);

    VC1_GET_BITS9(1, picLayerHeader->INTCOMP);
    if (picLayerHeader->INTCOMP)
    {
        VC1_GET_BITS9(6, picLayerHeader->LUMSCALE);
        VC1_GET_BITS9(6, picLayerHeader->LUMSHIFT);
        md->LUMSCALE2 = picLayerHeader->LUMSCALE;
        md->LUMSHIFT2 = picLayerHeader->LUMSHIFT;
    }

    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
        md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
    {
        return status;
    }

    VC1_GET_BITS9(2, picLayerHeader->MBMODETAB);
    VC1_GET_BITS9(2, picLayerHeader->MVTAB); /* IMVTAB. */
    VC1_GET_BITS9(3, picLayerHeader->CBPTAB); /* ICBPTAB. */
    VC1_GET_BITS9(2, picLayerHeader->MV2BPTAB); /* 2MVBPTAB. */

    if (picLayerHeader->MV4SWITCH == 1)
    {
        VC1_GET_BITS9(2, picLayerHeader->MV4BPTAB); /* 4MVBPTAB. */
    }

    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    if (md->VSTRANSFORM == 1)
    {
        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
        if (picLayerHeader->TTMBF == 1)
        {
            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
        }
    }

    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
    if (picLayerHeader->TRANSACFRM == 1)
    {
        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
        picLayerHeader->TRANSACFRM += 2;
    }

    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);

    /* Skip parsing of macroblock layer. */

    return status;
}

/*------------------------------------------------------------------------------
 * Parse picture layer.  This function parses interlace P field for advanced
 * profile bitstream.
 * Table 88 of SMPTE 421M after processing up to BFRACTION by
 * vc1_ParseFieldHeader_Adv() but stopping before processing of macroblock
 * layer.
 *------------------------------------------------------------------------------
 */

vc1_Status vc1_ParseFieldHeader_InterlacePpicture_Adv(void* ctxt, vc1_Info *pInfo)
{
    uint8_t bit_count;
    const uint8_t *table;
    vc1_Status status = VC1_STATUS_OK;
    vc1_metadata_t *md = &pInfo->metadata;
    vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
   

    VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
    if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
        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, picLayerHeader->POSTPROC);
    }

    VC1_GET_BITS9(1, picLayerHeader->NUMREF);
   
    if (picLayerHeader->NUMREF == 0)
    {
        VC1_GET_BITS9(1, picLayerHeader->REFFIELD);
    }

    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK) {
        DEB("Error in vc1_MVRangeDecode \n");
        return status;
    }

    if ((status = vc1_DMVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    if (picLayerHeader->PQUANT > 12)
        table = VC1_MVMODE_LOW_TBL;
    else
        table = VC1_MVMODE_HIGH_TBL;

    bit_count = 0;
    VC1_GET_BITS9(1, picLayerHeader->MVMODE);
    while ((picLayerHeader->MVMODE == 0) && (bit_count < 2))
    {
        VC1_GET_BITS9(1, picLayerHeader->MVMODE);
        bit_count++;
    }
    if (bit_count == 2 && picLayerHeader->MVMODE == 0) {
        VC1_GET_BITS9(1, picLayerHeader->MVMODE);

        if ( picLayerHeader->MVMODE == 1)
            bit_count ++;

        bit_count++;
    }
    picLayerHeader->MVMODE = table[bit_count];

    if (picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP)
    {
        bit_count = 0;
        VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
        while ((picLayerHeader->MVMODE2 == 0) && (bit_count < 2))
        {
            VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
            bit_count++;
        }
        if (bit_count == 2 && picLayerHeader->MVMODE2 == 0)
            bit_count++;
        picLayerHeader->MVMODE2 = table[bit_count];

        VC1_GET_BITS9(1, md->INTCOMPFIELD);
        if (md->INTCOMPFIELD == 1)
            md->INTCOMPFIELD = VC1_INTCOMP_BOTH_FIELD;
        else
        {
            VC1_GET_BITS9(1, md->INTCOMPFIELD);
            if(md->INTCOMPFIELD == 1)
                md->INTCOMPFIELD = VC1_INTCOMP_BOTTOM_FIELD;
            else
                md->INTCOMPFIELD = VC1_INTCOMP_TOP_FIELD;
        }
        VC1_GET_BITS9(6, picLayerHeader->LUMSCALE); /* LUMSCALE1. */
        VC1_GET_BITS9(6, picLayerHeader->LUMSHIFT); /* LUMSHIFT1. */
        if ( md->INTCOMPFIELD == VC1_INTCOMP_BOTTOM_FIELD ) {
            md->LUMSCALE2 = picLayerHeader->LUMSCALE;
            md->LUMSHIFT2 = picLayerHeader->LUMSHIFT;
        }
        if (md->INTCOMPFIELD == VC1_INTCOMP_BOTH_FIELD)
        {
            VC1_GET_BITS9(6, md->LUMSCALE2);
            VC1_GET_BITS9(6, md->LUMSHIFT2);
        }
    }
    else
#ifdef VBP    
		picLayerHeader->MVMODE2 = 0;
#else		
        picLayerHeader->MVMODE2 = picLayerHeader->MVMODE;
#endif        

    VC1_GET_BITS9(3, picLayerHeader->MBMODETAB);

    if (picLayerHeader->NUMREF)
    {
        VC1_GET_BITS9(3, picLayerHeader->MVTAB); /* IMVTAB. */
    }
    else
    {
        VC1_GET_BITS9(2, picLayerHeader->MVTAB); /* IMVTAB. */
    }

    VC1_GET_BITS9(3, picLayerHeader->CBPTAB); /* ICBPTAB. */

#ifdef VBP
	if (picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV)
#else	
    if (picLayerHeader->MVMODE2 == VC1_MVMODE_MIXED_MV)
#endif    
    {
        VC1_GET_BITS9(2, picLayerHeader->MV4BPTAB); /* 4MVBPTAB. */
    }

    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
        return status;

    if (md->VSTRANSFORM == 1)
    {
        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
        if (picLayerHeader->TTMBF == 1)
        {
            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
        }
    }

    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
    if (picLayerHeader->TRANSACFRM == 1)
    {
        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
        picLayerHeader->TRANSACFRM += 2;
    }
    picLayerHeader->TRANSACFRM2 = 0;

    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);

    /* Skip parsing of macroblock layer. */

    return status;
}
