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