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 picture in simple
10 // or main profile bitstream or progressive BI picture in main profile
11 // bitstream.
12 //
13 */
14
15 #include "vc1parse.h"
16
17 /*------------------------------------------------------------------------------
18 * Parse picture layer. This function parses progressive I picture for simple
19 * or main profile bitstream or progressive BI picture in main profile
20 * bitstream. This parser starts after PTYPE was parsed but stops before
21 * parsing of macroblock layer.
22 * Table 16 of SMPTE 421M after processing up to PTYPE for I picture.
23 * Table 17 of SMPTE 421M after processing up to PTYPE for BI picture.
24 *------------------------------------------------------------------------------
25 */
26
vc1_ParsePictureHeader_ProgressiveIpicture(void * ctxt,vc1_Info * pInfo)27 vc1_Status vc1_ParsePictureHeader_ProgressiveIpicture(void* ctxt, vc1_Info *pInfo)
28 {
29 uint32_t tempValue;
30 vc1_Status status = VC1_STATUS_OK;
31 vc1_metadata_t *md = &pInfo->metadata;
32 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
33
34 /* rounding control is implied for simple and main profile, SMPTE 421M 8.3.7.
35 For each I or BI frame, RND shall be set to 1 */
36 if (md->PROFILE != VC1_PROFILE_ADVANCED)
37 {
38 picLayerHeader->RNDCTRL = md->RNDCTRL | 1 ;
39 md->RNDCTRL = picLayerHeader->RNDCTRL;
40 }
41
42
43 if (picLayerHeader->PTYPE == VC1_BI_FRAME)
44 {
45 if ((status = vc1_DecodeHuffmanPair(ctxt, VC1_BFRACTION_TBL,
46 &picLayerHeader->BFRACTION_NUM, &picLayerHeader->BFRACTION_DEN))
47 != VC1_STATUS_OK)
48 {
49 return status;
50 }
51 if (picLayerHeader->BFRACTION_DEN != VC1_BFRACTION_BI)
52 return VC1_STATUS_PARSE_ERROR;
53 }
54
55 VC1_GET_BITS9(7, tempValue); /* BF. */
56 VC1_GET_BITS9(5, picLayerHeader->PQINDEX);
57
58 if ((status = vc1_CalculatePQuant(pInfo)) != VC1_STATUS_OK)
59 return status;
60
61 if (picLayerHeader->PQINDEX <= 8)
62 {
63 VC1_GET_BITS9(1, picLayerHeader->HALFQP);
64 }
65 else picLayerHeader->HALFQP=0;
66
67 if (md->QUANTIZER == 1)
68 {
69 VC1_GET_BITS9(1, picLayerHeader->PQUANTIZER);
70 picLayerHeader->UniformQuant = picLayerHeader->PQUANTIZER;
71 }
72
73 /* MVRANGE but only for main profile. */
74 if ((status = vc1_MVRangeDecode(ctxt, pInfo)) != VC1_STATUS_OK)
75 return status;
76
77 if (md->MULTIRES == 1 && picLayerHeader->PTYPE != VC1_BI_FRAME)
78 {
79 VC1_GET_BITS9(2, tempValue); /* RESPIC. */
80 }
81
82 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
83 if (picLayerHeader->TRANSACFRM)
84 {
85 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM);
86 picLayerHeader->TRANSACFRM += 2;
87 }
88
89 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
90 if (picLayerHeader->TRANSACFRM2)
91 {
92 VC1_GET_BITS9(1, picLayerHeader->TRANSACFRM2);
93 picLayerHeader->TRANSACFRM2 += 2;
94 }
95
96 VC1_GET_BITS9(1, picLayerHeader->TRANSDCTAB);
97
98 /* Skip parsing of macroblock layer. */
99
100 return status;
101 }
102