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 I or BI picture in
10 // advanced profile bitstream.
11 //
12 */
13
14 #include "vc1parse.h"
15 #include "viddec_fw_debug.h"
16 /*------------------------------------------------------------------------------
17 * Parse picture layer. This function parses progressive I or BI picture for
18 * advanced profile bitstream.
19 * Table 18 of SMPTE 421M after processing up to POSTPROC by
20 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
21 * layer.
22 *------------------------------------------------------------------------------
23 */
24
vc1_ParsePictureHeader_ProgressiveIpicture_Adv(void * ctxt,vc1_Info * pInfo)25 vc1_Status vc1_ParsePictureHeader_ProgressiveIpicture_Adv(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_DecodeBitplane(ctxt, pInfo,
32 md->widthMB, md->heightMB, BPP_ACPRED)) != VC1_STATUS_OK)
33 {
34 return status;
35 }
36
37 if ((md->OVERLAP == 1) && (picLayerHeader->PQUANT <= 8))
38 {
39 VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
40 if (picLayerHeader->CONDOVER)
41 {
42 VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
43 if (! picLayerHeader->CONDOVER)
44 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_ALL;
45 else
46 {
47 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_SOME;
48 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
49 md->widthMB,
50 md->heightMB, BPP_OVERFLAGS)) != VC1_STATUS_OK)
51 {
52 return status;
53 }
54 }
55 }
56 else
57 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_NONE;
58 }
59
60 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
61 if (picLayerHeader->TRANSACFRM)
62 {
63 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
64 picLayerHeader->TRANSACFRM += 2;
65 }
66
67 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
68 if (picLayerHeader->TRANSACFRM2)
69 {
70 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
71 picLayerHeader->TRANSACFRM2 += 2;
72 }
73
74 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
75
76 status = vc1_VOPDQuant(ctxt, pInfo);
77
78 /* Skip parsing of macroblock layer. */
79
80 return status;
81 }
82
83 /*------------------------------------------------------------------------------
84 * Parse picture layer. This function parses interlace I or BI frame for
85 * advanced profile bitstream.
86 * Table 82 of SMPTE 421M after processing up to POSTPROC by
87 * vc1_ParsePictureHeader_Adv() but stopping before processing of macroblock
88 * layer.
89 *------------------------------------------------------------------------------
90 */
91
vc1_ParsePictureHeader_InterlaceIpicture_Adv(void * ctxt,vc1_Info * pInfo)92 vc1_Status vc1_ParsePictureHeader_InterlaceIpicture_Adv(void* ctxt, vc1_Info *pInfo)
93 {
94 vc1_Status status = VC1_STATUS_OK;
95 vc1_metadata_t *md = &pInfo->metadata;
96 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
97
98 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
99 md->widthMB, md->heightMB, BPP_FIELDTX)) != VC1_STATUS_OK)
100 {
101 return status;
102 }
103
104 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
105 md->widthMB, md->heightMB, BPP_ACPRED)) != VC1_STATUS_OK)
106 {
107 return status;
108 }
109
110 if ((md->OVERLAP == 1) && (picLayerHeader->PQUANT <= 8))
111 {
112 VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
113 if (picLayerHeader->CONDOVER)
114 {
115 VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
116 if (! picLayerHeader->CONDOVER)
117 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_ALL;
118 else
119 {
120 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_SOME;
121 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
122 md->widthMB,
123 md->heightMB, BPP_OVERFLAGS)) != VC1_STATUS_OK)
124 {
125 return status;
126 }
127 }
128 }
129 else
130 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_NONE;
131 }
132
133 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
134 if (picLayerHeader->TRANSACFRM)
135 {
136 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
137 picLayerHeader->TRANSACFRM += 2;
138 }
139
140 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
141 if (picLayerHeader->TRANSACFRM2)
142 {
143 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
144 picLayerHeader->TRANSACFRM2 += 2;
145 }
146
147 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
148
149 status = vc1_VOPDQuant(ctxt, pInfo);
150
151 /* Skip parsing of macroblock layer. */
152
153 return status;
154 }
155
156 /*------------------------------------------------------------------------------
157 * Parse picture layer. This function parses interlace I or BI field for
158 * advanced profile bitstream.
159 * Table 87 of SMPTE 421M after processing up to BFRACTION by
160 * vc1_ParseFieldHeader_Adv() but stopping before processing of macroblock
161 * layer.
162 *------------------------------------------------------------------------------
163 */
164
vc1_ParseFieldHeader_InterlaceIpicture_Adv(void * ctxt,vc1_Info * pInfo)165 vc1_Status vc1_ParseFieldHeader_InterlaceIpicture_Adv(void* ctxt, vc1_Info *pInfo)
166 {
167 uint32_t tempValue;
168 vc1_Status status = VC1_STATUS_OK;
169 vc1_metadata_t *md = &pInfo->metadata;
170 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
171
172 // Reset MVMODE when the second field is an I picture
173 // to avoid carrying forward the mvmode values from previous field
174 // especially the intensity compensation value
175 picLayerHeader->MVMODE = 0;
176
177 VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
178 if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK) {
179 DEB("Error parsing I field \n");
180 return status;
181 }
182
183 if (picLayerHeader->PQINDEX <= 8)
184 {
185 VC1_GET_BITS9(1, picLayerHeader->HALFQP);
186 }
187 else
188 picLayerHeader->HALFQP = 0;
189
190 if (md->QUANTIZER == 1) {
191 VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
192 picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
193 }
194
195 if (md->POSTPROCFLAG == 1)
196 VC1_GET_BITS9(2, tempValue); /* POSTPROC. */
197
198 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
199 md->widthMB, (md->heightMB+1)/2, BPP_ACPRED)) !=
200 VC1_STATUS_OK)
201 {
202 DEB("Error parsing I field \n");
203 return status;
204 }
205
206 if ((md->OVERLAP == 1) && (picLayerHeader->PQUANT <= 8))
207 {
208 VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
209 if (picLayerHeader->CONDOVER)
210 {
211 VC1_GET_BITS9(1, picLayerHeader->CONDOVER);
212 if (! picLayerHeader->CONDOVER)
213 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_ALL;
214 else
215 {
216 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_SOME;
217
218 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
219 md->widthMB,
220 (md->heightMB+1)/2, BPP_OVERFLAGS)) !=
221 VC1_STATUS_OK)
222 {
223 DEB("Error parsing I field \n");
224 return status;
225 }
226 }
227 }
228 else
229 picLayerHeader->CONDOVER = VC1_CONDOVER_FLAG_NONE;
230 }
231
232 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
233 if (picLayerHeader->TRANSACFRM)
234 {
235 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
236 picLayerHeader->TRANSACFRM += 2;
237 }
238
239 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
240 if (picLayerHeader->TRANSACFRM2)
241 {
242 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
243 picLayerHeader->TRANSACFRM2 += 2;
244 }
245
246 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
247
248 status = vc1_VOPDQuant(ctxt, pInfo);
249 if (status != VC1_STATUS_OK) {
250 DEB("Error parsing I field \n");
251 return status;
252 }
253
254 /* Skip parsing of macroblock layer. */
255
256 return status;
257 }
258