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 simple
10//  or main 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 main
19 * profile bitstream.  This parser starts after PTYPE was parsed but stops
20 * before parsing of macroblock layer.
21 * Table 21 of SMPTE 421M after processing up to PTYPE for B picture.
22 *------------------------------------------------------------------------------
23 */
24
25vc1_Status vc1_ParsePictureHeader_ProgressiveBpicture(void* ctxt, vc1_Info *pInfo)
26{
27    vc1_Status status = VC1_STATUS_OK;
28    vc1_metadata_t *md = &pInfo->metadata;
29    vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
30
31    if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
32        &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN)) !=
33        VC1_STATUS_OK)
34    {
35        return status;
36    }
37
38    VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
39    if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
40        return status;
41
42    if (picLayerHeader->PQINDEX <= 8)
43    {
44        VC1_GET_BITS9(1, picLayerHeader->HALFQP);
45    }
46    else picLayerHeader->HALFQP=0;
47
48    if (md->QUANTIZER == 1)
49    {
50        VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
51    }
52
53    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
54        return status;
55
56    VC1_GET_BITS9(1, picLayerHeader->MVMODE);
57    picLayerHeader->MVMODE = (picLayerHeader->MVMODE == 1) ?
58        VC1_MVMODE_1MV : VC1_MVMODE_HPELBI_1MV;
59
60    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
61        md->widthMB, md->heightMB, BPP_DIRECTMB)) != VC1_STATUS_OK)
62    {
63        return VC1_STATUS_OK;
64    }
65
66    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
67        md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
68    {
69        return status;
70    }
71
72    VC1_GET_BITS9(2, picLayerHeader->MVTAB);
73    VC1_GET_BITS9(2, picLayerHeader->CBPTAB);
74
75    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
76        return status;
77
78    if (md->VSTRANSFORM == 1)
79    {
80        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
81        if (picLayerHeader->TTMBF)
82        {
83            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
84        }
85    }
86
87    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
88    if (picLayerHeader->TRANSACFRM == 1)
89    {
90        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
91        picLayerHeader->TRANSACFRM += 2;
92    }
93
94    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
95
96    /* Skip parsing of macroblock layer. */
97
98    return status;
99}
100
101