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