1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Maarten Lankhorst
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christian König
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_video_decoder.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_vlc.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_mpeg12_bitstream.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum {
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dct_End_of_Block = 0xFF,
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dct_Escape = 0xFE,
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dct_DC = 0xFD,
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dct_AC = 0xFC
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dct_coeff
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t length;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t run;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int16_t level;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dct_coeff_compressed
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t bitcode;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dct_coeff coeff;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-1 */
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed macroblock_address_increment[] = {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 1, 1 } },
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6000, { 3, 2 } },
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 3, 3 } },
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3000, { 4, 4 } },
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 4, 5 } },
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 5, 6 } },
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 5, 7 } },
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0e00, { 7, 8 } },
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0c00, { 7, 9 } },
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0b00, { 8, 10 } },
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0a00, { 8, 11 } },
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0900, { 8, 12 } },
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 8, 13 } },
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0700, { 8, 14 } },
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0600, { 8, 15 } },
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x05c0, { 10, 16 } },
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0580, { 10, 17 } },
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0540, { 10, 18 } },
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0500, { 10, 19 } },
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x04c0, { 10, 20 } },
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0480, { 10, 21 } },
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0460, { 11, 22 } },
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0440, { 11, 23 } },
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0420, { 11, 24 } },
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 11, 25 } },
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03e0, { 11, 26 } },
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03c0, { 11, 27 } },
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03a0, { 11, 28 } },
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0380, { 11, 29 } },
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0360, { 11, 30 } },
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0340, { 11, 31 } },
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0320, { 11, 32 } },
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0300, { 11, 33 } }
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Q PIPE_MPEG12_MB_TYPE_QUANT
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define F PIPE_MPEG12_MB_TYPE_MOTION_FORWARD
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define B PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define P PIPE_MPEG12_MB_TYPE_PATTERN
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define I PIPE_MPEG12_MB_TYPE_INTRA
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-2 */
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed macroblock_type_i[] = {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 1, I } },
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 2, Q|I } }
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-3 */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed macroblock_type_p[] = {
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 1, F|P } },
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 2, P } },
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 3, F } },
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 5, I } },
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 5, Q|F|P } },
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 5, Q|P } },
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 6, Q|I } }
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-4 */
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed macroblock_type_b[] = {
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 2, F|B } },
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xC000, { 2, F|B|P } },
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 3, B } },
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6000, { 3, B|P } },
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 4, F } },
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3000, { 4, F|P } },
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 5, I } },
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 5, Q|F|B|P } },
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0C00, { 6, Q|F|P } },
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 6, Q|B|P } },
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 6, Q|I } }
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef Q
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef F
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef B
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef P
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef I
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-9 */
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed coded_block_pattern[] = {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xE000, { 3, 60 } },
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xD000, { 4, 4 } },
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xC000, { 4, 8 } },
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xB000, { 4, 16 } },
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xA000, { 4, 32 } },
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x9800, { 5, 12 } },
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x9000, { 5, 48 } },
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8800, { 5, 20 } },
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 5, 40 } },
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x7800, { 5, 28 } },
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x7000, { 5, 44 } },
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6800, { 5, 52 } },
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6000, { 5, 56 } },
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x5800, { 5, 1 } },
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x5000, { 5, 61 } },
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4800, { 5, 2 } },
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 5, 62 } },
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3C00, { 6, 24 } },
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3800, { 6, 36 } },
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3400, { 6, 3 } },
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3000, { 6, 63 } },
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2E00, { 7, 5 } },
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2C00, { 7, 9 } },
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2A00, { 7, 17 } },
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2800, { 7, 33 } },
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2600, { 7, 6 } },
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2400, { 7, 10 } },
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2200, { 7, 18 } },
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 7, 34 } },
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1F00, { 8, 7 } },
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1E00, { 8, 11 } },
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1D00, { 8, 19 } },
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1C00, { 8, 35 } },
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1B00, { 8, 13 } },
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1A00, { 8, 49 } },
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1900, { 8, 21 } },
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 8, 41 } },
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1700, { 8, 14 } },
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1600, { 8, 50 } },
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1500, { 8, 22 } },
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1400, { 8, 42 } },
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1300, { 8, 15 } },
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1200, { 8, 51 } },
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1100, { 8, 23 } },
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 8, 43 } },
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0F00, { 8, 25 } },
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0E00, { 8, 37 } },
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0D00, { 8, 26 } },
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0C00, { 8, 38 } },
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0B00, { 8, 29 } },
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0A00, { 8, 45 } },
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0900, { 8, 53 } },
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 8, 57 } },
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0700, { 8, 30 } },
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0600, { 8, 46 } },
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0500, { 8, 54 } },
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 8, 58 } },
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0380, { 9, 31 } },
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0300, { 9, 47 } },
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0280, { 9, 55 } },
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0200, { 9, 59 } },
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0180, { 9, 27 } },
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0100, { 9, 39 } },
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0080, { 9, 0 } }
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-10 */
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed motion_code[] = {
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0320, { 11, -16 } },
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0360, { 11, -15 } },
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03a0, { 11, -14 } },
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03e0, { 11, -13 } },
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0420, { 11, -12 } },
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0460, { 11, -11 } },
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x04c0, { 10, -10 } },
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0540, { 10, -9 } },
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x05c0, { 10, -8 } },
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0700, { 8, -7 } },
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0900, { 8, -6 } },
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0b00, { 8, -5 } },
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0e00, { 7, -4 } },
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 5, -3 } },
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3000, { 4, -2 } },
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6000, { 3, -1 } },
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 1, 0 } },
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 3, 1 } },
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 4, 2 } },
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 5, 3 } },
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0c00, { 7, 4 } },
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0a00, { 8, 5 } },
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 8, 6 } },
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0600, { 8, 7 } },
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0580, { 10, 8 } },
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0500, { 10, 9 } },
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0480, { 10, 10 } },
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0440, { 11, 11 } },
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 11, 12 } },
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03c0, { 11, 13 } },
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0380, { 11, 14 } },
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0340, { 11, 15 } },
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0300, { 11, 16 } }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-11 */
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed dmvector[] = {
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0000, { 1, 0 } },
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 2, 1 } },
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xc000, { 2, -1 } }
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-12 */
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed dct_dc_size_luminance[] = {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 3, 0 } },
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0000, { 2, 1 } },
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 2, 2 } },
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xA000, { 3, 3 } },
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xC000, { 3, 4 } },
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xE000, { 4, 5 } },
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF000, { 5, 6 } },
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF800, { 6, 7 } },
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFC00, { 7, 8 } },
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFE00, { 8, 9 } },
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFF00, { 9, 10 } },
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFF80, { 9, 11 } }
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-13 */
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vl_vlc_compressed dct_dc_size_chrominance[] = {
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0000, { 2, 0 } },
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 2, 1 } },
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 2, 2 } },
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xC000, { 3, 3 } },
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xE000, { 4, 4 } },
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF000, { 5, 5 } },
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF800, { 6, 6 } },
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFC00, { 7, 7 } },
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFE00, { 8, 8 } },
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFF00, { 9, 9 } },
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFF80, { 10, 10 } },
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFFC0, { 10, 11 } }
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-14 */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct dct_coeff_compressed dct_coeff_tbl_zero[] = {
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 2, dct_End_of_Block, 0 } },
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 1, dct_DC, 1 } },
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xC000, { 2, dct_AC, 1 } },
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6000, { 3, 1, 1 } },
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 4, 0, 2 } },
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x5000, { 4, 2, 1 } },
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2800, { 5, 0, 3 } },
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3800, { 5, 3, 1 } },
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3000, { 5, 4, 1 } },
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 6, 1, 2 } },
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1C00, { 6, 5, 1 } },
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1400, { 6, 6, 1 } },
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 6, 7, 1 } },
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0C00, { 7, 0, 4 } },
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 7, 2, 2 } },
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0E00, { 7, 8, 1 } },
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0A00, { 7, 9, 1 } },
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 6, dct_Escape, 0 } },
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2600, { 8, 0, 5 } },
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2100, { 8, 0, 6 } },
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2500, { 8, 1, 3 } },
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2400, { 8, 3, 2 } },
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2700, { 8, 10, 1 } },
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2300, { 8, 11, 1 } },
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2200, { 8, 12, 1 } },
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 8, 13, 1 } },
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0280, { 10, 0, 7 } },
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0300, { 10, 1, 4 } },
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x02C0, { 10, 2, 3 } },
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x03C0, { 10, 4, 2 } },
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0240, { 10, 5, 2 } },
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0380, { 10, 14, 1 } },
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0340, { 10, 15, 1 } },
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0200, { 10, 16, 1 } },
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01D0, { 12, 0, 8 } },
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0180, { 12, 0, 9 } },
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0130, { 12, 0, 10 } },
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0100, { 12, 0, 11 } },
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01B0, { 12, 1, 5 } },
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0140, { 12, 2, 4 } },
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01C0, { 12, 3, 3 } },
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0120, { 12, 4, 3 } },
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01E0, { 12, 6, 2 } },
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0150, { 12, 7, 2 } },
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0110, { 12, 8, 2 } },
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01F0, { 12, 17, 1 } },
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01A0, { 12, 18, 1 } },
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0190, { 12, 19, 1 } },
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0170, { 12, 20, 1 } },
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0160, { 12, 21, 1 } },
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00D0, { 13, 0, 12 } },
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00C8, { 13, 0, 13 } },
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00C0, { 13, 0, 14 } },
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00B8, { 13, 0, 15 } },
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00B0, { 13, 1, 6 } },
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00A8, { 13, 1, 7 } },
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00A0, { 13, 2, 5 } },
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0098, { 13, 3, 4 } },
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0090, { 13, 5, 3 } },
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0088, { 13, 9, 2 } },
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0080, { 13, 10, 2 } },
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00F8, { 13, 22, 1 } },
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00F0, { 13, 23, 1 } },
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00E8, { 13, 24, 1 } },
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00E0, { 13, 25, 1 } },
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00D8, { 13, 26, 1 } },
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x007C, { 14, 0, 16 } },
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0078, { 14, 0, 17 } },
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0074, { 14, 0, 18 } },
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0070, { 14, 0, 19 } },
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x006C, { 14, 0, 20 } },
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0068, { 14, 0, 21 } },
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0064, { 14, 0, 22 } },
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0060, { 14, 0, 23 } },
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x005C, { 14, 0, 24 } },
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0058, { 14, 0, 25 } },
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0054, { 14, 0, 26 } },
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0050, { 14, 0, 27 } },
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x004C, { 14, 0, 28 } },
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0048, { 14, 0, 29 } },
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0044, { 14, 0, 30 } },
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0040, { 14, 0, 31 } },
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0030, { 15, 0, 32 } },
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x002E, { 15, 0, 33 } },
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x002C, { 15, 0, 34 } },
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x002A, { 15, 0, 35 } },
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0028, { 15, 0, 36 } },
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0026, { 15, 0, 37 } },
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0024, { 15, 0, 38 } },
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0022, { 15, 0, 39 } },
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0020, { 15, 0, 40 } },
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x003E, { 15, 1, 8 } },
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x003C, { 15, 1, 9 } },
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x003A, { 15, 1, 10 } },
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0038, { 15, 1, 11 } },
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0036, { 15, 1, 12 } },
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0034, { 15, 1, 13 } },
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0032, { 15, 1, 14 } },
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0013, { 16, 1, 15 } },
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0012, { 16, 1, 16 } },
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0011, { 16, 1, 17 } },
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0010, { 16, 1, 18 } },
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0014, { 16, 6, 3 } },
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001A, { 16, 11, 2 } },
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0019, { 16, 12, 2 } },
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0018, { 16, 13, 2 } },
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0017, { 16, 14, 2 } },
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0016, { 16, 15, 2 } },
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0015, { 16, 16, 2 } },
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001F, { 16, 27, 1 } },
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001E, { 16, 28, 1 } },
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001D, { 16, 29, 1 } },
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001C, { 16, 30, 1 } },
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001B, { 16, 31, 1 } }
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* coding table as found in the spec annex B.5 table B-15 */
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct dct_coeff_compressed dct_coeff_tbl_one[] = {
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x6000, { 4, dct_End_of_Block, 0 } },
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x8000, { 2, 0, 1 } },
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x4000, { 3, 1, 1 } },
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xC000, { 3, 0, 2 } },
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2800, { 5, 2, 1 } },
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x7000, { 4, 0, 3 } },
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3800, { 5, 3, 1 } },
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1800, { 6, 4, 1 } },
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x3000, { 5, 1, 2 } },
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1C00, { 6, 5, 1 } },
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0C00, { 7, 6, 1 } },
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0800, { 7, 7, 1 } },
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xE000, { 5, 0, 4 } },
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0E00, { 7, 2, 2 } },
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0A00, { 7, 8, 1 } },
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF000, { 7, 9, 1 } },
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0400, { 6, dct_Escape, 0 } },
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xE800, { 5, 0, 5 } },
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1400, { 6, 0, 6 } },
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF200, { 7, 1, 3 } },
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2600, { 8, 3, 2 } },
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF400, { 7, 10, 1 } },
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2100, { 8, 11, 1 } },
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2500, { 8, 12, 1 } },
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2400, { 8, 13, 1 } },
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x1000, { 6, 0, 7 } },
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2700, { 8, 1, 4 } },
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFC00, { 8, 2, 3 } },
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFD00, { 8, 4, 2 } },
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0200, { 9, 5, 2 } },
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0280, { 9, 14, 1 } },
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0380, { 9, 15, 1 } },
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0340, { 10, 16, 1 } },
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF600, { 7, 0, 8 } },
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xF800, { 7, 0, 9 } },
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2300, { 8, 0, 10 } },
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2200, { 8, 0, 11 } },
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x2000, { 8, 1, 5 } },
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0300, { 10, 2, 4 } },
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01C0, { 12, 3, 3 } },
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0120, { 12, 4, 3 } },
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01E0, { 12, 6, 2 } },
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0150, { 12, 7, 2 } },
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0110, { 12, 8, 2 } },
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01F0, { 12, 17, 1 } },
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x01A0, { 12, 18, 1 } },
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0190, { 12, 19, 1 } },
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0170, { 12, 20, 1 } },
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0160, { 12, 21, 1 } },
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFA00, { 8, 0, 12 } },
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFB00, { 8, 0, 13 } },
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFE00, { 8, 0, 14 } },
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0xFF00, { 8, 0, 15 } },
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00B0, { 13, 1, 6 } },
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00A8, { 13, 1, 7 } },
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00A0, { 13, 2, 5 } },
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0098, { 13, 3, 4 } },
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0090, { 13, 5, 3 } },
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0088, { 13, 9, 2 } },
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0080, { 13, 10, 2 } },
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00F8, { 13, 22, 1 } },
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00F0, { 13, 23, 1 } },
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00E8, { 13, 24, 1 } },
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00E0, { 13, 25, 1 } },
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x00D8, { 13, 26, 1 } },
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x007C, { 14, 0, 16 } },
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0078, { 14, 0, 17 } },
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0074, { 14, 0, 18 } },
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0070, { 14, 0, 19 } },
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x006C, { 14, 0, 20 } },
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0068, { 14, 0, 21 } },
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0064, { 14, 0, 22 } },
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0060, { 14, 0, 23 } },
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x005C, { 14, 0, 24 } },
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0058, { 14, 0, 25 } },
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0054, { 14, 0, 26 } },
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0050, { 14, 0, 27 } },
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x004C, { 14, 0, 28 } },
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0048, { 14, 0, 29 } },
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0044, { 14, 0, 30 } },
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0040, { 14, 0, 31 } },
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0030, { 15, 0, 32 } },
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x002E, { 15, 0, 33 } },
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x002C, { 15, 0, 34 } },
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x002A, { 15, 0, 35 } },
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0028, { 15, 0, 36 } },
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0026, { 15, 0, 37 } },
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0024, { 15, 0, 38 } },
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0022, { 15, 0, 39 } },
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0020, { 15, 0, 40 } },
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x003E, { 15, 1, 8 } },
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x003C, { 15, 1, 9 } },
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x003A, { 15, 1, 10 } },
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0038, { 15, 1, 11 } },
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0036, { 15, 1, 12 } },
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0034, { 15, 1, 13 } },
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0032, { 15, 1, 14 } },
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0013, { 16, 1, 15 } },
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0012, { 16, 1, 16 } },
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0011, { 16, 1, 17 } },
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0010, { 16, 1, 18 } },
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0014, { 16, 6, 3 } },
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001A, { 16, 11, 2 } },
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0019, { 16, 12, 2 } },
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0018, { 16, 13, 2 } },
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0017, { 16, 14, 2 } },
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0016, { 16, 15, 2 } },
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x0015, { 16, 16, 2 } },
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001F, { 16, 27, 1 } },
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001E, { 16, 28, 1 } },
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001D, { 16, 29, 1 } },
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001C, { 16, 30, 1 } },
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { 0x001B, { 16, 31, 1 } }
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* q_scale_type */
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const unsigned quant_scale[2][32] = {
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 },
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  { 0, 1, 2, 3, 4,  5,  6,  7,  8, 10, 12, 14, 16, 18, 20, 22, 24,
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, 104, 112 }
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B1[1 << 11];
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B2[1 << 2];
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B3[1 << 6];
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B4[1 << 6];
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B9[1 << 9];
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B10[1 << 11];
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B11[1 << 2];
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B12[1 << 10];
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vl_vlc_entry tbl_B13[1 << 10];
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dct_coeff tbl_B14_DC[1 << 17];
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dct_coeff tbl_B14_AC[1 << 17];
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dct_coeff tbl_B15[1 << 17];
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_dct_coeff_table(struct dct_coeff *dst, const struct dct_coeff_compressed *src,
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned size, bool is_DC)
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=0;i<(1<<17);++i) {
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i].length = 0;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i].level = 0;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i].run = dct_End_of_Block;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for(; size > 0; --size, ++src) {
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct dct_coeff coeff = src->coeff;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool has_sign = true;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (coeff.run) {
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case dct_End_of_Block:
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (is_DC)
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         has_sign = false;
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case dct_Escape:
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         has_sign = false;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case dct_DC:
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!is_DC)
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coeff.length += 1;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coeff.run = 1;
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case dct_AC:
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (is_DC)
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coeff.length += 1;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coeff.run = 1;
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coeff.length += 1;
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coeff.run += 1;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for(i=0; i<(1 << (17 - coeff.length)); ++i)
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst[src->bitcode << 1 | i] = coeff;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (has_sign) {
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 coeff.level = -coeff.level;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for(; i<(1 << (18 - coeff.length)); ++i)
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst[src->bitcode << 1 | i] = coeff;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_tables()
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B1, Elements(tbl_B1), macroblock_address_increment, Elements(macroblock_address_increment));
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B2, Elements(tbl_B2), macroblock_type_i, Elements(macroblock_type_i));
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B3, Elements(tbl_B3), macroblock_type_p, Elements(macroblock_type_p));
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B4, Elements(tbl_B4), macroblock_type_b, Elements(macroblock_type_b));
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B9, Elements(tbl_B9), coded_block_pattern, Elements(coded_block_pattern));
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B10, Elements(tbl_B10), motion_code, Elements(motion_code));
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B11, Elements(tbl_B11), dmvector, Elements(dmvector));
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B12, Elements(tbl_B12), dct_dc_size_luminance, Elements(dct_dc_size_luminance));
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init_table(tbl_B13, Elements(tbl_B13), dct_dc_size_chrominance, Elements(dct_dc_size_chrominance));
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_dct_coeff_table(tbl_B14_DC, dct_coeff_tbl_zero, Elements(dct_coeff_tbl_zero), true);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_dct_coeff_table(tbl_B14_AC, dct_coeff_tbl_zero, Elements(dct_coeff_tbl_zero), false);
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_dct_coeff_table(tbl_B15, dct_coeff_tbl_one, Elements(dct_coeff_tbl_one), false);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDIV2DOWN(int todiv)
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (todiv&~1)/2;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDIV2UP(int todiv)
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (todiv+1)/2;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmotion_vector(struct vl_mpg12_bs *bs, int r, int s, int dmv, short delta[2], short dmvector[2])
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int t;
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (t = 0; t < 2; ++t) {
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int motion_code;
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int r_size = bs->desc->f_code[s][t];
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vl_vlc_fillbits(&bs->vlc);
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_code = vl_vlc_get_vlclbf(&bs->vlc, tbl_B10, 11);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(r_size >= 0);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (r_size && motion_code) {
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int residual = vl_vlc_get_uimsbf(&bs->vlc, r_size) + 1;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         delta[t] = ((abs(motion_code) - 1) << r_size) + residual;
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (motion_code < 0)
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            delta[t] = -delta[t];
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         delta[t] = motion_code;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dmv)
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dmvector[t] = vl_vlc_get_vlclbf(&bs->vlc, tbl_B11, 2);
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrap(short f, int shift)
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (f < (-16 << shift))
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return f + (32 << shift);
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (f >= 16 << shift)
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return f - (32 << shift);
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return f;
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmotion_vector_frame(struct vl_mpg12_bs *bs, int s, struct pipe_mpeg12_macroblock *mb)
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dmv = mb->macroblock_modes.bits.frame_motion_type == PIPE_MPEG12_MO_TYPE_DUAL_PRIME;
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   short dmvector[2], delta[2];
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mb->macroblock_modes.bits.frame_motion_type == PIPE_MPEG12_MO_TYPE_FIELD) {
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->motion_vertical_field_select |= vl_vlc_get_uimsbf(&bs->vlc, 1) << s;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_vector(bs, 0, s, dmv, delta, dmvector);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->PMV[0][s][0] = wrap(mb->PMV[0][s][0] + delta[0], bs->desc->f_code[s][0]);
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->PMV[0][s][1] = wrap(DIV2DOWN(mb->PMV[0][s][1]) + delta[1], bs->desc->f_code[s][1]) * 2;
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->motion_vertical_field_select |= vl_vlc_get_uimsbf(&bs->vlc, 1) << (s + 2);
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_vector(bs, 1, s, dmv, delta, dmvector);
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->PMV[1][s][0] = wrap(mb->PMV[1][s][0] + delta[0], bs->desc->f_code[s][0]);
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->PMV[1][s][1] = wrap(DIV2DOWN(mb->PMV[1][s][1]) + delta[1], bs->desc->f_code[s][1]) * 2;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_vector(bs, 0, s, dmv, delta, dmvector);
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->PMV[0][s][0] = wrap(mb->PMV[0][s][0] + delta[0], bs->desc->f_code[s][0]);
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->PMV[0][s][1] = wrap(mb->PMV[0][s][1] + delta[1], bs->desc->f_code[s][1]);
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmotion_vector_field(struct vl_mpg12_bs *bs, int s, struct pipe_mpeg12_macroblock *mb)
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dmv = mb->macroblock_modes.bits.field_motion_type == PIPE_MPEG12_MO_TYPE_DUAL_PRIME;
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   short dmvector[2], delta[2];
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mb->macroblock_modes.bits.field_motion_type == PIPE_MPEG12_MO_TYPE_16x8) {
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->motion_vertical_field_select |= vl_vlc_get_uimsbf(&bs->vlc, 1) << s;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_vector(bs, 0, s, dmv, delta, dmvector);
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb->motion_vertical_field_select |= vl_vlc_get_uimsbf(&bs->vlc, 1) << (s + 2);
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_vector(bs, 1, s, dmv, delta, dmvector);
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!dmv)
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb->motion_vertical_field_select |= vl_vlc_get_uimsbf(&bs->vlc, 1) << s;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      motion_vector(bs, 0, s, dmv, delta, dmvector);
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgreset_predictor(struct vl_mpg12_bs *bs) {
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bs->pred_dc[0] = bs->pred_dc[1] = bs->pred_dc[2] = 0;
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdecode_dct(struct vl_mpg12_bs *bs, struct pipe_mpeg12_macroblock *mb, int scale)
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const unsigned blk2cc[] = { 0, 0, 0, 0, 1, 2 };
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const struct vl_vlc_entry *blk2dcsize[] = {
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tbl_B12, tbl_B12, tbl_B12, tbl_B12, tbl_B13, tbl_B13
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   };
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool intra = mb->macroblock_type & PIPE_MPEG12_MB_TYPE_INTRA;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct dct_coeff *table = intra ? bs->intra_dct_tbl : tbl_B14_AC;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct dct_coeff *entry;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, cbp, blk = 0;
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   short *dst = mb->blocks;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_fillbits(&bs->vlc);
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mb->coded_block_pattern = cbp = intra ? 0x3F : vl_vlc_get_vlclbf(&bs->vlc, tbl_B9, 9);
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   goto entry;
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while(1) {
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vl_vlc_eatbits(&bs->vlc, entry->length);
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (entry->run == dct_End_of_Block) {
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += 64;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cbp <<= 1;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cbp &= 0x3F;
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         blk++;
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgentry:
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!cbp)
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         while(!(cbp & 0x20)) {
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            cbp <<= 1;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            blk++;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_fillbits(&bs->vlc);
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (intra) {
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unsigned cc = blk2cc[blk];
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unsigned size = vl_vlc_get_vlclbf(&bs->vlc, blk2dcsize[blk], 10);
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (size) {
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               int dct_diff = vl_vlc_get_uimsbf(&bs->vlc, size);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               int half_range = 1 << (size - 1);
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (dct_diff < half_range)
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  dct_diff = (dct_diff + 1) - (2 * half_range);
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               bs->pred_dc[cc] += dct_diff;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst[0] = bs->pred_dc[cc];
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            i = 0;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else {
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            entry = tbl_B14_DC + vl_vlc_peekbits(&bs->vlc, 17);
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            i = -1;
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (entry->run == dct_Escape) {
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i += vl_vlc_get_uimsbf(&bs->vlc, 6) + 1;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i > 64)
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst[i] = vl_vlc_get_simsbf(&bs->vlc, 12) * scale;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i += entry->run;
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i > 64)
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst[i] = entry->level * scale;
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vl_vlc_fillbits(&bs->vlc);
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      entry = table + vl_vlc_peekbits(&bs->vlc, 17);
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdecode_slice(struct vl_mpg12_bs *bs, struct pipe_video_buffer *target)
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_mpeg12_macroblock mb;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   short dct_blocks[64*6];
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned dct_scale;
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   signed x = -1;
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&mb, 0, sizeof(mb));
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mb.base.codec = PIPE_VIDEO_CODEC_MPEG12;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mb.y = vl_vlc_get_uimsbf(&bs->vlc, 8) - 1;
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mb.blocks = dct_blocks;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   reset_predictor(bs);
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_fillbits(&bs->vlc);
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dct_scale = quant_scale[bs->desc->q_scale_type][vl_vlc_get_uimsbf(&bs->vlc, 5)];
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vl_vlc_get_uimsbf(&bs->vlc, 1))
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (vl_vlc_get_uimsbf(&bs->vlc, 9) & 1)
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_fillbits(&bs->vlc);
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_fillbits(&bs->vlc);
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(vl_vlc_bits_left(&bs->vlc) > 23 && vl_vlc_peekbits(&bs->vlc, 23));
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int inc = 0;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (bs->decoder->profile == PIPE_VIDEO_PROFILE_MPEG1)
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         while (vl_vlc_peekbits(&bs->vlc, 11) == 15) {
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vl_vlc_eatbits(&bs->vlc, 11);
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            vl_vlc_fillbits(&bs->vlc);
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (vl_vlc_peekbits(&bs->vlc, 11) == 8) {
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_eatbits(&bs->vlc, 11);
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_fillbits(&bs->vlc);
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         inc += 33;
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      inc += vl_vlc_get_vlclbf(&bs->vlc, tbl_B1, 11);
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (x != -1) {
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!inc)
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return;
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.num_skipped_macroblocks = inc - 1;
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bs->decoder->decode_macroblock(bs->decoder, target, &bs->desc->base, &mb.base, 1);
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb.x = x += inc;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (bs->desc->picture_coding_type) {
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_MPEG12_PICTURE_CODING_TYPE_I:
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.macroblock_type = vl_vlc_get_vlclbf(&bs->vlc, tbl_B2, 2);
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_MPEG12_PICTURE_CODING_TYPE_P:
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.macroblock_type = vl_vlc_get_vlclbf(&bs->vlc, tbl_B3, 6);
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_MPEG12_PICTURE_CODING_TYPE_B:
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.macroblock_type = vl_vlc_get_vlclbf(&bs->vlc, tbl_B4, 6);
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.macroblock_type = 0;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* dumb gcc */
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb.macroblock_modes.value = 0;
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mb.macroblock_type & (PIPE_MPEG12_MB_TYPE_MOTION_FORWARD | PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD)) {
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (bs->desc->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME) {
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (bs->desc->frame_pred_frame_dct == 0)
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               mb.macroblock_modes.bits.frame_motion_type = vl_vlc_get_uimsbf(&bs->vlc, 2);
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               mb.macroblock_modes.bits.frame_motion_type = 2;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.macroblock_modes.bits.field_motion_type = vl_vlc_get_uimsbf(&bs->vlc, 2);
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if ((mb.macroblock_type & PIPE_MPEG12_MB_TYPE_INTRA) && bs->desc->concealment_motion_vectors) {
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (bs->desc->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME)
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.macroblock_modes.bits.frame_motion_type = 2;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.macroblock_modes.bits.field_motion_type = 1;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (bs->desc->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME &&
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          bs->desc->frame_pred_frame_dct == 0 &&
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          mb.macroblock_type & (PIPE_MPEG12_MB_TYPE_INTRA | PIPE_MPEG12_MB_TYPE_PATTERN))
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.macroblock_modes.bits.dct_type = vl_vlc_get_uimsbf(&bs->vlc, 1);
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mb.macroblock_type & PIPE_MPEG12_MB_TYPE_QUANT)
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dct_scale = quant_scale[bs->desc->q_scale_type][vl_vlc_get_uimsbf(&bs->vlc, 5)];
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (inc > 1 && bs->desc->picture_coding_type == PIPE_MPEG12_PICTURE_CODING_TYPE_P)
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memset(mb.PMV, 0, sizeof(mb.PMV));
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mb.motion_vertical_field_select = 0;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((mb.macroblock_type & PIPE_MPEG12_MB_TYPE_MOTION_FORWARD) ||
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (mb.macroblock_type & PIPE_MPEG12_MB_TYPE_INTRA && bs->desc->concealment_motion_vectors)) {
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (bs->desc->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME)
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            motion_vector_frame(bs, 0, &mb);
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            motion_vector_field(bs, 0, &mb);
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mb.macroblock_type & PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD) {
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (bs->desc->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME)
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            motion_vector_frame(bs, 1, &mb);
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            motion_vector_field(bs, 1, &mb);
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mb.macroblock_type & PIPE_MPEG12_MB_TYPE_INTRA && bs->desc->concealment_motion_vectors) {
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned extra = vl_vlc_get_uimsbf(&bs->vlc, 1);
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.PMV[1][0][0] = mb.PMV[0][0][0];
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.PMV[1][0][1] = mb.PMV[0][0][1];
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(extra);
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (mb.macroblock_type & PIPE_MPEG12_MB_TYPE_INTRA ||
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                !(mb.macroblock_type & (PIPE_MPEG12_MB_TYPE_MOTION_FORWARD |
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD))) {
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memset(mb.PMV, 0, sizeof(mb.PMV));
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((mb.macroblock_type & PIPE_MPEG12_MB_TYPE_MOTION_FORWARD &&
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           mb.macroblock_modes.bits.frame_motion_type == 2) ||
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (mb.macroblock_modes.bits.frame_motion_type == 3)) {
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.PMV[1][0][0] = mb.PMV[0][0][0];
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.PMV[1][0][1] = mb.PMV[0][0][1];
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mb.macroblock_type & PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD &&
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          mb.macroblock_modes.bits.frame_motion_type == 2) {
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.PMV[1][1][0] = mb.PMV[0][1][0];
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mb.PMV[1][1][1] = mb.PMV[0][1][1];
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (inc > 1 || !(mb.macroblock_type & PIPE_MPEG12_MB_TYPE_INTRA))
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         reset_predictor(bs);
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mb.macroblock_type & (PIPE_MPEG12_MB_TYPE_INTRA | PIPE_MPEG12_MB_TYPE_PATTERN)) {
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memset(dct_blocks, 0, sizeof(dct_blocks));
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         decode_dct(bs, &mb, dct_scale);
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mb.coded_block_pattern = 0;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vl_vlc_fillbits(&bs->vlc);
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (vl_vlc_bits_left(&bs->vlc) && vl_vlc_peekbits(&bs->vlc, 23));
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mb.num_skipped_macroblocks = 0;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bs->decoder->decode_macroblock(bs->decoder, target, &bs->desc->base, &mb.base, 1);
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_mpg12_bs_init(struct vl_mpg12_bs *bs, struct pipe_video_decoder *decoder)
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static bool tables_initialized = false;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(bs);
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(bs, 0, sizeof(struct vl_mpg12_bs));
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bs->decoder = decoder;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tables_initialized) {
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      init_tables();
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tables_initialized = true;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_mpg12_bs_decode(struct vl_mpg12_bs *bs,
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct pipe_video_buffer *target,
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct pipe_mpeg12_picture_desc *picture,
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   unsigned num_buffers,
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const void * const *buffers,
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const unsigned *sizes)
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(bs);
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bs->desc = picture;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bs->intra_dct_tbl = picture->intra_vlc_format ? tbl_B15 : tbl_B14_AC;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vl_vlc_init(&bs->vlc, num_buffers, buffers, sizes);
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (vl_vlc_bits_left(&bs->vlc) > 32) {
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t code = vl_vlc_peekbits(&bs->vlc, 32);
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (code >= 0x101 && code <= 0x1AF) {
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_eatbits(&bs->vlc, 24);
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         decode_slice(bs, target);
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* align to a byte again */
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_eatbits(&bs->vlc, vl_vlc_valid_bits(&bs->vlc) & 7);
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vl_vlc_eatbits(&bs->vlc, 8);
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vl_vlc_fillbits(&bs->vlc);
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
986