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