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 P picture in simple
10 // or main profile bitstream.
11 //
12 */
13
14 #include "vc1parse.h"
15
16 /*------------------------------------------------------------------------------
17 * Parse picture layer. This function parses progressive P picture for simple
18 * or main profile bitstream. This parser starts after PTYPE was parsed but
19 * stops before parsing of macroblock layer.
20 * Table 19 of SMPTE 421M after processing up to PTYPE for P picture.
21 *------------------------------------------------------------------------------
22 */
23
vc1_ParsePictureHeader_ProgressivePpicture(void * ctxt,vc1_Info * pInfo)24 vc1_Status vc1_ParsePictureHeader_ProgressivePpicture(void* ctxt, vc1_Info *pInfo)
25 {
26 uint8_t bit_count;
27 const uint8_t *table;
28 uint32_t tempValue;
29 vc1_Status status = VC1_STATUS_OK;
30 vc1_metadata_t *md = &pInfo->metadata;
31 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
32
33 /* rounding control is implied for simple and main profile, SMPTE 421M 8.3.7.
34 It toggles back and forth between 0 and 1 for P frames */
35 if (md->PROFILE != VC1_PROFILE_ADVANCED)
36 {
37 picLayerHeader->RNDCTRL = md->RNDCTRL ^ 1 ;
38 md->RNDCTRL = picLayerHeader->RNDCTRL;
39 }
40
41 VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
42 if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
43 return status;
44
45 if (picLayerHeader->PQINDEX <= 8)
46 {
47 VC1_GET_BITS9(1, picLayerHeader->HALFQP);
48 }
49 else picLayerHeader->HALFQP=0;
50
51 if (md->QUANTIZER == 1)
52 {
53 VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
54 picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
55 }
56
57 /* MVRANGE. */
58 if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
59 return status;
60
61 if (md->MULTIRES == 1)
62 VC1_GET_BITS9(2, tempValue); /* RESPIC. */
63
64 if (picLayerHeader->PQUANT > 12)
65 table = VC1_MVMODE_LOW_TBL;
66 else
67 table = VC1_MVMODE_HIGH_TBL;
68
69 bit_count = 0;
70 VC1_GET_BITS9(1, picLayerHeader->MVMODE);
71 while ((picLayerHeader->MVMODE == 0) && (bit_count < 3))
72 {
73 VC1_GET_BITS9(1, picLayerHeader->MVMODE);
74 bit_count++;
75 }
76 if (bit_count == 3)
77 bit_count += picLayerHeader->MVMODE;
78 picLayerHeader->MVMODE = table[bit_count];
79
80 if (picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP)
81 {
82 bit_count = 0;
83 VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
84 while ((picLayerHeader->MVMODE2 == 0) && (bit_count < 2))
85 {
86 VC1_GET_BITS9(1, picLayerHeader->MVMODE2);
87 bit_count++;
88 }
89 if (bit_count == 2 && picLayerHeader->MVMODE2 == 0)
90 bit_count++;
91 picLayerHeader->MVMODE2 = table[bit_count];
92 VC1_GET_BITS9(6, picLayerHeader->LUMSCALE);
93 VC1_GET_BITS9(6, picLayerHeader->LUMSHIFT);
94 }
95 #ifdef VBP
96 else
97 picLayerHeader->MVMODE2 = 0;
98 #else
99 else
100 picLayerHeader->MVMODE2 = picLayerHeader->MVMODE;
101 #endif
102
103 if ((picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV) ||
104 ((picLayerHeader->MVMODE == VC1_MVMODE_INTENSCOMP) &&
105 (picLayerHeader->MVMODE2 == VC1_MVMODE_MIXED_MV)))
106 {
107 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
108 md->widthMB, md->heightMB, BPP_MVTYPEMB))
109 != VC1_STATUS_OK)
110 {
111 return status;
112 }
113 }
114
115 if ((status = vc1_DecodeBitplane(ctxt, pInfo,
116 md->widthMB, md->heightMB, BPP_SKIPMB)) != VC1_STATUS_OK)
117 {
118 return status;
119 }
120
121 VC1_GET_BITS9(2, picLayerHeader->MVTAB);
122 VC1_GET_BITS9(2, picLayerHeader->CBPTAB);
123
124 if ((status = vc1_VOPDQuant(ctxt, pInfo)) != VC1_STATUS_OK)
125 return status;
126
127 if (md->VSTRANSFORM == 1)
128 {
129 VC1_GET_BITS9(1, picLayerHeader->TTMBF);
130 if (picLayerHeader->TTMBF == 1)
131 {
132 VC1_GET_BITS9(2, picLayerHeader->TTFRM);
133 }
134 }
135
136 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
137 if (picLayerHeader->TRANSACFRM == 1)
138 {
139 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
140 picLayerHeader->TRANSACFRM += 2;
141 }
142
143 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
144
145 /* Skip parsing of macroblock layer. */
146
147 return status;
148 }
149
150