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