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 advanced
10//  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 advanced
19 * profile bitstream.
20 * Table 22 of SMPTE 421M after processing up to POSTPROC by
21 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
22 * layer.
23 *------------------------------------------------------------------------------
24 */
25
26vc1_Status vc1_ParsePictureHeader_ProgressiveBpicture_Adv(void* ctxt, vc1_Info *pInfo)
27{
28    vc1_Status status = VC1_STATUS_OK;
29    vc1_metadata_t *md = &pInfo->metadata;
30    vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
31
32    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
33        return status;
34
35    VC1_GET_BITS9(1, picLayerHeader->MVMODE);
36    picLayerHeader->MVMODE = (picLayerHeader->MVMODE == 1) ?
37        VC1_MVMODE_1MV : VC1_MVMODE_HPELBI_1MV;
38
39    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
40        md->widthMB, md->heightMB, BPP_DIRECTMB)) != VC1_STATUS_OK)
41    {
42        return status;
43    }
44
45    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
46        md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
47    {
48        return status;
49    }
50
51    VC1_GET_BITS9(2, picLayerHeader->MVTAB);
52    VC1_GET_BITS9(2, picLayerHeader->CBPTAB);
53
54    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
55        return status;
56
57    if (md->VSTRANSFORM == 1)
58    {
59        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
60        if (picLayerHeader->TTMBF == 1)
61        {
62            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
63        }
64    }
65
66    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
67    if (picLayerHeader->TRANSACFRM == 1)
68    {
69        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
70        picLayerHeader->TRANSACFRM += 2;
71    }
72
73    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
74
75    /* Skip parsing of macroblock layer. */
76
77    return status;
78}
79
80/*------------------------------------------------------------------------------
81 * Parse picture layer.  This function parses interlace B frame for advanced
82 * profile bitstream.
83 * Table 84 of SMPTE 421M after processing up to POSTPROC by
84 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
85 * layer.
86 *------------------------------------------------------------------------------
87 */
88
89vc1_Status vc1_ParsePictureHeader_InterlaceBpicture_Adv(void* ctxt, vc1_Info *pInfo)
90{
91    vc1_Status status = VC1_STATUS_OK;
92    vc1_metadata_t *md = &pInfo->metadata;
93    vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
94
95    if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
96                                        &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN)) !=
97        VC1_STATUS_OK)
98    {
99        return status;
100    }
101
102    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
103        return status;
104
105    if ((status = vc1_DMVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
106        return status;
107
108    VC1_GET_BITS9(1, picLayerHeader->INTCOMP);
109
110    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
111        md->widthMB, md->heightMB, BPP_DIRECTMB)) != VC1_STATUS_OK)
112    {
113        return status;
114    }
115
116    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
117        md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
118    {
119        return status;
120    }
121
122    // EPC picLayerHeader->MVMODE = VC1_MVMODE_1MV;
123    VC1_GET_BITS9(2, picLayerHeader->MBMODETAB);
124    VC1_GET_BITS9(2, picLayerHeader->MVTAB); /* IMVTAB. */
125    VC1_GET_BITS9(3, picLayerHeader->CBPTAB); /* ICBPTAB. */
126    VC1_GET_BITS9(2, picLayerHeader->MV2BPTAB); /* 2MVBPTAB. */
127    VC1_GET_BITS9(2, picLayerHeader->MV4BPTAB); /* 4MVBPTAB. */
128
129    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
130        return status;
131
132    if (md->VSTRANSFORM == 1)
133    {
134        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
135        if (picLayerHeader->TTMBF == 1)
136        {
137            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
138        }
139    }
140
141    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
142    if (picLayerHeader->TRANSACFRM == 1)
143    {
144        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
145        picLayerHeader->TRANSACFRM += 2;
146    }
147
148    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
149
150    /* Skip parsing of macroblock layer. */
151
152    return status;
153}
154
155/*------------------------------------------------------------------------------
156 * Parse picture layer.  This function parses interlace B field for advanced
157 * profile bitstream.
158 * Table 89 of SMPTE 421M after processing up to BFRACTION by
159 * vc1_ParseFieldHeader_Adv() but stopping before processing of macroblock
160 * layer.
161 *------------------------------------------------------------------------------
162 */
163
164vc1_Status vc1_ParseFieldHeader_InterlaceBpicture_Adv(void* ctxt, vc1_Info *pInfo)
165{
166    uint8_t bit_count;
167    const uint8_t *table;
168    vc1_Status status = VC1_STATUS_OK;
169    vc1_metadata_t *md = &pInfo->metadata;
170    vc1_PictureLayerHeader* picLayerHeader = &pInfo->picLayerHeader;
171
172    VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
173
174    if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
175        return status;
176
177    if (picLayerHeader->PQINDEX <= 8)
178    {
179        VC1_GET_BITS9(1, picLayerHeader->HALFQP);
180    }
181    else
182        picLayerHeader->HALFQP = 0;
183
184    if (md->QUANTIZER == 1)
185    {
186        VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
187        picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
188    }
189
190    if (md->POSTPROCFLAG == 1)
191    {
192        VC1_GET_BITS9(2, picLayerHeader->POSTPROC);
193    }
194
195    if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
196        return status;
197
198    if ((status = vc1_DMVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
199        return status;
200
201    if (picLayerHeader->PQUANT > 12)
202        table = VC1_MVMODE_LOW_TBL;
203    else
204        table = VC1_MVMODE_HIGH_TBL;
205
206    bit_count = 0;
207    VC1_GET_BITS9(1, picLayerHeader->MVMODE);
208    while ((picLayerHeader->MVMODE == 0) && (bit_count < 2))
209    {
210        VC1_GET_BITS9(1, picLayerHeader->MVMODE);
211        bit_count++;
212    }
213    if ((bit_count == 2) && (picLayerHeader->MVMODE == 0))
214        bit_count++;
215    picLayerHeader->MVMODE = table[bit_count];
216
217    if ((status = vc1_DecodeBitplane(ctxt, pInfo,
218	md->widthMB, (md->heightMB+1)/2, BPP_FORWARDMB)) !=
219	VC1_STATUS_OK)
220    {
221        return status;
222    }
223
224    VC1_GET_BITS9(3, picLayerHeader->MBMODETAB);
225    VC1_GET_BITS9(3, picLayerHeader->MVTAB); /* IMVTAB. */
226    VC1_GET_BITS9(3, picLayerHeader->CBPTAB); /* ICBPTAB. */
227
228    if (picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV)
229    {
230        VC1_GET_BITS9(2, picLayerHeader->MV4BPTAB); /* 4MVBPTAB. */
231    }
232
233    if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
234        return status;
235
236    if (md->VSTRANSFORM == 1)
237    {
238        VC1_GET_BITS9(1, picLayerHeader->TTMBF);
239        if (picLayerHeader->TTMBF == 1)
240        {
241            VC1_GET_BITS9(2, picLayerHeader->TTFRM);
242        }
243    }
244
245    VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
246    if (picLayerHeader->TRANSACFRM == 1)
247    {
248        VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
249        picLayerHeader->TRANSACFRM += 2;
250    }
251
252    VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
253
254    /* Skip parsing of macroblock layer. */
255
256    return status;
257}
258