vl_mpeg12_bitstream.c revision 626352648a8c0b5d92a979d1b1adbf472e711ff8
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#define DCT_TYPE_INTERLACED 32 80c888fe027c338f337123de4da2de1ac73b0f7587Christian König 81c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* motion_type */ 82c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MOTION_TYPE_MASK (3*64) 83c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MOTION_TYPE_BASE 64 84c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_FIELD (1*64) 85c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_FRAME (2*64) 86c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_16X8 (2*64) 87c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC_DMV (3*64) 88c888fe027c338f337123de4da2de1ac73b0f7587Christian König 89c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* picture structure */ 90c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define TOP_FIELD 1 91c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define BOTTOM_FIELD 2 92c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define FRAME_PICTURE 3 93c888fe027c338f337123de4da2de1ac73b0f7587Christian König 94c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* picture coding type (mpeg2 header) */ 95c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define I_TYPE 1 96c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define P_TYPE 2 97c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define B_TYPE 3 98c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define D_TYPE 4 99c888fe027c338f337123de4da2de1ac73b0f7587Christian König 100c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 101c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t modes; 102c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 103c888fe027c338f337123de4da2de1ac73b0f7587Christian König} MBtab; 104c888fe027c338f337123de4da2de1ac73b0f7587Christian König 105c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 106c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t delta; 107c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 108c888fe027c338f337123de4da2de1ac73b0f7587Christian König} MVtab; 109c888fe027c338f337123de4da2de1ac73b0f7587Christian König 110c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 111c888fe027c338f337123de4da2de1ac73b0f7587Christian König int8_t dmv; 112c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 113c888fe027c338f337123de4da2de1ac73b0f7587Christian König} DMVtab; 114c888fe027c338f337123de4da2de1ac73b0f7587Christian König 115c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 116c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t cbp; 117c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 118c888fe027c338f337123de4da2de1ac73b0f7587Christian König} CBPtab; 119c888fe027c338f337123de4da2de1ac73b0f7587Christian König 120c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 121c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t size; 122c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 123c888fe027c338f337123de4da2de1ac73b0f7587Christian König} DCtab; 124c888fe027c338f337123de4da2de1ac73b0f7587Christian König 125c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 126c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t run; 127c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t level; 128c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 129c888fe027c338f337123de4da2de1ac73b0f7587Christian König} DCTtab; 130c888fe027c338f337123de4da2de1ac73b0f7587Christian König 131c888fe027c338f337123de4da2de1ac73b0f7587Christian Königtypedef struct { 132c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t mba; 133c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t len; 134c888fe027c338f337123de4da2de1ac73b0f7587Christian König} MBAtab; 135c888fe027c338f337123de4da2de1ac73b0f7587Christian König 136c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define INTRA MACROBLOCK_INTRA 137c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define QUANT MACROBLOCK_QUANT 138c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MC MACROBLOCK_MOTION_FORWARD 139c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define CODED MACROBLOCK_PATTERN 140c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define FWD MACROBLOCK_MOTION_FORWARD 141c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define BWD MACROBLOCK_MOTION_BACKWARD 142c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define INTER MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD 143c888fe027c338f337123de4da2de1ac73b0f7587Christian König 144c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBtab MB_I [] = { 145c888fe027c338f337123de4da2de1ac73b0f7587Christian König {INTRA|QUANT, 2}, {INTRA, 1} 146c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 147c888fe027c338f337123de4da2de1ac73b0f7587Christian König 148c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBtab MB_P [] = { 149c888fe027c338f337123de4da2de1ac73b0f7587Christian König {INTRA|QUANT, 6}, {CODED|QUANT, 5}, {MC|CODED|QUANT, 5}, {INTRA, 5}, 150c888fe027c338f337123de4da2de1ac73b0f7587Christian König {MC, 3}, {MC, 3}, {MC, 3}, {MC, 3}, 151c888fe027c338f337123de4da2de1ac73b0f7587Christian König {CODED, 2}, {CODED, 2}, {CODED, 2}, {CODED, 2}, 152c888fe027c338f337123de4da2de1ac73b0f7587Christian König {CODED, 2}, {CODED, 2}, {CODED, 2}, {CODED, 2}, 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 {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1} 157c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 158c888fe027c338f337123de4da2de1ac73b0f7587Christian König 159c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBtab MB_B [] = { 160c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0, 0}, {INTRA|QUANT, 6}, 161c888fe027c338f337123de4da2de1ac73b0f7587Christian König {BWD|CODED|QUANT, 6}, {FWD|CODED|QUANT, 6}, 162c888fe027c338f337123de4da2de1ac73b0f7587Christian König {INTER|CODED|QUANT, 5}, {INTER|CODED|QUANT, 5}, 163c888fe027c338f337123de4da2de1ac73b0f7587Christian König {INTRA, 5}, {INTRA, 5}, 164c888fe027c338f337123de4da2de1ac73b0f7587Christian König {FWD, 4}, {FWD, 4}, {FWD, 4}, {FWD, 4}, 165c888fe027c338f337123de4da2de1ac73b0f7587Christian König {FWD|CODED, 4}, {FWD|CODED, 4}, {FWD|CODED, 4}, {FWD|CODED, 4}, 166c888fe027c338f337123de4da2de1ac73b0f7587Christian König {BWD, 3}, {BWD, 3}, {BWD, 3}, {BWD, 3}, 167c888fe027c338f337123de4da2de1ac73b0f7587Christian König {BWD, 3}, {BWD, 3}, {BWD, 3}, {BWD, 3}, 168c888fe027c338f337123de4da2de1ac73b0f7587Christian König {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3}, 169c888fe027c338f337123de4da2de1ac73b0f7587Christian König {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3}, 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, 2}, {INTER, 2}, {INTER, 2}, {INTER, 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 {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2} 178c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 179c888fe027c338f337123de4da2de1ac73b0f7587Christian König 180c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef INTRA 181c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef QUANT 182c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef MC 183c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef CODED 184c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef FWD 185c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef BWD 186c888fe027c338f337123de4da2de1ac73b0f7587Christian König#undef INTER 187c888fe027c338f337123de4da2de1ac73b0f7587Christian König 188c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MVtab MV_4 [] = { 189c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 6}, { 2, 4}, { 1, 3}, { 1, 3}, { 0, 2}, { 0, 2}, { 0, 2}, { 0, 2} 190c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 191c888fe027c338f337123de4da2de1ac73b0f7587Christian König 192c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MVtab MV_10 [] = { 193c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, 194c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 0,10}, { 0,10}, { 0,10}, { 0,10}, {15,10}, {14,10}, {13,10}, {12,10}, 195c888fe027c338f337123de4da2de1ac73b0f7587Christian König {11,10}, {10,10}, { 9, 9}, { 9, 9}, { 8, 9}, { 8, 9}, { 7, 9}, { 7, 9}, 196c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, 197c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, 198c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7} 199c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 200c888fe027c338f337123de4da2de1ac73b0f7587Christian König 201c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DMVtab DMV_2 [] = { 202c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 0, 1}, { 0, 1}, { 1, 2}, {-1, 2} 203c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 204c888fe027c338f337123de4da2de1ac73b0f7587Christian König 205c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const CBPtab CBP_7 [] = { 206c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x22, 7}, {0x12, 7}, {0x0a, 7}, {0x06, 7}, 207c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x21, 7}, {0x11, 7}, {0x09, 7}, {0x05, 7}, 208c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x3f, 6}, {0x3f, 6}, {0x03, 6}, {0x03, 6}, 209c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x24, 6}, {0x24, 6}, {0x18, 6}, {0x18, 6}, 210c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x3e, 5}, {0x3e, 5}, {0x3e, 5}, {0x3e, 5}, 211c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x02, 5}, {0x02, 5}, {0x02, 5}, {0x02, 5}, 212c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x3d, 5}, {0x3d, 5}, {0x3d, 5}, {0x3d, 5}, 213c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x01, 5}, {0x01, 5}, {0x01, 5}, {0x01, 5}, 214c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x38, 5}, {0x38, 5}, {0x38, 5}, {0x38, 5}, 215c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x34, 5}, {0x34, 5}, {0x34, 5}, {0x34, 5}, 216c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x2c, 5}, {0x2c, 5}, {0x2c, 5}, {0x2c, 5}, 217c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x1c, 5}, {0x1c, 5}, {0x1c, 5}, {0x1c, 5}, 218c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x28, 5}, {0x28, 5}, {0x28, 5}, {0x28, 5}, 219c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x14, 5}, {0x14, 5}, {0x14, 5}, {0x14, 5}, 220c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x30, 5}, {0x30, 5}, {0x30, 5}, {0x30, 5}, 221c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x0c, 5}, {0x0c, 5}, {0x0c, 5}, {0x0c, 5}, 222c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x20, 4}, {0x20, 4}, {0x20, 4}, {0x20, 4}, 223c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x20, 4}, {0x20, 4}, {0x20, 4}, {0x20, 4}, 224c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x10, 4}, {0x10, 4}, {0x10, 4}, {0x10, 4}, 225c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x10, 4}, {0x10, 4}, {0x10, 4}, {0x10, 4}, 226c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4}, 227c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4}, 228c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4}, 229c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4}, 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 {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3} 234c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 235c888fe027c338f337123de4da2de1ac73b0f7587Christian König 236c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const CBPtab CBP_9 [] = { 237c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0, 0}, {0x00, 9}, {0x27, 9}, {0x1b, 9}, 238c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x3b, 9}, {0x37, 9}, {0x2f, 9}, {0x1f, 9}, 239c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x3a, 8}, {0x3a, 8}, {0x36, 8}, {0x36, 8}, 240c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x2e, 8}, {0x2e, 8}, {0x1e, 8}, {0x1e, 8}, 241c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x39, 8}, {0x39, 8}, {0x35, 8}, {0x35, 8}, 242c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x2d, 8}, {0x2d, 8}, {0x1d, 8}, {0x1d, 8}, 243c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x26, 8}, {0x26, 8}, {0x1a, 8}, {0x1a, 8}, 244c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x25, 8}, {0x25, 8}, {0x19, 8}, {0x19, 8}, 245c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x2b, 8}, {0x2b, 8}, {0x17, 8}, {0x17, 8}, 246c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x33, 8}, {0x33, 8}, {0x0f, 8}, {0x0f, 8}, 247c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x2a, 8}, {0x2a, 8}, {0x16, 8}, {0x16, 8}, 248c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x32, 8}, {0x32, 8}, {0x0e, 8}, {0x0e, 8}, 249c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x29, 8}, {0x29, 8}, {0x15, 8}, {0x15, 8}, 250c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x31, 8}, {0x31, 8}, {0x0d, 8}, {0x0d, 8}, 251c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x23, 8}, {0x23, 8}, {0x13, 8}, {0x13, 8}, 252c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0x0b, 8}, {0x0b, 8}, {0x07, 8}, {0x07, 8} 253c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 254c888fe027c338f337123de4da2de1ac73b0f7587Christian König 255c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCtab DC_lum_5 [] = { 256c888fe027c338f337123de4da2de1ac73b0f7587Christian König {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, 257c888fe027c338f337123de4da2de1ac73b0f7587Christian König {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, 258c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, 259c888fe027c338f337123de4da2de1ac73b0f7587Christian König {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5} 260c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 261c888fe027c338f337123de4da2de1ac73b0f7587Christian König 262c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCtab DC_chrom_5 [] = { 263c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, 264c888fe027c338f337123de4da2de1ac73b0f7587Christian König {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, 265c888fe027c338f337123de4da2de1ac73b0f7587Christian König {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, 266c888fe027c338f337123de4da2de1ac73b0f7587Christian König {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5} 267c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 268c888fe027c338f337123de4da2de1ac73b0f7587Christian König 269c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCtab DC_long [] = { 270c888fe027c338f337123de4da2de1ac73b0f7587Christian König {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5}, 271c888fe027c338f337123de4da2de1ac73b0f7587Christian König {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5}, 272c888fe027c338f337123de4da2de1ac73b0f7587Christian König {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, { 7, 6}, { 7, 6}, 273c888fe027c338f337123de4da2de1ac73b0f7587Christian König {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10, 9}, {11, 9} 274c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 275c888fe027c338f337123de4da2de1ac73b0f7587Christian König 276c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_16 [] = { 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 {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, 281c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2,18, 0}, { 2,17, 0}, { 2,16, 0}, { 2,15, 0}, 282c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 7, 3, 0}, { 17, 2, 0}, { 16, 2, 0}, { 15, 2, 0}, 283c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 14, 2, 0}, { 13, 2, 0}, { 12, 2, 0}, { 32, 1, 0}, 284c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 31, 1, 0}, { 30, 1, 0}, { 29, 1, 0}, { 28, 1, 0} 285c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 286c888fe027c338f337123de4da2de1ac73b0f7587Christian König 287c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_15 [] = { 288c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,40,15}, { 1,39,15}, { 1,38,15}, { 1,37,15}, 289c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,36,15}, { 1,35,15}, { 1,34,15}, { 1,33,15}, 290c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,32,15}, { 2,14,15}, { 2,13,15}, { 2,12,15}, 291c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2,11,15}, { 2,10,15}, { 2, 9,15}, { 2, 8,15}, 292c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,31,14}, { 1,31,14}, { 1,30,14}, { 1,30,14}, 293c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,29,14}, { 1,29,14}, { 1,28,14}, { 1,28,14}, 294c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,27,14}, { 1,27,14}, { 1,26,14}, { 1,26,14}, 295c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,25,14}, { 1,25,14}, { 1,24,14}, { 1,24,14}, 296c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,23,14}, { 1,23,14}, { 1,22,14}, { 1,22,14}, 297c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,21,14}, { 1,21,14}, { 1,20,14}, { 1,20,14}, 298c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,19,14}, { 1,19,14}, { 1,18,14}, { 1,18,14}, 299c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,17,14}, { 1,17,14}, { 1,16,14}, { 1,16,14} 300c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 301c888fe027c338f337123de4da2de1ac73b0f7587Christian König 302c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_13 [] = { 303c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 11, 2,13}, { 10, 2,13}, { 6, 3,13}, { 4, 4,13}, 304c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 5,13}, { 2, 7,13}, { 2, 6,13}, { 1,15,13}, 305c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,14,13}, { 1,13,13}, { 1,12,13}, { 27, 1,13}, 306c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 26, 1,13}, { 25, 1,13}, { 24, 1,13}, { 23, 1,13}, 307c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1,11,12}, { 1,11,12}, { 9, 2,12}, { 9, 2,12}, 308c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 5, 3,12}, { 5, 3,12}, { 1,10,12}, { 1,10,12}, 309c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 4,12}, { 3, 4,12}, { 8, 2,12}, { 8, 2,12}, 310c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 22, 1,12}, { 22, 1,12}, { 21, 1,12}, { 21, 1,12}, 311c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 9,12}, { 1, 9,12}, { 20, 1,12}, { 20, 1,12}, 312c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 19, 1,12}, { 19, 1,12}, { 2, 5,12}, { 2, 5,12}, 313c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 4, 3,12}, { 4, 3,12}, { 1, 8,12}, { 1, 8,12}, 314c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 7, 2,12}, { 7, 2,12}, { 18, 1,12}, { 18, 1,12} 315c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 316c888fe027c338f337123de4da2de1ac73b0f7587Christian König 317c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14_10 [] = { 318c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 17, 1,10}, { 6, 2,10}, { 1, 7,10}, { 3, 3,10}, 319c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 4,10}, { 16, 1,10}, { 15, 1,10}, { 5, 2,10} 320c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 321c888fe027c338f337123de4da2de1ac73b0f7587Christian König 322c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14_8 [] = { 323c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, 324c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 2, 7}, { 3, 2, 7}, { 10, 1, 7}, { 10, 1, 7}, 325c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 4, 7}, { 1, 4, 7}, { 9, 1, 7}, { 9, 1, 7}, 326c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 8, 1, 6}, { 8, 1, 6}, { 8, 1, 6}, { 8, 1, 6}, 327c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 7, 1, 6}, { 7, 1, 6}, { 7, 1, 6}, { 7, 1, 6}, 328c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 2, 6}, { 2, 2, 6}, { 2, 2, 6}, { 2, 2, 6}, 329c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6}, 330c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 14, 1, 8}, { 1, 6, 8}, { 13, 1, 8}, { 12, 1, 8}, 331c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 4, 2, 8}, { 2, 3, 8}, { 1, 5, 8}, { 11, 1, 8} 332c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 333c888fe027c338f337123de4da2de1ac73b0f7587Christian König 334c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14AC_5 [] = { 335c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 3, 5}, { 5, 1, 5}, { 4, 1, 5}, 336c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 2, 4}, { 1, 2, 4}, { 3, 1, 4}, { 3, 1, 4}, 337c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, 338c888fe027c338f337123de4da2de1ac73b0f7587Christian König {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, 339c888fe027c338f337123de4da2de1ac73b0f7587Christian König {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, 340c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, 341c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2} 342c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 343c888fe027c338f337123de4da2de1ac73b0f7587Christian König 344c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B14DC_5 [] = { 345c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 3, 5}, { 5, 1, 5}, { 4, 1, 5}, 346c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 2, 4}, { 1, 2, 4}, { 3, 1, 4}, { 3, 1, 4}, 347c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, 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 { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1} 352c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 353c888fe027c338f337123de4da2de1ac73b0f7587Christian König 354c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B15_10 [] = { 355c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 6, 2, 9}, { 6, 2, 9}, { 15, 1, 9}, { 15, 1, 9}, 356c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 4,10}, { 17, 1,10}, { 16, 1, 9}, { 16, 1, 9} 357c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 358c888fe027c338f337123de4da2de1ac73b0f7587Christian König 359c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const DCTtab DCT_B15_8 [] = { 360c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, 361c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 8, 1, 7}, { 8, 1, 7}, { 9, 1, 7}, { 9, 1, 7}, 362c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 7, 1, 7}, { 7, 1, 7}, { 3, 2, 7}, { 3, 2, 7}, 363c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 7, 6}, { 1, 7, 6}, { 1, 7, 6}, { 1, 7, 6}, 364c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 6, 6}, { 1, 6, 6}, { 1, 6, 6}, { 1, 6, 6}, 365c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 5, 1, 6}, { 5, 1, 6}, { 5, 1, 6}, { 5, 1, 6}, 366c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6}, 367c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 5, 8}, { 12, 1, 8}, { 1,11, 8}, { 1,10, 8}, 368c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 14, 1, 8}, { 13, 1, 8}, { 4, 2, 8}, { 2, 4, 8}, 369c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5}, 370c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5}, 371c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5}, 372c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5}, 373c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5}, 374c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5}, 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 { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, 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 {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 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, 3, 4}, { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4}, 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, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, 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, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, 415c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5}, 416c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5}, 417c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5}, 418c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5}, 419c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 10, 1, 7}, { 10, 1, 7}, { 2, 3, 7}, { 2, 3, 7}, 420c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 11, 1, 7}, { 11, 1, 7}, { 1, 8, 7}, { 1, 8, 7}, 421c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 1, 9, 7}, { 1, 9, 7}, { 1,12, 8}, { 1,13, 8}, 422c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 3, 3, 8}, { 5, 2, 8}, { 1,14, 8}, { 1,15, 8} 423c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 424c888fe027c338f337123de4da2de1ac73b0f7587Christian König 425c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBAtab MBA_5 [] = { 426c888fe027c338f337123de4da2de1ac73b0f7587Christian König {6, 5}, {5, 5}, {4, 4}, {4, 4}, {3, 4}, {3, 4}, 427c888fe027c338f337123de4da2de1ac73b0f7587Christian König {2, 3}, {2, 3}, {2, 3}, {2, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, 428c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, 429c888fe027c338f337123de4da2de1ac73b0f7587Christian König {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1} 430c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 431c888fe027c338f337123de4da2de1ac73b0f7587Christian König 432c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const MBAtab MBA_11 [] = { 433c888fe027c338f337123de4da2de1ac73b0f7587Christian König {32, 11}, {31, 11}, {30, 11}, {29, 11}, 434c888fe027c338f337123de4da2de1ac73b0f7587Christian König {28, 11}, {27, 11}, {26, 11}, {25, 11}, 435c888fe027c338f337123de4da2de1ac73b0f7587Christian König {24, 11}, {23, 11}, {22, 11}, {21, 11}, 436c888fe027c338f337123de4da2de1ac73b0f7587Christian König {20, 10}, {20, 10}, {19, 10}, {19, 10}, 437c888fe027c338f337123de4da2de1ac73b0f7587Christian König {18, 10}, {18, 10}, {17, 10}, {17, 10}, 438c888fe027c338f337123de4da2de1ac73b0f7587Christian König {16, 10}, {16, 10}, {15, 10}, {15, 10}, 439c888fe027c338f337123de4da2de1ac73b0f7587Christian König {14, 8}, {14, 8}, {14, 8}, {14, 8}, 440c888fe027c338f337123de4da2de1ac73b0f7587Christian König {14, 8}, {14, 8}, {14, 8}, {14, 8}, 441c888fe027c338f337123de4da2de1ac73b0f7587Christian König {13, 8}, {13, 8}, {13, 8}, {13, 8}, 442c888fe027c338f337123de4da2de1ac73b0f7587Christian König {13, 8}, {13, 8}, {13, 8}, {13, 8}, 443c888fe027c338f337123de4da2de1ac73b0f7587Christian König {12, 8}, {12, 8}, {12, 8}, {12, 8}, 444c888fe027c338f337123de4da2de1ac73b0f7587Christian König {12, 8}, {12, 8}, {12, 8}, {12, 8}, 445c888fe027c338f337123de4da2de1ac73b0f7587Christian König {11, 8}, {11, 8}, {11, 8}, {11, 8}, 446c888fe027c338f337123de4da2de1ac73b0f7587Christian König {11, 8}, {11, 8}, {11, 8}, {11, 8}, 447c888fe027c338f337123de4da2de1ac73b0f7587Christian König {10, 8}, {10, 8}, {10, 8}, {10, 8}, 448c888fe027c338f337123de4da2de1ac73b0f7587Christian König {10, 8}, {10, 8}, {10, 8}, {10, 8}, 449c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 9, 8}, { 9, 8}, { 9, 8}, { 9, 8}, 450c888fe027c338f337123de4da2de1ac73b0f7587Christian König { 9, 8}, { 9, 8}, { 9, 8}, { 9, 8}, 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 { 8, 7}, { 8, 7}, { 8, 7}, { 8, 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 { 7, 7}, { 7, 7}, { 7, 7}, { 7, 7} 459c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 460c888fe027c338f337123de4da2de1ac73b0f7587Christian König 461c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic const int non_linear_quantizer_scale[] = { 462c888fe027c338f337123de4da2de1ac73b0f7587Christian König 0, 1, 2, 3, 4, 5, 6, 7, 463c888fe027c338f337123de4da2de1ac73b0f7587Christian König 8, 10, 12, 14, 16, 18, 20, 22, 464c888fe027c338f337123de4da2de1ac73b0f7587Christian König 24, 28, 32, 36, 40, 44, 48, 52, 465c888fe027c338f337123de4da2de1ac73b0f7587Christian König 56, 64, 72, 80, 88, 96, 104, 112 466c888fe027c338f337123de4da2de1ac73b0f7587Christian König}; 467c888fe027c338f337123de4da2de1ac73b0f7587Christian König 468c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 469c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_macroblock_modes(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture) 470c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 471c888fe027c338f337123de4da2de1ac73b0f7587Christian König int macroblock_modes; 472c888fe027c338f337123de4da2de1ac73b0f7587Christian König const MBtab * tab; 473c888fe027c338f337123de4da2de1ac73b0f7587Christian König 474c888fe027c338f337123de4da2de1ac73b0f7587Christian König switch (picture->picture_coding_type) { 475c888fe027c338f337123de4da2de1ac73b0f7587Christian König case I_TYPE: 476c888fe027c338f337123de4da2de1ac73b0f7587Christian König 477c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = MB_I + vl_vlc_ubits(&bs->vlc, 1); 478c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 479c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes = tab->modes; 480c888fe027c338f337123de4da2de1ac73b0f7587Christian König 481c888fe027c338f337123de4da2de1ac73b0f7587Christian König if ((!(picture->frame_pred_frame_dct)) && (picture->picture_structure == FRAME_PICTURE)) { 482c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 1) * DCT_TYPE_INTERLACED; 483c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 484c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 485c888fe027c338f337123de4da2de1ac73b0f7587Christian König 486c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 487c888fe027c338f337123de4da2de1ac73b0f7587Christian König 488c888fe027c338f337123de4da2de1ac73b0f7587Christian König case P_TYPE: 489c888fe027c338f337123de4da2de1ac73b0f7587Christian König 490c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = MB_P + vl_vlc_ubits(&bs->vlc, 5); 491c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 492c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes = tab->modes; 493c888fe027c338f337123de4da2de1ac73b0f7587Christian König 494c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_structure != FRAME_PICTURE) { 495c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) { 496c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE; 497c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); 498c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 499c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 500c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (picture->frame_pred_frame_dct) { 501c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) 502c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= MC_FRAME; 503c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 504c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 505c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) { 506c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE; 507c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); 508c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 509c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) { 510c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 1) * DCT_TYPE_INTERLACED; 511c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 512c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 513c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 514c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 515c888fe027c338f337123de4da2de1ac73b0f7587Christian König 516c888fe027c338f337123de4da2de1ac73b0f7587Christian König case B_TYPE: 517c888fe027c338f337123de4da2de1ac73b0f7587Christian König 518c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = MB_B + vl_vlc_ubits(&bs->vlc, 6); 519c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 520c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes = tab->modes; 521c888fe027c338f337123de4da2de1ac73b0f7587Christian König 522c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_structure != FRAME_PICTURE) { 523c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (! (macroblock_modes & MACROBLOCK_INTRA)) { 524c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE; 525c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); 526c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 527c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 528c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (picture->frame_pred_frame_dct) { 529c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (! (macroblock_modes & MACROBLOCK_INTRA)) */ 530c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= MC_FRAME; 531c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 532c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 533c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_INTRA) 534c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto intra; 535c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 2) * MOTION_TYPE_BASE; 536c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); 537c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) { 538c888fe027c338f337123de4da2de1ac73b0f7587Christian König intra: 539c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes |= vl_vlc_ubits(&bs->vlc, 1) * DCT_TYPE_INTERLACED; 540c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 541c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 542c888fe027c338f337123de4da2de1ac73b0f7587Christian König return macroblock_modes; 543c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 544c888fe027c338f337123de4da2de1ac73b0f7587Christian König 545c888fe027c338f337123de4da2de1ac73b0f7587Christian König case D_TYPE: 546c888fe027c338f337123de4da2de1ac73b0f7587Christian König 547c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 548c888fe027c338f337123de4da2de1ac73b0f7587Christian König return MACROBLOCK_INTRA; 549c888fe027c338f337123de4da2de1ac73b0f7587Christian König 550c888fe027c338f337123de4da2de1ac73b0f7587Christian König default: 551c888fe027c338f337123de4da2de1ac73b0f7587Christian König return 0; 552c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 553c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 554c888fe027c338f337123de4da2de1ac73b0f7587Christian König 555c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 556c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_quantizer_scale(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture) 557c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 558c888fe027c338f337123de4da2de1ac73b0f7587Christian König int quantizer_scale_code; 559c888fe027c338f337123de4da2de1ac73b0f7587Christian König 560c888fe027c338f337123de4da2de1ac73b0f7587Christian König quantizer_scale_code = vl_vlc_ubits(&bs->vlc, 5); 561c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 5); 562c888fe027c338f337123de4da2de1ac73b0f7587Christian König 563c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->q_scale_type) 564c888fe027c338f337123de4da2de1ac73b0f7587Christian König return non_linear_quantizer_scale[quantizer_scale_code]; 565c888fe027c338f337123de4da2de1ac73b0f7587Christian König else 566c888fe027c338f337123de4da2de1ac73b0f7587Christian König return quantizer_scale_code << 1; 567c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 568c888fe027c338f337123de4da2de1ac73b0f7587Christian König 569c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 570c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_motion_delta(struct vl_mpg12_bs *bs, unsigned f_code) 571c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 572c888fe027c338f337123de4da2de1ac73b0f7587Christian König int delta; 573c888fe027c338f337123de4da2de1ac73b0f7587Christian König int sign; 574c888fe027c338f337123de4da2de1ac73b0f7587Christian König const MVtab * tab; 575c888fe027c338f337123de4da2de1ac73b0f7587Christian König 576c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf & 0x80000000) { 577c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 578c888fe027c338f337123de4da2de1ac73b0f7587Christian König return 0; 579c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x0c000000) { 580c888fe027c338f337123de4da2de1ac73b0f7587Christian König 581c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = MV_4 + vl_vlc_ubits(&bs->vlc, 4); 582c888fe027c338f337123de4da2de1ac73b0f7587Christian König delta = (tab->delta << f_code) + 1; 583c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + f_code + 1; 584c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 585c888fe027c338f337123de4da2de1ac73b0f7587Christian König 586c888fe027c338f337123de4da2de1ac73b0f7587Christian König sign = vl_vlc_sbits(&bs->vlc, 1); 587c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 588c888fe027c338f337123de4da2de1ac73b0f7587Christian König 589c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (f_code) 590c888fe027c338f337123de4da2de1ac73b0f7587Christian König delta += vl_vlc_ubits(&bs->vlc, f_code); 591c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= f_code; 592c888fe027c338f337123de4da2de1ac73b0f7587Christian König 593c888fe027c338f337123de4da2de1ac73b0f7587Christian König return (delta ^ sign) - sign; 594c888fe027c338f337123de4da2de1ac73b0f7587Christian König 595c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 596c888fe027c338f337123de4da2de1ac73b0f7587Christian König 597c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = MV_10 + vl_vlc_ubits(&bs->vlc, 10); 598c888fe027c338f337123de4da2de1ac73b0f7587Christian König delta = (tab->delta << f_code) + 1; 599c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + 1; 600c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 601c888fe027c338f337123de4da2de1ac73b0f7587Christian König 602c888fe027c338f337123de4da2de1ac73b0f7587Christian König sign = vl_vlc_sbits(&bs->vlc, 1); 603c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 604c888fe027c338f337123de4da2de1ac73b0f7587Christian König 605c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (f_code) { 606c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 607c888fe027c338f337123de4da2de1ac73b0f7587Christian König delta += vl_vlc_ubits(&bs->vlc, f_code); 608c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, f_code); 609c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 610c888fe027c338f337123de4da2de1ac73b0f7587Christian König 611c888fe027c338f337123de4da2de1ac73b0f7587Christian König return (delta ^ sign) - sign; 612c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 613c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 614c888fe027c338f337123de4da2de1ac73b0f7587Christian König 615c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 616c888fe027c338f337123de4da2de1ac73b0f7587Christian Königbound_motion_vector(int vec, unsigned f_code) 617c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 618c888fe027c338f337123de4da2de1ac73b0f7587Christian König#if 1 619c888fe027c338f337123de4da2de1ac73b0f7587Christian König unsigned int limit; 620c888fe027c338f337123de4da2de1ac73b0f7587Christian König int sign; 621c888fe027c338f337123de4da2de1ac73b0f7587Christian König 622c888fe027c338f337123de4da2de1ac73b0f7587Christian König limit = 16 << f_code; 623c888fe027c338f337123de4da2de1ac73b0f7587Christian König 624c888fe027c338f337123de4da2de1ac73b0f7587Christian König if ((unsigned int)(vec + limit) < 2 * limit) 625c888fe027c338f337123de4da2de1ac73b0f7587Christian König return vec; 626c888fe027c338f337123de4da2de1ac73b0f7587Christian König else { 627c888fe027c338f337123de4da2de1ac73b0f7587Christian König sign = ((int32_t)vec) >> 31; 628c888fe027c338f337123de4da2de1ac73b0f7587Christian König return vec - ((2 * limit) ^ sign) + sign; 629c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 630c888fe027c338f337123de4da2de1ac73b0f7587Christian König#else 631c888fe027c338f337123de4da2de1ac73b0f7587Christian König return ((int32_t)vec << (28 - f_code)) >> (28 - f_code); 632c888fe027c338f337123de4da2de1ac73b0f7587Christian König#endif 633c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 634c888fe027c338f337123de4da2de1ac73b0f7587Christian König 635c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 636c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_dmv(struct vl_mpg12_bs *bs) 637c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 638c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DMVtab * tab; 639c888fe027c338f337123de4da2de1ac73b0f7587Christian König 640c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DMV_2 + vl_vlc_ubits(&bs->vlc, 2); 641c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 642c888fe027c338f337123de4da2de1ac73b0f7587Christian König return tab->dmv; 643c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 644c888fe027c338f337123de4da2de1ac73b0f7587Christian König 645c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 646c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_coded_block_pattern(struct vl_mpg12_bs *bs) 647c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 648c888fe027c338f337123de4da2de1ac73b0f7587Christian König const CBPtab * tab; 649c888fe027c338f337123de4da2de1ac73b0f7587Christian König 650c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 651c888fe027c338f337123de4da2de1ac73b0f7587Christian König 652c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x20000000) { 653c888fe027c338f337123de4da2de1ac73b0f7587Christian König 654c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = CBP_7 + (vl_vlc_ubits(&bs->vlc, 7) - 16); 655c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 656c888fe027c338f337123de4da2de1ac73b0f7587Christian König return tab->cbp; 657c888fe027c338f337123de4da2de1ac73b0f7587Christian König 658c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 659c888fe027c338f337123de4da2de1ac73b0f7587Christian König 660c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = CBP_9 + vl_vlc_ubits(&bs->vlc, 9); 661c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 662c888fe027c338f337123de4da2de1ac73b0f7587Christian König return tab->cbp; 663c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 664c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 665c888fe027c338f337123de4da2de1ac73b0f7587Christian König 666c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 667c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_luma_dc_dct_diff(struct vl_mpg12_bs *bs) 668c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 669c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCtab * tab; 670c888fe027c338f337123de4da2de1ac73b0f7587Christian König int size; 671c888fe027c338f337123de4da2de1ac73b0f7587Christian König int dc_diff; 672c888fe027c338f337123de4da2de1ac73b0f7587Christian König 673c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf < 0xf8000000) { 674c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DC_lum_5 + vl_vlc_ubits(&bs->vlc, 5); 675c888fe027c338f337123de4da2de1ac73b0f7587Christian König size = tab->size; 676c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (size) { 677c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + size; 678c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 679c888fe027c338f337123de4da2de1ac73b0f7587Christian König dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size); 680c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= size; 681c888fe027c338f337123de4da2de1ac73b0f7587Christian König return dc_diff; 682c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 683c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 3); 684c888fe027c338f337123de4da2de1ac73b0f7587Christian König return 0; 685c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 686c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 687c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DC_long + (vl_vlc_ubits(&bs->vlc, 9) - 0x1e0); 688c888fe027c338f337123de4da2de1ac73b0f7587Christian König size = tab->size; 689c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len); 690c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 691c888fe027c338f337123de4da2de1ac73b0f7587Christian König dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size); 692c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, size); 693c888fe027c338f337123de4da2de1ac73b0f7587Christian König return dc_diff; 694c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 695c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 696c888fe027c338f337123de4da2de1ac73b0f7587Christian König 697c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline int 698c888fe027c338f337123de4da2de1ac73b0f7587Christian Königget_chroma_dc_dct_diff(struct vl_mpg12_bs *bs) 699c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 700c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCtab * tab; 701c888fe027c338f337123de4da2de1ac73b0f7587Christian König int size; 702c888fe027c338f337123de4da2de1ac73b0f7587Christian König int dc_diff; 703c888fe027c338f337123de4da2de1ac73b0f7587Christian König 704c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf < 0xf8000000) { 705c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DC_chrom_5 + vl_vlc_ubits(&bs->vlc, 5); 706c888fe027c338f337123de4da2de1ac73b0f7587Christian König size = tab->size; 707c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (size) { 708c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + size; 709c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 710c888fe027c338f337123de4da2de1ac73b0f7587Christian König dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size); 711c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= size; 712c888fe027c338f337123de4da2de1ac73b0f7587Christian König return dc_diff; 713c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 714c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); 715c888fe027c338f337123de4da2de1ac73b0f7587Christian König return 0; 716c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 717c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 718c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DC_long + (vl_vlc_ubits(&bs->vlc, 10) - 0x3e0); 719c888fe027c338f337123de4da2de1ac73b0f7587Christian König size = tab->size; 720c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, tab->len + 1); 721c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 722c888fe027c338f337123de4da2de1ac73b0f7587Christian König dc_diff = vl_vlc_ubits(&bs->vlc, size) - UBITS (SBITS (~bs->vlc.buf, 1), size); 723c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, size); 724c888fe027c338f337123de4da2de1ac73b0f7587Christian König return dc_diff; 725c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 726c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 727c888fe027c338f337123de4da2de1ac73b0f7587Christian König 728c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 729352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königget_intra_block_B14(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, 7306ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König const int scan[64], int quantizer_scale, short *dest) 731c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 7320f24c19eea80290f533d69403586d9fc6f4b36f7Christian König int i, j, val; 733c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t *quant_matrix = picture->intra_quantizer_matrix; 734c888fe027c338f337123de4da2de1ac73b0f7587Christian König int mismatch; 735c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCTtab *tab; 736c888fe027c338f337123de4da2de1ac73b0f7587Christian König 737c888fe027c338f337123de4da2de1ac73b0f7587Christian König i = 0; 738c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch = ~dest[0]; 739c888fe027c338f337123de4da2de1ac73b0f7587Christian König 740c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 741c888fe027c338f337123de4da2de1ac73b0f7587Christian König 742c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 743c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x28000000) { 744c888fe027c338f337123de4da2de1ac73b0f7587Christian König 745c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5); 746c888fe027c338f337123de4da2de1ac73b0f7587Christian König 747c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 748c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 749c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* end of block */ 750c888fe027c338f337123de4da2de1ac73b0f7587Christian König 751c888fe027c338f337123de4da2de1ac73b0f7587Christian König normal_code: 7520f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 753c888fe027c338f337123de4da2de1ac73b0f7587Christian König 754c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 755c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + 1; 7560f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4; 757c888fe027c338f337123de4da2de1ac73b0f7587Christian König 758c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (bitstream_get (1)) val = -val; */ 759c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1); 760c888fe027c338f337123de4da2de1ac73b0f7587Christian König 761c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 7626ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 763c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch ^= val; 764c888fe027c338f337123de4da2de1ac73b0f7587Christian König 765c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 766c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 767c888fe027c338f337123de4da2de1ac73b0f7587Christian König 768c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 769c888fe027c338f337123de4da2de1ac73b0f7587Christian König 770c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x04000000) { 771c888fe027c338f337123de4da2de1ac73b0f7587Christian König 772c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4); 773c888fe027c338f337123de4da2de1ac73b0f7587Christian König 774c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 775c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 776c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 777c888fe027c338f337123de4da2de1ac73b0f7587Christian König 778c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* escape code */ 779c888fe027c338f337123de4da2de1ac73b0f7587Christian König 780c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += UBITS(bs->vlc.buf << 6, 6) - 64; 781c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 782c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 783c888fe027c338f337123de4da2de1ac73b0f7587Christian König 7840f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 785c888fe027c338f337123de4da2de1ac73b0f7587Christian König 786c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 787c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 7880f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (vl_vlc_sbits(&bs->vlc, 12) * quantizer_scale * quant_matrix[j]) / 16; 789c888fe027c338f337123de4da2de1ac73b0f7587Christian König 790c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 7916ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 792c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch ^= val; 793c888fe027c338f337123de4da2de1ac73b0f7587Christian König 794c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 795c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 796c888fe027c338f337123de4da2de1ac73b0f7587Christian König 797c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 798c888fe027c338f337123de4da2de1ac73b0f7587Christian König 799c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x02000000) { 800c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8); 801c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 802c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 803c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 804c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00800000) { 805c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16); 806c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 807c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 808c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 809c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00200000) { 810c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16); 811c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 812c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 813c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 814c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 815c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16); 816c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 16; 817c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16); 818c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 819c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 820c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 821c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 822c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 823c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 824c888fe027c338f337123de4da2de1ac73b0f7587Christian König 825c888fe027c338f337123de4da2de1ac73b0f7587Christian König dest[63] ^= mismatch & 1; 826c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); /* dump end of block code */ 827c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 828c888fe027c338f337123de4da2de1ac73b0f7587Christian König 829c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 830352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königget_intra_block_B15(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, 8316ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König const int scan[64], int quantizer_scale, short *dest) 832c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 8330f24c19eea80290f533d69403586d9fc6f4b36f7Christian König int i, j, val; 834c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t *quant_matrix = picture->intra_quantizer_matrix; 835c888fe027c338f337123de4da2de1ac73b0f7587Christian König int mismatch; 836c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCTtab * tab; 837c888fe027c338f337123de4da2de1ac73b0f7587Christian König 838c888fe027c338f337123de4da2de1ac73b0f7587Christian König i = 0; 839c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch = ~dest[0]; 840c888fe027c338f337123de4da2de1ac73b0f7587Christian König 841c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 842c888fe027c338f337123de4da2de1ac73b0f7587Christian König 843c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 844c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x04000000) { 845c888fe027c338f337123de4da2de1ac73b0f7587Christian König 846c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B15_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4); 847c888fe027c338f337123de4da2de1ac73b0f7587Christian König 848c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 849c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) { 850c888fe027c338f337123de4da2de1ac73b0f7587Christian König 851c888fe027c338f337123de4da2de1ac73b0f7587Christian König normal_code: 8520f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 853c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 854c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + 1; 8550f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4; 856c888fe027c338f337123de4da2de1ac73b0f7587Christian König 857c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (bitstream_get (1)) val = -val; */ 858c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1); 859c888fe027c338f337123de4da2de1ac73b0f7587Christian König 860c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 8616ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 862c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch ^= val; 863c888fe027c338f337123de4da2de1ac73b0f7587Christian König 864c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 865c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 866c888fe027c338f337123de4da2de1ac73b0f7587Christian König 867c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 868c888fe027c338f337123de4da2de1ac73b0f7587Christian König 869c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 870c888fe027c338f337123de4da2de1ac73b0f7587Christian König 871c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* end of block. I commented out this code because if we */ 872c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* dont exit here we will still exit at the later test :) */ 873c888fe027c338f337123de4da2de1ac73b0f7587Christian König 874c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (i >= 128) break; */ /* end of block */ 875c888fe027c338f337123de4da2de1ac73b0f7587Christian König 876c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* escape code */ 877c888fe027c338f337123de4da2de1ac73b0f7587Christian König 878c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += UBITS(bs->vlc.buf << 6, 6) - 64; 879c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 880c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check against buffer overflow */ 881c888fe027c338f337123de4da2de1ac73b0f7587Christian König 8820f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 883c888fe027c338f337123de4da2de1ac73b0f7587Christian König 884c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 885c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 8860f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (vl_vlc_sbits(&bs->vlc, 12) * quantizer_scale * quant_matrix[j]) / 16; 887c888fe027c338f337123de4da2de1ac73b0f7587Christian König 888c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 8896ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 890c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch ^= val; 891c888fe027c338f337123de4da2de1ac73b0f7587Christian König 892c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 893c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 894c888fe027c338f337123de4da2de1ac73b0f7587Christian König 895c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 896c888fe027c338f337123de4da2de1ac73b0f7587Christian König 897c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 898c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x02000000) { 899c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B15_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8); 900c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 901c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 902c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 903c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00800000) { 904c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16); 905c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 906c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 907c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 908c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00200000) { 909c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16); 910c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 911c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 912c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 913c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 914c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16); 915c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 16; 916c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16); 917c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 918c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 919c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 920c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 921c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 922c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 923c888fe027c338f337123de4da2de1ac73b0f7587Christian König 924c888fe027c338f337123de4da2de1ac73b0f7587Christian König dest[63] ^= mismatch & 1; 925c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 4); /* dump end of block code */ 926c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 927c888fe027c338f337123de4da2de1ac73b0f7587Christian König 928c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 929352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königget_non_intra_block(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, 9306ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König const int scan[64], int quantizer_scale, short *dest) 931c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 9320f24c19eea80290f533d69403586d9fc6f4b36f7Christian König int i, j, val; 933c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t *quant_matrix = picture->non_intra_quantizer_matrix; 934c888fe027c338f337123de4da2de1ac73b0f7587Christian König int mismatch; 935c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCTtab *tab; 936c888fe027c338f337123de4da2de1ac73b0f7587Christian König 937c888fe027c338f337123de4da2de1ac73b0f7587Christian König i = -1; 938c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch = 1; 939c888fe027c338f337123de4da2de1ac73b0f7587Christian König 940c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 941c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x28000000) { 942c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14DC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5); 943c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto entry_1; 944c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else 945c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto entry_2; 946c888fe027c338f337123de4da2de1ac73b0f7587Christian König 947c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 948c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x28000000) { 949c888fe027c338f337123de4da2de1ac73b0f7587Christian König 950c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5); 951c888fe027c338f337123de4da2de1ac73b0f7587Christian König 952c888fe027c338f337123de4da2de1ac73b0f7587Christian König entry_1: 953c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 954c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 955c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* end of block */ 956c888fe027c338f337123de4da2de1ac73b0f7587Christian König 957c888fe027c338f337123de4da2de1ac73b0f7587Christian König normal_code: 9580f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 959c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 960c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + 1; 9610f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5; 962c888fe027c338f337123de4da2de1ac73b0f7587Christian König 963c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (bitstream_get (1)) val = -val; */ 964c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1); 965c888fe027c338f337123de4da2de1ac73b0f7587Christian König 966c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 9676ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 968c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch ^= val; 969c888fe027c338f337123de4da2de1ac73b0f7587Christian König 970c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 971c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 972c888fe027c338f337123de4da2de1ac73b0f7587Christian König 973c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 974c888fe027c338f337123de4da2de1ac73b0f7587Christian König 975c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 976c888fe027c338f337123de4da2de1ac73b0f7587Christian König 977c888fe027c338f337123de4da2de1ac73b0f7587Christian König entry_2: 978c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x04000000) { 979c888fe027c338f337123de4da2de1ac73b0f7587Christian König 980c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4); 981c888fe027c338f337123de4da2de1ac73b0f7587Christian König 982c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 983c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 984c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 985c888fe027c338f337123de4da2de1ac73b0f7587Christian König 986c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* escape code */ 987c888fe027c338f337123de4da2de1ac73b0f7587Christian König 988c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += UBITS(bs->vlc.buf << 6, 6) - 64; 989c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 990c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 991c888fe027c338f337123de4da2de1ac73b0f7587Christian König 9920f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 993c888fe027c338f337123de4da2de1ac73b0f7587Christian König 994c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 995c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 996c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = 2 * (vl_vlc_sbits(&bs->vlc, 12) + vl_vlc_sbits(&bs->vlc, 1)) + 1; 9970f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (val * quantizer_scale * quant_matrix[j]) / 32; 998c888fe027c338f337123de4da2de1ac73b0f7587Christian König 999c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 10006ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 1001c888fe027c338f337123de4da2de1ac73b0f7587Christian König mismatch ^= val; 1002c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1003c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 1004c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1005c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1006c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1007c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1008c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x02000000) { 1009c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8); 1010c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1011c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1012c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1013c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00800000) { 1014c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16); 1015c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1016c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1017c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1018c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00200000) { 1019c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16); 1020c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1021c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1022c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1023c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 1024c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16); 1025c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 16; 1026c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16); 1027c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1028c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1029c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1030c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1031c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 1032c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1033c888fe027c338f337123de4da2de1ac73b0f7587Christian König dest[63] ^= mismatch & 1; 1034c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); /* dump end of block code */ 1035c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1036c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1037c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1038352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königget_mpeg1_intra_block(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, 10396ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König const int scan[64], int quantizer_scale, short *dest) 1040c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 10410f24c19eea80290f533d69403586d9fc6f4b36f7Christian König int i, j, val; 1042c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t *quant_matrix = picture->intra_quantizer_matrix; 1043c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCTtab * tab; 1044c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1045c888fe027c338f337123de4da2de1ac73b0f7587Christian König i = 0; 1046c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1047c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1048c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1049c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 1050c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x28000000) { 1051c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1052c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5); 1053c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1054c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1055c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 1056c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* end of block */ 1057c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1058c888fe027c338f337123de4da2de1ac73b0f7587Christian König normal_code: 10590f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 1060c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 1061c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + 1; 10620f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4; 1063c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1064c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* oddification */ 1065c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val - 1) | 1; 1066c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1067c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (bitstream_get (1)) val = -val; */ 1068c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1); 1069c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1070c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 10716ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 1072c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1073c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 1074c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1075c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1076c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1077c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1078c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x04000000) { 1079c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1080c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4); 1081c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1082c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1083c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1084c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1085c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1086c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* escape code */ 1087c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1088c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += UBITS(bs->vlc.buf << 6, 6) - 64; 1089c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 1090c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 1091c888fe027c338f337123de4da2de1ac73b0f7587Christian König 10920f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 1093c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1094c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 1095c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1096c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = vl_vlc_sbits(&bs->vlc, 8); 1097c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (! (val & 0x7f)) { 1098c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 8); 1099c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = vl_vlc_ubits(&bs->vlc, 8) + 2 * val; 1100c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 11010f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (val * quantizer_scale * quant_matrix[j]) / 16; 1102c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1103c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* oddification */ 1104c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val + ~SBITS (val, 1)) | 1; 1105c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1106c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 11076ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 1108c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1109c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 8); 1110c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1111c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1112c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1113c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1114c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x02000000) { 1115c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8); 1116c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1117c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1118c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1119c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00800000) { 1120c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16); 1121c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1122c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1123c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1124c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00200000) { 1125c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16); 1126c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1127c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1128c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1129c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 1130c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16); 1131c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 16; 1132c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16); 1133c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1134c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1135c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1136c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1137c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 1138c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1139c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); /* dump end of block code */ 1140c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1141c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1142c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1143352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königget_mpeg1_non_intra_block(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, 11446ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König const int scan[64], int quantizer_scale, short *dest) 1145c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 11460f24c19eea80290f533d69403586d9fc6f4b36f7Christian König int i, j, val; 1147c888fe027c338f337123de4da2de1ac73b0f7587Christian König uint8_t *quant_matrix = picture->non_intra_quantizer_matrix; 1148c888fe027c338f337123de4da2de1ac73b0f7587Christian König const DCTtab * tab; 1149c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1150c888fe027c338f337123de4da2de1ac73b0f7587Christian König i = -1; 1151c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1152c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1153c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x28000000) { 1154c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14DC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5); 1155c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto entry_1; 1156c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else 1157c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto entry_2; 1158c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1159c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 1160c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x28000000) { 1161c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1162c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14AC_5 + (vl_vlc_ubits(&bs->vlc, 5) - 5); 1163c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1164c888fe027c338f337123de4da2de1ac73b0f7587Christian König entry_1: 1165c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1166c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 1167c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* end of block */ 1168c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1169c888fe027c338f337123de4da2de1ac73b0f7587Christian König normal_code: 11700f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 1171c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= tab->len; 1172c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.bits += tab->len + 1; 11730f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5; 1174c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1175c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* oddification */ 1176c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val - 1) | 1; 1177c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1178c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* if (bitstream_get (1)) val = -val; */ 1179c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val ^ vl_vlc_sbits(&bs->vlc, 1)) - vl_vlc_sbits(&bs->vlc, 1); 1180c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1181c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 11826ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 1183c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1184c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 1; 1185c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1186c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1187c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1188c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1189c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1190c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1191c888fe027c338f337123de4da2de1ac73b0f7587Christian König entry_2: 1192c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x04000000) { 1193c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1194c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_8 + (vl_vlc_ubits(&bs->vlc, 8) - 4); 1195c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1196c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1197c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1198c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1199c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1200c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* escape code */ 1201c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1202c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += UBITS(bs->vlc.buf << 6, 6) - 64; 1203c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i >= 64) 1204c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 1205c888fe027c338f337123de4da2de1ac73b0f7587Christian König 12060f24c19eea80290f533d69403586d9fc6f4b36f7Christian König j = scan[i]; 1207c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1208c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 12); 1209c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1210c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = vl_vlc_sbits(&bs->vlc, 8); 1211c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (! (val & 0x7f)) { 1212c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 8); 1213c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = vl_vlc_ubits(&bs->vlc, 8) + 2 * val; 1214c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1215c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = 2 * (val + SBITS (val, 1)) + 1; 12160f24c19eea80290f533d69403586d9fc6f4b36f7Christian König val = (val * quantizer_scale * quant_matrix[j]) / 32; 1217c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1218c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* oddification */ 1219c888fe027c338f337123de4da2de1ac73b0f7587Christian König val = (val + ~SBITS (val, 1)) | 1; 1220c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1221c888fe027c338f337123de4da2de1ac73b0f7587Christian König SATURATE (val); 12226ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König dest[i] = val; 1223c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1224c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 8); 1225c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1226c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1227c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1228c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1229c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x02000000) { 1230c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_B14_10 + (vl_vlc_ubits(&bs->vlc, 10) - 8); 1231c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1232c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1233c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1234c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00800000) { 1235c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_13 + (vl_vlc_ubits(&bs->vlc, 13) - 16); 1236c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1237c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1238c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1239c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x00200000) { 1240c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_15 + (vl_vlc_ubits(&bs->vlc, 15) - 16); 1241c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1242c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1243c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1244c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 1245c888fe027c338f337123de4da2de1ac73b0f7587Christian König tab = DCT_16 + vl_vlc_ubits(&bs->vlc, 16); 1246c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf <<= 16; 1247c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_getword(&bs->vlc, bs->vlc.bits + 16); 1248c888fe027c338f337123de4da2de1ac73b0f7587Christian König i += tab->run; 1249c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (i < 64) 1250c888fe027c338f337123de4da2de1ac73b0f7587Christian König goto normal_code; 1251c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1252c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; /* illegal, check needed to avoid buffer overflow */ 1253c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1254c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 2); /* dump end of block code */ 1255c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1256c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1257c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 12586ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian Königslice_intra_DCT(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, const int scan[64], int cc, 12596ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König unsigned x, unsigned y, enum pipe_mpeg12_dct_type coding, int quantizer_scale, int dc_dct_pred[3]) 1260c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1261626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König short dest[64]; 1262c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1263c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->x = x; 1264c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->y = y; 1265c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->intra = PIPE_MPEG12_DCT_INTRA; 1266c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->coding = coding; 1267c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1268c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1269c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1270c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* Get the intra DC coefficient and inverse quantize it */ 1271c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (cc == 0) 1272a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König dc_dct_pred[0] += get_luma_dc_dct_diff(bs); 1273c888fe027c338f337123de4da2de1ac73b0f7587Christian König else 1274a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König dc_dct_pred[cc] += get_chroma_dc_dct_diff(bs); 1275c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1276c888fe027c338f337123de4da2de1ac73b0f7587Christian König memset(dest, 0, sizeof(int16_t) * 64); 1277a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König dest[0] = dc_dct_pred[cc] << (3 - picture->intra_dc_precision); 1278c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->mpeg1) { 1279c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_coding_type != D_TYPE) 12806ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König get_mpeg1_intra_block(bs, picture, scan, quantizer_scale, dest); 1281c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (picture->intra_vlc_format) 12826ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König get_intra_block_B15(bs, picture, scan, quantizer_scale, dest); 1283c888fe027c338f337123de4da2de1ac73b0f7587Christian König else 12846ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König get_intra_block_B14(bs, picture, scan, quantizer_scale, dest); 1285c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1286626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König memcpy(bs->ycbcr_buffer[cc], dest, sizeof(int16_t) * 64); 1287626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König 1288c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->num_ycbcr_blocks[cc]++; 1289c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]++; 1290c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_buffer[cc] += 64; 1291c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1292c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1293c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 12946ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian Königslice_non_intra_DCT(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, const int scan[64], int cc, 1295352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König unsigned x, unsigned y, int quantizer_scale, enum pipe_mpeg12_dct_type coding) 1296c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1297626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König short dest[64]; 1298c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1299c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->x = x; 1300c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->y = y; 1301c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->intra = PIPE_MPEG12_DCT_DELTA; 1302c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]->coding = coding; 1303c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1304c888fe027c338f337123de4da2de1ac73b0f7587Christian König memset(dest, 0, sizeof(int16_t) * 64); 1305c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->mpeg1) 13066ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König get_mpeg1_non_intra_block(bs, picture, scan, quantizer_scale, dest); 1307c888fe027c338f337123de4da2de1ac73b0f7587Christian König else 13086ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König get_non_intra_block(bs, picture, scan, quantizer_scale, dest); 1309c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1310626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König memcpy(bs->ycbcr_buffer[cc], dest, sizeof(int16_t) * 64); 1311626352648a8c0b5d92a979d1b1adbf472e711ff8Christian König 1312c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->num_ycbcr_blocks[cc]++; 1313c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[cc]++; 1314c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_buffer[cc] += 64; 1315c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1316c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1317c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1318c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_mp1(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1319c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1320c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1321c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1322c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME; 1323c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1324c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1325c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = (mv->top.x + (get_motion_delta(bs, f_code[0]) << f_code[1])); 1326c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0] + f_code[1]); 1327c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = motion_x; 1328c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1329c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1330c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = (mv->top.y + (get_motion_delta(bs, f_code[0]) << f_code[1])); 1331c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = bound_motion_vector (motion_y, f_code[0] + f_code[1]); 1332c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = motion_y; 1333c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1334c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1335c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1336c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_frame(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1337c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1338c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1339c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1340c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME; 1341c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1342c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1343c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->top.x + get_motion_delta(bs, f_code[0]); 1344c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector(motion_x, f_code[0]); 1345c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = motion_x; 1346c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1347c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1348c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = mv->top.y + get_motion_delta(bs, f_code[1]); 1349c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = bound_motion_vector(motion_y, f_code[1]); 1350c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = motion_y; 1351c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1352c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1353c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1354c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_field(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1355c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1356c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1357c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1358c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1359c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = vl_vlc_ubits(&bs->vlc, 1) ? 1360c888fe027c338f337123de4da2de1ac73b0f7587Christian König PIPE_VIDEO_BOTTOM_FIELD : PIPE_VIDEO_TOP_FIELD; 1361c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 1362c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1363c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->top.x + get_motion_delta(bs, f_code[0]); 1364c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0]); 1365c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = motion_x; 1366c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1367c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1368c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = (mv->top.y >> 1) + get_motion_delta(bs, f_code[1]); 1369c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* motion_y = bound_motion_vector (motion_y, f_code[1]); */ 1370c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = motion_y << 1; 1371c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1372c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1373c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->bottom.field_select = vl_vlc_ubits(&bs->vlc, 1) ? 1374c888fe027c338f337123de4da2de1ac73b0f7587Christian König PIPE_VIDEO_BOTTOM_FIELD : PIPE_VIDEO_TOP_FIELD; 1375c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 1376c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1377c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->bottom.x + get_motion_delta(bs, f_code[0]); 1378c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0]); 1379c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->bottom.x = motion_x; 1380c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1381c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1382c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = (mv->bottom.y >> 1) + get_motion_delta(bs, f_code[1]); 1383c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* motion_y = bound_motion_vector (motion_y, f_code[1]); */ 1384c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->bottom.y = motion_y << 1; 1385c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1386c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1387c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1388c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_dmv(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1389c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1390c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1391c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1392c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO Implement dmv 1393c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME; 1394c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1395c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1396c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->top.x + get_motion_delta(bs, f_code[0]); 1397c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector(motion_x, f_code[0]); 1398c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = motion_x; 1399c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1400c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1401c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = (mv->top.y >> 1) + get_motion_delta(bs, f_code[1]); 1402c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* motion_y = bound_motion_vector (motion_y, f_code[1]); */ 1403c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = motion_y << 1; 1404c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1405c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1406c888fe027c338f337123de4da2de1ac73b0f7587Christian König/* like motion_frame, but parsing without actual motion compensation */ 1407c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1408c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fr_conceal(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1409c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1410c888fe027c338f337123de4da2de1ac73b0f7587Christian König int tmp; 1411c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1412c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME; 1413c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1414c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1415c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = (mv->top.x + get_motion_delta(bs, f_code[0])); 1416c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = bound_motion_vector (tmp, f_code[0]); 1417c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = tmp; 1418c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1419c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1420c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = (mv->top.y + get_motion_delta(bs, f_code[1])); 1421c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = bound_motion_vector (tmp, f_code[1]); 1422c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = tmp; 1423c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1424c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); /* remove marker_bit */ 1425c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1426c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1427c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1428c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_field(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1429c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1430c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1431c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1432c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1433c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1434c888fe027c338f337123de4da2de1ac73b0f7587Christian König // ref_field 1435c888fe027c338f337123de4da2de1ac73b0f7587Christian König //vl_vlc_ubits(&bs->vlc, 1); 1436c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1437c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO field select may need to do something here for bob (weave ok) 1438c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME; 1439c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 1440c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1441c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->top.x + get_motion_delta(bs, f_code[0]); 1442c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0]); 1443c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = motion_x; 1444c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1445c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1446c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = mv->top.y + get_motion_delta(bs, f_code[1]); 1447c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = bound_motion_vector (motion_y, f_code[1]); 1448c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = motion_y; 1449c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1450c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1451c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1452c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_16x8(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1453c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1454c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1455c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1456c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1457c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1458c888fe027c338f337123de4da2de1ac73b0f7587Christian König // ref_field 1459c888fe027c338f337123de4da2de1ac73b0f7587Christian König //vl_vlc_ubits(&bs->vlc, 1); 1460c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1461c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO field select may need to do something here bob (weave ok) 1462c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = PIPE_VIDEO_FRAME; 1463c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 1464c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1465c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->top.x + get_motion_delta(bs, f_code[0]); 1466c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0]); 1467c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = motion_x; 1468c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1469c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1470c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = mv->top.y + get_motion_delta(bs, f_code[1]); 1471c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = bound_motion_vector (motion_y, f_code[1]); 1472c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = motion_y; 1473c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1474c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1475c888fe027c338f337123de4da2de1ac73b0f7587Christian König // ref_field 1476c888fe027c338f337123de4da2de1ac73b0f7587Christian König //vl_vlc_ubits(&bs->vlc, 1); 1477c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1478c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO field select may need to do something here for bob (weave ok) 1479c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->bottom.field_select = PIPE_VIDEO_FRAME; 1480c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 1481c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1482c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->bottom.x + get_motion_delta(bs, f_code[0]); 1483c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0]); 1484c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->bottom.x = motion_x; 1485c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1486c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1487c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = mv->bottom.y + get_motion_delta(bs, f_code[1]); 1488c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = bound_motion_vector (motion_y, f_code[1]); 1489c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->bottom.y = motion_y; 1490c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1491c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1492c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1493c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_dmv(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1494c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1495c888fe027c338f337123de4da2de1ac73b0f7587Christian König int motion_x, motion_y; 1496c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1497c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO field select may need to do something here for bob (weave ok) 1498c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.field_select = mv->bottom.field_select = PIPE_VIDEO_FRAME; 1499c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1500c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1501c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = mv->top.x + get_motion_delta(bs, f_code[0]); 1502c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_x = bound_motion_vector (motion_x, f_code[0]); 1503c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = motion_x; 1504c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1505c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1506c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = mv->top.y + get_motion_delta(bs, f_code[1]); 1507c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_y = bound_motion_vector (motion_y, f_code[1]); 1508c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = motion_y; 1509c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1510c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1511c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1512c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline void 1513c888fe027c338f337123de4da2de1ac73b0f7587Christian Königmotion_fi_conceal(struct vl_mpg12_bs *bs, unsigned f_code[2], struct pipe_motionvector *mv) 1514c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1515c888fe027c338f337123de4da2de1ac73b0f7587Christian König int tmp; 1516c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1517c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1518c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); /* remove field_select */ 1519c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1520c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = (mv->top.x + get_motion_delta(bs, f_code[0])); 1521c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = bound_motion_vector(tmp, f_code[0]); 1522c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.x = mv->bottom.x = tmp; 1523c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1524c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1525c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = (mv->top.y + get_motion_delta(bs, f_code[1])); 1526c888fe027c338f337123de4da2de1ac73b0f7587Christian König tmp = bound_motion_vector(tmp, f_code[1]); 1527c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv->top.y = mv->bottom.y = tmp; 1528c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1529c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); /* remove marker_bit */ 1530c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1531c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1532c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define MOTION_CALL(routine, macroblock_modes) \ 1533c888fe027c338f337123de4da2de1ac73b0f7587Christian Königdo { \ 1534c888fe027c338f337123de4da2de1ac73b0f7587Christian König if ((macroblock_modes) & MACROBLOCK_MOTION_FORWARD) \ 1535c888fe027c338f337123de4da2de1ac73b0f7587Christian König routine(bs, picture->f_code[0], &mv_fwd); \ 1536c888fe027c338f337123de4da2de1ac73b0f7587Christian König if ((macroblock_modes) & MACROBLOCK_MOTION_BACKWARD) \ 1537c888fe027c338f337123de4da2de1ac73b0f7587Christian König routine(bs, picture->f_code[1], &mv_bwd); \ 1538c888fe027c338f337123de4da2de1ac73b0f7587Christian König} while (0) 1539c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1540c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define NEXT_MACROBLOCK \ 1541c888fe027c338f337123de4da2de1ac73b0f7587Christian Königdo { \ 1542e3789105fe3a289338821a53da499857aa924637Christian König bs->mv_stream[0][x+y*bs->width] = mv_fwd; \ 1543e3789105fe3a289338821a53da499857aa924637Christian König bs->mv_stream[1][x+y*bs->width] = mv_bwd; \ 1544c888fe027c338f337123de4da2de1ac73b0f7587Christian König ++x; \ 1545e3789105fe3a289338821a53da499857aa924637Christian König if (x == bs->width) { \ 1546c888fe027c338f337123de4da2de1ac73b0f7587Christian König ++y; \ 1547e3789105fe3a289338821a53da499857aa924637Christian König if (y >= bs->height) \ 1548c888fe027c338f337123de4da2de1ac73b0f7587Christian König return false; \ 1549c888fe027c338f337123de4da2de1ac73b0f7587Christian König x = 0; \ 1550c888fe027c338f337123de4da2de1ac73b0f7587Christian König } \ 1551c888fe027c338f337123de4da2de1ac73b0f7587Christian König} while (0) 1552c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1553c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline bool 1554352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian Königslice_init(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc * picture, 1555352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König int *quantizer_scale, int *x, int *y) 1556c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1557c888fe027c338f337123de4da2de1ac73b0f7587Christian König const MBAtab * mba; 1558c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1559c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_need32bits(&bs->vlc); 1560c888fe027c338f337123de4da2de1ac73b0f7587Christian König while(bs->vlc.buf < 0x101 || bs->vlc.buf > 0x1AF) { 1561c888fe027c338f337123de4da2de1ac73b0f7587Christian König if(!vl_vlc_getbyte(&bs->vlc)) 1562c888fe027c338f337123de4da2de1ac73b0f7587Christian König return false; 1563c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1564e3789105fe3a289338821a53da499857aa924637Christian König *y = (bs->vlc.buf & 0xFF) - 1; 1565c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_restart(&bs->vlc); 1566c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1567352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König *quantizer_scale = get_quantizer_scale(bs, picture); 1568c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1569c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* ignore intra_slice and all the extra data */ 1570c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (bs->vlc.buf & 0x80000000) { 1571c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 9); 1572c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1573c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1574c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1575c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* decode initial macroblock address increment */ 1576c888fe027c338f337123de4da2de1ac73b0f7587Christian König *x = 0; 1577c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 1578c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x08000000) { 1579c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba = MBA_5 + (vl_vlc_ubits(&bs->vlc, 6) - 2); 1580c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1581c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x01800000) { 1582c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba = MBA_11 + (vl_vlc_ubits(&bs->vlc, 12) - 24); 1583c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1584c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else switch (vl_vlc_ubits(&bs->vlc, 12)) { 1585c888fe027c338f337123de4da2de1ac73b0f7587Christian König case 8: /* macroblock_escape */ 1586c888fe027c338f337123de4da2de1ac73b0f7587Christian König *x += 33; 1587c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 11); 1588c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1589c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1590c888fe027c338f337123de4da2de1ac73b0f7587Christian König case 15: /* macroblock_stuffing (MPEG1 only) */ 1591c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->vlc.buf &= 0xfffff; 1592c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 11); 1593c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1594c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1595c888fe027c338f337123de4da2de1ac73b0f7587Christian König default: /* error */ 1596c888fe027c338f337123de4da2de1ac73b0f7587Christian König return false; 1597c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1598c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1599c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, mba->len + 1); 1600e3789105fe3a289338821a53da499857aa924637Christian König *x += mba->mba; 1601c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1602c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (*x >= bs->width) { 1603c888fe027c338f337123de4da2de1ac73b0f7587Christian König *x -= bs->width; 1604e3789105fe3a289338821a53da499857aa924637Christian König (*y)++; 1605c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1606c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (*y > bs->height) 1607c888fe027c338f337123de4da2de1ac73b0f7587Christian König return false; 1608c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1609c888fe027c338f337123de4da2de1ac73b0f7587Christian König return true; 1610c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1611c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1612c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstatic inline bool 16136ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian Königdecode_slice(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc *picture, const int scan[64]) 1614c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1615c888fe027c338f337123de4da2de1ac73b0f7587Christian König struct pipe_motionvector mv_fwd, mv_bwd; 1616c888fe027c338f337123de4da2de1ac73b0f7587Christian König enum pipe_mpeg12_dct_type dct_type; 1617a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König 1618a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König /* predictor for DC coefficients in intra blocks */ 1619a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König int dc_dct_pred[3] = { 0, 0, 0 }; 1620352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König int quantizer_scale; 1621a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König 1622c888fe027c338f337123de4da2de1ac73b0f7587Christian König int x, y; 1623c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1624352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König if (!slice_init(bs, picture, &quantizer_scale, &x, &y)) 1625c888fe027c338f337123de4da2de1ac73b0f7587Christian König return false; 1626c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1627c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0; 1628c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.field_select = mv_fwd.bottom.field_select = PIPE_VIDEO_FRAME; 1629c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1630c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0; 1631c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.field_select = mv_bwd.bottom.field_select = PIPE_VIDEO_FRAME; 1632c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1633c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 1634c888fe027c338f337123de4da2de1ac73b0f7587Christian König int macroblock_modes; 1635c888fe027c338f337123de4da2de1ac73b0f7587Christian König int mba_inc; 1636c888fe027c338f337123de4da2de1ac73b0f7587Christian König const MBAtab * mba; 1637c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1638c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1639c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1640c888fe027c338f337123de4da2de1ac73b0f7587Christian König macroblock_modes = get_macroblock_modes(bs, picture); //macroblock_modes() 1641c888fe027c338f337123de4da2de1ac73b0f7587Christian König dct_type = macroblock_modes & DCT_TYPE_INTERLACED ? 1642c888fe027c338f337123de4da2de1ac73b0f7587Christian König PIPE_MPEG12_DCT_TYPE_FIELD : PIPE_MPEG12_DCT_TYPE_FRAME; 1643c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1644c888fe027c338f337123de4da2de1ac73b0f7587Christian König switch(macroblock_modes & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD)) { 1645c888fe027c338f337123de4da2de1ac73b0f7587Christian König case (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD): 1646c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_HALF; 1647c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_HALF; 1648c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1649c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1650c888fe027c338f337123de4da2de1ac73b0f7587Christian König default: 1651c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MACROBLOCK_MOTION_FORWARD: 1652c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX; 1653c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN; 1654c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1655c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1656c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MACROBLOCK_MOTION_BACKWARD: 1657c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN; 1658c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX; 1659c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1660c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1661c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1662c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ? */ 1663c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_QUANT) 1664352bfb525ab4858ac1a5710cc8d629764cf6bd72Christian König quantizer_scale = get_quantizer_scale(bs, picture); 1665c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1666c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_INTRA) { 1667c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1668c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->concealment_motion_vectors) { 1669c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_structure == FRAME_PICTURE) 1670c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_fr_conceal(bs, picture->f_code[0], &mv_fwd); 1671c888fe027c338f337123de4da2de1ac73b0f7587Christian König else 1672c888fe027c338f337123de4da2de1ac73b0f7587Christian König motion_fi_conceal(bs, picture->f_code[0], &mv_fwd); 1673c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1674c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 1675c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0; 1676c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0; 1677c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1678c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN; 1679c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.weight = mv_bwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN; 1680c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1681c888fe027c338f337123de4da2de1ac73b0f7587Christian König // unravaled loop of 6 block(i) calls in macroblock() 16826ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_intra_DCT(bs, picture, scan, 0, x*2+0, y*2+0, dct_type, quantizer_scale, dc_dct_pred); 16836ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_intra_DCT(bs, picture, scan, 0, x*2+1, y*2+0, dct_type, quantizer_scale, dc_dct_pred); 16846ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_intra_DCT(bs, picture, scan, 0, x*2+0, y*2+1, dct_type, quantizer_scale, dc_dct_pred); 16856ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_intra_DCT(bs, picture, scan, 0, x*2+1, y*2+1, dct_type, quantizer_scale, dc_dct_pred); 16866ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_intra_DCT(bs, picture, scan, 1, x, y, dct_type, quantizer_scale, dc_dct_pred); 16876ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_intra_DCT(bs, picture, scan, 2, x, y, dct_type, quantizer_scale, dc_dct_pred); 1688c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1689c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_coding_type == D_TYPE) { 1690c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1691c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 1); 1692c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1693c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1694c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 1695c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_structure == FRAME_PICTURE) 1696c888fe027c338f337123de4da2de1ac73b0f7587Christian König switch (macroblock_modes & MOTION_TYPE_MASK) { 1697c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MC_FRAME: 1698c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->mpeg1) { 1699c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL(motion_mp1, macroblock_modes); 1700c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else { 1701c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL(motion_fr_frame, macroblock_modes); 1702c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1703c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1704c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1705c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MC_FIELD: 1706c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL (motion_fr_field, macroblock_modes); 1707c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1708c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1709c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MC_DMV: 1710c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL (motion_fr_dmv, MACROBLOCK_MOTION_FORWARD); 1711c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1712c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1713c888fe027c338f337123de4da2de1ac73b0f7587Christian König case 0: 1714c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* non-intra mb without forward mv in a P picture */ 1715c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0; 1716c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0; 1717c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1718c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1719c888fe027c338f337123de4da2de1ac73b0f7587Christian König else 1720c888fe027c338f337123de4da2de1ac73b0f7587Christian König switch (macroblock_modes & MOTION_TYPE_MASK) { 1721c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MC_FIELD: 1722c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL (motion_fi_field, macroblock_modes); 1723c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1724c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1725c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MC_16X8: 1726c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL (motion_fi_16x8, macroblock_modes); 1727c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1728c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1729c888fe027c338f337123de4da2de1ac73b0f7587Christian König case MC_DMV: 1730c888fe027c338f337123de4da2de1ac73b0f7587Christian König MOTION_CALL (motion_fi_dmv, MACROBLOCK_MOTION_FORWARD); 1731c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1732c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1733c888fe027c338f337123de4da2de1ac73b0f7587Christian König case 0: 1734c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* non-intra mb without forward mv in a P picture */ 1735c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0; 1736c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.x = mv_bwd.top.y = mv_bwd.bottom.x = mv_bwd.bottom.y = 0; 1737c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1738c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1739c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1740c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (macroblock_modes & MACROBLOCK_PATTERN) { 1741c888fe027c338f337123de4da2de1ac73b0f7587Christian König int coded_block_pattern = get_coded_block_pattern(bs); 1742c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1743c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO optimize not fully used for idct accel only mc. 1744c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (coded_block_pattern & 0x20) 17456ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_non_intra_DCT(bs, picture, scan, 0, x*2+0, y*2+0, quantizer_scale, dct_type); // cc0 luma 0 1746c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (coded_block_pattern & 0x10) 17476ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_non_intra_DCT(bs, picture, scan, 0, x*2+1, y*2+0, quantizer_scale, dct_type); // cc0 luma 1 1748c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (coded_block_pattern & 0x08) 17496ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_non_intra_DCT(bs, picture, scan, 0, x*2+0, y*2+1, quantizer_scale, dct_type); // cc0 luma 2 1750c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (coded_block_pattern & 0x04) 17516ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_non_intra_DCT(bs, picture, scan, 0, x*2+1, y*2+1, quantizer_scale, dct_type); // cc0 luma 3 1752c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (coded_block_pattern & 0x2) 17536ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_non_intra_DCT(bs, picture, scan, 1, x, y, quantizer_scale, dct_type); // cc1 croma 1754c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (coded_block_pattern & 0x1) 17556ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König slice_non_intra_DCT(bs, picture, scan, 2, x, y, quantizer_scale, dct_type); // cc2 croma 1756c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1757c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1758a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0; 1759c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1760c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1761c888fe027c338f337123de4da2de1ac73b0f7587Christian König NEXT_MACROBLOCK; 1762c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1763c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1764c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba_inc = 0; 1765c888fe027c338f337123de4da2de1ac73b0f7587Christian König while (1) { 1766c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (bs->vlc.buf >= 0x10000000) { 1767c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba = MBA_5 + (vl_vlc_ubits(&bs->vlc, 5) - 2); 1768c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1769c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else if (bs->vlc.buf >= 0x03000000) { 1770c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba = MBA_11 + (vl_vlc_ubits(&bs->vlc, 11) - 24); 1771c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1772c888fe027c338f337123de4da2de1ac73b0f7587Christian König } else switch (vl_vlc_ubits(&bs->vlc, 11)) { 1773c888fe027c338f337123de4da2de1ac73b0f7587Christian König case 8: /* macroblock_escape */ 1774c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba_inc += 33; 1775c888fe027c338f337123de4da2de1ac73b0f7587Christian König /* pass through */ 1776c888fe027c338f337123de4da2de1ac73b0f7587Christian König case 15: /* macroblock_stuffing (MPEG1 only) */ 1777c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, 11); 1778c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_needbits(&bs->vlc); 1779c888fe027c338f337123de4da2de1ac73b0f7587Christian König continue; 1780c888fe027c338f337123de4da2de1ac73b0f7587Christian König default: /* end of slice, or error */ 1781c888fe027c338f337123de4da2de1ac73b0f7587Christian König return true; 1782c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1783c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1784c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_dumpbits(&bs->vlc, mba->len); 1785c888fe027c338f337123de4da2de1ac73b0f7587Christian König mba_inc += mba->mba; 1786c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (mba_inc) { 1787c888fe027c338f337123de4da2de1ac73b0f7587Christian König //TODO conversion to signed format signed format 1788a9b1c4fe2e67c5b158056a05cbc394d62c1d3e40Christian König dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0; 1789c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1790c888fe027c338f337123de4da2de1ac73b0f7587Christian König switch(picture->picture_structure) { 1791c888fe027c338f337123de4da2de1ac73b0f7587Christian König case FRAME_PICTURE: 1792c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.field_select = mv_fwd.bottom.field_select = PIPE_VIDEO_FRAME; 1793c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.field_select = mv_bwd.bottom.field_select = PIPE_VIDEO_FRAME; 1794c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1795c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1796c888fe027c338f337123de4da2de1ac73b0f7587Christian König case TOP_FIELD: 1797c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.field_select = mv_fwd.bottom.field_select = PIPE_VIDEO_TOP_FIELD; 1798c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.field_select = mv_bwd.bottom.field_select = PIPE_VIDEO_TOP_FIELD; 1799c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1800c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1801c888fe027c338f337123de4da2de1ac73b0f7587Christian König case BOTTOM_FIELD: 1802c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.field_select = mv_fwd.bottom.field_select = PIPE_VIDEO_BOTTOM_FIELD; 1803c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_bwd.top.field_select = mv_bwd.bottom.field_select = PIPE_VIDEO_BOTTOM_FIELD; 1804c888fe027c338f337123de4da2de1ac73b0f7587Christian König break; 1805c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1806c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1807c888fe027c338f337123de4da2de1ac73b0f7587Christian König if (picture->picture_coding_type == P_TYPE) { 1808c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.x = mv_fwd.top.y = mv_fwd.bottom.x = mv_fwd.bottom.y = 0; 1809c888fe027c338f337123de4da2de1ac73b0f7587Christian König mv_fwd.top.weight = mv_fwd.bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX; 1810c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1811c888fe027c338f337123de4da2de1ac73b0f7587Christian König do { 1812c888fe027c338f337123de4da2de1ac73b0f7587Christian König NEXT_MACROBLOCK; 1813c888fe027c338f337123de4da2de1ac73b0f7587Christian König } while (--mba_inc); 1814c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1815c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1816c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1817c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1818c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvoid 1819c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvl_mpg12_bs_init(struct vl_mpg12_bs *bs, unsigned width, unsigned height) 1820c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1821c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(bs); 1822c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1823c888fe027c338f337123de4da2de1ac73b0f7587Christian König memset(bs, 0, sizeof(struct vl_mpg12_bs)); 1824c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1825c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->width = width; 1826c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->height = height; 1827c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1828c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1829c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvoid 1830c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvl_mpg12_bs_set_buffers(struct vl_mpg12_bs *bs, struct pipe_ycbcr_block *ycbcr_stream[VL_MAX_PLANES], 1831c888fe027c338f337123de4da2de1ac73b0f7587Christian König short *ycbcr_buffer[VL_MAX_PLANES], struct pipe_motionvector *mv_stream[VL_MAX_REF_FRAMES]) 1832c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 1833c888fe027c338f337123de4da2de1ac73b0f7587Christian König unsigned i; 1834c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1835c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(bs); 1836c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(ycbcr_stream && ycbcr_buffer); 1837c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(mv_stream); 1838c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1839c888fe027c338f337123de4da2de1ac73b0f7587Christian König for (i = 0; i < VL_MAX_PLANES; ++i) { 1840c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_stream[i] = ycbcr_stream[i]; 1841c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->ycbcr_buffer[i] = ycbcr_buffer[i]; 1842c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1843c888fe027c338f337123de4da2de1ac73b0f7587Christian König for (i = 0; i < VL_MAX_REF_FRAMES; ++i) 1844c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[i] = mv_stream[i]; 1845c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1846c888fe027c338f337123de4da2de1ac73b0f7587Christian König // TODO 1847e3789105fe3a289338821a53da499857aa924637Christian König for (i = 0; i < bs->width*bs->height; ++i) { 1848c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[0][i].top.x = bs->mv_stream[0][i].top.y = 0; 1849c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[0][i].top.field_select = PIPE_VIDEO_FRAME; 1850c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[0][i].top.weight = PIPE_VIDEO_MV_WEIGHT_MAX; 1851c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[0][i].bottom.x = bs->mv_stream[0][i].bottom.y = 0; 1852c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[0][i].bottom.field_select = PIPE_VIDEO_FRAME; 1853c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[0][i].bottom.weight = PIPE_VIDEO_MV_WEIGHT_MAX; 1854c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1855c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[1][i].top.x = bs->mv_stream[1][i].top.y = 0; 1856c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[1][i].top.field_select = PIPE_VIDEO_FRAME; 1857c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[1][i].top.weight = PIPE_VIDEO_MV_WEIGHT_MIN; 1858c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[1][i].bottom.x = bs->mv_stream[1][i].bottom.y = 0; 1859c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[1][i].bottom.field_select = PIPE_VIDEO_FRAME; 1860c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->mv_stream[1][i].bottom.weight = PIPE_VIDEO_MV_WEIGHT_MIN; 1861c888fe027c338f337123de4da2de1ac73b0f7587Christian König } 1862c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1863c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1864c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvoid 1865c888fe027c338f337123de4da2de1ac73b0f7587Christian Königvl_mpg12_bs_decode(struct vl_mpg12_bs *bs, unsigned num_bytes, const void *buffer, 1866c888fe027c338f337123de4da2de1ac73b0f7587Christian König struct pipe_mpeg12_picture_desc *picture, unsigned num_ycbcr_blocks[3]) 1867c888fe027c338f337123de4da2de1ac73b0f7587Christian König{ 18686ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König const int *scan; 18696ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König 1870c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(bs); 1871c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(num_ycbcr_blocks); 1872c888fe027c338f337123de4da2de1ac73b0f7587Christian König assert(buffer && num_bytes); 1873c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1874c888fe027c338f337123de4da2de1ac73b0f7587Christian König bs->num_ycbcr_blocks = num_ycbcr_blocks; 1875c888fe027c338f337123de4da2de1ac73b0f7587Christian König 1876c888fe027c338f337123de4da2de1ac73b0f7587Christian König vl_vlc_init(&bs->vlc, buffer, num_bytes); 1877c888fe027c338f337123de4da2de1ac73b0f7587Christian König 18786ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König scan = picture->alternate_scan ? vl_zscan_alternate : vl_zscan_normal; 18796ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König 18806ad846ee78d9d8ba93dcecdefbf89f2b981333efChristian König while(decode_slice(bs, picture, scan)); 1881c888fe027c338f337123de4da2de1ac73b0f7587Christian König} 1882