vl_mpeg12_bitstream.c revision 235de23e57bd6dac6a2fcdd0807838eef72f6173
1c888fe027c338f337123de4da2de1ac73b0f7587Christian König/**************************************************************************
2c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
3c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Copyright 2011 Christian König.
4c888fe027c338f337123de4da2de1ac73b0f7587Christian König * All Rights Reserved.
5c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
6c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Permission is hereby granted, free of charge, to any person obtaining a
7c888fe027c338f337123de4da2de1ac73b0f7587Christian König * copy of this software and associated documentation files (the
8c888fe027c338f337123de4da2de1ac73b0f7587Christian König * "Software"), to deal in the Software without restriction, including
9c888fe027c338f337123de4da2de1ac73b0f7587Christian König * without limitation the rights to use, copy, modify, merge, publish,
10c888fe027c338f337123de4da2de1ac73b0f7587Christian König * distribute, sub license, and/or sell copies of the Software, and to
11c888fe027c338f337123de4da2de1ac73b0f7587Christian König * permit persons to whom the Software is furnished to do so, subject to
12c888fe027c338f337123de4da2de1ac73b0f7587Christian König * the following conditions:
13c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
14c888fe027c338f337123de4da2de1ac73b0f7587Christian König * The above copyright notice and this permission notice (including the
15c888fe027c338f337123de4da2de1ac73b0f7587Christian König * next paragraph) shall be included in all copies or substantial portions
16c888fe027c338f337123de4da2de1ac73b0f7587Christian König * of the Software.
17c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
18c888fe027c338f337123de4da2de1ac73b0f7587Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c888fe027c338f337123de4da2de1ac73b0f7587Christian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c888fe027c338f337123de4da2de1ac73b0f7587Christian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c888fe027c338f337123de4da2de1ac73b0f7587Christian König * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c888fe027c338f337123de4da2de1ac73b0f7587Christian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c888fe027c338f337123de4da2de1ac73b0f7587Christian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c888fe027c338f337123de4da2de1ac73b0f7587Christian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
26c888fe027c338f337123de4da2de1ac73b0f7587Christian König **************************************************************************/
27c888fe027c338f337123de4da2de1ac73b0f7587Christian König
28c888fe027c338f337123de4da2de1ac73b0f7587Christian König/**
29c888fe027c338f337123de4da2de1ac73b0f7587Christian König * This file is based uppon slice_xvmc.c and vlc.h from the xine project,
30c888fe027c338f337123de4da2de1ac73b0f7587Christian König * which in turn is based on mpeg2dec. The following is the original copyright:
31c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
32c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
33c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
34c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
35c888fe027c338f337123de4da2de1ac73b0f7587Christian König * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
36c888fe027c338f337123de4da2de1ac73b0f7587Christian König * See http://libmpeg2.sourceforge.net/ for updates.
37c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
38c888fe027c338f337123de4da2de1ac73b0f7587Christian König * mpeg2dec is free software; you can redistribute it and/or modify
39c888fe027c338f337123de4da2de1ac73b0f7587Christian König * it under the terms of the GNU General Public License as published by
40c888fe027c338f337123de4da2de1ac73b0f7587Christian König * the Free Software Foundation; either version 2 of the License, or
41c888fe027c338f337123de4da2de1ac73b0f7587Christian König * (at your option) any later version.
42c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
43c888fe027c338f337123de4da2de1ac73b0f7587Christian König * mpeg2dec is distributed in the hope that it will be useful,
44c888fe027c338f337123de4da2de1ac73b0f7587Christian König * but WITHOUT ANY WARRANTY; without even the implied warranty of
45c888fe027c338f337123de4da2de1ac73b0f7587Christian König * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
46c888fe027c338f337123de4da2de1ac73b0f7587Christian König * GNU General Public License for more details.
47c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
48c888fe027c338f337123de4da2de1ac73b0f7587Christian König * You should have received a copy of the GNU General Public License
49c888fe027c338f337123de4da2de1ac73b0f7587Christian König * along with this program; if not, write to the Free Software
50c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
51c888fe027c338f337123de4da2de1ac73b0f7587Christian König */
52c888fe027c338f337123de4da2de1ac73b0f7587Christian König
53c888fe027c338f337123de4da2de1ac73b0f7587Christian König#include <stdint.h>
54c888fe027c338f337123de4da2de1ac73b0f7587Christian König
55c888fe027c338f337123de4da2de1ac73b0f7587Christian König#include <pipe/p_video_state.h>
56c888fe027c338f337123de4da2de1ac73b0f7587Christian König
57c888fe027c338f337123de4da2de1ac73b0f7587Christian König#include "vl_vlc.h"
586ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König#include "vl_zscan.h"
59c888fe027c338f337123de4da2de1ac73b0f7587Christian König#include "vl_mpeg12_bitstream.h"
60c888fe027c338f337123de4da2de1ac73b0f7587Christian König
61c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* take num bits from the high part of bit_buf and zero extend them */
62c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define UBITS(buf,num) (((uint32_t)(buf)) >> (32 - (num)))
63c888fe027c338f337123de4da2de1ac73b0f7587Christian König
64c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* take num bits from the high part of bit_buf and sign extend them */
65c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define SBITS(buf,num) (((int32_t)(buf)) >> (32 - (num)))
66c888fe027c338f337123de4da2de1ac73b0f7587Christian König
67c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define SATURATE(val)			\
68c888fe027c338f337123de4da2de1ac73b0f7587Christian Königdo {					\
69c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if ((uint32_t)(val + 2048) > 4095)	\
70c888fe027c338f337123de4da2de1ac73b0f7587Christian König      val = (val > 0) ? 2047 : -2048;	\
71c888fe027c338f337123de4da2de1ac73b0f7587Christian König} while (0)
72c888fe027c338f337123de4da2de1ac73b0f7587Christian König
73c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* macroblock modes */
74c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MACROBLOCK_INTRA 1
75c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MACROBLOCK_PATTERN 2
76c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MACROBLOCK_MOTION_BACKWARD 4
77c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MACROBLOCK_MOTION_FORWARD 8
78c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MACROBLOCK_QUANT 16
79c888fe027c338f337123de4da2de1ac73b0f7587Christian König
80c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* motion_type */
81c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MOTION_TYPE_MASK (3*64)
82c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MOTION_TYPE_BASE 64
83c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_FIELD (1*64)
84c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_FRAME (2*64)
85c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_16X8 (2*64)
86c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_DMV (3*64)
87c888fe027c338f337123de4da2de1ac73b0f7587Christian König
88c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* picture structure */
89c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define TOP_FIELD     1
90c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define BOTTOM_FIELD  2
91c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define FRAME_PICTURE 3
92c888fe027c338f337123de4da2de1ac73b0f7587Christian König
93c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* picture coding type (mpeg2 header) */
94c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define I_TYPE 1
95c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define P_TYPE 2
96c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define B_TYPE 3
97c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define D_TYPE 4
98c888fe027c338f337123de4da2de1ac73b0f7587Christian König
99c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
100c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t modes;
101c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
102c888fe027c338f337123de4da2de1ac73b0f7587Christian König} MBtab;
103c888fe027c338f337123de4da2de1ac73b0f7587Christian König
104c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
105c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t delta;
106c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
107c888fe027c338f337123de4da2de1ac73b0f7587Christian König} MVtab;
108c888fe027c338f337123de4da2de1ac73b0f7587Christian König
109c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
110c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int8_t dmv;
111c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
112c888fe027c338f337123de4da2de1ac73b0f7587Christian König} DMVtab;
113c888fe027c338f337123de4da2de1ac73b0f7587Christian König
114c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
115c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t cbp;
116c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
117c888fe027c338f337123de4da2de1ac73b0f7587Christian König} CBPtab;
118c888fe027c338f337123de4da2de1ac73b0f7587Christian König
119c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
120c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t size;
121c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
122c888fe027c338f337123de4da2de1ac73b0f7587Christian König} DCtab;
123c888fe027c338f337123de4da2de1ac73b0f7587Christian König
124c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
125c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t run;
126c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t level;
127c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
128c888fe027c338f337123de4da2de1ac73b0f7587Christian König} DCTtab;
129c888fe027c338f337123de4da2de1ac73b0f7587Christian König
130c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct {
131c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t mba;
132c888fe027c338f337123de4da2de1ac73b0f7587Christian König   uint8_t len;
133c888fe027c338f337123de4da2de1ac73b0f7587Christian König} MBAtab;
134c888fe027c338f337123de4da2de1ac73b0f7587Christian König
135c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define INTRA MACROBLOCK_INTRA
136c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define QUANT MACROBLOCK_QUANT
137c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC MACROBLOCK_MOTION_FORWARD
138c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define CODED MACROBLOCK_PATTERN
139c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define FWD MACROBLOCK_MOTION_FORWARD
140c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define BWD MACROBLOCK_MOTION_BACKWARD
141c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define INTER MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD
142c888fe027c338f337123de4da2de1ac73b0f7587Christian König
143c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBtab MB_I [] = {
144c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTRA|QUANT, 2}, {INTRA, 1}
145c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
146c888fe027c338f337123de4da2de1ac73b0f7587Christian König
147c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBtab MB_P [] = {
148c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTRA|QUANT, 6}, {CODED|QUANT, 5}, {MC|CODED|QUANT, 5}, {INTRA,    5},
149c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {MC,          3}, {MC,          3}, {MC,             3}, {MC,       3},
150c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {CODED,       2}, {CODED,       2}, {CODED,          2}, {CODED,    2},
151c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {CODED,       2}, {CODED,       2}, {CODED,          2}, {CODED,    2},
152c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1},
153c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1},
154c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1},
155c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1}
156c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
157c888fe027c338f337123de4da2de1ac73b0f7587Christian König
158c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBtab MB_B [] = {
159c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0,                 0}, {INTRA|QUANT,       6},
160c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {BWD|CODED|QUANT,   6}, {FWD|CODED|QUANT,   6},
161c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER|CODED|QUANT, 5}, {INTER|CODED|QUANT, 5},
162c888fe027c338f337123de4da2de1ac73b0f7587Christian König                                     {INTRA,       5}, {INTRA,       5},
163c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {FWD,         4}, {FWD,         4}, {FWD,         4}, {FWD,         4},
164c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {FWD|CODED,   4}, {FWD|CODED,   4}, {FWD|CODED,   4}, {FWD|CODED,   4},
165c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {BWD,         3}, {BWD,         3}, {BWD,         3}, {BWD,         3},
166c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {BWD,         3}, {BWD,         3}, {BWD,         3}, {BWD,         3},
167c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3},
168c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3},
169c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
170c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
171c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
172c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
173c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
174c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
175c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
176c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}
177c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
178c888fe027c338f337123de4da2de1ac73b0f7587Christian König
179c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef INTRA
180c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef QUANT
181c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef MC
182c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef CODED
183c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef FWD
184c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef BWD
185c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef INTER
186c888fe027c338f337123de4da2de1ac73b0f7587Christian König
187c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MVtab MV_4 [] = {
188c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 3, 6}, { 2, 4}, { 1, 3}, { 1, 3}, { 0, 2}, { 0, 2}, { 0, 2}, { 0, 2}
189c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
190c888fe027c338f337123de4da2de1ac73b0f7587Christian König
191c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MVtab MV_10 [] = {
192c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10},
193c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 0,10}, { 0,10}, { 0,10}, { 0,10}, {15,10}, {14,10}, {13,10}, {12,10},
194c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {11,10}, {10,10}, { 9, 9}, { 9, 9}, { 8, 9}, { 8, 9}, { 7, 9}, { 7, 9},
195c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7},
196c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7},
197c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}
198c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
199c888fe027c338f337123de4da2de1ac73b0f7587Christian König
200c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DMVtab DMV_2 [] = {
201c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 0, 1}, { 0, 1}, { 1, 2}, {-1, 2}
202c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
203c888fe027c338f337123de4da2de1ac73b0f7587Christian König
204c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const CBPtab CBP_7 [] = {
205c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x22, 7}, {0x12, 7}, {0x0a, 7}, {0x06, 7},
206c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x21, 7}, {0x11, 7}, {0x09, 7}, {0x05, 7},
207c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3f, 6}, {0x3f, 6}, {0x03, 6}, {0x03, 6},
208c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x24, 6}, {0x24, 6}, {0x18, 6}, {0x18, 6},
209c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3e, 5}, {0x3e, 5}, {0x3e, 5}, {0x3e, 5},
210c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x02, 5}, {0x02, 5}, {0x02, 5}, {0x02, 5},
211c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3d, 5}, {0x3d, 5}, {0x3d, 5}, {0x3d, 5},
212c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x01, 5}, {0x01, 5}, {0x01, 5}, {0x01, 5},
213c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x38, 5}, {0x38, 5}, {0x38, 5}, {0x38, 5},
214c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x34, 5}, {0x34, 5}, {0x34, 5}, {0x34, 5},
215c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x2c, 5}, {0x2c, 5}, {0x2c, 5}, {0x2c, 5},
216c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x1c, 5}, {0x1c, 5}, {0x1c, 5}, {0x1c, 5},
217c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x28, 5}, {0x28, 5}, {0x28, 5}, {0x28, 5},
218c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x14, 5}, {0x14, 5}, {0x14, 5}, {0x14, 5},
219c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x30, 5}, {0x30, 5}, {0x30, 5}, {0x30, 5},
220c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x0c, 5}, {0x0c, 5}, {0x0c, 5}, {0x0c, 5},
221c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x20, 4}, {0x20, 4}, {0x20, 4}, {0x20, 4},
222c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x20, 4}, {0x20, 4}, {0x20, 4}, {0x20, 4},
223c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x10, 4}, {0x10, 4}, {0x10, 4}, {0x10, 4},
224c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x10, 4}, {0x10, 4}, {0x10, 4}, {0x10, 4},
225c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4},
226c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4},
227c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4},
228c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4},
229c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3},
230c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3},
231c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3},
232c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3}
233c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
234c888fe027c338f337123de4da2de1ac73b0f7587Christian König
235c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const CBPtab CBP_9 [] = {
236c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0,    0}, {0x00, 9}, {0x27, 9}, {0x1b, 9},
237c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3b, 9}, {0x37, 9}, {0x2f, 9}, {0x1f, 9},
238c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x3a, 8}, {0x3a, 8}, {0x36, 8}, {0x36, 8},
239c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x2e, 8}, {0x2e, 8}, {0x1e, 8}, {0x1e, 8},
240c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x39, 8}, {0x39, 8}, {0x35, 8}, {0x35, 8},
241c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x2d, 8}, {0x2d, 8}, {0x1d, 8}, {0x1d, 8},
242c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x26, 8}, {0x26, 8}, {0x1a, 8}, {0x1a, 8},
243c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x25, 8}, {0x25, 8}, {0x19, 8}, {0x19, 8},
244c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x2b, 8}, {0x2b, 8}, {0x17, 8}, {0x17, 8},
245c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x33, 8}, {0x33, 8}, {0x0f, 8}, {0x0f, 8},
246c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x2a, 8}, {0x2a, 8}, {0x16, 8}, {0x16, 8},
247c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x32, 8}, {0x32, 8}, {0x0e, 8}, {0x0e, 8},
248c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x29, 8}, {0x29, 8}, {0x15, 8}, {0x15, 8},
249c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x31, 8}, {0x31, 8}, {0x0d, 8}, {0x0d, 8},
250c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x23, 8}, {0x23, 8}, {0x13, 8}, {0x13, 8},
251c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0x0b, 8}, {0x0b, 8}, {0x07, 8}, {0x07, 8}
252c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
253c888fe027c338f337123de4da2de1ac73b0f7587Christian König
254c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCtab DC_lum_5 [] = {
255c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
256c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
257c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
258c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}
259c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
260c888fe027c338f337123de4da2de1ac73b0f7587Christian König
261c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCtab DC_chrom_5 [] = {
262c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
263c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
264c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
265c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}
266c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
267c888fe027c338f337123de4da2de1ac73b0f7587Christian König
268c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCtab DC_long [] = {
269c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5},
270c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5},
271c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, { 7, 6}, { 7, 6},
272c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10, 9}, {11, 9}
273c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
274c888fe027c338f337123de4da2de1ac73b0f7587Christian König
275c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_16 [] = {
276c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
277c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
278c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
279c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
280c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2,18, 0}, {  2,17, 0}, {  2,16, 0}, {  2,15, 0},
281c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  7, 3, 0}, { 17, 2, 0}, { 16, 2, 0}, { 15, 2, 0},
282c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 14, 2, 0}, { 13, 2, 0}, { 12, 2, 0}, { 32, 1, 0},
283c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 31, 1, 0}, { 30, 1, 0}, { 29, 1, 0}, { 28, 1, 0}
284c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
285c888fe027c338f337123de4da2de1ac73b0f7587Christian König
286c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_15 [] = {
287c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,40,15}, {  1,39,15}, {  1,38,15}, {  1,37,15},
288c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,36,15}, {  1,35,15}, {  1,34,15}, {  1,33,15},
289c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,32,15}, {  2,14,15}, {  2,13,15}, {  2,12,15},
290c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2,11,15}, {  2,10,15}, {  2, 9,15}, {  2, 8,15},
291c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,31,14}, {  1,31,14}, {  1,30,14}, {  1,30,14},
292c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,29,14}, {  1,29,14}, {  1,28,14}, {  1,28,14},
293c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,27,14}, {  1,27,14}, {  1,26,14}, {  1,26,14},
294c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,25,14}, {  1,25,14}, {  1,24,14}, {  1,24,14},
295c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,23,14}, {  1,23,14}, {  1,22,14}, {  1,22,14},
296c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,21,14}, {  1,21,14}, {  1,20,14}, {  1,20,14},
297c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,19,14}, {  1,19,14}, {  1,18,14}, {  1,18,14},
298c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,17,14}, {  1,17,14}, {  1,16,14}, {  1,16,14}
299c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
300c888fe027c338f337123de4da2de1ac73b0f7587Christian König
301c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_13 [] = {
302c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 11, 2,13}, { 10, 2,13}, {  6, 3,13}, {  4, 4,13},
303c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 5,13}, {  2, 7,13}, {  2, 6,13}, {  1,15,13},
304c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,14,13}, {  1,13,13}, {  1,12,13}, { 27, 1,13},
305c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 26, 1,13}, { 25, 1,13}, { 24, 1,13}, { 23, 1,13},
306c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1,11,12}, {  1,11,12}, {  9, 2,12}, {  9, 2,12},
307c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  5, 3,12}, {  5, 3,12}, {  1,10,12}, {  1,10,12},
308c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 4,12}, {  3, 4,12}, {  8, 2,12}, {  8, 2,12},
309c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 22, 1,12}, { 22, 1,12}, { 21, 1,12}, { 21, 1,12},
310c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 9,12}, {  1, 9,12}, { 20, 1,12}, { 20, 1,12},
311c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 19, 1,12}, { 19, 1,12}, {  2, 5,12}, {  2, 5,12},
312c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  4, 3,12}, {  4, 3,12}, {  1, 8,12}, {  1, 8,12},
313c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  7, 2,12}, {  7, 2,12}, { 18, 1,12}, { 18, 1,12}
314c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
315c888fe027c338f337123de4da2de1ac73b0f7587Christian König
316c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14_10 [] = {
317c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 17, 1,10}, {  6, 2,10}, {  1, 7,10}, {  3, 3,10},
318c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 4,10}, { 16, 1,10}, { 15, 1,10}, {  5, 2,10}
319c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
320c888fe027c338f337123de4da2de1ac73b0f7587Christian König
321c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14_8 [] = {
322c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6},
323c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 2, 7}, {  3, 2, 7}, { 10, 1, 7}, { 10, 1, 7},
324c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 4, 7}, {  1, 4, 7}, {  9, 1, 7}, {  9, 1, 7},
325c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  8, 1, 6}, {  8, 1, 6}, {  8, 1, 6}, {  8, 1, 6},
326c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  7, 1, 6}, {  7, 1, 6}, {  7, 1, 6}, {  7, 1, 6},
327c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 2, 6}, {  2, 2, 6}, {  2, 2, 6}, {  2, 2, 6},
328c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6},
329c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 14, 1, 8}, {  1, 6, 8}, { 13, 1, 8}, { 12, 1, 8},
330c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  4, 2, 8}, {  2, 3, 8}, {  1, 5, 8}, { 11, 1, 8}
331c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
332c888fe027c338f337123de4da2de1ac73b0f7587Christian König
333c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14AC_5 [] = {
334c888fe027c338f337123de4da2de1ac73b0f7587Christian König                {  1, 3, 5}, {  5, 1, 5}, {  4, 1, 5},
335c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 4}, {  1, 2, 4}, {  3, 1, 4}, {  3, 1, 4},
336c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
337c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2},
338c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2},
339c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
340c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}
341c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
342c888fe027c338f337123de4da2de1ac73b0f7587Christian König
343c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14DC_5 [] = {
344c888fe027c338f337123de4da2de1ac73b0f7587Christian König                {  1, 3, 5}, {  5, 1, 5}, {  4, 1, 5},
345c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 4}, {  1, 2, 4}, {  3, 1, 4}, {  3, 1, 4},
346c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
347c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1},
348c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1},
349c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1},
350c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}
351c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
352c888fe027c338f337123de4da2de1ac73b0f7587Christian König
353c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B15_10 [] = {
354c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  6, 2, 9}, {  6, 2, 9}, { 15, 1, 9}, { 15, 1, 9},
355c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 4,10}, { 17, 1,10}, { 16, 1, 9}, { 16, 1, 9}
356c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
357c888fe027c338f337123de4da2de1ac73b0f7587Christian König
358c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B15_8 [] = {
359c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6},
360c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  8, 1, 7}, {  8, 1, 7}, {  9, 1, 7}, {  9, 1, 7},
361c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  7, 1, 7}, {  7, 1, 7}, {  3, 2, 7}, {  3, 2, 7},
362c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 7, 6}, {  1, 7, 6}, {  1, 7, 6}, {  1, 7, 6},
363c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 6, 6}, {  1, 6, 6}, {  1, 6, 6}, {  1, 6, 6},
364c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  5, 1, 6}, {  5, 1, 6}, {  5, 1, 6}, {  5, 1, 6},
365c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6},
366c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 5, 8}, { 12, 1, 8}, {  1,11, 8}, {  1,10, 8},
367c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 14, 1, 8}, { 13, 1, 8}, {  4, 2, 8}, {  2, 4, 8},
368c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5},
369c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5},
370c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5},
371c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5},
372c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5},
373c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5},
374c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
375c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
376c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
377c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
378c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
379c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
380c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
381c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
382c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
383c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
384c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
385c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
386c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
387c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
388c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
389c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
390c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
391c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
392c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
393c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
394c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
395c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
396c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
397c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
398c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
399c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
400c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
401c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
402c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
403c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
404c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
405c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
406c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
407c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
408c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
409c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
410c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
411c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
412c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
413c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
414c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5},
415c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5},
416c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5},
417c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5},
418c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 10, 1, 7}, { 10, 1, 7}, {  2, 3, 7}, {  2, 3, 7},
419c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 11, 1, 7}, { 11, 1, 7}, {  1, 8, 7}, {  1, 8, 7},
420c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  1, 9, 7}, {  1, 9, 7}, {  1,12, 8}, {  1,13, 8},
421c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {  3, 3, 8}, {  5, 2, 8}, {  1,14, 8}, {  1,15, 8}
422c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
423c888fe027c338f337123de4da2de1ac73b0f7587Christian König
424c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBAtab MBA_5 [] = {
425c888fe027c338f337123de4da2de1ac73b0f7587Christian König                   {6, 5}, {5, 5}, {4, 4}, {4, 4}, {3, 4}, {3, 4},
426c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {2, 3}, {2, 3}, {2, 3}, {2, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
427c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1},
428c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}
429c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
430c888fe027c338f337123de4da2de1ac73b0f7587Christian König
431c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBAtab MBA_11 [] = {
432c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {32, 11}, {31, 11}, {30, 11}, {29, 11},
433c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {28, 11}, {27, 11}, {26, 11}, {25, 11},
434c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {24, 11}, {23, 11}, {22, 11}, {21, 11},
435c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {20, 10}, {20, 10}, {19, 10}, {19, 10},
436c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {18, 10}, {18, 10}, {17, 10}, {17, 10},
437c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {16, 10}, {16, 10}, {15, 10}, {15, 10},
438c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {14,  8}, {14,  8}, {14,  8}, {14,  8},
439c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {14,  8}, {14,  8}, {14,  8}, {14,  8},
440c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {13,  8}, {13,  8}, {13,  8}, {13,  8},
441c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {13,  8}, {13,  8}, {13,  8}, {13,  8},
442c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {12,  8}, {12,  8}, {12,  8}, {12,  8},
443c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {12,  8}, {12,  8}, {12,  8}, {12,  8},
444c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {11,  8}, {11,  8}, {11,  8}, {11,  8},
445c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {11,  8}, {11,  8}, {11,  8}, {11,  8},
446c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {10,  8}, {10,  8}, {10,  8}, {10,  8},
447c888fe027c338f337123de4da2de1ac73b0f7587Christian König   {10,  8}, {10,  8}, {10,  8}, {10,  8},
448c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 9,  8}, { 9,  8}, { 9,  8}, { 9,  8},
449c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 9,  8}, { 9,  8}, { 9,  8}, { 9,  8},
450c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
451c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
452c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
453c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
454c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7},
455c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7},
456c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7},
457c888fe027c338f337123de4da2de1ac73b0f7587Christian König   { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7}
458c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
459c888fe027c338f337123de4da2de1ac73b0f7587Christian König
460c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const int non_linear_quantizer_scale[] = {
461c888fe027c338f337123de4da2de1ac73b0f7587Christian König   0,  1,  2,  3,  4,  5,   6,   7,
462c888fe027c338f337123de4da2de1ac73b0f7587Christian König   8, 10, 12, 14, 16, 18,  20,  22,
463c888fe027c338f337123de4da2de1ac73b0f7587Christian König   24, 28, 32, 36, 40, 44,  48,  52,
464c888fe027c338f337123de4da2de1ac73b0f7587Christian König   56, 64, 72, 80, 88, 96, 104, 112
465c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
466c888fe027c338f337123de4da2de1ac73b0f7587Christian König
467c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
468c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_macroblock_modes(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture)
469c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
470c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int macroblock_modes;
471c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const MBtab * tab;
472c888fe027c338f337123de4da2de1ac73b0f7587Christian König
473c888fe027c338f337123de4da2de1ac73b0f7587Christian König   switch (picture->picture_coding_type) {
474c888fe027c338f337123de4da2de1ac73b0f7587Christian König   case I_TYPE:
475c888fe027c338f337123de4da2de1ac73b0f7587Christian König
476c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = MB_I + vl_vlc_ubits(&bs->vlc, 1);
477c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len);
478c888fe027c338f337123de4da2de1ac73b0f7587Christian König      macroblock_modes = tab->modes;
479c888fe027c338f337123de4da2de1ac73b0f7587Christian König
480c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return macroblock_modes;
481c888fe027c338f337123de4da2de1ac73b0f7587Christian König
482c888fe027c338f337123de4da2de1ac73b0f7587Christian König   case P_TYPE:
483c888fe027c338f337123de4da2de1ac73b0f7587Christian König
484c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = MB_P + vl_vlc_ubits(&bs->vlc, 5);
485c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len);
486c888fe027c338f337123de4da2de1ac73b0f7587Christian König      macroblock_modes = tab->modes;
487c888fe027c338f337123de4da2de1ac73b0f7587Christian König
488c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (picture->picture_structure != FRAME_PICTURE) {
489c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
490c888fe027c338f337123de4da2de1ac73b0f7587Christian König            macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE;
491c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 2);
492c888fe027c338f337123de4da2de1ac73b0f7587Christian König          }
493c888fe027c338f337123de4da2de1ac73b0f7587Christian König          return macroblock_modes;
494c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (picture->frame_pred_frame_dct) {
495c888fe027c338f337123de4da2de1ac73b0f7587Christian König          if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
496c888fe027c338f337123de4da2de1ac73b0f7587Christian König            macroblock_modes |= MC_FRAME;
497c888fe027c338f337123de4da2de1ac73b0f7587Christian König          return macroblock_modes;
498c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
499c888fe027c338f337123de4da2de1ac73b0f7587Christian König          if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
500c888fe027c338f337123de4da2de1ac73b0f7587Christian König            macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE;
501c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 2);
502c888fe027c338f337123de4da2de1ac73b0f7587Christian König          }
503c888fe027c338f337123de4da2de1ac73b0f7587Christian König          return macroblock_modes;
504c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
505c888fe027c338f337123de4da2de1ac73b0f7587Christian König
506c888fe027c338f337123de4da2de1ac73b0f7587Christian König   case B_TYPE:
507c888fe027c338f337123de4da2de1ac73b0f7587Christian König
508c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = MB_B + vl_vlc_ubits(&bs->vlc, 6);
509c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len);
510c888fe027c338f337123de4da2de1ac73b0f7587Christian König      macroblock_modes = tab->modes;
511c888fe027c338f337123de4da2de1ac73b0f7587Christian König
512c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (picture->picture_structure != FRAME_PICTURE) {
513c888fe027c338f337123de4da2de1ac73b0f7587Christian König          if (! (macroblock_modes & MACROBLOCK_INTRA)) {
514c888fe027c338f337123de4da2de1ac73b0f7587Christian König            macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE;
515c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 2);
516c888fe027c338f337123de4da2de1ac73b0f7587Christian König          }
517c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (picture->frame_pred_frame_dct) {
518c888fe027c338f337123de4da2de1ac73b0f7587Christian König          macroblock_modes |= MC_FRAME;
519ce31aaec02de0ef509dcee9d641c39623017a638Christian König      } else if (!(macroblock_modes & MACROBLOCK_INTRA)) {
520c888fe027c338f337123de4da2de1ac73b0f7587Christian König          macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE;
521c888fe027c338f337123de4da2de1ac73b0f7587Christian König          vl_vlc_dumpbits(&bs->vlc, 2);
522c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
523ce31aaec02de0ef509dcee9d641c39623017a638Christian König      return macroblock_modes;
524c888fe027c338f337123de4da2de1ac73b0f7587Christian König
525c888fe027c338f337123de4da2de1ac73b0f7587Christian König   case D_TYPE:
526c888fe027c338f337123de4da2de1ac73b0f7587Christian König
527c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, 1);
528c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return MACROBLOCK_INTRA;
529c888fe027c338f337123de4da2de1ac73b0f7587Christian König
530c888fe027c338f337123de4da2de1ac73b0f7587Christian König   default:
531c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return 0;
532c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
533c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
534c888fe027c338f337123de4da2de1ac73b0f7587Christian König
535ce31aaec02de0ef509dcee9d641c39623017a638Christian Königstatic inline enum pipe_mpeg12_dct_type
536ce31aaec02de0ef509dcee9d641c39623017a638Christian Königget_dct_type(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, int macroblock_modes)
537ce31aaec02de0ef509dcee9d641c39623017a638Christian König{
538ce31aaec02de0ef509dcee9d641c39623017a638Christian König   enum pipe_mpeg12_dct_type dct_type = PIPE_MPEG12_DCT_TYPE_FRAME;
539ce31aaec02de0ef509dcee9d641c39623017a638Christian König
540ce31aaec02de0ef509dcee9d641c39623017a638Christian König   if ((picture->picture_structure == FRAME_PICTURE) &&
541ce31aaec02de0ef509dcee9d641c39623017a638Christian König       (!picture->frame_pred_frame_dct) &&
542ce31aaec02de0ef509dcee9d641c39623017a638Christian König       (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN))) {
543ce31aaec02de0ef509dcee9d641c39623017a638Christian König
544ce31aaec02de0ef509dcee9d641c39623017a638Christian König      dct_type = vl_vlc_ubits(&bs->vlc, 1) ? PIPE_MPEG12_DCT_TYPE_FIELD : PIPE_MPEG12_DCT_TYPE_FRAME;
545ce31aaec02de0ef509dcee9d641c39623017a638Christian König      vl_vlc_dumpbits(&bs->vlc, 1);
546ce31aaec02de0ef509dcee9d641c39623017a638Christian König   }
547ce31aaec02de0ef509dcee9d641c39623017a638Christian König   return dct_type;
548ce31aaec02de0ef509dcee9d641c39623017a638Christian König}
549ce31aaec02de0ef509dcee9d641c39623017a638Christian König
550c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
551c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_quantizer_scale(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture)
552c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
553c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int quantizer_scale_code;
554c888fe027c338f337123de4da2de1ac73b0f7587Christian König
555c888fe027c338f337123de4da2de1ac73b0f7587Christian König   quantizer_scale_code = vl_vlc_ubits(&bs->vlc, 5);
556c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 5);
557c888fe027c338f337123de4da2de1ac73b0f7587Christian König
558c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (picture->q_scale_type)
559c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return non_linear_quantizer_scale[quantizer_scale_code];
560c888fe027c338f337123de4da2de1ac73b0f7587Christian König   else
561c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return quantizer_scale_code << 1;
562c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
563c888fe027c338f337123de4da2de1ac73b0f7587Christian König
564c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
565c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_motion_delta(struct vl_mpg12_bs *bs, unsigned f_code)
566c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
567c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int delta;
568c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int sign;
569c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const MVtab * tab;
570c888fe027c338f337123de4da2de1ac73b0f7587Christian König
571c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (bs->vlc.buf & 0x80000000) {
572c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, 1);
573c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return 0;
574c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else if (bs->vlc.buf >= 0x0c000000) {
575c888fe027c338f337123de4da2de1ac73b0f7587Christian König
576c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = MV_4 + vl_vlc_ubits(&bs->vlc, 4);
577c888fe027c338f337123de4da2de1ac73b0f7587Christian König      delta = (tab->delta << f_code) + 1;
578c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.bits += tab->len + f_code + 1;
579c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.buf <<= tab->len;
580c888fe027c338f337123de4da2de1ac73b0f7587Christian König
581c888fe027c338f337123de4da2de1ac73b0f7587Christian König      sign = vl_vlc_sbits(&bs->vlc, 1);
582c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.buf <<= 1;
583c888fe027c338f337123de4da2de1ac73b0f7587Christian König
584c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (f_code)
585c888fe027c338f337123de4da2de1ac73b0f7587Christian König         delta += vl_vlc_ubits(&bs->vlc, f_code);
586c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.buf <<= f_code;
587c888fe027c338f337123de4da2de1ac73b0f7587Christian König
588c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return (delta ^ sign) - sign;
589c888fe027c338f337123de4da2de1ac73b0f7587Christian König
590c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else {
591c888fe027c338f337123de4da2de1ac73b0f7587Christian König
592c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = MV_10 + vl_vlc_ubits(&bs->vlc, 10);
593c888fe027c338f337123de4da2de1ac73b0f7587Christian König      delta = (tab->delta << f_code) + 1;
594c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.bits += tab->len + 1;
595c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.buf <<= tab->len;
596c888fe027c338f337123de4da2de1ac73b0f7587Christian König
597c888fe027c338f337123de4da2de1ac73b0f7587Christian König      sign = vl_vlc_sbits(&bs->vlc, 1);
598c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->vlc.buf <<= 1;
599c888fe027c338f337123de4da2de1ac73b0f7587Christian König
600c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (f_code) {
601c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
602c888fe027c338f337123de4da2de1ac73b0f7587Christian König         delta += vl_vlc_ubits(&bs->vlc, f_code);
603c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, f_code);
604c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
605c888fe027c338f337123de4da2de1ac73b0f7587Christian König
606c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return (delta ^ sign) - sign;
607c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
608c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
609c888fe027c338f337123de4da2de1ac73b0f7587Christian König
610c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
611c888fe027c338f337123de4da2de1ac73b0f7587Christian Königbound_motion_vector(int vec, unsigned f_code)
612c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
613c888fe027c338f337123de4da2de1ac73b0f7587Christian König#if 1
614c888fe027c338f337123de4da2de1ac73b0f7587Christian König   unsigned int limit;
615c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int sign;
616c888fe027c338f337123de4da2de1ac73b0f7587Christian König
617c888fe027c338f337123de4da2de1ac73b0f7587Christian König   limit = 16 << f_code;
618c888fe027c338f337123de4da2de1ac73b0f7587Christian König
619c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if ((unsigned int)(vec + limit) < 2 * limit)
620c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return vec;
621c888fe027c338f337123de4da2de1ac73b0f7587Christian König   else {
622c888fe027c338f337123de4da2de1ac73b0f7587Christian König      sign = ((int32_t)vec) >> 31;
623c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return vec - ((2 * limit) ^ sign) + sign;
624c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
625c888fe027c338f337123de4da2de1ac73b0f7587Christian König#else
626c888fe027c338f337123de4da2de1ac73b0f7587Christian König   return ((int32_t)vec << (28 - f_code)) >> (28 - f_code);
627c888fe027c338f337123de4da2de1ac73b0f7587Christian König#endif
628c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
629c888fe027c338f337123de4da2de1ac73b0f7587Christian König
630c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
631c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_dmv(struct vl_mpg12_bs *bs)
632c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
633c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DMVtab * tab;
634c888fe027c338f337123de4da2de1ac73b0f7587Christian König
635c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tab = DMV_2 + vl_vlc_ubits(&bs->vlc, 2);
636c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, tab->len);
637c888fe027c338f337123de4da2de1ac73b0f7587Christian König   return tab->dmv;
638c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
639c888fe027c338f337123de4da2de1ac73b0f7587Christian König
640c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
641c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_coded_block_pattern(struct vl_mpg12_bs *bs)
642c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
643c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const CBPtab * tab;
644c888fe027c338f337123de4da2de1ac73b0f7587Christian König
645c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
646c888fe027c338f337123de4da2de1ac73b0f7587Christian König
647c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (bs->vlc.buf >= 0x20000000) {
648c888fe027c338f337123de4da2de1ac73b0f7587Christian König
649c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = CBP_7 + (vl_vlc_ubits(&bs->vlc, 7) - 16);
650c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len);
651c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return tab->cbp;
652c888fe027c338f337123de4da2de1ac73b0f7587Christian König
653c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else {
654c888fe027c338f337123de4da2de1ac73b0f7587Christian König
655c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = CBP_9 + vl_vlc_ubits(&bs->vlc, 9);
656c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len);
657c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return tab->cbp;
658c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
659c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
660c888fe027c338f337123de4da2de1ac73b0f7587Christian König
661c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
662c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_luma_dc_dct_diff(struct vl_mpg12_bs *bs)
663c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
664c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCtab * tab;
665c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int size;
666c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int dc_diff;
667c888fe027c338f337123de4da2de1ac73b0f7587Christian König
668c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (bs->vlc.buf < 0xf8000000) {
669c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = DC_lum_5 + vl_vlc_ubits(&bs->vlc, 5);
670c888fe027c338f337123de4da2de1ac73b0f7587Christian König      size = tab->size;
671c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (size) {
672c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.bits += tab->len + size;
673c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= tab->len;
674c888fe027c338f337123de4da2de1ac73b0f7587Christian König         dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size);
675c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= size;
676c888fe027c338f337123de4da2de1ac73b0f7587Christian König         return dc_diff;
677c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
678c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 3);
679c888fe027c338f337123de4da2de1ac73b0f7587Christian König         return 0;
680c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
681c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else {
682c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = DC_long + (vl_vlc_ubits(&bs->vlc, 9) - 0x1e0);
683c888fe027c338f337123de4da2de1ac73b0f7587Christian König      size = tab->size;
684c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len);
685c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_needbits(&bs->vlc);
686c888fe027c338f337123de4da2de1ac73b0f7587Christian König      dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size);
687c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, size);
688c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return dc_diff;
689c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
690c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
691c888fe027c338f337123de4da2de1ac73b0f7587Christian König
692c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int
693c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_chroma_dc_dct_diff(struct vl_mpg12_bs *bs)
694c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
695c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCtab * tab;
696c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int size;
697c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int dc_diff;
698c888fe027c338f337123de4da2de1ac73b0f7587Christian König
699c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (bs->vlc.buf < 0xf8000000) {
700c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = DC_chrom_5 + vl_vlc_ubits(&bs->vlc, 5);
701c888fe027c338f337123de4da2de1ac73b0f7587Christian König      size = tab->size;
702c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (size) {
703c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.bits += tab->len + size;
704c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= tab->len;
705c888fe027c338f337123de4da2de1ac73b0f7587Christian König         dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size);
706c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= size;
707c888fe027c338f337123de4da2de1ac73b0f7587Christian König         return dc_diff;
708c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
709c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 2);
710c888fe027c338f337123de4da2de1ac73b0f7587Christian König         return 0;
711c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
712c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else {
713c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = DC_long + (vl_vlc_ubits(&bs->vlc, 10) - 0x3e0);
714c888fe027c338f337123de4da2de1ac73b0f7587Christian König      size = tab->size;
715c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, tab->len + 1);
716c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_needbits(&bs->vlc);
717c888fe027c338f337123de4da2de1ac73b0f7587Christian König      dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size);
718c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, size);
719c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return dc_diff;
720c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
721c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
722c888fe027c338f337123de4da2de1ac73b0f7587Christian König
723c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
7245d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königget_intra_block_B14(struct vl_mpg12_bs *bs, const int quant_matrix[64], int quantizer_scale, short *dest)
725c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
7265d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int i, val;
727c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int mismatch;
728c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCTtab *tab;
729c888fe027c338f337123de4da2de1ac73b0f7587Christian König
730c888fe027c338f337123de4da2de1ac73b0f7587Christian König   i = 0;
731c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mismatch = ~dest[0];
732c888fe027c338f337123de4da2de1ac73b0f7587Christian König
733c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
734c888fe027c338f337123de4da2de1ac73b0f7587Christian König
735c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
736c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x28000000) {
737c888fe027c338f337123de4da2de1ac73b0f7587Christian König
738c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5);
739c888fe027c338f337123de4da2de1ac73b0f7587Christian König
740c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
741c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
742c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* end of block */
743c888fe027c338f337123de4da2de1ac73b0f7587Christian König
744c888fe027c338f337123de4da2de1ac73b0f7587Christian König      normal_code:
745c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= tab->len;
746c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.bits += tab->len + 1;
7475d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = (tab->level * quantizer_scale * quant_matrix[i]) >> 4;
748c888fe027c338f337123de4da2de1ac73b0f7587Christian König
749c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* if (bitstream_get (1)) val = -val; */
750c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1);
751c888fe027c338f337123de4da2de1ac73b0f7587Christian König
752c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
7536ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
754c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mismatch ^= val;
755c888fe027c338f337123de4da2de1ac73b0f7587Christian König
756c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 1;
757c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
758c888fe027c338f337123de4da2de1ac73b0f7587Christian König
759c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
760c888fe027c338f337123de4da2de1ac73b0f7587Christian König
761c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x04000000) {
762c888fe027c338f337123de4da2de1ac73b0f7587Christian König
763c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4);
764c888fe027c338f337123de4da2de1ac73b0f7587Christian König
765c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
766c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
767c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
768c888fe027c338f337123de4da2de1ac73b0f7587Christian König
769c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* escape code */
770c888fe027c338f337123de4da2de1ac73b0f7587Christian König
771c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += UBITS(bs->vlc.buf << 6, 6) - 64;
772c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
773c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* illegal, check needed to avoid buffer overflow */
774c888fe027c338f337123de4da2de1ac73b0f7587Christian König
775c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 12);
776c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
7775d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = (vl_vlc_sbits(&bs->vlc, 12) * quantizer_scale * quant_matrix[i]) / 16;
778c888fe027c338f337123de4da2de1ac73b0f7587Christian König
779c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
7806ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
781c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mismatch ^= val;
782c888fe027c338f337123de4da2de1ac73b0f7587Christian König
783c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 12);
784c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
785c888fe027c338f337123de4da2de1ac73b0f7587Christian König
786c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
787c888fe027c338f337123de4da2de1ac73b0f7587Christian König
788c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x02000000) {
789c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8);
790c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
791c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
792c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
793c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00800000) {
794c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16);
795c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
796c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
797c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
798c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00200000) {
799c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16);
800c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
801c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
802c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
803c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
804c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16);
805c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 16;
806c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16);
807c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
808c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
809c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
810c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
811c888fe027c338f337123de4da2de1ac73b0f7587Christian König      break;	/* illegal, check needed to avoid buffer overflow */
812c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
813c888fe027c338f337123de4da2de1ac73b0f7587Christian König
814c888fe027c338f337123de4da2de1ac73b0f7587Christian König   dest[63] ^= mismatch & 1;
815c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 2);	/* dump end of block code */
816c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
817c888fe027c338f337123de4da2de1ac73b0f7587Christian König
818c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
8195d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königget_intra_block_B15(struct vl_mpg12_bs *bs, const int quant_matrix[64], int quantizer_scale, short *dest)
820c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
8215d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int i, val;
822c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int mismatch;
823c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCTtab * tab;
824c888fe027c338f337123de4da2de1ac73b0f7587Christian König
825c888fe027c338f337123de4da2de1ac73b0f7587Christian König   i = 0;
826c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mismatch = ~dest[0];
827c888fe027c338f337123de4da2de1ac73b0f7587Christian König
828c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
829c888fe027c338f337123de4da2de1ac73b0f7587Christian König
830c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
831c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x04000000) {
832c888fe027c338f337123de4da2de1ac73b0f7587Christian König
833c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B15_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4);
834c888fe027c338f337123de4da2de1ac73b0f7587Christian König
835c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
836c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64) {
837c888fe027c338f337123de4da2de1ac73b0f7587Christian König
838c888fe027c338f337123de4da2de1ac73b0f7587Christian König         normal_code:
839c888fe027c338f337123de4da2de1ac73b0f7587Christian König            bs->vlc.buf <<= tab->len;
840c888fe027c338f337123de4da2de1ac73b0f7587Christian König            bs->vlc.bits += tab->len + 1;
8415d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König            val = (tab->level * quantizer_scale * quant_matrix[i]) >> 4;
842c888fe027c338f337123de4da2de1ac73b0f7587Christian König
843c888fe027c338f337123de4da2de1ac73b0f7587Christian König            /* if (bitstream_get (1)) val = -val; */
844c888fe027c338f337123de4da2de1ac73b0f7587Christian König            val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1);
845c888fe027c338f337123de4da2de1ac73b0f7587Christian König
846c888fe027c338f337123de4da2de1ac73b0f7587Christian König            SATURATE (val);
8476ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König            dest[i] = val;
848c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mismatch ^= val;
849c888fe027c338f337123de4da2de1ac73b0f7587Christian König
850c888fe027c338f337123de4da2de1ac73b0f7587Christian König            bs->vlc.buf <<= 1;
851c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_needbits(&bs->vlc);
852c888fe027c338f337123de4da2de1ac73b0f7587Christian König
853c888fe027c338f337123de4da2de1ac73b0f7587Christian König            continue;
854c888fe027c338f337123de4da2de1ac73b0f7587Christian König
855c888fe027c338f337123de4da2de1ac73b0f7587Christian König         } else {
856c888fe027c338f337123de4da2de1ac73b0f7587Christian König
857c888fe027c338f337123de4da2de1ac73b0f7587Christian König            /* end of block. I commented out this code because if we */
858c888fe027c338f337123de4da2de1ac73b0f7587Christian König            /* dont exit here we will still exit at the later test :) */
859c888fe027c338f337123de4da2de1ac73b0f7587Christian König
860c888fe027c338f337123de4da2de1ac73b0f7587Christian König            /* if (i >= 128) break;	*/	/* end of block */
861c888fe027c338f337123de4da2de1ac73b0f7587Christian König
862c888fe027c338f337123de4da2de1ac73b0f7587Christian König            /* escape code */
863c888fe027c338f337123de4da2de1ac73b0f7587Christian König
864c888fe027c338f337123de4da2de1ac73b0f7587Christian König            i += UBITS(bs->vlc.buf << 6, 6) - 64;
865c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (i >= 64)
866c888fe027c338f337123de4da2de1ac73b0f7587Christian König                break;	/* illegal, check against buffer overflow */
867c888fe027c338f337123de4da2de1ac73b0f7587Christian König
868c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 12);
869c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_needbits(&bs->vlc);
8705d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König            val = (vl_vlc_sbits(&bs->vlc, 12) * quantizer_scale * quant_matrix[i]) / 16;
871c888fe027c338f337123de4da2de1ac73b0f7587Christian König
872c888fe027c338f337123de4da2de1ac73b0f7587Christian König            SATURATE (val);
8736ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König            dest[i] = val;
874c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mismatch ^= val;
875c888fe027c338f337123de4da2de1ac73b0f7587Christian König
876c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 12);
877c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_needbits(&bs->vlc);
878c888fe027c338f337123de4da2de1ac73b0f7587Christian König
879c888fe027c338f337123de4da2de1ac73b0f7587Christian König            continue;
880c888fe027c338f337123de4da2de1ac73b0f7587Christian König
881c888fe027c338f337123de4da2de1ac73b0f7587Christian König          }
882c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x02000000) {
883c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B15_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8);
884c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
885c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
886c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
887c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00800000) {
888c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16);
889c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
890c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
891c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
892c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00200000) {
893c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16);
894c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
895c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
896c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
897c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
898c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16);
899c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 16;
900c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16);
901c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
902c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
903c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
904c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
905c888fe027c338f337123de4da2de1ac73b0f7587Christian König      break;	/* illegal, check needed to avoid buffer overflow */
906c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
907c888fe027c338f337123de4da2de1ac73b0f7587Christian König
908c888fe027c338f337123de4da2de1ac73b0f7587Christian König   dest[63] ^= mismatch & 1;
909c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 4);	/* dump end of block code */
910c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
911c888fe027c338f337123de4da2de1ac73b0f7587Christian König
912c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
9135d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königget_non_intra_block(struct vl_mpg12_bs *bs, const int quant_matrix[64], int quantizer_scale, short *dest)
914c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
9155d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int i, val;
916c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int mismatch;
917c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCTtab *tab;
918c888fe027c338f337123de4da2de1ac73b0f7587Christian König
919c888fe027c338f337123de4da2de1ac73b0f7587Christian König   i = -1;
920c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mismatch = 1;
921c888fe027c338f337123de4da2de1ac73b0f7587Christian König
922c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
923c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (bs->vlc.buf >= 0x28000000) {
924c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = DCT_B14DC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5);
925c888fe027c338f337123de4da2de1ac73b0f7587Christian König      goto entry_1;
926c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else
927c888fe027c338f337123de4da2de1ac73b0f7587Christian König      goto entry_2;
928c888fe027c338f337123de4da2de1ac73b0f7587Christian König
929c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
930c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x28000000) {
931c888fe027c338f337123de4da2de1ac73b0f7587Christian König
932c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5);
933c888fe027c338f337123de4da2de1ac73b0f7587Christian König
934c888fe027c338f337123de4da2de1ac73b0f7587Christian König      entry_1:
935c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
936c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
937c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* end of block */
938c888fe027c338f337123de4da2de1ac73b0f7587Christian König
939c888fe027c338f337123de4da2de1ac73b0f7587Christian König      normal_code:
940c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= tab->len;
941c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.bits += tab->len + 1;
9425d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = ((2*tab->level+1) * quantizer_scale * quant_matrix[i]) >> 5;
943c888fe027c338f337123de4da2de1ac73b0f7587Christian König
944c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* if (bitstream_get (1)) val = -val; */
945c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1);
946c888fe027c338f337123de4da2de1ac73b0f7587Christian König
947c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
9486ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
949c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mismatch ^= val;
950c888fe027c338f337123de4da2de1ac73b0f7587Christian König
951c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 1;
952c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
953c888fe027c338f337123de4da2de1ac73b0f7587Christian König
954c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
955c888fe027c338f337123de4da2de1ac73b0f7587Christian König
956c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
957c888fe027c338f337123de4da2de1ac73b0f7587Christian König
958c888fe027c338f337123de4da2de1ac73b0f7587Christian König   entry_2:
959c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x04000000) {
960c888fe027c338f337123de4da2de1ac73b0f7587Christian König
961c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4);
962c888fe027c338f337123de4da2de1ac73b0f7587Christian König
963c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
964c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
965c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
966c888fe027c338f337123de4da2de1ac73b0f7587Christian König
967c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* escape code */
968c888fe027c338f337123de4da2de1ac73b0f7587Christian König
969c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += UBITS(bs->vlc.buf << 6, 6) - 64;
970c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
971c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* illegal, check needed to avoid buffer overflow */
972c888fe027c338f337123de4da2de1ac73b0f7587Christian König
973c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 12);
974c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
975c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = 2 * (vl_vlc_sbits(&bs->vlc, 12) + vl_vlc_sbits(&bs->vlc, 1)) + 1;
9765d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = (val * quantizer_scale * quant_matrix[i]) / 32;
977c888fe027c338f337123de4da2de1ac73b0f7587Christian König
978c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
9796ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
980c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mismatch ^= val;
981c888fe027c338f337123de4da2de1ac73b0f7587Christian König
982c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 12);
983c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
984c888fe027c338f337123de4da2de1ac73b0f7587Christian König
985c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
986c888fe027c338f337123de4da2de1ac73b0f7587Christian König
987c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x02000000) {
988c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8);
989c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
990c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
991c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
992c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00800000) {
993c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16);
994c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
995c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
996c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
997c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00200000) {
998c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16);
999c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1000c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1001c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1002c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
1003c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16);
1004c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 16;
1005c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16);
1006c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1007c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1008c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1009c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1010c888fe027c338f337123de4da2de1ac73b0f7587Christian König      break;	/* illegal, check needed to avoid buffer overflow */
1011c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1012c888fe027c338f337123de4da2de1ac73b0f7587Christian König   dest[63] ^= mismatch & 1;
1013c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 2);	/* dump end of block code */
1014c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1015c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1016c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
10175d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königget_mpeg1_intra_block(struct vl_mpg12_bs *bs, const int quant_matrix[64], int quantizer_scale, short *dest)
1018c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
10195d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int i, val;
1020c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCTtab * tab;
1021c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1022c888fe027c338f337123de4da2de1ac73b0f7587Christian König   i = 0;
1023c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1024c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1025c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1026c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
1027c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x28000000) {
1028c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1029c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5);
1030c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1031c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1032c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
1033c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* end of block */
1034c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1035c888fe027c338f337123de4da2de1ac73b0f7587Christian König      normal_code:
1036c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= tab->len;
1037c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.bits += tab->len + 1;
10385d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = (tab->level * quantizer_scale * quant_matrix[i]) >> 4;
1039c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1040c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* oddification */
1041c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val - 1) | 1;
1042c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1043c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* if (bitstream_get (1)) val = -val; */
1044c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1);
1045c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1046c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
10476ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
1048c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1049c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 1;
1050c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
1051c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1052c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
1053c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1054c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x04000000) {
1055c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1056c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4);
1057c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1058c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1059c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1060c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1061c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1062c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* escape code */
1063c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1064c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += UBITS(bs->vlc.buf << 6, 6) - 64;
1065c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
1066c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* illegal, check needed to avoid buffer overflow */
1067c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1068c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 12);
1069c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
1070c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = vl_vlc_sbits(&bs->vlc, 8);
1071c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (! (val & 0x7f)) {
1072c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 8);
1073c888fe027c338f337123de4da2de1ac73b0f7587Christian König            val = vl_vlc_ubits(&bs->vlc, 8) + 2 * val;
1074c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
10755d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = (val * quantizer_scale * quant_matrix[i]) / 16;
1076c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1077c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* oddification */
1078c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val + ~SBITS (val, 1)) | 1;
1079c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1080c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
10816ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
1082c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1083c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 8);
1084c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
1085c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1086c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
1087c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1088c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x02000000) {
1089c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8);
1090c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1091c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1092c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1093c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00800000) {
1094c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16);
1095c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1096c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1097c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1098c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00200000) {
1099c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16);
1100c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1101c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1102c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1103c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
1104c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16);
1105c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 16;
1106c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16);
1107c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1108c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1109c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1110c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1111c888fe027c338f337123de4da2de1ac73b0f7587Christian König      break;	/* illegal, check needed to avoid buffer overflow */
1112c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1113c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 2);	/* dump end of block code */
1114c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1115c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1116c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
11175d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königget_mpeg1_non_intra_block(struct vl_mpg12_bs *bs, const int quant_matrix[64], int quantizer_scale, short *dest)
1118c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
11195d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int i, val;
1120c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const DCTtab * tab;
1121c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1122c888fe027c338f337123de4da2de1ac73b0f7587Christian König   i = -1;
1123c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1124c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1125c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (bs->vlc.buf >= 0x28000000) {
1126c888fe027c338f337123de4da2de1ac73b0f7587Christian König      tab = DCT_B14DC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5);
1127c888fe027c338f337123de4da2de1ac73b0f7587Christian König      goto entry_1;
1128c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else
1129c888fe027c338f337123de4da2de1ac73b0f7587Christian König      goto entry_2;
1130c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1131c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
1132c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x28000000) {
1133c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1134c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5);
1135c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1136c888fe027c338f337123de4da2de1ac73b0f7587Christian König      entry_1:
1137c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1138c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
1139c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* end of block */
1140c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1141c888fe027c338f337123de4da2de1ac73b0f7587Christian König      normal_code:
1142c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= tab->len;
1143c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.bits += tab->len + 1;
11445d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = ((2*tab->level+1) * quantizer_scale * quant_matrix[i]) >> 5;
1145c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1146c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* oddification */
1147c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val - 1) | 1;
1148c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1149c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* if (bitstream_get (1)) val = -val; */
1150c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1);
1151c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1152c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
11536ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
1154c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1155c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 1;
1156c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
1157c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1158c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
1159c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1160c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1161c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1162c888fe027c338f337123de4da2de1ac73b0f7587Christian König   entry_2:
1163c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x04000000) {
1164c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1165c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4);
1166c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1167c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1168c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1169c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1170c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1171c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* escape code */
1172c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1173c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += UBITS(bs->vlc.buf << 6, 6) - 64;
1174c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i >= 64)
1175c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;	/* illegal, check needed to avoid buffer overflow */
1176c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1177c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 12);
1178c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
1179c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = vl_vlc_sbits(&bs->vlc, 8);
1180c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (! (val & 0x7f)) {
1181c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 8);
1182c888fe027c338f337123de4da2de1ac73b0f7587Christian König            val = vl_vlc_ubits(&bs->vlc, 8) + 2 * val;
1183c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
1184c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = 2 * (val + SBITS (val, 1)) + 1;
11855d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         val = (val * quantizer_scale * quant_matrix[i]) / 32;
1186c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1187c888fe027c338f337123de4da2de1ac73b0f7587Christian König         /* oddification */
1188c888fe027c338f337123de4da2de1ac73b0f7587Christian König         val = (val + ~SBITS (val, 1)) | 1;
1189c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1190c888fe027c338f337123de4da2de1ac73b0f7587Christian König         SATURATE (val);
11916ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König         dest[i] = val;
1192c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1193c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_dumpbits(&bs->vlc, 8);
1194c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_needbits(&bs->vlc);
1195c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1196c888fe027c338f337123de4da2de1ac73b0f7587Christian König         continue;
1197c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1198c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x02000000) {
1199c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8);
1200c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1201c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1202c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1203c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00800000) {
1204c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16);
1205c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1206c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1207c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1208c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x00200000) {
1209c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16);
1210c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1211c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1212c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1213c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
1214c888fe027c338f337123de4da2de1ac73b0f7587Christian König         tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16);
1215c888fe027c338f337123de4da2de1ac73b0f7587Christian König         bs->vlc.buf <<= 16;
1216c888fe027c338f337123de4da2de1ac73b0f7587Christian König         vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16);
1217c888fe027c338f337123de4da2de1ac73b0f7587Christian König         i += tab->run;
1218c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (i < 64)
1219c888fe027c338f337123de4da2de1ac73b0f7587Christian König            goto normal_code;
1220c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1221c888fe027c338f337123de4da2de1ac73b0f7587Christian König      break;	/* illegal, check needed to avoid buffer overflow */
1222c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1223c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 2);	/* dump end of block code */
1224c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1225c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1226c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
12275d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königslice_intra_DCT(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, const int quant_matrix[64], int cc,
12286ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König                 unsigned x, unsigned y, enum pipe_mpeg12_dct_type coding, int quantizer_scale, int dc_dct_pred[3])
1229c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1230626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König   short dest[64];
1231c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1232c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->x = x;
1233c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->y = y;
1234c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->intra = PIPE_MPEG12_DCT_INTRA;
1235c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->coding = coding;
1236c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1237c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1238c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1239c888fe027c338f337123de4da2de1ac73b0f7587Christian König   /* Get the intra DC coefficient and inverse quantize it */
1240c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (cc == 0)
1241a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König      dc_dct_pred[0] += get_luma_dc_dct_diff(bs);
1242c888fe027c338f337123de4da2de1ac73b0f7587Christian König   else
1243a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König      dc_dct_pred[cc] += get_chroma_dc_dct_diff(bs);
1244c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1245c888fe027c338f337123de4da2de1ac73b0f7587Christian König   memset(dest, 0, sizeof(int16_t) * 64);
1246a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König   dest[0] = dc_dct_pred[cc] << (3 - picture->intra_dc_precision);
1247c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (picture->mpeg1) {
1248c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (picture->picture_coding_type != D_TYPE)
12495d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König          get_mpeg1_intra_block(bs, quant_matrix, quantizer_scale, dest);
1250c888fe027c338f337123de4da2de1ac73b0f7587Christian König   } else if (picture->intra_vlc_format)
12515d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König      get_intra_block_B15(bs, quant_matrix, quantizer_scale, dest);
1252c888fe027c338f337123de4da2de1ac73b0f7587Christian König   else
12535d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König      get_intra_block_B14(bs, quant_matrix, quantizer_scale, dest);
1254c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1255626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König   memcpy(bs->ycbcr_buffer[cc], dest, sizeof(int16_t) * 64);
1256626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König
1257c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->num_ycbcr_blocks[cc]++;
1258c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]++;
1259c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_buffer[cc] += 64;
1260c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1261c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1262c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
12635d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königslice_non_intra_DCT(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, const int quant_matrix[64], int cc,
12645d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König                    unsigned x, unsigned y,  enum pipe_mpeg12_dct_type coding, int quantizer_scale)
1265c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1266626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König   short dest[64];
1267c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1268c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->x = x;
1269c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->y = y;
1270c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->intra = PIPE_MPEG12_DCT_DELTA;
1271c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]->coding = coding;
1272c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1273c888fe027c338f337123de4da2de1ac73b0f7587Christian König   memset(dest, 0, sizeof(int16_t) * 64);
1274c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (picture->mpeg1)
12755d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König      get_mpeg1_non_intra_block(bs, quant_matrix, quantizer_scale, dest);
1276c888fe027c338f337123de4da2de1ac73b0f7587Christian König   else
12775d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König      get_non_intra_block(bs, quant_matrix, quantizer_scale, dest);
1278c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1279626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König   memcpy(bs->ycbcr_buffer[cc], dest, sizeof(int16_t) * 64);
1280626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König
1281c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->num_ycbcr_blocks[cc]++;
1282c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_stream[cc]++;
1283c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->ycbcr_buffer[cc] += 64;
1284c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1285c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1286c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1287c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_mp1(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1288c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1289c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1290c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1291c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME;
1292c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1293c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1294c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = (mv->top.x + (get_motion_delta(bs, f_code[0]) << f_code[1]));
1295c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0] + f_code[1]);
1296c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = motion_x;
1297c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1298c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1299c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = (mv->top.y + (get_motion_delta(bs, f_code[0]) << f_code[1]));
1300c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = bound_motion_vector (motion_y, f_code[0] + f_code[1]);
1301c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = motion_y;
1302c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1303c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1304c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1305c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_frame(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1306c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1307c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1308c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1309c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME;
1310c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1311c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1312c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->top.x + get_motion_delta(bs, f_code[0]);
1313c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector(motion_x, f_code[0]);
1314c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = motion_x;
1315c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1316c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1317c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = mv->top.y + get_motion_delta(bs, f_code[1]);
1318c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = bound_motion_vector(motion_y, f_code[1]);
1319c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = motion_y;
1320c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1321c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1322c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1323c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_field(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1324c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1325c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1326c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1327c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1328c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = vl_vlc_ubits(&bs->vlc, 1) ?
1329c888fe027c338f337123de4da2de1ac73b0f7587Christian König      PIPE_VIDEO_BOTTOM_FIELD : PIPE_VIDEO_TOP_FIELD;
1330c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1);
1331c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1332c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->top.x + get_motion_delta(bs, f_code[0]);
1333c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0]);
1334c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = motion_x;
1335c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1336c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1337c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = (mv->top.y >> 1) + get_motion_delta(bs, f_code[1]);
1338c888fe027c338f337123de4da2de1ac73b0f7587Christian König   /* motion_y = bound_motion_vector (motion_y, f_code[1]); */
1339c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = motion_y << 1;
1340c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1341c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1342c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->bottom.field_select = vl_vlc_ubits(&bs->vlc, 1) ?
1343c888fe027c338f337123de4da2de1ac73b0f7587Christian König      PIPE_VIDEO_BOTTOM_FIELD : PIPE_VIDEO_TOP_FIELD;
1344c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1);
1345c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1346c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->bottom.x + get_motion_delta(bs, f_code[0]);
1347c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0]);
1348c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->bottom.x = motion_x;
1349c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1350c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1351c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = (mv->bottom.y >> 1) + get_motion_delta(bs, f_code[1]);
1352c888fe027c338f337123de4da2de1ac73b0f7587Christian König   /* motion_y = bound_motion_vector (motion_y, f_code[1]); */
1353c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->bottom.y = motion_y << 1;
1354c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1355c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1356c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1357c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_dmv(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1358c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1359c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1360c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1361c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // TODO Implement dmv
1362c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME;
1363c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1364c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1365c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->top.x + get_motion_delta(bs, f_code[0]);
1366c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector(motion_x, f_code[0]);
1367c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = motion_x;
1368c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1369c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1370c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = (mv->top.y >> 1) + get_motion_delta(bs, f_code[1]);
1371c888fe027c338f337123de4da2de1ac73b0f7587Christian König   /* motion_y = bound_motion_vector (motion_y, f_code[1]); */
1372c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = motion_y << 1;
1373c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1374c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1375c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* like motion_frame, but parsing without actual motion compensation */
1376c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1377c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_conceal(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1378c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1379c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int tmp;
1380c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1381c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME;
1382c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1383c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1384c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = (mv->top.x + get_motion_delta(bs, f_code[0]));
1385c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = bound_motion_vector (tmp, f_code[0]);
1386c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = tmp;
1387c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1388c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1389c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = (mv->top.y + get_motion_delta(bs, f_code[1]));
1390c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = bound_motion_vector (tmp, f_code[1]);
1391c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = tmp;
1392c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1393c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1); /* remove marker_bit */
1394c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1395c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1396c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1397c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_field(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1398c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1399c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1400c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1401c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1402c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1403c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // ref_field
1404c888fe027c338f337123de4da2de1ac73b0f7587Christian König   //vl_vlc_ubits(&bs->vlc, 1);
1405c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1406c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // TODO field select may need to do something here for bob (weave ok)
1407c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME;
1408c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1);
1409c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1410c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->top.x + get_motion_delta(bs, f_code[0]);
1411c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0]);
1412c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = motion_x;
1413c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1414c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1415c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = mv->top.y + get_motion_delta(bs, f_code[1]);
1416c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = bound_motion_vector (motion_y, f_code[1]);
1417c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = motion_y;
1418c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1419c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1420c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1421c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_16x8(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1422c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1423c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1424c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1425c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1426c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1427c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // ref_field
1428c888fe027c338f337123de4da2de1ac73b0f7587Christian König   //vl_vlc_ubits(&bs->vlc, 1);
1429c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1430c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // TODO field select may need to do something here bob  (weave ok)
1431c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = PIPE_VIDEO_FRAME;
1432c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1);
1433c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1434c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->top.x + get_motion_delta(bs, f_code[0]);
1435c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0]);
1436c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = motion_x;
1437c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1438c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1439c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = mv->top.y + get_motion_delta(bs, f_code[1]);
1440c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = bound_motion_vector (motion_y, f_code[1]);
1441c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = motion_y;
1442c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1443c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1444c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // ref_field
1445c888fe027c338f337123de4da2de1ac73b0f7587Christian König   //vl_vlc_ubits(&bs->vlc, 1);
1446c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1447c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // TODO field select may need to do something here for bob (weave ok)
1448c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->bottom.field_select = PIPE_VIDEO_FRAME;
1449c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1);
1450c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1451c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->bottom.x + get_motion_delta(bs, f_code[0]);
1452c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0]);
1453c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->bottom.x = motion_x;
1454c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1455c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1456c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = mv->bottom.y + get_motion_delta(bs, f_code[1]);
1457c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = bound_motion_vector (motion_y, f_code[1]);
1458c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->bottom.y = motion_y;
1459c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1460c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1461c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1462c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_dmv(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1463c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1464c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int motion_x, motion_y;
1465c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1466c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // TODO field select may need to do something here for bob  (weave ok)
1467c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME;
1468c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1469c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1470c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = mv->top.x + get_motion_delta(bs, f_code[0]);
1471c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_x = bound_motion_vector (motion_x, f_code[0]);
1472c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = motion_x;
1473c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1474c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1475c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = mv->top.y + get_motion_delta(bs, f_code[1]);
1476c888fe027c338f337123de4da2de1ac73b0f7587Christian König   motion_y = bound_motion_vector (motion_y, f_code[1]);
1477c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = motion_y;
1478c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1479c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1480c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1481c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void
1482c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_conceal(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv)
1483c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1484c888fe027c338f337123de4da2de1ac73b0f7587Christian König   int tmp;
1485c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1486c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1487c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1); /* remove field_select */
1488c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1489c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = (mv->top.x + get_motion_delta(bs, f_code[0]));
1490c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = bound_motion_vector(tmp, f_code[0]);
1491c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.x = mv->bottom.x = tmp;
1492c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1493c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_needbits(&bs->vlc);
1494c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = (mv->top.y + get_motion_delta(bs, f_code[1]));
1495c888fe027c338f337123de4da2de1ac73b0f7587Christian König   tmp = bound_motion_vector(tmp, f_code[1]);
1496c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv->top.y = mv->bottom.y = tmp;
1497c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1498c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, 1); /* remove marker_bit */
1499c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1500c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1501c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MOTION_CALL(routine, macroblock_modes)		\
1502c888fe027c338f337123de4da2de1ac73b0f7587Christian Königdo {							\
1503c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if ((macroblock_modes) & MACROBLOCK_MOTION_FORWARD)  \
1504c888fe027c338f337123de4da2de1ac73b0f7587Christian König      routine(bs, picture->f_code[0], &mv_fwd);         \
1505c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if ((macroblock_modes) & MACROBLOCK_MOTION_BACKWARD)	\
1506c888fe027c338f337123de4da2de1ac73b0f7587Christian König      routine(bs, picture->f_code[1], &mv_bwd);         \
1507c888fe027c338f337123de4da2de1ac73b0f7587Christian König} while (0)
1508c888fe027c338f337123de4da2de1ac73b0f7587Christian König
15096c731191c08561ea247cb2fcfacdf08f6b842363Christian Königstatic inline void
1510235de23e57bd6dac6a2fcdd0807838eef72f6173Christian Königstore_motionvectors(struct vl_mpg12_bs *bs, unsigned *mv_pos,
15116c731191c08561ea247cb2fcfacdf08f6b842363Christian König                    struct pipe_motionvector *mv_fwd,
15126c731191c08561ea247cb2fcfacdf08f6b842363Christian König                    struct pipe_motionvector *mv_bwd)
15136c731191c08561ea247cb2fcfacdf08f6b842363Christian König{
1514235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   bs->mv_stream[0][*mv_pos].top = mv_fwd->top;
1515235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   bs->mv_stream[0][*mv_pos].bottom =
15166c731191c08561ea247cb2fcfacdf08f6b842363Christian König      mv_fwd->top.field_select == PIPE_VIDEO_FRAME ?
15176c731191c08561ea247cb2fcfacdf08f6b842363Christian König      mv_fwd->top : mv_fwd->bottom;
15186c731191c08561ea247cb2fcfacdf08f6b842363Christian König
1519235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   bs->mv_stream[1][*mv_pos].top = mv_bwd->top;
1520235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   bs->mv_stream[1][*mv_pos].bottom =
15216c731191c08561ea247cb2fcfacdf08f6b842363Christian König      mv_bwd->top.field_select == PIPE_VIDEO_FRAME ?
15226c731191c08561ea247cb2fcfacdf08f6b842363Christian König      mv_bwd->top : mv_bwd->bottom;
1523235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König
1524235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   (*mv_pos)++;
15256c731191c08561ea247cb2fcfacdf08f6b842363Christian König}
15266c731191c08561ea247cb2fcfacdf08f6b842363Christian König
1527c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline bool
1528352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königslice_init(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture,
1529235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König           int *quantizer_scale, unsigned *x, unsigned *y, unsigned *mv_pos)
1530c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1531c888fe027c338f337123de4da2de1ac73b0f7587Christian König   const MBAtab * mba;
1532c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1533c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_need32bits(&bs->vlc);
1534c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while(bs->vlc.buf < 0x101 || bs->vlc.buf > 0x1AF) {
1535c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if(!vl_vlc_getbyte(&bs->vlc))
1536c888fe027c338f337123de4da2de1ac73b0f7587Christian König         return false;
1537c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1538e3789105fe3a289338821a53da499857aa924637Christian König   *y = (bs->vlc.buf & 0xFF) - 1;
1539c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_restart(&bs->vlc);
1540c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1541352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König   *quantizer_scale = get_quantizer_scale(bs, picture);
1542c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1543c888fe027c338f337123de4da2de1ac73b0f7587Christian König   /* ignore intra_slice and all the extra data */
1544c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (bs->vlc.buf & 0x80000000) {
1545c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, 9);
1546c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_needbits(&bs->vlc);
1547c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1548c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1549c888fe027c338f337123de4da2de1ac73b0f7587Christian König   /* decode initial macroblock address increment */
1550c888fe027c338f337123de4da2de1ac73b0f7587Christian König   *x = 0;
1551c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
1552c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (bs->vlc.buf >= 0x08000000) {
1553c888fe027c338f337123de4da2de1ac73b0f7587Christian König          mba = MBA_5 + (vl_vlc_ubits(&bs->vlc, 6) - 2);
1554c888fe027c338f337123de4da2de1ac73b0f7587Christian König          break;
1555c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else if (bs->vlc.buf >= 0x01800000) {
1556c888fe027c338f337123de4da2de1ac73b0f7587Christian König          mba = MBA_11 + (vl_vlc_ubits(&bs->vlc, 12) - 24);
1557c888fe027c338f337123de4da2de1ac73b0f7587Christian König          break;
1558c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else switch (vl_vlc_ubits(&bs->vlc, 12)) {
1559c888fe027c338f337123de4da2de1ac73b0f7587Christian König      case 8:		/* macroblock_escape */
1560c888fe027c338f337123de4da2de1ac73b0f7587Christian König          *x += 33;
1561c888fe027c338f337123de4da2de1ac73b0f7587Christian König          vl_vlc_dumpbits(&bs->vlc, 11);
1562c888fe027c338f337123de4da2de1ac73b0f7587Christian König          vl_vlc_needbits(&bs->vlc);
1563c888fe027c338f337123de4da2de1ac73b0f7587Christian König          continue;
1564c888fe027c338f337123de4da2de1ac73b0f7587Christian König      case 15:	/* macroblock_stuffing (MPEG1 only) */
1565c888fe027c338f337123de4da2de1ac73b0f7587Christian König          bs->vlc.buf &= 0xfffff;
1566c888fe027c338f337123de4da2de1ac73b0f7587Christian König          vl_vlc_dumpbits(&bs->vlc, 11);
1567c888fe027c338f337123de4da2de1ac73b0f7587Christian König          vl_vlc_needbits(&bs->vlc);
1568c888fe027c338f337123de4da2de1ac73b0f7587Christian König          continue;
1569c888fe027c338f337123de4da2de1ac73b0f7587Christian König      default:	/* error */
1570c888fe027c338f337123de4da2de1ac73b0f7587Christian König          return false;
1571c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1572c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1573c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_dumpbits(&bs->vlc, mba->len + 1);
1574e3789105fe3a289338821a53da499857aa924637Christian König   *x += mba->mba;
1575c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1576c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (*x >= bs->width) {
1577c888fe027c338f337123de4da2de1ac73b0f7587Christian König      *x -= bs->width;
1578e3789105fe3a289338821a53da499857aa924637Christian König      (*y)++;
1579c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1580c888fe027c338f337123de4da2de1ac73b0f7587Christian König   if (*y > bs->height)
1581c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return false;
1582c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1583235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   *mv_pos = *x + *y * bs->width;
1584235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König
1585c888fe027c338f337123de4da2de1ac73b0f7587Christian König   return true;
1586c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1587c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1588c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline bool
15895d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian Königdecode_slice(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc *picture,
15905d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König             const int intra_quantizer_matrix[64], const int non_intra_quantizer_matrix[64])
1591c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
15923b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   enum pipe_video_field_select default_field_select;
1593c888fe027c338f337123de4da2de1ac73b0f7587Christian König   struct pipe_motionvector mv_fwd, mv_bwd;
1594c888fe027c338f337123de4da2de1ac73b0f7587Christian König   enum pipe_mpeg12_dct_type dct_type;
1595a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König
1596a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König   /* predictor for DC coefficients in intra blocks */
1597a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König   int dc_dct_pred[3] = { 0, 0, 0 };
1598352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König   int quantizer_scale;
1599a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König
1600235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   unsigned x, y, mv_pos;
1601c888fe027c338f337123de4da2de1ac73b0f7587Christian König
16023b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   switch(picture->picture_structure) {
16033b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   case TOP_FIELD:
16043b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König      default_field_select = PIPE_VIDEO_TOP_FIELD;
16053b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König      break;
16063b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König
16073b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   case BOTTOM_FIELD:
16083b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König      default_field_select = PIPE_VIDEO_BOTTOM_FIELD;
16093b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König      break;
16103b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König
16113b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   default:
16123b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König      default_field_select = PIPE_VIDEO_FRAME;
16133b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König      break;
16143b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   }
16153b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König
1616235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König   if (!slice_init(bs, picture, &quantizer_scale, &x, &y, &mv_pos))
1617c888fe027c338f337123de4da2de1ac73b0f7587Christian König      return false;
1618c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1619c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0;
16203b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   mv_fwd.top.field_select = mv_fwd.bottom.field_select = default_field_select;
1621c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1622c888fe027c338f337123de4da2de1ac73b0f7587Christian König   mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0;
16233b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König   mv_bwd.top.field_select = mv_bwd.bottom.field_select = default_field_select;
1624c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1625c888fe027c338f337123de4da2de1ac73b0f7587Christian König   while (1) {
1626c888fe027c338f337123de4da2de1ac73b0f7587Christian König      int macroblock_modes;
1627c888fe027c338f337123de4da2de1ac73b0f7587Christian König      int mba_inc;
1628c888fe027c338f337123de4da2de1ac73b0f7587Christian König      const MBAtab * mba;
1629c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1630c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_needbits(&bs->vlc);
1631c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1632ce31aaec02de0ef509dcee9d641c39623017a638Christian König      macroblock_modes = get_macroblock_modes(bs, picture);
1633ce31aaec02de0ef509dcee9d641c39623017a638Christian König      dct_type = get_dct_type(bs, picture, macroblock_modes);
1634c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1635c888fe027c338f337123de4da2de1ac73b0f7587Christian König      switch(macroblock_modes & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD)) {
1636c888fe027c338f337123de4da2de1ac73b0f7587Christian König      case (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD):
1637c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_HALF;
1638c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_HALF;
1639c888fe027c338f337123de4da2de1ac73b0f7587Christian König         break;
1640c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1641c888fe027c338f337123de4da2de1ac73b0f7587Christian König      default:
16423b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König         mv_fwd.top.field_select = mv_fwd.bottom.field_select = default_field_select;
16433b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König         mv_bwd.top.field_select = mv_bwd.bottom.field_select = default_field_select;
16443b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König
16453b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König         /* fall through */
1646c888fe027c338f337123de4da2de1ac73b0f7587Christian König      case MACROBLOCK_MOTION_FORWARD:
1647c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX;
1648c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN;
1649c888fe027c338f337123de4da2de1ac73b0f7587Christian König         break;
1650c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1651c888fe027c338f337123de4da2de1ac73b0f7587Christian König      case MACROBLOCK_MOTION_BACKWARD:
1652c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN;
1653c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX;
1654c888fe027c338f337123de4da2de1ac73b0f7587Christian König         break;
1655c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1656c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1657c888fe027c338f337123de4da2de1ac73b0f7587Christian König      /* maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ? */
1658c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (macroblock_modes & MACROBLOCK_QUANT)
1659352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König         quantizer_scale = get_quantizer_scale(bs, picture);
1660c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1661c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (macroblock_modes & MACROBLOCK_INTRA) {
1662c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1663c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (picture->concealment_motion_vectors) {
1664c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (picture->picture_structure == FRAME_PICTURE)
1665c888fe027c338f337123de4da2de1ac73b0f7587Christian König               motion_fr_conceal(bs, picture->f_code[0], &mv_fwd);
1666c888fe027c338f337123de4da2de1ac73b0f7587Christian König            else
1667c888fe027c338f337123de4da2de1ac73b0f7587Christian König               motion_fi_conceal(bs, picture->f_code[0], &mv_fwd);
1668c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1669c888fe027c338f337123de4da2de1ac73b0f7587Christian König         } else {
1670c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0;
1671c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0;
1672c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
1673c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN;
1674c888fe027c338f337123de4da2de1ac73b0f7587Christian König         mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN;
1675c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1676c888fe027c338f337123de4da2de1ac73b0f7587Christian König         // unravaled loop of 6 block(i) calls in macroblock()
16775d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         slice_intra_DCT(bs, picture, intra_quantizer_matrix, 0, x*2+0, y*2+0, dct_type, quantizer_scale, dc_dct_pred);
16785d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         slice_intra_DCT(bs, picture, intra_quantizer_matrix, 0, x*2+1, y*2+0, dct_type, quantizer_scale, dc_dct_pred);
16795d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         slice_intra_DCT(bs, picture, intra_quantizer_matrix, 0, x*2+0, y*2+1, dct_type, quantizer_scale, dc_dct_pred);
16805d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         slice_intra_DCT(bs, picture, intra_quantizer_matrix, 0, x*2+1, y*2+1, dct_type, quantizer_scale, dc_dct_pred);
16815d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         slice_intra_DCT(bs, picture, intra_quantizer_matrix, 1, x, y, PIPE_MPEG12_DCT_TYPE_FRAME, quantizer_scale, dc_dct_pred);
16825d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König         slice_intra_DCT(bs, picture, intra_quantizer_matrix, 2, x, y, PIPE_MPEG12_DCT_TYPE_FRAME, quantizer_scale, dc_dct_pred);
1683c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1684c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (picture->picture_coding_type == D_TYPE) {
1685c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_needbits(&bs->vlc);
1686c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 1);
1687c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
1688c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1689c888fe027c338f337123de4da2de1ac73b0f7587Christian König      } else {
1690c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (picture->picture_structure == FRAME_PICTURE)
1691c888fe027c338f337123de4da2de1ac73b0f7587Christian König            switch (macroblock_modes & MOTION_TYPE_MASK) {
1692c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case MC_FRAME:
1693c888fe027c338f337123de4da2de1ac73b0f7587Christian König               if (picture->mpeg1) {
1694c888fe027c338f337123de4da2de1ac73b0f7587Christian König                  MOTION_CALL(motion_mp1, macroblock_modes);
1695c888fe027c338f337123de4da2de1ac73b0f7587Christian König               } else {
1696c888fe027c338f337123de4da2de1ac73b0f7587Christian König                  MOTION_CALL(motion_fr_frame, macroblock_modes);
1697c888fe027c338f337123de4da2de1ac73b0f7587Christian König               }
1698c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1699c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1700c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case MC_FIELD:
1701c888fe027c338f337123de4da2de1ac73b0f7587Christian König               MOTION_CALL (motion_fr_field, macroblock_modes);
1702c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1703c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1704c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case MC_DMV:
1705c888fe027c338f337123de4da2de1ac73b0f7587Christian König               MOTION_CALL (motion_fr_dmv, MACROBLOCK_MOTION_FORWARD);
1706c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1707c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1708c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case 0:
1709c888fe027c338f337123de4da2de1ac73b0f7587Christian König               /* non-intra mb without forward mv in a P picture */
1710c888fe027c338f337123de4da2de1ac73b0f7587Christian König               mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0;
1711c888fe027c338f337123de4da2de1ac73b0f7587Christian König               mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0;
1712c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1713c888fe027c338f337123de4da2de1ac73b0f7587Christian König            }
1714c888fe027c338f337123de4da2de1ac73b0f7587Christian König         else
1715c888fe027c338f337123de4da2de1ac73b0f7587Christian König            switch (macroblock_modes & MOTION_TYPE_MASK) {
1716c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case MC_FIELD:
1717c888fe027c338f337123de4da2de1ac73b0f7587Christian König               MOTION_CALL (motion_fi_field, macroblock_modes);
1718c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1719c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1720c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case MC_16X8:
1721c888fe027c338f337123de4da2de1ac73b0f7587Christian König               MOTION_CALL (motion_fi_16x8, macroblock_modes);
1722c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1723c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1724c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case MC_DMV:
1725c888fe027c338f337123de4da2de1ac73b0f7587Christian König               MOTION_CALL (motion_fi_dmv, MACROBLOCK_MOTION_FORWARD);
1726c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1727c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1728c888fe027c338f337123de4da2de1ac73b0f7587Christian König            case 0:
1729c888fe027c338f337123de4da2de1ac73b0f7587Christian König               /* non-intra mb without forward mv in a P picture */
1730c888fe027c338f337123de4da2de1ac73b0f7587Christian König               mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0;
1731c888fe027c338f337123de4da2de1ac73b0f7587Christian König               mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0;
1732c888fe027c338f337123de4da2de1ac73b0f7587Christian König               break;
1733c888fe027c338f337123de4da2de1ac73b0f7587Christian König            }
1734c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1735c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (macroblock_modes & MACROBLOCK_PATTERN) {
1736c888fe027c338f337123de4da2de1ac73b0f7587Christian König            int coded_block_pattern = get_coded_block_pattern(bs);
1737c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1738c888fe027c338f337123de4da2de1ac73b0f7587Christian König            // TODO  optimize not fully used for idct accel only mc.
1739c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (coded_block_pattern & 0x20)
17405d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König               slice_non_intra_DCT(bs, picture, non_intra_quantizer_matrix, 0, x*2+0, y*2+0, dct_type, quantizer_scale); // cc0  luma 0
1741c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (coded_block_pattern & 0x10)
17425d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König               slice_non_intra_DCT(bs, picture, non_intra_quantizer_matrix, 0, x*2+1, y*2+0, dct_type, quantizer_scale); // cc0 luma 1
1743c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (coded_block_pattern & 0x08)
17445d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König               slice_non_intra_DCT(bs, picture, non_intra_quantizer_matrix, 0, x*2+0, y*2+1, dct_type, quantizer_scale); // cc0 luma 2
1745c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (coded_block_pattern & 0x04)
17465d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König               slice_non_intra_DCT(bs, picture, non_intra_quantizer_matrix, 0, x*2+1, y*2+1, dct_type, quantizer_scale); // cc0 luma 3
1747c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (coded_block_pattern & 0x2)
17485d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König               slice_non_intra_DCT(bs, picture, non_intra_quantizer_matrix, 1, x, y, PIPE_MPEG12_DCT_TYPE_FRAME, quantizer_scale); // cc1 croma
1749c888fe027c338f337123de4da2de1ac73b0f7587Christian König            if (coded_block_pattern & 0x1)
17505d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König               slice_non_intra_DCT(bs, picture, non_intra_quantizer_matrix, 2, x, y, PIPE_MPEG12_DCT_TYPE_FRAME, quantizer_scale); // cc2 croma
1751c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
1752c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1753a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König         dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0;
1754c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1755c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1756235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König      store_motionvectors(bs, &mv_pos, &mv_fwd, &mv_bwd);
1757235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König      if (++x >= bs->width) {
1758235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         ++y;
1759235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         if (y >= bs->height)
1760235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König            return false;
1761235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         x -= bs->width;
1762235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König      }
1763c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1764c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_needbits(&bs->vlc);
1765c888fe027c338f337123de4da2de1ac73b0f7587Christian König      mba_inc = 0;
1766c888fe027c338f337123de4da2de1ac73b0f7587Christian König      while (1) {
1767c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (bs->vlc.buf >= 0x10000000) {
1768c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mba = MBA_5 + (vl_vlc_ubits(&bs->vlc, 5) - 2);
1769c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;
1770c888fe027c338f337123de4da2de1ac73b0f7587Christian König         } else if (bs->vlc.buf >= 0x03000000) {
1771c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mba = MBA_11 + (vl_vlc_ubits(&bs->vlc, 11) - 24);
1772c888fe027c338f337123de4da2de1ac73b0f7587Christian König            break;
1773c888fe027c338f337123de4da2de1ac73b0f7587Christian König         } else switch (vl_vlc_ubits(&bs->vlc, 11)) {
1774c888fe027c338f337123de4da2de1ac73b0f7587Christian König         case 8:		/* macroblock_escape */
1775c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mba_inc += 33;
1776c888fe027c338f337123de4da2de1ac73b0f7587Christian König            /* pass through */
1777c888fe027c338f337123de4da2de1ac73b0f7587Christian König         case 15:	/* macroblock_stuffing (MPEG1 only) */
1778c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_dumpbits(&bs->vlc, 11);
1779c888fe027c338f337123de4da2de1ac73b0f7587Christian König            vl_vlc_needbits(&bs->vlc);
1780c888fe027c338f337123de4da2de1ac73b0f7587Christian König            continue;
1781c888fe027c338f337123de4da2de1ac73b0f7587Christian König         default:	/* end of slice, or error */
1782c888fe027c338f337123de4da2de1ac73b0f7587Christian König            return true;
1783c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
1784c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1785c888fe027c338f337123de4da2de1ac73b0f7587Christian König      vl_vlc_dumpbits(&bs->vlc, mba->len);
1786c888fe027c338f337123de4da2de1ac73b0f7587Christian König      mba_inc += mba->mba;
1787c888fe027c338f337123de4da2de1ac73b0f7587Christian König      if (mba_inc) {
1788c888fe027c338f337123de4da2de1ac73b0f7587Christian König         //TODO  conversion to signed format signed format
1789a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König         dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0;
1790c888fe027c338f337123de4da2de1ac73b0f7587Christian König
17913b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König         mv_fwd.top.field_select = mv_fwd.bottom.field_select = default_field_select;
17923b773d06d2edd39ce6e6ab6e306e3cca121dddfcChristian König         mv_bwd.top.field_select = mv_bwd.bottom.field_select = default_field_select;
1793c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1794c888fe027c338f337123de4da2de1ac73b0f7587Christian König         if (picture->picture_coding_type == P_TYPE) {
1795c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0;
1796c888fe027c338f337123de4da2de1ac73b0f7587Christian König            mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX;
1797c888fe027c338f337123de4da2de1ac73b0f7587Christian König         }
17986c731191c08561ea247cb2fcfacdf08f6b842363Christian König
1799235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         x += mba_inc;
1800c888fe027c338f337123de4da2de1ac73b0f7587Christian König         do {
1801235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König            store_motionvectors(bs, &mv_pos, &mv_fwd, &mv_bwd);
1802c888fe027c338f337123de4da2de1ac73b0f7587Christian König         } while (--mba_inc);
1803c888fe027c338f337123de4da2de1ac73b0f7587Christian König      }
1804235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König      while (x >= bs->width) {
1805235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         ++y;
1806235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         if (y >= bs->height)
1807235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König            return false;
1808235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König         x -= bs->width;
1809235de23e57bd6dac6a2fcdd0807838eef72f6173Christian König      }
1810c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1811c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1812c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1813c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvoid
1814c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvl_mpg12_bs_init(struct vl_mpg12_bs *bs, unsigned width, unsigned height)
1815c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1816c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(bs);
1817c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1818c888fe027c338f337123de4da2de1ac73b0f7587Christian König   memset(bs, 0, sizeof(struct vl_mpg12_bs));
1819c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1820c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->width = width;
1821c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->height = height;
1822c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1823c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1824c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvoid
1825c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvl_mpg12_bs_set_buffers(struct vl_mpg12_bs *bs, struct pipe_ycbcr_block *ycbcr_stream[VL_MAX_PLANES],
1826c888fe027c338f337123de4da2de1ac73b0f7587Christian König                        short *ycbcr_buffer[VL_MAX_PLANES], struct pipe_motionvector *mv_stream[VL_MAX_REF_FRAMES])
1827c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
1828c888fe027c338f337123de4da2de1ac73b0f7587Christian König   unsigned i;
1829c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1830c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(bs);
1831c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(ycbcr_stream && ycbcr_buffer);
1832c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(mv_stream);
1833c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1834c888fe027c338f337123de4da2de1ac73b0f7587Christian König   for (i = 0; i < VL_MAX_PLANES; ++i) {
1835c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->ycbcr_stream[i] = ycbcr_stream[i];
1836c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->ycbcr_buffer[i] = ycbcr_buffer[i];
1837c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1838c888fe027c338f337123de4da2de1ac73b0f7587Christian König   for (i = 0; i < VL_MAX_REF_FRAMES; ++i)
1839c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[i] = mv_stream[i];
1840c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1841c888fe027c338f337123de4da2de1ac73b0f7587Christian König   // TODO
1842e3789105fe3a289338821a53da499857aa924637Christian König   for (i = 0; i < bs->width*bs->height; ++i) {
1843c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[0][i].top.x = bs->mv_stream[0][i].top.y = 0;
1844c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[0][i].top.field_select = PIPE_VIDEO_FRAME;
1845c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[0][i].top.weight = PIPE_VIDEO_MV_WEIGHT_MAX;
1846c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[0][i].bottom.x = bs->mv_stream[0][i].bottom.y = 0;
1847c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[0][i].bottom.field_select = PIPE_VIDEO_FRAME;
1848c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[0][i].bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX;
1849c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1850c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[1][i].top.x = bs->mv_stream[1][i].top.y = 0;
1851c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[1][i].top.field_select = PIPE_VIDEO_FRAME;
1852c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[1][i].top.weight = PIPE_VIDEO_MV_WEIGHT_MIN;
1853c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[1][i].bottom.x = bs->mv_stream[1][i].bottom.y = 0;
1854c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[1][i].bottom.field_select = PIPE_VIDEO_FRAME;
1855c888fe027c338f337123de4da2de1ac73b0f7587Christian König      bs->mv_stream[1][i].bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN;
1856c888fe027c338f337123de4da2de1ac73b0f7587Christian König   }
1857c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1858c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1859c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvoid
1860c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvl_mpg12_bs_decode(struct vl_mpg12_bs *bs, unsigned num_bytes, const void *buffer,
1861c888fe027c338f337123de4da2de1ac73b0f7587Christian König                   struct pipe_mpeg12_picture_desc *picture, unsigned num_ycbcr_blocks[3])
1862c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
18635d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int intra_quantizer_matrix[64];
18645d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   int non_intra_quantizer_matrix[64];
18655d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König
18666ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König   const int *scan;
18675d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   unsigned i;
18686ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König
1869c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(bs);
1870c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(num_ycbcr_blocks);
1871c888fe027c338f337123de4da2de1ac73b0f7587Christian König   assert(buffer && num_bytes);
1872c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1873c888fe027c338f337123de4da2de1ac73b0f7587Christian König   bs->num_ycbcr_blocks = num_ycbcr_blocks;
1874c888fe027c338f337123de4da2de1ac73b0f7587Christian König
1875c888fe027c338f337123de4da2de1ac73b0f7587Christian König   vl_vlc_init(&bs->vlc, buffer, num_bytes);
1876c888fe027c338f337123de4da2de1ac73b0f7587Christian König
18776ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König   scan = picture->alternate_scan ? vl_zscan_alternate : vl_zscan_normal;
18785d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   for (i = 0; i < 64; ++i) {
18795d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König      intra_quantizer_matrix[i] = picture->intra_quantizer_matrix[scan[i]];
18805d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König      non_intra_quantizer_matrix[i] = picture->non_intra_quantizer_matrix[scan[i]];
18815d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   }
18826ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König
18835d7c8130b80ffc27fc73a2ca1a55352d4b4e34c4Christian König   while(decode_slice(bs, picture, intra_quantizer_matrix, non_intra_quantizer_matrix));
1884c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
1885