| /* |
| * Copyright (C) 2017 Amlogic, Inc. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| * |
| * Description: |
| */ |
| #include <linux/kernel.h> |
| #include <linux/types.h> |
| #include <linux/errno.h> |
| #include <linux/interrupt.h> |
| #include <linux/timer.h> |
| #include <linux/platform_device.h> |
| #include <linux/amlogic/media/utils/amstream.h> |
| #include <linux/amlogic/media/frame_sync/ptsserv.h> |
| #include <linux/amlogic/media/canvas/canvas.h> |
| #include <linux/amlogic/media/vfm/vframe.h> |
| #include <linux/amlogic/media/vfm/vframe_provider.h> |
| #include <linux/amlogic/media/vfm/vframe_receiver.h> |
| #include <linux/amlogic/media/utils/vformat.h> |
| #include <linux/dma-mapping.h> |
| #include <linux/amlogic/media/codec_mm/codec_mm.h> |
| #include <linux/slab.h> |
| /* #include <mach/am_regs.h> */ |
| #include <linux/module.h> |
| #include <linux/amlogic/media/utils/vdec_reg.h> |
| #include "../../../stream_input/parser/streambuf_reg.h" |
| #include "../utils/amvdec.h" |
| #include <linux/amlogic/media/registers/register.h> |
| #include "../../../stream_input/amports/amports_priv.h" |
| |
| #include "avs.h" |
| #ifdef AVSP_LONG_CABAC |
| |
| #define DECODING_SANITY_CHECK |
| |
| #define TRACE 0 |
| #define LIWR_FIX 0 |
| #define pow2(a, b) (1<<b) |
| #define io_printf pr_info |
| |
| static unsigned char *local_heap_adr; |
| static int local_heap_size; |
| static int local_heap_pos; |
| static int transcoding_error_flag; |
| |
| unsigned char *local_alloc(int num, int size) |
| { |
| unsigned char *ret_buf = NULL; |
| int alloc_size = num * size; |
| |
| if ((local_heap_pos + alloc_size) <= local_heap_size) { |
| ret_buf = local_heap_adr + local_heap_pos; |
| local_heap_pos += alloc_size; |
| } else { |
| pr_info( |
| "!!!local_alloc(%d) error, local_heap (size %d) is not enough\r\n", |
| alloc_size, local_heap_size); |
| } |
| return ret_buf; |
| } |
| |
| int local_heap_init(int size) |
| { |
| /*local_heap_adr = &local_heap[0];*/ |
| local_heap_adr = (unsigned char *)(avsp_heap_adr + |
| MAX_CODED_FRAME_SIZE); |
| memset(local_heap_adr, 0, LOCAL_HEAP_SIZE); |
| |
| local_heap_size = LOCAL_HEAP_SIZE; |
| local_heap_pos = 0; |
| return 0; |
| } |
| |
| void local_heap_uninit(void) |
| { |
| local_heap_adr = NULL; |
| local_heap_size = 0; |
| local_heap_pos = 0; |
| } |
| |
| #define CODE2D_ESCAPE_SYMBOL 59 |
| |
| const int vlc_golomb_order[3][7][2] = |
| |
| {{{2, 9}, {2, 9}, {2, 9}, {2, 9}, {2, 9}, {2, 9}, {2, 9}, }, {{3, 9}, {2, 9}, { |
| 2, 9}, {2, 9}, {2, 9}, {2, 9}, {2, 9}, }, {{2, 9}, {0, 9}, |
| {1, 9}, {1, 9}, {0, 9}, {-1, -1}, {-1, -1}, }, }; |
| |
| const int MaxRun[3][7] = {{22, 14, 9, 6, 4, 2, 1}, {25, 18, 13, 9, 6, 4, 3}, { |
| 24, 19, 10, 7, 4, -1, -1} }; |
| |
| const int refabslevel[19][26] = {{4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1}, {7, 4, 4, 3, 3, 3, 3, 3, 2, |
| 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| 10, 6, 4, 4, 3, 3, 3, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1}, {13, 7, 5, 4, 3, 2, 2, -1, -1, |
| -1 - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {18, 8, 4, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {22, 7, 3, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {27, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, |
| 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2}, {5, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, -1, -1, -1, -1, -1, -1, -1}, {7, 5, 4, 4, 3, 3, 3, 2, 2, |
| 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, |
| {10, 6, 5, 4, 3, 3, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1}, {13, 7, 5, 4, |
| 3, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {17, 8, 4, |
| 3, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| 22, 6, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {5, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1}, {6, 4, 3, |
| 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, -1, -1, -1, -1, -1, -1}, {10, 6, 4, 4, 3, 3, |
| 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {14, 7, 4, 3, 3, 2, |
| 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1}, {20, 7, 3, 2, |
| 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} }; |
| |
| static const int incvlc_intra[7] = {0, 1, 2, 4, 7, 10, 3000}; |
| static const int incvlc_chroma[5] = {0, 1, 2, 4, 3000}; |
| |
| const int AVS_2DVLC_INTRA[7][26][27] = {{{0, 22, 38, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {2, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 44, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {6, 50, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {8, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {12, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {14, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {18, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {20, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {24, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {26, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {28, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {30, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {34, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {40, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {42, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {46, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {52, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {56, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, {{8, 0, 4, 15, 27, 41, |
| 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, 2, 17, 35, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, |
| {-1, 6, 25, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 9, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 11, 39, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 13, 45, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 19, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 21, 51, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 23, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 31, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 37, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 47, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 57, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, }, {{8, 0, 2, 6, |
| 13, 17, 27, 35, 45, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 4, 11, 21, 33, 49, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, 9, 23, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 15, |
| 29, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 19, 39, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, 25, 43, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, 31, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 41, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 47, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, 57, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, }, {{8, 0, 2, 4, 9, 11, 17, 21, 25, 33, 39, 45, 55, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 6, 13, 19, |
| 29, 35, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 15, 27, 41, 57, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 23, 37, 53, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 31, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 43, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 49, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, }, {{6, 0, 2, 4, 7, 9, 11, 15, 17, |
| 21, 23, 29, 33, 35, 43, 47, 49, 57, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, 13, 19, 27, 31, 37, 45, 55, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| 25, 41, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 39, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, 53, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, {{0, |
| 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 23, 25, 27, 31, 33, 37, 41, |
| 45, 49, 51, 55, -1, -1, -1, -1, -1}, {-1, 21, 29, 35, 43, 47, |
| 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, 39, 57, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, }, {{0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, |
| 21, 23, 25, 27, 29, 31, 35, 37, 39, 41, 43, 47, 49, 51, 53, 57}, |
| {-1, 33, 45, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} } }; |
| |
| const int AVS_2DVLC_CHROMA[5][26][27] = {{{0, 14, 32, 56, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {2, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1}, {6, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {12, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {16, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {20, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {22, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {24, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {26, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {28, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {30, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {34, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {38, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {40, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {42, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {46, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {50, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {52, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, {{0, 1, 5, 15, 29, |
| 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, 3, 21, 45, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1}, {-1, 7, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 9, 41, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 11, 53, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 19, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 23, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 31, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 33, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 47, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, 49, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 57, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, |
| {{2, 0, 3, 7, 11, 17, 27, 33, 47, 53, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 5, 13, 21, 37, 55, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 9, 23, 41, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, 15, 31, 57, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| 19, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, 25, 45, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, 29, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, 39, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, 49, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, }, {{0, 1, 3, 5, 7, 11, 15, 19, 23, 29, |
| 35, 43, 47, 53, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1}, {-1, 9, 13, 21, 31, 39, 51, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 17, 27, |
| 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, |
| {-1, 25, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 33, 55, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 45, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, 49, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, 57, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, { |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1}, {-1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1}, }, |
| {{0, 1, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 27, 29, 33, 37, 41, |
| 43, 51, 55, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| 17, 25, 31, 39, 45, 53, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, 35, 49, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, 47, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1}, } }; |
| |
| const int UE[64][2] = {{1, 1}, {2, 3}, {3, 3}, {4, 5}, {5, 5}, {6, 5}, {7, 5}, { |
| 8, 7}, {9, 7}, {10, 7}, {11, 7}, {12, 7}, {13, 7}, {14, 7}, {15, |
| 7}, {16, 9}, {17, 9}, {18, 9}, {19, 9}, {20, 9}, {21, 9}, |
| {22, 9}, {23, 9}, {24, 9}, {25, 9}, {26, 9}, {27, 9}, {28, 9}, { |
| 29, 9}, {30, 9}, {31, 9}, {32, 11}, {33, 11}, { |
| 34, 11}, {35, 11}, {36, 11}, {37, 11}, {38, 11}, |
| {39, 11}, {40, 11}, {41, 11}, {42, 11}, {43, 11}, {44, 11}, {45, |
| 11}, {46, 11}, {47, 11}, {48, 11}, {49, 11}, { |
| 50, 11}, {51, 11}, {52, 11}, {53, 11}, {54, 11}, |
| {55, 11}, {56, 11}, {57, 11}, {58, 11}, {59, 11}, {60, 11}, {61, |
| 11}, {62, 11}, {63, 11}, {64, 13} }; |
| |
| unsigned int src_start; |
| unsigned int des_start; |
| |
| #ifdef AVSP_LONG_CABAC |
| |
| unsigned char *es_buf; |
| unsigned int es_buf_ptr; |
| unsigned int es_buf_is_overflow; |
| |
| #else |
| FILE *f_es; |
| #endif |
| unsigned int es_ptr; |
| unsigned int es_res; |
| unsigned int es_res_ptr; |
| unsigned int previous_es; |
| |
| void init_es(void) |
| { |
| |
| #ifdef AVSP_LONG_CABAC |
| es_buf_is_overflow = 0; |
| |
| es_buf[0] = 0x00; |
| es_buf[1] = 0x00; |
| es_buf[2] = 0x01; |
| es_buf_ptr = 3; |
| es_ptr = 3; |
| #else |
| f_es = fopen("es.out", "wb"); |
| if (f_es == NULL) |
| io_printf(" ERROR : Can not open es.out for write\n"); |
| putc(0x00, f_es); |
| putc(0x00, f_es); |
| putc(0x01, f_es); |
| |
| es_ptr = 3; |
| #endif |
| es_res = 0; |
| es_res_ptr = 0; |
| previous_es = 0xff; |
| |
| } |
| |
| void push_es(int value, int num) |
| { |
| unsigned char wr_es_data; |
| int push_num; |
| int push_value; |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & ES_DUMP) |
| io_printf(" push_es : value : 0x%x, num : %d\n", value, num); |
| #endif |
| while (num > 0) { |
| if (num >= 8) |
| push_num = 8; |
| else |
| push_num = num; |
| |
| num = num - push_num; |
| push_value = (value >> num); |
| |
| es_res = (es_res << push_num) | push_value; |
| es_res_ptr = es_res_ptr + push_num; |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & ES_DUMP) |
| io_printf(" #### es_res : 0x%X, es_res_ptr : %d\n", |
| es_res, es_res_ptr); |
| #endif |
| |
| while (es_res_ptr >= 8) { |
| es_res_ptr = es_res_ptr & 7; |
| wr_es_data = (es_res >> es_res_ptr) & 0xff; |
| if ((previous_es == 0) & (wr_es_data < 4)) { |
| io_printf( |
| " Insert 2'b10 for emu at position : %d\n", |
| es_ptr); |
| |
| es_res_ptr = es_res_ptr + 2; |
| wr_es_data = 2; |
| } |
| #ifdef AVSP_LONG_CABAC |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & ES_DUMP) |
| pr_info("es_buf[%d] = 0x%02x\r\n", |
| es_buf_ptr, wr_es_data); |
| #endif |
| if (!es_buf_is_overflow) { |
| es_buf[es_buf_ptr++] = wr_es_data; |
| if (es_buf_ptr >= MAX_CODED_FRAME_SIZE) |
| es_buf_is_overflow = 1; |
| } |
| #else |
| putc(wr_es_data, f_es); |
| #endif |
| es_ptr++; |
| previous_es = ((previous_es << 8) | wr_es_data) |
| & 0xffff; |
| } |
| |
| } |
| } |
| |
| #ifdef BLOCK_SIZE |
| #undef BLOCK_SIZE |
| #endif |
| |
| #define MIN_QP 0 |
| #define MAX_QP 63 |
| |
| #define BLOCK_SIZE 4 |
| #define B8_SIZE 8 |
| #define MB_BLOCK_SIZE 16 |
| |
| #define BLOCK_MULTIPLE (MB_BLOCK_SIZE/(BLOCK_SIZE*2)) |
| |
| #define DECODE_COPY_MB 0 |
| #define DECODE_MB 1 |
| |
| #define NO_INTRA_PMODE 5 |
| #define INTRA_PMODE_4x4 10 |
| #define NO_INTRA_PMODE_4x4 19 |
| /* 8x8 intra prediction modes */ |
| #define VERT_PRED 0 |
| #define HOR_PRED 1 |
| #define DC_PRED 2 |
| #define DOWN_LEFT_PRED 3 |
| #define DOWN_RIGHT_PRED 4 |
| |
| #define VERT_PRED_4x4 0 |
| #define HOR_PRED_4x4 1 |
| #define DC_PRED_4x4 2 |
| #define DOWN_LEFT_PRED_4x4 3 |
| #define DOWN_RIGHT_PRED_4x4 4 |
| |
| #define HOR_DOWN_PRED_4x4 5 |
| #define VERT_LEFT_PRED_4x4 6 |
| #define HOR_UP_PRED_4x4 7 |
| #define VERT_RIGHT_PRED_4x4 8 |
| |
| #define DC_PRED_8 0 |
| #define HOR_PRED_8 1 |
| #define VERT_PRED_8 2 |
| #define PLANE_8 3 |
| |
| #define LUMA_16DC 0 |
| #define LUMA_16AC 1 |
| #define LUMA_8x8 2 |
| #define LUMA_8x4 3 |
| #define LUMA_4x8 4 |
| #define LUMA_4x4 5 |
| #define CHROMA_DC 6 |
| #define CHROMA_AC 7 |
| #define NUM_BLOCK_TYPES 8 |
| |
| #define I_PICTURE_START_CODE 0xB3 |
| #define PB_PICTURE_START_CODE 0xB6 |
| #define SLICE_START_CODE_MIN 0x00 |
| #define SLICE_START_CODE_MAX 0xAF |
| #define USER_DATA_START_CODE 0xB2 |
| #define SEQUENCE_HEADER_CODE 0xB0 |
| #define EXTENSION_START_CODE 0xB5 |
| #define SEQUENCE_END_CODE 0xB1 |
| #define VIDEO_EDIT_CODE 0xB7 |
| |
| #define EOS 1 |
| #define SOP 2 |
| #define SOS 3 |
| #define P8x8 8 |
| #define I8MB 9 |
| #define I4MB 10 |
| #define IBLOCK 11 |
| #define SI4MB 12 |
| #define MAXMODE 13 |
| |
| #define IS_INTRA(MB) ((MB)->mb_type == I8MB || (MB)->mb_type == I4MB) |
| #define IS_NEWINTRA(MB) ((MB)->mb_type == I4MB) |
| #define IS_OLDINTRA(MB) ((MB)->mb_type == I8MB) |
| #define IS_INTER(MB) ((MB)->mb_type != I8MB && (MB)->mb_type != I4MB) |
| #define IS_INTERMV(MB) ((MB)->mb_type != I8MB && (MB)->mb_type != I4MB\ |
| && (MB)->mb_type != 0) |
| |
| #define IS_DIRECT(MB) ((MB)->mb_type == 0 && (img->type == B_IMG)) |
| #define IS_COPY(MB) ((MB)->mb_type == 0 && (img->type == P_IMG)) |
| #define IS_P8x8(MB) ((MB)->mb_type == P8x8) |
| |
| #define P_IMG 0 |
| #define B_IMG 1 |
| #define I_IMG 2 |
| |
| #define FIELD 0 |
| #define FRAME 1 |
| |
| #define SE_CABP 21 |
| struct decoding_environment_s { |
| unsigned int dbuffer; |
| int dbits_to_go; |
| unsigned char *dcodestrm; |
| int *dcodestrm_len; |
| }; |
| |
| struct bi_context_type_s { |
| unsigned char MPS; |
| unsigned int LG_PMPS; |
| unsigned char cycno; |
| }; |
| |
| |
| /********************************************************************** |
| * C O N T E X T S F O R R M S Y N T A X E L E M E N T S |
| ********************************************************************** |
| */ |
| |
| #define NUM_MB_TYPE_CTX 11 |
| #define NUM_B8_TYPE_CTX 9 |
| #define NUM_MV_RES_CTX 10 |
| #define NUM_REF_NO_CTX 6 |
| #define NUM_DELTA_QP_CTX 4 |
| #define NUM_MB_AFF_CTX 4 |
| |
| struct motion_info_contexts_s { |
| struct bi_context_type_s mb_type_contexts[4][NUM_MB_TYPE_CTX]; |
| struct bi_context_type_s b8_type_contexts[2][NUM_B8_TYPE_CTX]; |
| struct bi_context_type_s mv_res_contexts[2][NUM_MV_RES_CTX]; |
| struct bi_context_type_s ref_no_contexts[2][NUM_REF_NO_CTX]; |
| struct bi_context_type_s delta_qp_contexts[NUM_DELTA_QP_CTX]; |
| struct bi_context_type_s mb_aff_contexts[NUM_MB_AFF_CTX]; |
| #ifdef TEST_WEIGHTING_AEC |
| struct bi_context_type_s mb_weighting_pred; |
| #endif |
| }; |
| |
| #define NUM_IPR_CTX 2 |
| #define NUM_CIPR_CTX 4 |
| #define NUM_CBP_CTX 4 |
| #define NUM_BCBP_CTX 4 |
| #define NUM_MAP_CTX 16 |
| #define NUM_LAST_CTX 16 |
| |
| #define NUM_ONE_CTX 5 |
| #define NUM_ABS_CTX 5 |
| |
| struct texture_info_contexts { |
| struct bi_context_type_s ipr_contexts[NUM_IPR_CTX]; |
| struct bi_context_type_s cipr_contexts[NUM_CIPR_CTX]; |
| struct bi_context_type_s cbp_contexts[3][NUM_CBP_CTX]; |
| struct bi_context_type_s bcbp_contexts[NUM_BLOCK_TYPES][NUM_BCBP_CTX]; |
| struct bi_context_type_s one_contexts[NUM_BLOCK_TYPES][NUM_ONE_CTX]; |
| struct bi_context_type_s abs_contexts[NUM_BLOCK_TYPES][NUM_ABS_CTX]; |
| struct bi_context_type_s fld_map_contexts[NUM_BLOCK_TYPES][NUM_MAP_CTX]; |
| struct bi_context_type_s fld_last_contexts |
| [NUM_BLOCK_TYPES][NUM_LAST_CTX]; |
| struct bi_context_type_s map_contexts[NUM_BLOCK_TYPES][NUM_MAP_CTX]; |
| struct bi_context_type_s last_contexts[NUM_BLOCK_TYPES][NUM_LAST_CTX]; |
| }; |
| struct img_par; |
| |
| struct syntaxelement { |
| int type; |
| int value1; |
| int value2; |
| int len; |
| int inf; |
| unsigned int bitpattern; |
| int context; |
| int k; |
| int golomb_grad; |
| int golomb_maxlevels; |
| #if TRACE |
| #define TRACESTRING_SIZE 100 |
| char tracestring[TRACESTRING_SIZE]; |
| #endif |
| |
| void (*mapping)(int len, int info, int *value1, int *value2); |
| |
| void (*reading)(struct syntaxelement *, struct img_par *, |
| struct decoding_environment_s *); |
| |
| }; |
| |
| struct bitstream_s { |
| |
| int read_len; |
| int code_len; |
| |
| int frame_bitoffset; |
| int bitstream_length; |
| |
| unsigned char *stream_buffer; |
| }; |
| |
| struct datapartition { |
| |
| struct bitstream_s *bitstream; |
| struct decoding_environment_s de_aec; |
| |
| int (*read_syntax_element)(struct syntaxelement *, struct img_par *, |
| struct datapartition *); |
| /*!< virtual function; |
| * actual method depends on chosen data partition and |
| * entropy coding method |
| */ |
| }; |
| |
| struct slice_s { |
| int picture_id; |
| int qp; |
| int picture_type; |
| int start_mb_nr; |
| int max_part_nr; |
| int num_mb; |
| |
| struct datapartition *part_arr; |
| struct motion_info_contexts_s *mot_ctx; |
| struct texture_info_contexts *tex_ctx; |
| int field_ctx[3][2]; |
| }; |
| |
| struct img_par { |
| int number; |
| int current_mb_nr; |
| int max_mb_nr; |
| int current_slice_nr; |
| int tr; |
| int qp; |
| int type; |
| |
| int typeb; |
| |
| int width; |
| int height; |
| int width_cr; |
| int height_cr; |
| int source_bitdepth; |
| int mb_y; |
| int mb_x; |
| int block_y; |
| int pix_y; |
| int pix_x; |
| int pix_c_y; |
| int block_x; |
| int pix_c_x; |
| |
| int ***mv; |
| int mpr[16][16]; |
| |
| int m7[16][16]; |
| int m8[/*2*/4][8][8]; |
| int cof[4][/*6*/8][4][4]; |
| int cofu[4]; |
| int **ipredmode; |
| int quad[256]; |
| int cod_counter; |
| |
| int ***dfmv; |
| int ***dbmv; |
| int **fw_reffrarr; |
| int **bw_reffrarr; |
| |
| int ***mv_frm; |
| int **fw_reffrarr_frm; |
| int **bw_reffrarr_frm; |
| int imgtr_next_p; |
| int imgtr_last_p; |
| int tr_frm; |
| int tr_fld; |
| int imgtr_last_prev_p; |
| |
| int no_forward_reference; |
| int seq_header_indicate; |
| int b_discard_flag; |
| |
| int ***fw_mv; |
| int ***bw_mv; |
| int subblock_x; |
| int subblock_y; |
| |
| int buf_cycle; |
| |
| int direct_type; |
| |
| int ***mv_top; |
| int ***mv_bot; |
| int **fw_reffrarr_top; |
| int **bw_reffrarr_top; |
| int **fw_reffrarr_bot; |
| int **bw_reffrarr_bot; |
| |
| int **ipredmode_top; |
| int **ipredmode_bot; |
| int ***fw_mv_top; |
| int ***fw_mv_bot; |
| int ***bw_mv_top; |
| int ***bw_mv_bot; |
| int ***dfmv_top; |
| int ***dbmv_top; |
| int ***dfmv_bot; |
| int ***dbm_bot; |
| |
| int toppoc; |
| int bottompoc; |
| int framepoc; |
| unsigned int frame_num; |
| |
| unsigned int pic_distance; |
| int delta_pic_order_cnt_bottom; |
| |
| signed int pic_distance_msb; |
| unsigned int prev_pic_distance_lsb; |
| signed int curr_pic_distance_msb; |
| unsigned int this_poc; |
| |
| int pic_width_inmbs; |
| int pic_height_inmbs; |
| int pic_size_inmbs; |
| |
| int block8_x, block8_y; |
| int structure; |
| int pn; |
| int buf_used; |
| int buf_size; |
| int picture_structure; |
| int advanced_pred_mode_disable; |
| int types; |
| int current_mb_nr_fld; |
| |
| int p_field_enhanced; |
| int b_field_enhanced; |
| |
| int slice_weighting_flag; |
| int lum_scale[4]; |
| int lum_shift[4]; |
| int chroma_scale[4]; |
| int chroma_shift[4]; |
| int mb_weighting_flag; |
| int weighting_prediction; |
| int mpr_weight[16][16]; |
| int top_bot; |
| int bframe_number; |
| |
| int auto_crop_right; |
| int auto_crop_bottom; |
| |
| struct slice_s *current_slice; |
| int is_v_block; |
| int is_intra_block; |
| |
| int new_seq_header_flag; |
| int new_sequence_flag; |
| int last_pic_bbv_delay; |
| |
| int sequence_end_flag; |
| int is_top_field; |
| |
| int abt_flag; |
| int qp_shift; |
| |
| #ifdef EIGHTH |
| int eighth_subpixel_flag; |
| int subpixel_precision; |
| int unit_length; |
| int subpixel_mask; |
| |
| int max_mvd; |
| int min_mvd; |
| #endif |
| |
| }; |
| |
| struct macroblock { |
| int qp; |
| int slice_nr; |
| int delta_quant; |
| struct macroblock *mb_available[3][3]; |
| /*!< pointer to neighboring MBs in a 3x3 window of current MB, |
| *which is located at [1][1] |
| * NULL pointer identifies neighboring MBs which are unavailable |
| */ |
| |
| int mb_type; |
| int mvd[2][BLOCK_MULTIPLE][BLOCK_MULTIPLE][2]; |
| int cbp, cbp_blk, cbp01; |
| unsigned long cbp_bits; |
| |
| int b8mode[4]; |
| int b8pdir[4]; |
| int mb_type_2; |
| int c_ipred_mode_2; |
| int dct_mode; |
| |
| int c_ipred_mode; |
| int lf_disable; |
| int lf_alpha_c0_offset; |
| int lf_beta_offset; |
| |
| int CABT[4]; |
| int CABP[4]; |
| int cbp_4x4[4]; |
| |
| int skip_flag; |
| |
| struct macroblock *mb_available_up; |
| struct macroblock *mb_available_left; |
| unsigned int mbaddr_a, mbaddr_b, mbaddr_c, mbaddr_d; |
| unsigned int mbavail_a, mbavail_b, mbavail_c, mbavail_d; |
| |
| }; |
| |
| struct macroblock *mb_data; |
| |
| struct img_par *img; |
| |
| struct bitstream_s *curr_stream; |
| |
| struct datapartition *alloc_partition(int n); |
| |
| unsigned int vld_mem_start_addr; |
| unsigned int vld_mem_end_addr; |
| |
| int marker_bit; |
| |
| int progressive_sequence; |
| int horizontal_size; |
| int vertical_size; |
| |
| int second_ifield; |
| int pre_img_type; |
| |
| /* slice_header() */ |
| int slice_vertical_position; |
| int slice_vertical_position_extension; |
| int fixed_picture_qp; |
| int fixed_slice_qp; |
| int slice_qp; |
| |
| /* |
| ************************************************************************* |
| * Function:ue_v, reads an u(v) syntax element, the length in bits is stored in |
| the global UsedBits variable |
| * Input: |
| tracestring |
| the string for the trace file |
| bitstream |
| the stream to be read from |
| * Output: |
| * Return: the value of the coded syntax element |
| * Attention: |
| ************************************************************************* |
| */ |
| /*! |
| * definition of AVS syntaxelements |
| * order of elements follow dependencies for picture reconstruction |
| */ |
| /*! |
| * \brief Assignment of old TYPE partition elements to new |
| * elements |
| * |
| * old element | new elements |
| * TYPE_HEADER | SE_HEADER, SE_PTYPE |
| * TYPE_MBHEADER | SE_MBTYPE, SE_REFFRAME, SE_INTRAPREDMODE |
| * TYPE_MVD | SE_MVD |
| * TYPE_CBP | SE_CBP_INTRA, SE_CBP_INTER * SE_DELTA_QUANT_INTER |
| * SE_DELTA_QUANT_INTRA |
| * TYPE_COEFF_Y | SE_LUM_DC_INTRA, SE_LUM_AC_INTRA, |
| SE_LUM_DC_INTER, SE_LUM_AC_INTER |
| * TYPE_2x2DC | SE_CHR_DC_INTRA, SE_CHR_DC_INTER |
| * TYPE_COEFF_C | SE_CHR_AC_INTRA, SE_CHR_AC_INTER |
| * TYPE_EOS | SE_EOS |
| */ |
| |
| #define SE_HEADER 0 |
| #define SE_PTYPE 1 |
| #define SE_MBTYPE 2 |
| #define SE_REFFRAME 3 |
| #define SE_INTRAPREDMODE 4 |
| #define SE_MVD 5 |
| #define SE_CBP_INTRA 6 |
| #define SE_LUM_DC_INTRA 7 |
| #define SE_CHR_DC_INTRA 8 |
| #define SE_LUM_AC_INTRA 9 |
| #define SE_CHR_AC_INTRA 10 |
| #define SE_CBP_INTER 11 |
| #define SE_LUM_DC_INTER 12 |
| #define SE_CHR_DC_INTER 13 |
| #define SE_LUM_AC_INTER 14 |
| #define SE_CHR_AC_INTER 15 |
| #define SE_DELTA_QUANT_INTER 16 |
| #define SE_DELTA_QUANT_INTRA 17 |
| #define SE_BFRAME 18 |
| #define SE_EOS 19 |
| #define SE_MAX_ELEMENTS 20 |
| #define SE_CBP01 21 |
| int chroma_format; |
| /* |
| ************************************************************************* |
| * Function:Reads bits from the bitstream buffer |
| * Input: |
| byte buffer[] |
| containing VLC-coded data bits |
| int totbitoffset |
| bit offset from start of partition |
| int bytecount |
| total bytes in bitstream |
| int numbits |
| number of bits to read |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| int get_bits(unsigned char buffer[], int totbitoffset, int *info, int bytecount, |
| int numbits) |
| { |
| register int inf; |
| long byteoffset; |
| int bitoffset; |
| |
| int bitcounter = numbits; |
| |
| byteoffset = totbitoffset / 8; |
| bitoffset = 7 - (totbitoffset % 8); |
| |
| inf = 0; |
| while (numbits) { |
| inf <<= 1; |
| inf |= (buffer[byteoffset] & (0x01 << bitoffset)) >> bitoffset; |
| numbits--; |
| bitoffset--; |
| if (bitoffset < 0) { |
| byteoffset++; |
| bitoffset += 8; |
| if (byteoffset > bytecount) |
| return -1; |
| } |
| } |
| |
| *info = inf; |
| |
| |
| return bitcounter; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:read FLC codeword from UVLC-partition |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| int read_syntaxelement_flc(struct syntaxelement *sym) |
| { |
| int frame_bitoffset = curr_stream->frame_bitoffset; |
| unsigned char *buf = curr_stream->stream_buffer; |
| int bitstreamlengthinbytes = curr_stream->bitstream_length; |
| |
| if ((get_bits(buf, frame_bitoffset, &(sym->inf), bitstreamlengthinbytes, |
| sym->len)) < 0) |
| return -1; |
| |
| curr_stream->frame_bitoffset += sym->len; |
| sym->value1 = sym->inf; |
| |
| #if TRACE |
| tracebits2(sym->tracestring, sym->len, sym->inf); |
| #endif |
| |
| return 1; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:ue_v, reads an u(1) syntax element, the length in bits is stored in |
| the global UsedBits variable |
| * Input: |
| tracestring |
| the string for the trace file |
| bitstream |
| the stream to be read from |
| * Output: |
| * Return: the value of the coded syntax element |
| * Attention: |
| ************************************************************************* |
| */ |
| int u_1(char *tracestring) |
| { |
| return u_v(1, tracestring); |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:mapping rule for ue(v) syntax elements |
| * Input:length and info |
| * Output:number in the code table |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| void linfo_ue(int len, int info, int *value1, int *dummy) |
| { |
| *value1 = (int)pow2(2, (len / 2)) + info - 1; |
| } |
| |
| int u_v(int leninbits, char *tracestring) |
| { |
| struct syntaxelement symbol, *sym = &symbol; |
| |
| #ifdef AVSP_LONG_CABAC |
| #else |
| assert(curr_stream->stream_buffer != NULL); |
| #endif |
| sym->type = SE_HEADER; |
| sym->mapping = linfo_ue; |
| sym->len = leninbits; |
| read_syntaxelement_flc(sym); |
| |
| return sym->inf; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:mapping rule for se(v) syntax elements |
| * Input:length and info |
| * Output:signed mvd |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void linfo_se(int len, int info, int *value1, int *dummy) |
| { |
| int n; |
| |
| n = (int)pow2(2, (len / 2)) + info - 1; |
| *value1 = (n + 1) / 2; |
| if ((n & 0x01) == 0) |
| *value1 = -*value1; |
| |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:length and info |
| * Input: |
| * Output:cbp (intra) |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void linfo_cbp_intra(int len, int info, int *cbp, int *dummy) |
| { |
| } |
| |
| const int NCBP[64][2] = {{4, 0}, {16, 19}, {17, 16}, {19, 15}, {14, 18}, |
| {9, 11}, {22, 31}, {8, 13}, {11, 17}, {21, 30}, {10, 12}, |
| {7, 9}, {12, 10}, {6, 7}, {5, 8}, {1, 1}, {35, 4}, {47, 42}, { |
| 48, 38}, {38, 27}, {46, 39}, {36, 33}, {50, 59}, |
| {26, 26}, {45, 40}, {52, 58}, {41, 35}, {28, 25}, {37, 29}, {23, |
| 24}, {31, 28}, {2, 3}, {43, 5}, {51, 51}, {56, |
| 52}, {39, 37}, {55, 50}, {33, 43}, {62, 63}, { |
| 27, 44}, {54, 53}, {60, 62}, {40, 48}, {32, 47}, |
| {42, 34}, {24, 45}, {29, 49}, {3, 6}, {49, 14}, {53, 55}, {57, |
| 56}, {25, 36}, {58, 54}, {30, 41}, {59, 60}, { |
| 15, 21}, {61, 57}, {63, 61}, {44, 46}, {18, 22}, |
| {34, 32}, {13, 20}, {20, 23}, {0, 2} }; |
| |
| unsigned int s1, t1, value_s, value_t; |
| unsigned char dec_bypass, dec_final; |
| |
| #define get_byte() { \ |
| dbuffer = dcodestrm[(*dcodestrm_len)++];\ |
| dbits_to_go = 7; \ |
| } |
| |
| #define dbuffer (dep->dbuffer) |
| #define dbits_to_go (dep->dbits_to_go) |
| #define dcodestrm (dep->dcodestrm) |
| #define dcodestrm_len (dep->dcodestrm_len) |
| |
| #define B_BITS 10 |
| |
| #define LG_PMPS_SHIFTNO 2 |
| |
| #define HALF (1 << (B_BITS-1)) |
| #define QUARTER (1 << (B_BITS-2)) |
| |
| unsigned int biari_decode_symbol(struct decoding_environment_s *dep, |
| struct bi_context_type_s *bi_ct) |
| { |
| register unsigned char bit; |
| register unsigned char s_flag; |
| register unsigned char is_lps = 0; |
| register unsigned char cwr; |
| register unsigned char cycno = bi_ct->cycno; |
| register unsigned int lg_pmps = bi_ct->LG_PMPS; |
| register unsigned int t_rlps; |
| register unsigned int s2, t2; |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & AEC_DUMP) |
| io_printf("LG_PMPS : %03X, MPS : %d, cycno : %d -- %p\n", |
| bi_ct->LG_PMPS, bi_ct->MPS, bi_ct->cycno, bi_ct); |
| #endif |
| |
| bit = bi_ct->MPS; |
| |
| cwr = (cycno <= 1) ? 3 : (cycno == 2) ? 4 : 5; |
| |
| if (t1 >= (lg_pmps >> LG_PMPS_SHIFTNO)) { |
| s2 = s1; |
| t2 = t1 - (lg_pmps >> LG_PMPS_SHIFTNO); |
| s_flag = 0; |
| } else { |
| s2 = s1 + 1; |
| t2 = 256 + t1 - (lg_pmps >> LG_PMPS_SHIFTNO); |
| s_flag = 1; |
| } |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & AEC_DUMP) |
| io_printf(" s2 : %d, t2 : %03X\n", s2, t2); |
| #endif |
| |
| if (s2 > value_s || (s2 == value_s && value_t >= t2)) { |
| is_lps = 1; |
| bit = !bit; |
| |
| t_rlps = (s_flag == 0) ? |
| (lg_pmps >> LG_PMPS_SHIFTNO) : |
| (t1 + (lg_pmps >> LG_PMPS_SHIFTNO)); |
| |
| if (s2 == value_s) |
| value_t = (value_t - t2); |
| else { |
| if (--dbits_to_go < 0) |
| get_byte(); |
| |
| value_t = (value_t << 1) |
| | ((dbuffer >> dbits_to_go) & 0x01); |
| value_t = 256 + value_t - t2; |
| |
| } |
| |
| while (t_rlps < QUARTER) { |
| t_rlps = t_rlps << 1; |
| if (--dbits_to_go < 0) |
| get_byte(); |
| |
| value_t = (value_t << 1) |
| | ((dbuffer >> dbits_to_go) & 0x01); |
| } |
| |
| s1 = 0; |
| t1 = t_rlps & 0xff; |
| |
| value_s = 0; |
| while (value_t < QUARTER) { |
| int j; |
| |
| if (--dbits_to_go < 0) |
| get_byte(); |
| j = (dbuffer >> dbits_to_go) & 0x01; |
| |
| value_t = (value_t << 1) | j; |
| value_s++; |
| } |
| value_t = value_t & 0xff; |
| } else { |
| |
| s1 = s2; |
| t1 = t2; |
| } |
| |
| if (dec_bypass) |
| return bit; |
| |
| if (is_lps) |
| cycno = (cycno <= 2) ? (cycno + 1) : 3; |
| else if (cycno == 0) |
| cycno = 1; |
| bi_ct->cycno = cycno; |
| |
| if (is_lps) { |
| switch (cwr) { |
| case 3: |
| lg_pmps = lg_pmps + 197; |
| break; |
| case 4: |
| lg_pmps = lg_pmps + 95; |
| break; |
| default: |
| lg_pmps = lg_pmps + 46; |
| } |
| |
| if (lg_pmps >= (256 << LG_PMPS_SHIFTNO)) { |
| lg_pmps = (512 << LG_PMPS_SHIFTNO) - 1 - lg_pmps; |
| bi_ct->MPS = !(bi_ct->MPS); |
| } |
| } else { |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & AEC_DUMP) |
| io_printf(" - lg_pmps_MPS : %X (%X - %X - %X)\n", |
| lg_pmps - (unsigned int)(lg_pmps>>cwr) |
| - (unsigned int)(lg_pmps>>(cwr+2)), |
| lg_pmps, |
| (unsigned int)(lg_pmps>>cwr), |
| (unsigned int)(lg_pmps>>(cwr+2)) |
| ); |
| #endif |
| lg_pmps = lg_pmps - (unsigned int)(lg_pmps >> cwr) |
| - (unsigned int)(lg_pmps >> (cwr + 2)); |
| } |
| |
| bi_ct->LG_PMPS = lg_pmps; |
| |
| return bit; |
| } |
| |
| unsigned int biari_decode_symbolw(struct decoding_environment_s *dep, |
| struct bi_context_type_s *bi_ct1, |
| struct bi_context_type_s *bi_ct2) |
| { |
| register unsigned char bit1, bit2; |
| register unsigned char pred_mps, bit; |
| register unsigned int lg_pmps; |
| register unsigned char cwr1, cycno1 = bi_ct1->cycno; |
| register unsigned char cwr2, cycno2 = bi_ct2->cycno; |
| register unsigned int lg_pmps1 = bi_ct1->LG_PMPS; |
| register unsigned int lg_pmps2 = |
| bi_ct2->LG_PMPS; |
| register unsigned int t_rlps; |
| register unsigned char s_flag, is_lps = 0; |
| register unsigned int s2, t2; |
| |
| |
| bit1 = bi_ct1->MPS; |
| bit2 = bi_ct2->MPS; |
| |
| cwr1 = (cycno1 <= 1) ? 3 : (cycno1 == 2) ? 4 : 5; |
| cwr2 = (cycno2 <= 1) ? 3 : (cycno2 == 2) ? 4 : 5; |
| |
| if (bit1 == bit2) { |
| pred_mps = bit1; |
| lg_pmps = (lg_pmps1 + lg_pmps2) / 2; |
| } else { |
| if (lg_pmps1 < lg_pmps2) { |
| pred_mps = bit1; |
| lg_pmps = (256 << LG_PMPS_SHIFTNO) - 1 |
| - ((lg_pmps2 - lg_pmps1) >> 1); |
| } else { |
| pred_mps = bit2; |
| lg_pmps = (256 << LG_PMPS_SHIFTNO) - 1 |
| - ((lg_pmps1 - lg_pmps2) >> 1); |
| } |
| } |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & AEC_DUMP) |
| io_printf(" - Begin - LG_PMPS : %03X, MPS : %d\n", |
| lg_pmps, pred_mps); |
| #endif |
| if (t1 >= (lg_pmps >> LG_PMPS_SHIFTNO)) { |
| s2 = s1; |
| t2 = t1 - (lg_pmps >> LG_PMPS_SHIFTNO); |
| s_flag = 0; |
| } else { |
| s2 = s1 + 1; |
| t2 = 256 + t1 - (lg_pmps >> LG_PMPS_SHIFTNO); |
| s_flag = 1; |
| } |
| |
| bit = pred_mps; |
| if (s2 > value_s || (s2 == value_s && value_t >= t2)) { |
| is_lps = 1; |
| bit = !bit; |
| t_rlps = (s_flag == 0) ? |
| (lg_pmps >> LG_PMPS_SHIFTNO) : |
| (t1 + (lg_pmps >> LG_PMPS_SHIFTNO)); |
| |
| if (s2 == value_s) |
| value_t = (value_t - t2); |
| else { |
| if (--dbits_to_go < 0) |
| get_byte(); |
| |
| value_t = (value_t << 1) |
| | ((dbuffer >> dbits_to_go) & 0x01); |
| value_t = 256 + value_t - t2; |
| } |
| |
| while (t_rlps < QUARTER) { |
| t_rlps = t_rlps << 1; |
| if (--dbits_to_go < 0) |
| get_byte(); |
| |
| value_t = (value_t << 1) |
| | ((dbuffer >> dbits_to_go) & 0x01); |
| } |
| s1 = 0; |
| t1 = t_rlps & 0xff; |
| |
| value_s = 0; |
| while (value_t < QUARTER) { |
| int j; |
| |
| if (--dbits_to_go < 0) |
| get_byte(); |
| j = (dbuffer >> dbits_to_go) & 0x01; |
| |
| value_t = (value_t << 1) | j; |
| value_s++; |
| } |
| value_t = value_t & 0xff; |
| } else { |
| s1 = s2; |
| t1 = t2; |
| } |
| |
| if (bit != bit1) { |
| cycno1 = (cycno1 <= 2) ? (cycno1 + 1) : 3; |
| } else { |
| if (cycno1 == 0) |
| cycno1 = 1; |
| } |
| |
| if (bit != bit2) { |
| cycno2 = (cycno2 <= 2) ? (cycno2 + 1) : 3; |
| } else { |
| if (cycno2 == 0) |
| cycno2 = 1; |
| } |
| bi_ct1->cycno = cycno1; |
| bi_ct2->cycno = cycno2; |
| |
| { |
| |
| if (bit == bit1) { |
| lg_pmps1 = |
| lg_pmps1 |
| - (unsigned int)(lg_pmps1 |
| >> cwr1) |
| - (unsigned int)(lg_pmps1 |
| >> (cwr1 |
| + 2)); |
| } else { |
| switch (cwr1) { |
| case 3: |
| lg_pmps1 = lg_pmps1 + 197; |
| break; |
| case 4: |
| lg_pmps1 = lg_pmps1 + 95; |
| break; |
| default: |
| lg_pmps1 = lg_pmps1 + 46; |
| } |
| |
| if (lg_pmps1 >= (256 << LG_PMPS_SHIFTNO)) { |
| lg_pmps1 = (512 << LG_PMPS_SHIFTNO) - 1 |
| - lg_pmps1; |
| bi_ct1->MPS = !(bi_ct1->MPS); |
| } |
| } |
| bi_ct1->LG_PMPS = lg_pmps1; |
| |
| if (bit == bit2) { |
| lg_pmps2 = |
| lg_pmps2 |
| - (unsigned int)(lg_pmps2 |
| >> cwr2) |
| - (unsigned int)(lg_pmps2 |
| >> (cwr2 |
| + 2)); |
| } else { |
| switch (cwr2) { |
| case 3: |
| lg_pmps2 = lg_pmps2 + 197; |
| break; |
| case 4: |
| lg_pmps2 = lg_pmps2 + 95; |
| break; |
| default: |
| lg_pmps2 = lg_pmps2 + 46; |
| } |
| |
| if (lg_pmps2 >= (256 << LG_PMPS_SHIFTNO)) { |
| lg_pmps2 = (512 << LG_PMPS_SHIFTNO) - 1 |
| - lg_pmps2; |
| bi_ct2->MPS = !(bi_ct2->MPS); |
| } |
| } |
| bi_ct2->LG_PMPS = lg_pmps2; |
| } |
| |
| |
| return bit; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * biari_decode_symbol_eq_prob(): |
| * \return |
| * the decoded symbol |
| ************************************************************************ |
| */ |
| unsigned int biari_decode_symbol_eq_prob(struct decoding_environment_s *dep) |
| { |
| unsigned char bit; |
| struct bi_context_type_s octx; |
| struct bi_context_type_s *ctx = &octx; |
| |
| ctx->LG_PMPS = (QUARTER << LG_PMPS_SHIFTNO) - 1; |
| ctx->MPS = 0; |
| ctx->cycno = 0xfe; |
| dec_bypass = 1; |
| bit = biari_decode_symbol(dep, ctx); |
| dec_bypass = 0; |
| return bit; |
| } |
| |
| unsigned int biari_decode_final(struct decoding_environment_s *dep) |
| { |
| unsigned char bit; |
| struct bi_context_type_s octx; |
| struct bi_context_type_s *ctx = &octx; |
| |
| ctx->LG_PMPS = 1 << LG_PMPS_SHIFTNO; |
| ctx->MPS = 0; |
| ctx->cycno = 0xff; |
| dec_final = 1; |
| bit = biari_decode_symbol(dep, ctx); |
| dec_final = 0; |
| return bit; |
| } |
| |
| int i_8(char *tracestring) |
| { |
| int frame_bitoffset = curr_stream->frame_bitoffset; |
| unsigned char *buf = curr_stream->stream_buffer; |
| int bitstreamlengthinbytes = curr_stream->bitstream_length; |
| struct syntaxelement symbol, *sym = &symbol; |
| #ifdef AVSP_LONG_CABAC |
| #else |
| assert(curr_stream->stream_buffer != NULL); |
| #endif |
| |
| sym->len = 8; |
| sym->type = SE_HEADER; |
| sym->mapping = linfo_ue; |
| |
| if ((get_bits(buf, frame_bitoffset, &(sym->inf), bitstreamlengthinbytes, |
| sym->len)) < 0) |
| return -1; |
| curr_stream->frame_bitoffset += sym->len; |
| sym->value1 = sym->inf; |
| if (sym->inf & 0x80) |
| sym->inf = -(~((int)0xffffff00 | sym->inf) + 1); |
| #if TRACE |
| tracebits2(sym->tracestring, sym->len, sym->inf); |
| #endif |
| return sym->inf; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * arideco_bits_read |
| ************************************************************************ |
| */ |
| int arideco_bits_read(struct decoding_environment_s *dep) |
| { |
| |
| return 8 * ((*dcodestrm_len) - 1) + (8 - dbits_to_go); |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * arithmetic decoding |
| ************************************************************************ |
| */ |
| int read_syntaxelement_aec(struct syntaxelement *se, struct img_par *img, |
| struct datapartition *this_data_part) |
| { |
| int curr_len; |
| struct decoding_environment_s *dep_dp = &(this_data_part->de_aec); |
| |
| curr_len = arideco_bits_read(dep_dp); |
| |
| se->reading(se, img, dep_dp); |
| |
| se->len = (arideco_bits_read(dep_dp) - curr_len); |
| return se->len; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * This function is used to arithmetically decode the |
| * run length info of the skip mb |
| ************************************************************************ |
| */ |
| void readrunlenghtfrombuffer_aec(struct syntaxelement *se, struct img_par *img, |
| struct decoding_environment_s *dep_dp) |
| { |
| struct bi_context_type_s *pctx; |
| int ctx, symbol; |
| |
| pctx = img->current_slice->tex_ctx->one_contexts[0]; |
| symbol = 0; |
| ctx = 0; |
| while (biari_decode_symbol(dep_dp, pctx + ctx) == 0) { |
| symbol += 1; |
| ctx++; |
| if (ctx >= 3) |
| ctx = 3; |
| } |
| se->value1 = symbol; |
| #if TRACE |
| fprintf(p_trace, "@%d%s\t\t\t%d\n", |
| symbol_count++, se->tracestring, se->value1); |
| fflush(p_trace); |
| #endif |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * This function is used to arithmetically decode a pair of |
| * intra prediction modes of a given MB. |
| ************************************************************************ |
| */ |
| int mapd_intrap[5] = {0, 2, 3, 4, 1}; |
| void read_intrapredmode_aec(struct syntaxelement *se, struct img_par *img, |
| struct decoding_environment_s *dep_dp) |
| { |
| struct bi_context_type_s *pctx; |
| int ctx, symbol; |
| |
| pctx = img->current_slice->tex_ctx->one_contexts[1]; |
| symbol = 0; |
| ctx = 0; |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & AEC_DUMP) |
| io_printf(" -- read_intrapredmode_aec ctx : %d\n", ctx); |
| #endif |
| while (biari_decode_symbol(dep_dp, pctx + ctx) == 0) { |
| symbol += 1; |
| ctx++; |
| if (ctx >= 3) |
| ctx = 3; |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & AEC_DUMP) |
| io_printf(" -- read_intrapredmode_aec ctx : %d\n", ctx); |
| #endif |
| if (symbol == 4) |
| break; |
| } |
| se->value1 = mapd_intrap[symbol] - 1; |
| |
| #if TRACE |
| fprintf(p_trace, "@%d %s\t\t\t%d\n", |
| symbol_count++, se->tracestring, se->value1); |
| fflush(p_trace); |
| #endif |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * decoding of unary binarization using one or 2 distinct |
| * models for the first and all remaining bins; no terminating |
| * "0" for max_symbol |
| *********************************************************************** |
| */ |
| unsigned int unary_bin_max_decode(struct decoding_environment_s *dep_dp, |
| struct bi_context_type_s *ctx, |
| int ctx_offset, unsigned int max_symbol) |
| { |
| unsigned int l; |
| unsigned int symbol; |
| struct bi_context_type_s *ictx; |
| |
| symbol = biari_decode_symbol(dep_dp, ctx); |
| |
| if (symbol == 0) |
| return 0; |
| |
| if (max_symbol == 1) |
| return symbol; |
| symbol = 0; |
| ictx = ctx + ctx_offset; |
| do { |
| l = biari_decode_symbol(dep_dp, ictx); |
| symbol++; |
| } while ((l != 0) && (symbol < max_symbol - 1)); |
| if ((l != 0) && (symbol == max_symbol - 1)) |
| symbol++; |
| return symbol; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * decoding of unary binarization using one or 2 distinct |
| * models for the first and all remaining bins |
| *********************************************************************** |
| */ |
| unsigned int unary_bin_decode(struct decoding_environment_s *dep_dp, |
| struct bi_context_type_s *ctx, int ctx_offset) |
| { |
| unsigned int l; |
| unsigned int symbol; |
| struct bi_context_type_s *ictx; |
| |
| symbol = 1 - biari_decode_symbol(dep_dp, ctx); |
| |
| if (symbol == 0) |
| return 0; |
| symbol = 0; |
| ictx = ctx + ctx_offset; |
| do { |
| l = 1 - biari_decode_symbol(dep_dp, ictx); |
| symbol++; |
| } while (l != 0); |
| return symbol; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * This function is used to arithmetically decode the chroma |
| * intra prediction mode of a given MB. |
| ************************************************************************ |
| */ |
| void read_cipredmode_aec(struct syntaxelement *se, |
| struct img_par *img, |
| struct decoding_environment_s *dep_dp) |
| { |
| struct texture_info_contexts *ctx = img->current_slice->tex_ctx; |
| struct macroblock *curr_mb = &mb_data[img->current_mb_nr]; |
| int act_ctx, a, b; |
| int act_sym = se->value1; |
| |
| if (curr_mb->mb_available_up == NULL) |
| b = 0; |
| else { |
| /*if ( (curr_mb->mb_available_up)->mb_type==IPCM) |
| * b=0; |
| * else |
| */ |
| b = (((curr_mb->mb_available_up)->c_ipred_mode != 0) ? 1 : 0); |
| } |
| |
| if (curr_mb->mb_available_left == NULL) |
| a = 0; |
| else { |
| /* if ( (curr_mb->mb_available_left)->mb_type==IPCM) |
| * a=0; |
| * else |
| */ |
| a = (((curr_mb->mb_available_left)->c_ipred_mode != 0) ? 1 : 0); |
| } |
| |
| act_ctx = a + b; |
| |
| |
| act_sym = biari_decode_symbol(dep_dp, ctx->cipr_contexts + act_ctx); |
| |
| if (act_sym != 0) |
| act_sym = unary_bin_max_decode(dep_dp, ctx->cipr_contexts + 3, |
| 0, 2) + 1; |
| |
| se->value1 = act_sym; |
| |
| #if TRACE |
| fprintf(p_trace, "@%d %s\t\t%d\n", |
| symbol_count++, se->tracestring, se->value1); |
| fflush(p_trace); |
| #endif |
| |
| } |
| |
| int slice_header(char *buf, int startcodepos, int length) |
| { |
| int i; |
| |
| int weight_para_num = 0; |
| int mb_row; |
| int mb_column; |
| int mb_index; |
| int mb_width, mb_height; |
| |
| mb_column = 0; |
| |
| memcpy(curr_stream->stream_buffer, buf, length); |
| curr_stream->code_len = curr_stream->bitstream_length = length; |
| |
| curr_stream->read_len = |
| curr_stream->frame_bitoffset = (startcodepos) * 8; |
| slice_vertical_position = u_v(8, "slice vertical position"); |
| |
| push_es(slice_vertical_position, 8); |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & SLICE_INFO_DUMP) |
| io_printf(" * 8-bits slice_vertical_position : %d\n", |
| slice_vertical_position); |
| #endif |
| |
| if (vertical_size > 2800) { |
| slice_vertical_position_extension = u_v(3, |
| "slice vertical position extension"); |
| push_es(slice_vertical_position_extension, 3); |
| |
| } |
| |
| if (vertical_size > 2800) |
| mb_row = (slice_vertical_position_extension << 7) |
| + slice_vertical_position; |
| else |
| mb_row = slice_vertical_position; |
| |
| mb_width = (horizontal_size + 15) / 16; |
| if (!progressive_sequence) |
| mb_height = 2 * ((vertical_size + 31) / 32); |
| else |
| mb_height = (vertical_size + 15) / 16; |
| |
| |
| mb_index = mb_row * mb_width + mb_column; |
| |
| if (!img->picture_structure && img->type == I_IMG |
| && (mb_index >= mb_width * mb_height / 2)) { |
| second_ifield = 1; |
| img->type = P_IMG; |
| pre_img_type = P_IMG; |
| } |
| |
| { |
| if (!fixed_picture_qp) { |
| fixed_slice_qp = u_v(1, "fixed_slice_qp"); |
| push_es(fixed_slice_qp, 1); |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & SLICE_INFO_DUMP) |
| io_printf(" * 1-bit fixed_slice_qp : %d\n", |
| fixed_slice_qp); |
| #endif |
| slice_qp = u_v(6, "slice_qp"); |
| push_es(slice_qp, 6); |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & SLICE_INFO_DUMP) |
| io_printf(" * 6-bits slice_qp : %d\n", |
| slice_qp); |
| #endif |
| |
| img->qp = slice_qp; |
| } |
| |
| if (img->type != I_IMG) { |
| img->slice_weighting_flag = u_v(1, |
| "slice weighting flag"); |
| |
| if (img->slice_weighting_flag) { |
| |
| if (second_ifield && !img->picture_structure) |
| weight_para_num = 1; |
| else if (img->type == P_IMG |
| && img->picture_structure) |
| weight_para_num = 2; |
| else if (img->type == P_IMG |
| && !img->picture_structure) |
| weight_para_num = 4; |
| else if (img->type == B_IMG |
| && img->picture_structure) |
| weight_para_num = 2; |
| else if (img->type == B_IMG |
| && !img->picture_structure) |
| weight_para_num = 4; |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & SLICE_INFO_DUMP) |
| io_printf(" - weight_para_num : %d\n", |
| weight_para_num); |
| #endif |
| for (i = 0; i < weight_para_num; i++) { |
| img->lum_scale[i] = u_v(8, |
| "luma scale"); |
| |
| img->lum_shift[i] = i_8("luma shift"); |
| |
| marker_bit = u_1("insert bit"); |
| |
| |
| { |
| img->chroma_scale[i] = u_v(8, |
| "chroma scale"); |
| |
| img->chroma_shift[i] = i_8( |
| "chroma shift"); |
| |
| marker_bit = u_1("insert bit"); |
| |
| } |
| } |
| img->mb_weighting_flag = u_v(1, |
| "MB weighting flag"); |
| |
| } |
| } |
| } |
| |
| |
| #if 1 |
| return mb_index; |
| #endif |
| } |
| |
| void no_mem_exit(char *where) |
| { |
| io_printf("%s\r\n", where); |
| } |
| |
| unsigned char bit[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; |
| |
| struct inputstream_s { |
| /*FILE *f;*/ |
| unsigned char buf[SVA_STREAM_BUF_SIZE]; |
| unsigned int uclear_bits; |
| unsigned int upre_3bytes; |
| int ibyte_position; |
| int ibuf_bytesnum; |
| int iclear_bitsnum; |
| int istuff_bitsnum; |
| int ibits_count; |
| }; |
| |
| struct inputstream_s IRABS; |
| struct inputstream_s *p_irabs = &IRABS; |
| |
| struct stat_bits { |
| int curr_frame_bits; |
| int prev_frame_bits; |
| int emulate_bits; |
| int prev_emulate_bits; |
| int last_unit_bits; |
| int bitrate; |
| int total_bitrate[1000]; |
| int coded_pic_num; |
| int time_s; |
| }; |
| |
| struct stat_bits *stat_bits_ptr; |
| |
| unsigned char *temp_slice_buf; |
| int start_codeposition; |
| int first_slice_length; |
| int first_slice_startpos; |
| |
| int bitstream_buf_used; |
| int startcode_offset; |
| |
| int bitstream_read_ptr; |
| |
| int demulate_enable; |
| |
| int last_dquant; |
| |
| int total_mb_count; |
| |
| int current_mb_skip; |
| |
| int skip_mode_flag; |
| |
| int current_mb_intra; |
| |
| /* |
| ************************************************************************* |
| * Function: Check start code's type |
| * Input: |
| * Output: |
| * Return: |
| * Author: XZHENG, 20080515 |
| ************************************************************************* |
| */ |
| void check_type(int startcode) |
| { |
| startcode = startcode & 0x000000ff; |
| switch (startcode) { |
| case 0xb0: |
| case 0xb2: |
| case 0xb5: |
| demulate_enable = 0; |
| break; |
| default: |
| demulate_enable = 1; |
| break; |
| } |
| |
| } |
| /* |
| ************************************************************************* |
| * Function: |
| * Input: |
| * Output: |
| * Return: 0 : OK |
| -1 : arrive at stream end |
| -2 : meet another start code |
| * Attention: |
| ************************************************************************* |
| */ |
| int clear_nextbyte(struct inputstream_s *p) |
| { |
| int i, k, j; |
| unsigned char temp[3]; |
| |
| i = p->ibyte_position; |
| k = p->ibuf_bytesnum - i; |
| if (k < 3) { |
| for (j = 0; j < k; j++) |
| temp[j] = p->buf[i + j]; |
| |
| p->ibuf_bytesnum = read_bitstream(p->buf + k, |
| SVA_STREAM_BUF_SIZE - k); |
| bitstream_buf_used++; |
| if (p->ibuf_bytesnum == 0) { |
| if (k > 0) { |
| while (k > 0) { |
| p->upre_3bytes = ((p->upre_3bytes << 8) |
| | p->buf[i]) |
| & 0x00ffffff; |
| if (p->upre_3bytes < 4 |
| && demulate_enable) { |
| p->uclear_bits = |
| (p->uclear_bits |
| << 6) |
| | (p->buf[i] |
| >> 2); |
| p->iclear_bitsnum += 6; |
| stat_bits_ptr->emulate_bits |
| += 2; |
| } else { |
| p->uclear_bits = (p->uclear_bits |
| << 8) |
| | p->buf[i]; |
| p->iclear_bitsnum += 8; |
| } |
| p->ibyte_position++; |
| k--; |
| i++; |
| } |
| return 0; |
| } else { |
| return -1; |
| } |
| } else { |
| for (j = 0; j < k; j++) |
| p->buf[j] = temp[j]; |
| p->ibuf_bytesnum += k; |
| i = p->ibyte_position = 0; |
| } |
| } |
| if (p->buf[i] == 0 && p->buf[i + 1] == 0 && p->buf[i + 2] == 1) |
| return -2; |
| p->upre_3bytes = ((p->upre_3bytes << 8) | p->buf[i]) & 0x00ffffff; |
| if (p->upre_3bytes < 4 && demulate_enable) { |
| p->uclear_bits = (p->uclear_bits << 6) | (p->buf[i] >> 2); |
| p->iclear_bitsnum += 6; |
| stat_bits_ptr->emulate_bits += 2; |
| } else { |
| p->uclear_bits = (p->uclear_bits << 8) | p->buf[i]; |
| p->iclear_bitsnum += 8; |
| } |
| p->ibyte_position++; |
| return 0; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function: |
| * Input: |
| * Output: |
| * Return: 0 : OK |
| -1 : arrive at stream end |
| -2 : meet another start code |
| * Attention: |
| ************************************************************************* |
| */ |
| int read_n_bit(struct inputstream_s *p, int n, int *v) |
| { |
| int r; |
| unsigned int t; |
| |
| while (n > p->iclear_bitsnum) { |
| r = clear_nextbyte(p); |
| if (r) { |
| if (r == -1) { |
| if (p->ibuf_bytesnum - p->ibyte_position > 0) |
| break; |
| } |
| return r; |
| } |
| } |
| t = p->uclear_bits; |
| r = 32 - p->iclear_bitsnum; |
| *v = (t << r) >> (32 - n); |
| p->iclear_bitsnum -= n; |
| return 0; |
| } |
| |
| #ifdef AVSP_LONG_CABAC |
| unsigned char TMP_BUF[2 * SVA_STREAM_BUF_SIZE]; |
| int tmp_buf_wr_ptr; |
| int tmp_buf_rd_ptr; |
| int tmp_buf_count; |
| #endif |
| void open_irabs(struct inputstream_s *p) |
| { |
| p->uclear_bits = 0xffffffff; |
| p->ibyte_position = 0; |
| p->ibuf_bytesnum = 0; |
| p->iclear_bitsnum = 0; |
| p->istuff_bitsnum = 0; |
| p->ibits_count = 0; |
| p->upre_3bytes = 0; |
| |
| bitstream_buf_used = 0; |
| bitstream_read_ptr = (src_start - 16) & 0xfffffff0; |
| |
| #ifdef AVSP_LONG_CABAC |
| tmp_buf_count = 0; |
| tmp_buf_wr_ptr = 0; |
| tmp_buf_rd_ptr = 0; |
| #endif |
| |
| } |
| |
| void move_bitstream(unsigned int move_from_addr, unsigned int move_to_addr, |
| int move_size) |
| { |
| int move_bytes_left = move_size; |
| unsigned int move_read_addr; |
| unsigned int move_write_addr = move_to_addr; |
| |
| int move_byte; |
| unsigned int data32; |
| |
| while (move_from_addr > vld_mem_end_addr) { |
| move_from_addr = move_from_addr + vld_mem_start_addr |
| - vld_mem_end_addr - 8; |
| } |
| move_read_addr = move_from_addr; |
| while (move_bytes_left > 0) { |
| move_byte = move_bytes_left; |
| if (move_byte > 512) |
| move_byte = 512; |
| if ((move_read_addr + move_byte) > vld_mem_end_addr) |
| move_byte = (vld_mem_end_addr + 8) - move_read_addr; |
| |
| WRITE_VREG(LMEM_DMA_ADR, move_read_addr); |
| WRITE_VREG(LMEM_DMA_COUNT, move_byte / 2); |
| WRITE_VREG(LMEM_DMA_CTRL, 0xc200); |
| |
| data32 = 0x8000; |
| while (data32 & 0x8000) |
| data32 = READ_VREG(LMEM_DMA_CTRL); |
| |
| WRITE_VREG(LMEM_DMA_ADR, move_write_addr); |
| WRITE_VREG(LMEM_DMA_COUNT, move_byte / 2); |
| WRITE_VREG(LMEM_DMA_CTRL, 0x8200); |
| |
| data32 = 0x8000; |
| while (data32 & 0x8000) |
| data32 = READ_VREG(LMEM_DMA_CTRL); |
| |
| data32 = 0x0fff; |
| while (data32 & 0x0fff) |
| data32 = READ_VREG(WRRSP_LMEM); |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & STREAM_INFO_DUMP) |
| io_printf(" 2 MOVE %d Bytes from 0x%x to 0x%x\n", |
| move_byte, move_read_addr, move_write_addr); |
| #endif |
| |
| move_read_addr = move_read_addr + move_byte; |
| if (move_read_addr > vld_mem_end_addr) |
| move_read_addr = vld_mem_start_addr; |
| move_write_addr = move_write_addr + move_byte; |
| move_bytes_left = move_bytes_left - move_byte; |
| } |
| |
| } |
| |
| int read_bitstream(unsigned char *buf, int size) |
| { |
| int i; |
| |
| #ifdef AVSP_LONG_CABAC |
| |
| unsigned int *TMP_BUF_32 = (unsigned int *)bitstream_read_tmp; |
| |
| if (tmp_buf_count < size) { |
| dma_sync_single_for_cpu(amports_get_dma_device(), |
| bitstream_read_tmp_phy, SVA_STREAM_BUF_SIZE, |
| DMA_FROM_DEVICE); |
| |
| move_bitstream(bitstream_read_ptr, bitstream_read_tmp_phy, |
| SVA_STREAM_BUF_SIZE); |
| |
| for (i = 0; i < SVA_STREAM_BUF_SIZE / 8; i++) { |
| TMP_BUF[tmp_buf_wr_ptr++] = |
| (TMP_BUF_32[2 * i + 1] >> 24) & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = |
| (TMP_BUF_32[2 * i + 1] >> 16) & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = (TMP_BUF_32[2 * i + 1] >> 8) |
| & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = (TMP_BUF_32[2 * i + 1] >> 0) |
| & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = |
| (TMP_BUF_32[2 * i + 0] >> 24) & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = |
| (TMP_BUF_32[2 * i + 0] >> 16) & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = (TMP_BUF_32[2 * i + 0] >> 8) |
| & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| TMP_BUF[tmp_buf_wr_ptr++] = (TMP_BUF_32[2 * i + 0] >> 0) |
| & 0xff; |
| if (tmp_buf_wr_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_wr_ptr = 0; |
| } |
| tmp_buf_count = tmp_buf_count + SVA_STREAM_BUF_SIZE; |
| bitstream_read_ptr = bitstream_read_ptr + SVA_STREAM_BUF_SIZE; |
| } |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & STREAM_INFO_DUMP) |
| io_printf(" Read %d bytes from %d, size left : %d\n", |
| size, tmp_buf_rd_ptr, tmp_buf_count); |
| #endif |
| for (i = 0; i < size; i++) { |
| buf[i] = TMP_BUF[tmp_buf_rd_ptr++]; |
| if (tmp_buf_rd_ptr >= (2 * SVA_STREAM_BUF_SIZE)) |
| tmp_buf_rd_ptr = 0; |
| } |
| tmp_buf_count = tmp_buf_count - size; |
| |
| #else |
| for (i = 0; i < size; i++) |
| buf[i] = tmp_stream[bitstream_read_ptr + i]; |
| bitstream_read_ptr = bitstream_read_ptr + size; |
| #endif |
| |
| return size; |
| } |
| |
| int next_startcode(struct inputstream_s *p) |
| { |
| int i, m; |
| unsigned char a = 0, b = 0; |
| |
| m = 0; |
| |
| while (1) { |
| if (p->ibyte_position >= p->ibuf_bytesnum - 2) { |
| m = p->ibuf_bytesnum - p->ibyte_position; |
| if (m < 0) |
| return -2; |
| if (m == 1) |
| b = p->buf[p->ibyte_position + 1]; |
| if (m == 2) { |
| b = p->buf[p->ibyte_position + 1]; |
| a = p->buf[p->ibyte_position]; |
| } |
| p->ibuf_bytesnum = read_bitstream(p->buf, |
| SVA_STREAM_BUF_SIZE); |
| p->ibyte_position = 0; |
| bitstream_buf_used++; |
| } |
| |
| if (p->ibuf_bytesnum + m < 3) |
| return -1; |
| |
| if (m == 1 && b == 0 && p->buf[0] == 0 && p->buf[1] == 1) { |
| p->ibyte_position = 2; |
| p->iclear_bitsnum = 0; |
| p->istuff_bitsnum = 0; |
| p->ibits_count += 24; |
| p->upre_3bytes = 1; |
| return 0; |
| } |
| |
| if (m == 2 && b == 0 && a == 0 && p->buf[0] == 1) { |
| p->ibyte_position = 1; |
| p->iclear_bitsnum = 0; |
| p->istuff_bitsnum = 0; |
| p->ibits_count += 24; |
| p->upre_3bytes = 1; |
| return 0; |
| } |
| |
| if (m == 2 && b == 0 && p->buf[0] == 0 && p->buf[1] == 1) { |
| p->ibyte_position = 2; |
| p->iclear_bitsnum = 0; |
| p->istuff_bitsnum = 0; |
| p->ibits_count += 24; |
| p->upre_3bytes = 1; |
| return 0; |
| } |
| |
| for (i = p->ibyte_position; i < p->ibuf_bytesnum - 2; i++) { |
| if (p->buf[i] == 0 && p->buf[i + 1] == 0 |
| && p->buf[i + 2] == 1) { |
| p->ibyte_position = i + 3; |
| p->iclear_bitsnum = 0; |
| p->istuff_bitsnum = 0; |
| p->ibits_count += 24; |
| p->upre_3bytes = 1; |
| return 0; |
| } |
| p->ibits_count += 8; |
| } |
| p->ibyte_position = i; |
| } |
| } |
| |
| int get_oneunit(char *buf, int *startcodepos, int *length) |
| { |
| int i, j, k; |
| |
| i = next_startcode(p_irabs); |
| |
| if (i != 0) { |
| if (i == -1) |
| io_printf( |
| "\narrive at stream end and start code is not found!"); |
| if (i == -2) |
| io_printf("\np->ibyte_position error!"); |
| |
| } |
| startcode_offset = |
| p_irabs->ibyte_position |
| - 3 + (bitstream_buf_used-1) |
| * SVA_STREAM_BUF_SIZE; |
| buf[0] = 0; |
| buf[1] = 0; |
| buf[2] = 1; |
| *startcodepos = 3; |
| i = read_n_bit(p_irabs, 8, &j); |
| buf[3] = (char)j; |
| |
| check_type(buf[3]); |
| if (buf[3] == SEQUENCE_END_CODE) { |
| *length = 4; |
| return -1; |
| } |
| k = 4; |
| while (1) { |
| i = read_n_bit(p_irabs, 8, &j); |
| if (i < 0) |
| break; |
| buf[k++] = (char)j; |
| if (k >= (MAX_CODED_FRAME_SIZE - 1)) |
| break; |
| } |
| if (p_irabs->iclear_bitsnum > 0) { |
| int shift; |
| |
| shift = 8 - p_irabs->iclear_bitsnum; |
| i = read_n_bit(p_irabs, p_irabs->iclear_bitsnum, &j); |
| |
| if (j != 0) |
| buf[k++] = (char)(j << shift); |
| stat_bits_ptr->last_unit_bits += shift; |
| } |
| *length = k; |
| return k; |
| } |
| |
| /*unsigned char tmp_buf[MAX_CODED_FRAME_SIZE] __attribute__ ((aligned(64)));*/ |
| /*unsigned char tmp_buf[MAX_CODED_FRAME_SIZE] __aligned(64);*/ |
| int header(void) |
| { |
| unsigned char *buf; |
| int startcodepos, length; |
| |
| unsigned char *tmp_buf; |
| |
| tmp_buf = (unsigned char *)avsp_heap_adr; |
| |
| buf = &tmp_buf[0]; |
| while (1) { |
| start_codeposition = get_oneunit(buf, &startcodepos, &length); |
| |
| switch (buf[startcodepos]) { |
| case SEQUENCE_HEADER_CODE: |
| io_printf( |
| "# SEQUENCE_HEADER_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| case EXTENSION_START_CODE: |
| io_printf( |
| "# EXTENSION_START_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| case USER_DATA_START_CODE: |
| io_printf( |
| "# USER_DATA_START_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| case VIDEO_EDIT_CODE: |
| io_printf( |
| "# VIDEO_EDIT_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| case I_PICTURE_START_CODE: |
| io_printf( |
| "# I_PICTURE_START_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| case PB_PICTURE_START_CODE: |
| io_printf( |
| "# PB_PICTURE_START_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| case SEQUENCE_END_CODE: |
| io_printf( |
| "# SEQUENCE_END_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| break; |
| default: |
| io_printf( |
| "# SLICE_START_CODE (0x%02x) found at offset %d (0x%x)\n", |
| buf[startcodepos], startcode_offset, |
| startcode_offset); |
| #if 0 |
| io_printf("VLD_MEM_VIFIFO_START_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_START_PTR)); |
| io_printf("VLD_MEM_VIFIFO_CURR_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_CURR_PTR)); |
| io_printf("VLD_MEM_VIFIFO_END_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_END_PTR)); |
| io_printf("VLD_MEM_VIFIFO_WP %x\r\n" |
| READ_VREG(VLD_MEM_VIFIFO_WP)); |
| io_printf("VLD_MEM_VIFIFO_RP %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_RP)); |
| io_printf("VLD_MEM_VBUF_RD_PTR %x\r\n" |
| READ_VREG(VLD_MEM_VBUF_RD_PTR)); |
| io_printf("VLD_MEM_VIFIFO_BUF_CNTL %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_BUF_CNTL)); |
| io_printf("PARSER_VIDEO_HOLE %x\r\n", |
| READ_MPEG_REG(PARSER_VIDEO_HOLE)); |
| #endif |
| if ((buf[startcodepos] >= SLICE_START_CODE_MIN |
| && buf[startcodepos] |
| <= SLICE_START_CODE_MAX) |
| && ((!img->seq_header_indicate) |
| || (img->type == B_IMG |
| && img->b_discard_flag |
| == 1 |
| && !img->no_forward_reference))) { |
| break; |
| } else if (buf[startcodepos] >= SLICE_START_CODE_MIN) { |
| |
| first_slice_length = length; |
| first_slice_startpos = startcodepos; |
| |
| temp_slice_buf = &tmp_buf[0]; |
| return SOP; |
| } else { |
| io_printf("Can't find start code"); |
| return -EOS; |
| } |
| } |
| } |
| |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:Allocates a Bitstream |
| * Input: |
| * Output:allocated Bitstream point |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| struct bitstream_s *alloc_bitstream(void) |
| { |
| struct bitstream_s *bitstream; |
| |
| bitstream = (struct bitstream_s *)local_alloc(1, |
| sizeof(struct bitstream_s)); |
| if (bitstream == NULL) { |
| io_printf( |
| "AllocBitstream: Memory allocation for Bitstream failed"); |
| return NULL; |
| } |
| bitstream->stream_buffer = (unsigned char *)local_alloc( |
| MAX_CODED_FRAME_SIZE, |
| sizeof(unsigned char)); |
| if (bitstream->stream_buffer == NULL) { |
| io_printf( |
| "AllocBitstream: Memory allocation for streamBuffer failed"); |
| return NULL; |
| } |
| |
| return bitstream; |
| } |
| |
| void biari_init_context_logac(struct bi_context_type_s *ctx) |
| { |
| ctx->LG_PMPS = (QUARTER << LG_PMPS_SHIFTNO) - 1; |
| ctx->MPS = 0; |
| ctx->cycno = 0; |
| } |
| |
| #define BIARI_CTX_INIT1_LOG(jj, ctx)\ |
| {\ |
| for (j = 0; j < jj; j++)\ |
| biari_init_context_logac(&(ctx[j]));\ |
| } |
| |
| #define BIARI_CTX_INIT2_LOG(ii, jj, ctx)\ |
| {\ |
| for (i = 0; i < ii; i++)\ |
| for (j = 0; j < jj; j++)\ |
| biari_init_context_logac(&(ctx[i][j]));\ |
| } |
| |
| #define BIARI_CTX_INIT3_LOG(ii, jj, kk, ctx)\ |
| {\ |
| for (i = 0; i < ii; i++)\ |
| for (j = 0; j < jj; j++)\ |
| for (k = 0; k < kk; k++)\ |
| biari_init_context_logac(&(ctx[i][j][k]));\ |
| } |
| |
| #define BIARI_CTX_INIT4_LOG(ii, jj, kk, ll, ctx)\ |
| {\ |
| for (i = 0; i < ii; i++)\ |
| for (j = 0; j < jj; j++)\ |
| for (k = 0; k < kk; k++)\ |
| for (l = 0; l < ll; l++)\ |
| biari_init_context_logac\ |
| (&(ctx[i][j][k][l]));\ |
| } |
| |
| void init_contexts(struct img_par *img) |
| { |
| struct motion_info_contexts_s *mc = img->current_slice->mot_ctx; |
| struct texture_info_contexts *tc = img->current_slice->tex_ctx; |
| int i, j; |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & SLICE_INFO_DUMP) |
| io_printf(" ---- init_contexts ----\n"); |
| #endif |
| |
| BIARI_CTX_INIT2_LOG(3, NUM_MB_TYPE_CTX, mc->mb_type_contexts); |
| BIARI_CTX_INIT2_LOG(2, NUM_B8_TYPE_CTX, mc->b8_type_contexts); |
| BIARI_CTX_INIT2_LOG(2, NUM_MV_RES_CTX, mc->mv_res_contexts); |
| BIARI_CTX_INIT2_LOG(2, NUM_REF_NO_CTX, mc->ref_no_contexts); |
| BIARI_CTX_INIT1_LOG(NUM_DELTA_QP_CTX, mc->delta_qp_contexts); |
| BIARI_CTX_INIT1_LOG(NUM_MB_AFF_CTX, mc->mb_aff_contexts); |
| |
| BIARI_CTX_INIT1_LOG(NUM_IPR_CTX, tc->ipr_contexts); |
| BIARI_CTX_INIT1_LOG(NUM_CIPR_CTX, tc->cipr_contexts); |
| BIARI_CTX_INIT2_LOG(3, NUM_CBP_CTX, tc->cbp_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_BCBP_CTX, tc->bcbp_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_ONE_CTX, tc->one_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_ABS_CTX, tc->abs_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_MAP_CTX, tc->fld_map_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_LAST_CTX, |
| tc->fld_last_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_MAP_CTX, tc->map_contexts); |
| BIARI_CTX_INIT2_LOG(NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts); |
| #ifdef TEST_WEIGHTING_AEC |
| biari_init_context_logac(&mc->mb_weighting_pred); |
| #endif |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * Allocation of contexts models for the motion info |
| * used for arithmetic decoding |
| * |
| ************************************************************************ |
| */ |
| struct motion_info_contexts_s *create_contexts_motioninfo(void) |
| { |
| struct motion_info_contexts_s *deco_ctx; |
| |
| deco_ctx = (struct motion_info_contexts_s *)local_alloc(1, |
| sizeof(struct motion_info_contexts_s)); |
| if (deco_ctx == NULL) |
| no_mem_exit("create_contexts_motioninfo: deco_ctx"); |
| |
| return deco_ctx; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * Allocates of contexts models for the texture info |
| * used for arithmetic decoding |
| ************************************************************************ |
| */ |
| struct texture_info_contexts *create_contexts_textureinfo(void) |
| { |
| struct texture_info_contexts *deco_ctx; |
| |
| deco_ctx = (struct texture_info_contexts *)local_alloc(1, |
| sizeof(struct texture_info_contexts)); |
| if (deco_ctx == NULL) |
| no_mem_exit("create_contexts_textureinfo: deco_ctx"); |
| |
| return deco_ctx; |
| } |
| |
| struct datapartition *alloc_partition(int n) |
| { |
| struct datapartition *part_arr, *datapart; |
| int i; |
| |
| part_arr = |
| (struct datapartition *)local_alloc(n, sizeof(struct datapartition)); |
| if (part_arr == NULL) { |
| no_mem_exit( |
| "alloc_partition: Memory allocation for Data Partition failed"); |
| return NULL; |
| } |
| |
| #if LIWR_FIX |
| part_arr[0].bitstream = NULL; |
| #else |
| for (i = 0; i < n; i++) { |
| datapart = &(part_arr[i]); |
| datapart->bitstream = (struct bitstream_s *)local_alloc(1, |
| sizeof(struct bitstream_s)); |
| if (datapart->bitstream == NULL) { |
| no_mem_exit( |
| "alloc_partition: Memory allocation for Bitstream failed"); |
| return NULL; |
| } |
| } |
| #endif |
| return part_arr; |
| } |
| |
| int malloc_slice(struct img_par *img) |
| { |
| struct slice_s *currslice; |
| |
| img->current_slice = |
| (struct slice_s *)local_alloc(1, sizeof(struct slice_s)); |
| currslice = img->current_slice; |
| if (currslice == NULL) { |
| no_mem_exit( |
| "Memory allocation for struct slice_s datastruct Failed" |
| ); |
| return 0; |
| } |
| if (1) { |
| |
| currslice->mot_ctx = create_contexts_motioninfo(); |
| if (currslice->mot_ctx == NULL) |
| return 0; |
| |
| currslice->tex_ctx = create_contexts_textureinfo(); |
| if (currslice->tex_ctx == NULL) |
| return 0; |
| } |
| #if LIWR_FIX |
| currslice->max_part_nr = 1; |
| #else |
| currslice->max_part_nr = 3; |
| #endif |
| currslice->part_arr = alloc_partition(currslice->max_part_nr); |
| if (currslice->part_arr == NULL) |
| return 0; |
| return 1; |
| } |
| |
| void init(struct img_par *img) |
| { |
| int i; |
| |
| for (i = 0; i < 256; i++) |
| img->quad[i] = i * i; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:Allocate 2D memory array -> int array2D[rows][columns] |
| * Input: |
| * Output: memory size in bytes |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| int get_mem2Dint(int ***array2D, int rows, int columns) |
| { |
| int i; |
| |
| *array2D = (int **)local_alloc(rows, sizeof(int *)); |
| if (*array2D == NULL) { |
| no_mem_exit("get_mem2Dint: array2D"); |
| return -1; |
| } |
| (*array2D)[0] = (int *)local_alloc(rows * columns, sizeof(int)); |
| if ((*array2D)[0] == NULL) { |
| no_mem_exit("get_mem2Dint: array2D"); |
| return -1; |
| } |
| |
| for (i = 1; i < rows; i++) |
| (*array2D)[i] = (*array2D)[i - 1] + columns; |
| |
| return rows * columns * sizeof(int); |
| } |
| |
| int initial_decode(void) |
| { |
| int i, j; |
| int ret; |
| int img_height = (vertical_size + img->auto_crop_bottom); |
| int memory_size = 0; |
| |
| ret = malloc_slice(img); |
| if (ret == 0) |
| return 0; |
| |
| mb_data = (struct macroblock *)local_alloc( |
| (img->width / MB_BLOCK_SIZE) |
| * (img_height /*vertical_size*/ |
| / MB_BLOCK_SIZE), sizeof(struct macroblock)); |
| if (mb_data == NULL) { |
| no_mem_exit("init_global_buffers: mb_data"); |
| return 0; |
| } |
| |
| if (progressive_sequence) { |
| int size; |
| size = get_mem2Dint(&(img->ipredmode), |
| img->width / B8_SIZE * 2 + 4, |
| vertical_size / B8_SIZE * 2 + 4); |
| if (size == -1) |
| return 0; |
| |
| memory_size += size; |
| } else { |
| int size; |
| size = get_mem2Dint(&(img->ipredmode), |
| img->width / B8_SIZE * 2 + 4, |
| (vertical_size + 32) / (2 * B8_SIZE) * 4 + 4); |
| if (size == -1) |
| return 0; |
| |
| memory_size += size; |
| } |
| |
| for (i = 0; i < img->width / (B8_SIZE) * 2 + 4; i++) { |
| for (j = 0; j < img->height / (B8_SIZE) * 2 + 4; j++) |
| img->ipredmode[i][j] = -1; |
| } |
| |
| init(img); |
| img->number = 0; |
| img->type = I_IMG; |
| img->imgtr_last_p = 0; |
| img->imgtr_next_p = 0; |
| |
| img->new_seq_header_flag = 1; |
| img->new_sequence_flag = 1; |
| |
| return 1; |
| } |
| |
| void aec_new_slice(void) |
| { |
| last_dquant = 0; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * Initializes the DecodingEnvironment for the arithmetic coder |
| ************************************************************************ |
| */ |
| |
| void arideco_start_decoding(struct decoding_environment_s *dep, |
| unsigned char *cpixcode, |
| int firstbyte, int *cpixcode_len, int slice_type) |
| { |
| |
| dcodestrm = cpixcode; |
| dcodestrm_len = cpixcode_len; |
| *dcodestrm_len = firstbyte; |
| |
| s1 = 0; |
| t1 = QUARTER - 1; |
| value_s = 0; |
| |
| value_t = 0; |
| |
| { |
| int i; |
| |
| dbits_to_go = 0; |
| for (i = 0; i < B_BITS - 1; i++) { |
| if (--dbits_to_go < 0) |
| get_byte(); |
| |
| value_t = (value_t << 1) |
| | ((dbuffer >> dbits_to_go) & 0x01); |
| } |
| } |
| |
| while (value_t < QUARTER) { |
| if (--dbits_to_go < 0) |
| get_byte(); |
| |
| value_t = (value_t << 1) | ((dbuffer >> dbits_to_go) & 0x01); |
| value_s++; |
| } |
| value_t = value_t & 0xff; |
| |
| dec_final = dec_bypass = 0; |
| |
| |
| |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:Checks the availability of neighboring macroblocks of |
| the current macroblock for prediction and context determination; |
| marks the unavailable MBs for intra prediction in the |
| ipredmode-array by -1. Only neighboring MBs in the causal |
| past of the current MB are checked. |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void checkavailabilityofneighbors(struct img_par *img) |
| { |
| int i, j; |
| const int mb_width = img->width / MB_BLOCK_SIZE; |
| const int mb_nr = img->current_mb_nr; |
| struct macroblock *curr_mb = &mb_data[mb_nr]; |
| int check_value; |
| int remove_prediction; |
| |
| curr_mb->mb_available_up = NULL; |
| curr_mb->mb_available_left = NULL; |
| |
| for (i = 0; i < 3; i++) |
| for (j = 0; j < 3; j++) |
| mb_data[mb_nr].mb_available[i][j] = NULL; |
| |
| mb_data[mb_nr].mb_available[1][1] = curr_mb; |
| |
| if (img->pix_x >= MB_BLOCK_SIZE) { |
| remove_prediction = curr_mb->slice_nr |
| != mb_data[mb_nr - 1].slice_nr; |
| |
| if (remove_prediction) |
| |
| { |
| |
| img->ipredmode[(img->block_x + 1) * 2 - 1][(img->block_y |
| + 1) * 2] = -1; |
| img->ipredmode[(img->block_x + 1) * 2 - 1][(img->block_y |
| + 1) * 2 + 1] = -1; |
| img->ipredmode[(img->block_x + 1) * 2 - 1][(img->block_y |
| + 2) * 2] = -1; |
| img->ipredmode[(img->block_x + 1) * 2 - 1][(img->block_y |
| + 2) * 2 + 1] = -1; |
| } |
| if (!remove_prediction) |
| curr_mb->mb_available[1][0] = &(mb_data[mb_nr - 1]); |
| |
| } |
| |
| check_value = (img->pix_y >= MB_BLOCK_SIZE); |
| if (check_value) { |
| remove_prediction = curr_mb->slice_nr |
| != mb_data[mb_nr - mb_width].slice_nr; |
| |
| if (remove_prediction) { |
| img->ipredmode |
| [(img->block_x + 1) * 2][(img->block_y + 1) |
| * 2 - 1] = -1; |
| img->ipredmode[(img->block_x + 1) * 2 + 1][(img->block_y |
| + 1) * 2 - 1] = -1; |
| img->ipredmode[(img->block_x + 1) * 2 + 2][(img->block_y |
| + 1) * 2 - 1] = -1; |
| img->ipredmode[(img->block_x + 1) * 2 + 3][(img->block_y |
| + 1) * 2 - 1] = -1; |
| } |
| |
| if (!remove_prediction) { |
| curr_mb->mb_available[0][1] = |
| &(mb_data[mb_nr - mb_width]); |
| } |
| } |
| |
| if (img->pix_y >= MB_BLOCK_SIZE && img->pix_x >= MB_BLOCK_SIZE) { |
| remove_prediction = curr_mb->slice_nr |
| != mb_data[mb_nr - mb_width - 1].slice_nr; |
| |
| if (remove_prediction) { |
| img->ipredmode[img->block_x * 2 + 1][img->block_y * 2 |
| + 1] = -1; |
| } |
| if (!remove_prediction) { |
| curr_mb->mb_available[0][0] = &(mb_data[mb_nr - mb_width |
| - 1]); |
| } |
| } |
| |
| if (img->pix_y >= MB_BLOCK_SIZE |
| && img->pix_x < (img->width - MB_BLOCK_SIZE)) { |
| if (curr_mb->slice_nr == mb_data[mb_nr - mb_width + 1].slice_nr) |
| curr_mb->mb_available[0][2] = &(mb_data[mb_nr - mb_width |
| + 1]); |
| } |
| |
| if (1) { |
| curr_mb->mbaddr_a = mb_nr - 1; |
| curr_mb->mbaddr_b = mb_nr - img->pic_width_inmbs; |
| curr_mb->mbaddr_c = mb_nr - img->pic_width_inmbs + 1; |
| curr_mb->mbaddr_d = mb_nr - img->pic_width_inmbs - 1; |
| |
| curr_mb->mbavail_a = |
| (curr_mb->mb_available[1][0] != NULL) ? 1 : 0; |
| curr_mb->mbavail_b = |
| (curr_mb->mb_available[0][1] != NULL) ? 1 : 0; |
| curr_mb->mbavail_c = |
| (curr_mb->mb_available[0][2] != NULL) ? 1 : 0; |
| curr_mb->mbavail_d = |
| (curr_mb->mb_available[0][0] != NULL) ? 1 : 0; |
| |
| } |
| |
| } |
| |
| void checkavailabilityofneighborsaec(void) |
| { |
| |
| int i, j; |
| const int mb_width = img->width / MB_BLOCK_SIZE; |
| const int mb_nr = img->current_mb_nr; |
| struct macroblock *curr_mb = &(mb_data[mb_nr]); |
| int check_value; |
| |
| for (i = 0; i < 3; i++) |
| for (j = 0; j < 3; j++) |
| mb_data[mb_nr].mb_available[i][j] = NULL; |
| mb_data[mb_nr].mb_available[1][1] = &(mb_data[mb_nr]); |
| |
| if (img->pix_x >= MB_BLOCK_SIZE) { |
| int remove_prediction = curr_mb->slice_nr |
| != mb_data[mb_nr - 1].slice_nr; |
| if (!remove_prediction) |
| curr_mb->mb_available[1][0] = &(mb_data[mb_nr - 1]); |
| } |
| |
| check_value = (img->pix_y >= MB_BLOCK_SIZE); |
| if (check_value) { |
| int remove_prediction = curr_mb->slice_nr |
| != mb_data[mb_nr - mb_width].slice_nr; |
| |
| if (!remove_prediction) { |
| curr_mb->mb_available[0][1] = |
| &(mb_data[mb_nr - mb_width]); |
| } |
| } |
| |
| if (img->pix_y >= MB_BLOCK_SIZE && img->pix_x >= MB_BLOCK_SIZE) { |
| int remove_prediction = curr_mb->slice_nr |
| != mb_data[mb_nr - mb_width - 1].slice_nr; |
| if (!remove_prediction) { |
| curr_mb->mb_available[0][0] = &(mb_data[mb_nr - mb_width |
| - 1]); |
| } |
| } |
| |
| if (img->pix_y >= MB_BLOCK_SIZE |
| && img->pix_x < (img->width - MB_BLOCK_SIZE)) { |
| if (curr_mb->slice_nr == mb_data[mb_nr - mb_width + 1].slice_nr) |
| curr_mb->mb_available[0][2] = &(mb_data[mb_nr - mb_width |
| + 1]); |
| } |
| curr_mb->mb_available_left = curr_mb->mb_available[1][0]; |
| curr_mb->mb_available_up = curr_mb->mb_available[0][1]; |
| curr_mb->mbaddr_a = mb_nr - 1; |
| curr_mb->mbaddr_b = mb_nr - img->pic_width_inmbs; |
| curr_mb->mbaddr_c = mb_nr - img->pic_width_inmbs + 1; |
| curr_mb->mbaddr_d = mb_nr - img->pic_width_inmbs - 1; |
| |
| curr_mb->mbavail_a = (curr_mb->mb_available[1][0] != NULL) ? 1 : 0; |
| curr_mb->mbavail_b = (curr_mb->mb_available[0][1] != NULL) ? 1 : 0; |
| curr_mb->mbavail_c = (curr_mb->mb_available[0][2] != NULL) ? 1 : 0; |
| curr_mb->mbavail_d = (curr_mb->mb_available[0][0] != NULL) ? 1 : 0; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:initializes the current macroblock |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void start_macroblock(struct img_par *img) |
| { |
| int i, j, k, l; |
| struct macroblock *curr_mb; |
| |
| #ifdef AVSP_LONG_CABAC |
| #else |
| |
| #endif |
| |
| curr_mb = &mb_data[img->current_mb_nr]; |
| |
| /* Update coordinates of the current macroblock */ |
| img->mb_x = (img->current_mb_nr) % (img->width / MB_BLOCK_SIZE); |
| img->mb_y = (img->current_mb_nr) / (img->width / MB_BLOCK_SIZE); |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & MB_NUM_DUMP) |
| io_printf(" #Begin MB : %d, (%x, %x) es_ptr %d\n", |
| img->current_mb_nr, img->mb_x, img->mb_y, es_ptr); |
| #endif |
| |
| |
| total_mb_count = total_mb_count + 1; |
| |
| /* Define vertical positions */ |
| img->block_y = img->mb_y * BLOCK_SIZE / 2; /* luma block position */ |
| img->block8_y = img->mb_y * BLOCK_SIZE / 2; |
| img->pix_y = img->mb_y * MB_BLOCK_SIZE; /* luma macroblock position */ |
| if (chroma_format == 2) |
| img->pix_c_y = img->mb_y * |
| MB_BLOCK_SIZE; /* chroma macroblock position */ |
| else |
| img->pix_c_y = img->mb_y * |
| MB_BLOCK_SIZE / 2; /* chroma macroblock position */ |
| |
| /* Define horizontal positions */ |
| img->block_x = img->mb_x * BLOCK_SIZE / 2; /* luma block position */ |
| img->block8_x = img->mb_x * BLOCK_SIZE / 2; |
| img->pix_x = img->mb_x * MB_BLOCK_SIZE; /* luma pixel position */ |
| img->pix_c_x = img->mb_x * |
| MB_BLOCK_SIZE / 2; /* chroma pixel position */ |
| |
| checkavailabilityofneighbors(img); |
| |
| /*<!*******EDIT START BY lzhang ******************/ |
| |
| if (1) |
| checkavailabilityofneighborsaec(); |
| /*<!*******EDIT end BY lzhang ******************/ |
| |
| curr_mb->qp = img->qp; |
| curr_mb->mb_type = 0; |
| curr_mb->delta_quant = 0; |
| curr_mb->cbp = 0; |
| curr_mb->cbp_blk = 0; |
| curr_mb->c_ipred_mode = DC_PRED_8; |
| curr_mb->c_ipred_mode_2 = DC_PRED_8; |
| |
| for (l = 0; l < 2; l++) |
| for (j = 0; j < BLOCK_MULTIPLE; j++) |
| for (i = 0; i < BLOCK_MULTIPLE; i++) |
| for (k = 0; k < 2; k++) |
| curr_mb->mvd[l][j][i][k] = 0; |
| |
| curr_mb->cbp_bits = 0; |
| |
| for (j = 0; j < MB_BLOCK_SIZE; j++) |
| for (i = 0; i < MB_BLOCK_SIZE; i++) |
| img->m7[i][j] = 0; |
| |
| for (j = 0; j < 2 * BLOCK_SIZE; j++) |
| for (i = 0; i < 2 * BLOCK_SIZE; i++) { |
| img->m8[0][i][j] = 0; |
| img->m8[1][i][j] = 0; |
| img->m8[2][i][j] = 0; |
| img->m8[3][i][j] = 0; |
| } |
| |
| curr_mb->lf_disable = 1; |
| |
| img->weighting_prediction = 0; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:init macroblock I and P frames |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void init_macroblock(struct img_par *img) |
| { |
| int i, j; |
| |
| |
| for (i = 0; i < 4; i++) { |
| for (j = 0; j < 4; j++) { |
| img->ipredmode[img->block_x * 2 + i + 2][img->block_y |
| * 2 + j + 2] = -1; |
| } |
| } |
| |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:Interpret the mb mode for I-Frames |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void interpret_mb_mode_i(struct img_par *img) |
| { |
| int i; |
| |
| struct macroblock *curr_mb = &mb_data[img->current_mb_nr]; |
| int num = 4; |
| |
| curr_mb->mb_type = I8MB; |
| |
| |
| current_mb_intra = 1; |
| |
| for (i = 0; i < 4; i++) { |
| curr_mb->b8mode[i] = IBLOCK; |
| curr_mb->b8pdir[i] = -1; |
| } |
| |
| for (i = num; i < 4; i++) { |
| curr_mb->b8mode[i] = |
| curr_mb->mb_type_2 == P8x8 ? |
| 4 : curr_mb->mb_type_2; |
| curr_mb->b8pdir[i] = 0; |
| } |
| } |
| |
| const int pred_4x4[9][9] = {{0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, |
| 1, 1}, {0, 1, 2, 3, 4, 5, 6, 7, 8}, {0, 0, 0, 3, 3, 3, 3, 3, 3}, |
| {0, 1, 4, 4, 4, 4, 4, 4, 4}, {0, 1, 5, 5, 5, 5, 5, 5, 5}, {0, 0, |
| 0, 0, 0, 0, 6, 0, 0}, |
| {0, 1, 7, 7, 7, 7, 7, 7, 7}, {0, 0, 0, 0, 4, 5, 6, 7, 8} |
| |
| }; |
| |
| const int pred_4x4to8x8[9] = {0, 1, 2, 3, 4, 1, 0, 1, 0 |
| |
| }; |
| |
| const int pred_8x8to4x4[5] = {0, 1, 2, 3, 4}; |
| |
| void read_ipred_block_modes(struct img_par *img, int b8) |
| { |
| int bi, bj, dec; |
| struct syntaxelement curr_se; |
| struct macroblock *curr_mb; |
| int j2; |
| int mostprobableintrapredmode; |
| int upintrapredmode; |
| int uprightintrapredmode; |
| int leftintrapredmode; |
| int leftdownintrapredmode; |
| int intrachromapredmodeflag; |
| |
| struct slice_s *currslice = img->current_slice; |
| struct datapartition *dp; |
| |
| curr_mb = mb_data + img->current_mb_nr; |
| intrachromapredmodeflag = IS_INTRA(curr_mb); |
| |
| curr_se.type = SE_INTRAPREDMODE; |
| #if TRACE |
| strncpy(curr_se.tracestring, "Ipred Mode", TRACESTRING_SIZE); |
| #endif |
| |
| if (b8 < 4) { |
| if (curr_mb->b8mode[b8] == IBLOCK) { |
| intrachromapredmodeflag = 1; |
| |
| if (1) { |
| dp = &(currslice->part_arr[0]); |
| curr_se.reading = read_intrapredmode_aec; |
| dp->read_syntax_element(&curr_se, img, dp); |
| |
| if (curr_se.value1 == -1) |
| push_es(1, 1); |
| else |
| push_es(curr_se.value1, 3); |
| |
| |
| } |
| bi = img->block_x + (b8 & 1); |
| bj = img->block_y + (b8 / 2); |
| |
| upintrapredmode = img->ipredmode[(bi + 1) * 2][(bj) * 2 |
| + 1]; |
| uprightintrapredmode = |
| img->ipredmode[(bi + 1) * 2 + 1][(bj) |
| * 2 + 1]; |
| leftintrapredmode = |
| img->ipredmode[(bi) * 2 + 1][(bj + 1) |
| * 2]; |
| leftdownintrapredmode = img->ipredmode[(bi) * 2 + 1][(bj |
| + 1) * 2 + 1]; |
| |
| if ((upintrapredmode < 0) || (leftintrapredmode < 0)) { |
| mostprobableintrapredmode = DC_PRED; |
| } else if ((upintrapredmode < NO_INTRA_PMODE) |
| && (leftintrapredmode < |
| NO_INTRA_PMODE)) { |
| mostprobableintrapredmode = |
| upintrapredmode |
| < leftintrapredmode ? |
| upintrapredmode : |
| leftintrapredmode; |
| } else if (upintrapredmode < NO_INTRA_PMODE) { |
| mostprobableintrapredmode = upintrapredmode; |
| } else if (leftintrapredmode < NO_INTRA_PMODE) { |
| mostprobableintrapredmode = leftintrapredmode; |
| } else { |
| mostprobableintrapredmode = |
| pred_4x4[leftintrapredmode |
| - INTRA_PMODE_4x4][upintrapredmode |
| - INTRA_PMODE_4x4]; |
| mostprobableintrapredmode = |
| pred_4x4to8x8[mostprobableintrapredmode]; |
| } |
| |
| |
| |
| dec = |
| (curr_se.value1 == -1) ? |
| mostprobableintrapredmode : |
| curr_se.value1 |
| + (curr_se.value1 |
| >= mostprobableintrapredmode); |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & MB_INFO_DUMP) |
| io_printf(" - ipredmode[%d] : %d\n", b8, dec); |
| #endif |
| |
| img->ipredmode[(1 + bi) * 2][(1 + bj) * 2] = dec; |
| img->ipredmode[(1 + bi) * 2 + 1][(1 + bj) * 2] = dec; |
| img->ipredmode[(1 + bi) * 2][(1 + bj) * 2 + 1] = dec; |
| img->ipredmode[(1 + bi) * 2 + 1][(1 + bj) * 2 + 1] = |
| dec; |
| |
| j2 = bj; |
| } |
| } else if (b8 == 4 && curr_mb->b8mode[b8 - 3] == IBLOCK) { |
| |
| curr_se.type = SE_INTRAPREDMODE; |
| #if TRACE |
| strncpy(curr_se.tracestring, |
| "Chroma intra pred mode", TRACESTRING_SIZE); |
| #endif |
| |
| if (1) { |
| dp = &(currslice->part_arr[0]); |
| curr_se.reading = read_cipredmode_aec; |
| dp->read_syntax_element(&curr_se, img, dp); |
| } else |
| |
| { |
| } |
| curr_mb->c_ipred_mode = curr_se.value1; |
| |
| push_es(UE[curr_se.value1][0], UE[curr_se.value1][1]); |
| |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & MB_INFO_DUMP) |
| io_printf(" * UE c_ipred_mode read : %d\n", |
| curr_mb->c_ipred_mode); |
| #endif |
| |
| if (curr_se.value1 < DC_PRED_8 || curr_se.value1 > PLANE_8) { |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & MB_INFO_DUMP) |
| io_printf("%d\n", img->current_mb_nr); |
| #endif |
| pr_info("illegal chroma intra pred mode!\n"); |
| } |
| } |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * This function is used to arithmetically decode the coded |
| * block pattern of a given MB. |
| ************************************************************************ |
| */ |
| void readcp_aec(struct syntaxelement *se, struct img_par *img, |
| struct decoding_environment_s *dep_dp) |
| { |
| struct texture_info_contexts *ctx = img->current_slice->tex_ctx; |
| struct macroblock *curr_mb = &mb_data[img->current_mb_nr]; |
| |
| int mb_x, mb_y; |
| int a, b; |
| int curr_cbp_ctx, curr_cbp_idx; |
| int cbp = 0; |
| int cbp_bit; |
| int mask; |
| |
| for (mb_y = 0; mb_y < 4; mb_y += 2) { |
| for (mb_x = 0; mb_x < 4; mb_x += 2) { |
| if (curr_mb->b8mode[mb_y + (mb_x / 2)] == IBLOCK) |
| curr_cbp_idx = 0; |
| else |
| curr_cbp_idx = 1; |
| |
| if (mb_y == 0) { |
| if (curr_mb->mb_available_up == NULL) |
| b = 0; |
| else { |
| b = ((((curr_mb->mb_available_up)->cbp |
| & (1 << (2 + mb_x / 2))) |
| == 0) ? 1 : 0); |
| } |
| |
| } else |
| b = (((cbp & (1 << (mb_x / 2))) == 0) ? 1 : 0); |
| |
| if (mb_x == 0) { |
| if (curr_mb->mb_available_left == NULL) |
| a = 0; |
| else { |
| a = |
| ((((curr_mb->mb_available_left)->cbp |
| & (1 |
| << (2 |
| * (mb_y |
| / 2) |
| + 1))) |
| == 0) ? |
| 1 : 0); |
| } |
| } else |
| a = (((cbp & (1 << mb_y)) == 0) ? 1 : 0); |
| curr_cbp_ctx = a + 2 * b; |
| mask = (1 << (mb_y + mb_x / 2)); |
| cbp_bit = biari_decode_symbol(dep_dp, |
| ctx->cbp_contexts[0] + curr_cbp_ctx); |
| |
| if (cbp_bit) |
| cbp += mask; |
| } |
| } |
| curr_cbp_ctx = 0; |
| cbp_bit = biari_decode_symbol(dep_dp, |
| ctx->cbp_contexts[1] + curr_cbp_ctx); |
| |
| if (cbp_bit) { |
| curr_cbp_ctx = 1; |
| cbp_bit = biari_decode_symbol(dep_dp, |
| ctx->cbp_contexts[1] + curr_cbp_ctx); |
| if (cbp_bit) { |
| cbp += 48; |
| |
| } else { |
| curr_cbp_ctx = 1; |
| cbp_bit = biari_decode_symbol(dep_dp, |
| ctx->cbp_contexts[1] + curr_cbp_ctx); |
| cbp += (cbp_bit == 1) ? 32 : 16; |
| |
| } |
| } |
| |
| se->value1 = cbp; |
| if (!cbp) |
| last_dquant = 0; |
| |
| |
| |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * This function is used to arithmetically decode the delta qp |
| * of a given MB. |
| ************************************************************************ |
| */ |
| void readdquant_aec(struct syntaxelement *se, struct img_par *img, |
| struct decoding_environment_s *dep_dp) |
| { |
| struct motion_info_contexts_s *ctx = img->current_slice->mot_ctx; |
| |
| int act_ctx; |
| int act_sym; |
| int dquant; |
| |
| |
| act_ctx = ((last_dquant != 0) ? 1 : 0); |
| |
| act_sym = 1 |
| - biari_decode_symbol(dep_dp, |
| ctx->delta_qp_contexts + act_ctx); |
| if (act_sym != 0) { |
| act_ctx = 2; |
| act_sym = unary_bin_decode(dep_dp, |
| ctx->delta_qp_contexts + act_ctx, 1); |
| act_sym++; |
| } |
| act_sym &= 0x3f; |
| push_es(UE[act_sym][0], UE[act_sym][1]); |
| |
| dquant = (act_sym + 1) / 2; |
| if ((act_sym & 0x01) == 0) |
| dquant = -dquant; |
| se->value1 = dquant; |
| |
| last_dquant = dquant; |
| |
| } |
| |
| int csyntax; |
| |
| #define CHECKDELTAQP {\ |
| if (img->qp+curr_mb->delta_quant > 63\ |
| || img->qp+curr_mb->delta_quant < 0) {\ |
| csyntax = 0;\ |
| transcoding_error_flag = 1;\ |
| io_printf("error(0) (%3d|%3d) @ MB%d\n",\ |
| curr_mb->delta_quant,\ |
| img->qp+curr_mb->delta_quant,\ |
| img->picture_structure == 0 \ |
| ? img->current_mb_nr_fld : img->current_mb_nr);\ |
| } } |
| |
| int dct_level[65]; |
| int dct_run[65]; |
| int pair_pos; |
| int dct_pairs = -1; |
| const int t_chr[5] = {0, 1, 2, 4, 3000}; |
| |
| void readrunlevel_aec_ref(struct syntaxelement *se, struct img_par *img, |
| struct decoding_environment_s *dep_dp) |
| { |
| int pairs, rank, pos; |
| int run, level, abslevel, symbol; |
| int sign; |
| |
| if (dct_pairs < 0) { |
| struct bi_context_type_s (*primary)[NUM_MAP_CTX]; |
| struct bi_context_type_s *pctx; |
| struct bi_context_type_s *pCTX2; |
| int ctx, ctx2, offset; |
| |
| if (se->context == LUMA_8x8) { |
| if (img->picture_structure == 0) { |
| primary = |
| img->current_slice->tex_ctx->fld_map_contexts; |
| } else { |
| primary = |
| img->current_slice->tex_ctx->map_contexts; |
| } |
| } else { |
| if (img->picture_structure == 0) { |
| primary = |
| img->current_slice->tex_ctx->fld_last_contexts; |
| } else { |
| primary = |
| img->current_slice->tex_ctx->last_contexts; |
| } |
| } |
| |
| rank = 0; |
| pos = 0; |
| for (pairs = 0; pairs < 65; pairs++) { |
| #ifdef DECODING_SANITY_CHECK |
| /*max index is NUM_BLOCK_TYPES - 1*/ |
| pctx = primary[rank & 0x7]; |
| #else |
| pctx = primary[rank]; |
| #endif |
| if (rank > 0) { |
| #ifdef DECODING_SANITY_CHECK |
| /*max index is NUM_BLOCK_TYPES - 1*/ |
| pCTX2 = primary[(5 + (pos >> 5)) & 0x7]; |
| #else |
| pCTX2 = primary[5 + (pos >> 5)]; |
| #endif |
| ctx2 = (pos >> 1) & 0x0f; |
| ctx = 0; |
| |
| |
| if (biari_decode_symbolw(dep_dp, pctx + ctx, |
| pCTX2 + ctx2)) { |
| break; |
| } |
| } |
| |
| ctx = 1; |
| symbol = 0; |
| while (biari_decode_symbol(dep_dp, pctx + ctx) == 0) { |
| symbol += 1; |
| ctx++; |
| if (ctx >= 2) |
| ctx = 2; |
| } |
| abslevel = symbol + 1; |
| |
| if (biari_decode_symbol_eq_prob(dep_dp)) { |
| level = -abslevel; |
| sign = 1; |
| } else { |
| level = abslevel; |
| sign = 0; |
| } |
| #if TRACE |
| tracebits2("level", 1, level); |
| #endif |
| |
| if (abslevel == 1) |
| offset = 4; |
| else |
| offset = 6; |
| symbol = 0; |
| ctx = 0; |
| while (biari_decode_symbol(dep_dp, pctx + ctx + offset) |
| == 0) { |
| symbol += 1; |
| ctx++; |
| if (ctx >= 1) |
| ctx = 1; |
| } |
| run = symbol; |
| |
| #if TRACE |
| tracebits2("run", 1, run); |
| #endif |
| dct_level[pairs] = level; |
| dct_run[pairs] = run; |
| if (abslevel > t_chr[rank]) { |
| if (abslevel <= 2) |
| rank = abslevel; |
| else if (abslevel <= 4) |
| rank = 3; |
| else |
| rank = 4; |
| } |
| pos += (run + 1); |
| if (pos >= 64) |
| pos = 63; |
| } |
| dct_pairs = pairs; |
| pair_pos = dct_pairs; |
| } |
| |
| if (dct_pairs > 0) { |
| se->value1 = dct_level[pair_pos - 1]; |
| se->value2 = dct_run[pair_pos - 1]; |
| pair_pos--; |
| } else { |
| |
| se->value1 = se->value2 = 0; |
| } |
| |
| if ((dct_pairs--) == 0) |
| pair_pos = 0; |
| } |
| |
| int b8_ctr; |
| #if 0 |
| int curr_residual_chroma[4][16][16]; |
| int curr_residual_luma[16][16]; |
| #endif |
| |
| const int SCAN[2][64][2] = {{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {0, 3}, {0, 4}, {1, |
| 1}, {1, 2}, {0, 5}, {0, 6}, {1, 3}, {2, 0}, {2, 1}, {0, 7}, {1, |
| 4}, {2, 2}, {3, 0}, {1, 5}, {1, 6}, {2, 3}, {3, 1}, {3, 2}, {4, |
| 0}, {1, 7}, {2, 4}, {4, 1}, {2, 5}, {3, 3}, {4, 2}, {2, 6}, {3, |
| 4}, {4, 3}, {5, 0}, {5, 1}, {2, 7}, {3, 5}, {4, 4}, {5, 2}, {6, |
| 0}, {5, 3}, {3, 6}, {4, 5}, {6, 1}, {6, 2}, {5, 4}, {3, 7}, {4, |
| 6}, {6, 3}, {5, 5}, {4, 7}, {6, 4}, {5, 6}, {6, 5}, {5, 7}, {6, |
| 6}, {7, 0}, {6, 7}, {7, 1}, {7, 2}, {7, 3}, {7, 4}, {7, 5}, {7, |
| 6}, {7, 7} }, {{0, 0}, {1, 0}, {0, 1}, {0, 2}, {1, 1}, {2, 0}, { |
| 3, 0}, {2, 1}, {1, 2}, {0, 3}, {0, 4}, {1, 3}, {2, 2}, {3, 1}, { |
| 4, 0}, {5, 0}, {4, 1}, {3, 2}, {2, 3}, {1, 4}, {0, 5}, {0, 6}, { |
| 1, 5}, {2, 4}, {3, 3}, {4, 2}, {5, 1}, {6, 0}, {7, 0}, {6, 1}, { |
| 5, 2}, {4, 3}, {3, 4}, {2, 5}, {1, 6}, {0, 7}, {1, 7}, {2, 6}, { |
| 3, 5}, {4, 4}, {5, 3}, {6, 2}, {7, 1}, {7, 2}, {6, 3}, {5, 4}, { |
| 4, 5}, {3, 6}, {2, 7}, {3, 7}, {4, 6}, {5, 5}, {6, 4}, {7, 3}, { |
| 7, 4}, {6, 5}, {5, 6}, {4, 7}, {5, 7}, {6, 6}, {7, 5}, {7, 6}, { |
| 6, 7}, {7, 7} } }; |
| |
| const int SCAN_4x4[16][2] = {{0, 0}, {1, 0}, {0, 1}, {0, 2}, {1, 1}, {2, 0}, {3, |
| 0}, {2, 1}, {1, 2}, {0, 3}, {1, 3}, {2, 2}, {3, 1}, {3, 2}, {2, |
| 3}, {3, 3} }; |
| |
| /* |
| ************************************************************************* |
| * Function: |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void encode_golomb_word(unsigned int symbol, unsigned int grad0, |
| unsigned int max_levels, unsigned int *res_bits, |
| unsigned int *res_len) |
| { |
| unsigned int level, res, numbits; |
| |
| res = 1UL << grad0; |
| level = 1UL; |
| numbits = 1UL + grad0; |
| |
| while (symbol >= res && level < max_levels) { |
| symbol -= res; |
| res = res << 1; |
| level++; |
| numbits += 2UL; |
| } |
| |
| if (level >= max_levels) { |
| if (symbol >= res) |
| symbol = res - 1UL; |
| } |
| |
| *res_bits = res | symbol; |
| *res_len = numbits; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function: |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void encode_multilayer_golomb_word(unsigned int symbol, |
| const unsigned int *grad, const unsigned int *max_levels, |
| unsigned int *res_bits, unsigned int *res_len) |
| { |
| unsigned int accbits, acclen, bits, len, tmp; |
| |
| accbits = acclen = 0UL; |
| |
| while (1) { |
| encode_golomb_word(symbol, *grad, *max_levels, &bits, &len); |
| accbits = (accbits << len) | bits; |
| acclen += len; |
| #ifdef AVSP_LONG_CABAC |
| #else |
| assert(acclen <= 32UL); |
| #endif |
| tmp = *max_levels - 1UL; |
| |
| if (!((len == (tmp << 1) + (*grad)) |
| && (bits == (1UL << (tmp + *grad)) - 1UL))) |
| break; |
| |
| tmp = *max_levels; |
| symbol -= (((1UL << tmp) - 1UL) << (*grad)) - 1UL; |
| grad++; |
| max_levels++; |
| } |
| *res_bits = accbits; |
| *res_len = acclen; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function: |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| int writesyntaxelement_golomb(struct syntaxelement *se, int write_to_stream) |
| { |
| unsigned int bits, len, i; |
| unsigned int grad[4], max_lev[4]; |
| |
| if (!(se->golomb_maxlevels & ~0xFF)) |
| encode_golomb_word(se->value1, se->golomb_grad, |
| se->golomb_maxlevels, &bits, &len); |
| else { |
| for (i = 0UL; i < 4UL; i++) { |
| grad[i] = (se->golomb_grad >> (i << 3)) & 0xFFUL; |
| max_lev[i] = (se->golomb_maxlevels >> (i << 3)) |
| & 0xFFUL; |
| } |
| encode_multilayer_golomb_word(se->value1, grad, max_lev, &bits, |
| &len); |
| } |
| |
| se->len = len; |
| se->bitpattern = bits; |
| |
| if (write_to_stream) |
| push_es(bits, len); |
| return se->len; |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:Get coded block pattern and coefficients (run/level) |
| from the bitstream |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| void read_cbpandcoeffsfrom_nal(struct img_par *img) |
| { |
| |
| int tablenum; |
| int inumblk; |
| int inumcoeff; |
| int symbol2D; |
| int escape_level_diff; |
| const int (*AVS_2DVLC_table_intra)[26][27]; |
| const int (*AVS_2DVLC_table_chroma)[26][27]; |
| int write_to_stream; |
| struct syntaxelement currse_enc; |
| struct syntaxelement *e_currse = &currse_enc; |
| |
| int coeff_save[65][2]; |
| int coeff_ptr; |
| |
| int ii, jj; |
| int mb_nr = img->current_mb_nr; |
| |
| int m2, jg2; |
| struct macroblock *curr_mb = &mb_data[mb_nr]; |
| |
| int block8x8; |
| |
| int block_x, block_y; |
| |
| struct slice_s *currslice = img->current_slice; |
| int level, run, coef_ctr, len, k, i0, j0, uv, qp; |
| |
| int boff_x, boff_y, start_scan; |
| struct syntaxelement curr_se; |
| struct datapartition *dp; |
| |
| AVS_2DVLC_table_intra = AVS_2DVLC_INTRA; |
| AVS_2DVLC_table_chroma = AVS_2DVLC_CHROMA; |
| write_to_stream = 1; |
| |
| dct_pairs = -1; |
| |
| curr_mb->qp = img->qp; |
| qp = curr_mb->qp; |
| |
| |
| for (block_y = 0; block_y < 4; block_y += 2) {/* all modes */ |
| for (block_x = 0; block_x < 4; block_x += 2) { |
| block8x8 = 2 * (block_y / 2) + block_x / 2; |
| if (curr_mb->cbp & (1 << block8x8)) { |
| tablenum = 0; |
| inumblk = 1; |
| inumcoeff = 65; |
| coeff_save[0][0] = 0; |
| coeff_save[0][1] = 0; |
| coeff_ptr = 1; |
| |
| b8_ctr = block8x8; |
| |
| boff_x = (block8x8 % 2) << 3; |
| boff_y = (block8x8 / 2) << 3; |
| |
| img->subblock_x = boff_x >> 2; |
| img->subblock_y = boff_y >> 2; |
| |
| start_scan = 0; |
| coef_ctr = start_scan - 1; |
| level = 1; |
| img->is_v_block = 0; |
| img->is_intra_block = IS_INTRA(curr_mb); |
| for (k = start_scan; |
| (k < 65) && (level != 0); |
| k++) { |
| |
| curr_se.context = LUMA_8x8; |
| curr_se.type = |
| (IS_INTRA(curr_mb)) ? |
| SE_LUM_AC_INTRA : |
| SE_LUM_AC_INTER; |
| |
| dp = &(currslice->part_arr[0]); |
| curr_se.reading = |
| readrunlevel_aec_ref; |
| dp-> |
| read_syntax_element(&curr_se, |
| img, dp); |
| level = curr_se.value1; |
| run = curr_se.value2; |
| len = curr_se.len; |
| |
| if (level != 0) { |
| coeff_save[coeff_ptr][0] = |
| run; |
| coeff_save[coeff_ptr][1] = |
| level; |
| coeff_ptr++; |
| } |
| |
| |
| |
| if (level != 0) {/* leave if len = 1 */ |
| coef_ctr += run + 1; |
| if ((img->picture_structure |
| == FRAME)) { |
| ii = |
| SCAN[img->picture_structure] |
| [coef_ctr][0]; |
| jj = |
| SCAN[img->picture_structure] |
| [coef_ctr][1]; |
| } else { |
| ii = |
| SCAN[img->picture_structure] |
| [coef_ctr][0]; |
| jj = |
| SCAN[img->picture_structure] |
| [coef_ctr][1]; |
| } |
| |
| } |
| } |
| |
| while (coeff_ptr > 0) { |
| run = |
| coeff_save[coeff_ptr |
| - 1][0]; |
| level = |
| coeff_save[coeff_ptr |
| - 1][1]; |
| |
| coeff_ptr--; |
| |
| symbol2D = CODE2D_ESCAPE_SYMBOL; |
| if (level > -27 && level < 27 |
| && run < 26) { |
| if (tablenum == 0) |
| |
| symbol2D = |
| AVS_2DVLC_table_intra |
| [tablenum] |
| [run][abs( |
| level) |
| - 1]; |
| else |
| |
| symbol2D = |
| AVS_2DVLC_table_intra |
| [tablenum] |
| [run][abs( |
| level)]; |
| if (symbol2D >= 0 |
| && level |
| < 0) |
| symbol2D++; |
| if (symbol2D < 0) |
| |
| symbol2D = |
| (CODE2D_ESCAPE_SYMBOL |
| + (run |
| << 1) |
| + ((level |
| > 0) ? |
| 1 : |
| 0)); |
| } |
| |
| else { |
| |
| symbol2D = |
| (CODE2D_ESCAPE_SYMBOL |
| + (run |
| << 1) |
| + ((level |
| > 0) ? |
| 1 : |
| 0)); |
| } |
| |
| |
| |
| e_currse->type = SE_LUM_AC_INTER; |
| e_currse->value1 = symbol2D; |
| e_currse->value2 = 0; |
| |
| e_currse->golomb_grad = |
| vlc_golomb_order |
| [0][tablenum][0]; |
| e_currse->golomb_maxlevels = |
| vlc_golomb_order |
| [0][tablenum][1]; |
| |
| writesyntaxelement_golomb( |
| e_currse, |
| write_to_stream); |
| |
| if (symbol2D |
| >= CODE2D_ESCAPE_SYMBOL) { |
| |
| e_currse->type = |
| SE_LUM_AC_INTER; |
| e_currse->golomb_grad = |
| 1; |
| e_currse->golomb_maxlevels = |
| 11; |
| escape_level_diff = |
| abs( |
| level) |
| - ((run |
| > MaxRun[0][tablenum]) ? |
| 1 : |
| refabslevel[tablenum][run]); |
| e_currse->value1 = |
| escape_level_diff; |
| |
| writesyntaxelement_golomb( |
| e_currse, |
| write_to_stream); |
| |
| } |
| |
| if (abs(level) |
| > incvlc_intra[tablenum]) { |
| if (abs(level) <= 2) |
| tablenum = |
| abs( |
| level); |
| else if (abs(level) <= 4) |
| tablenum = 3; |
| else if (abs(level) <= 7) |
| tablenum = 4; |
| else if (abs(level) |
| <= 10) |
| tablenum = 5; |
| else |
| tablenum = 6; |
| } |
| } |
| |
| |
| } |
| } |
| } |
| |
| |
| |
| m2 = img->mb_x * 2; |
| jg2 = img->mb_y * 2; |
| |
| |
| uv = -1; |
| block_y = 4; |
| #if 0 |
| qp = QP_SCALE_CR[curr_mb->qp]; |
| #endif |
| for (block_x = 0; block_x < 4; block_x += 2) { |
| |
| uv++; |
| |
| |
| b8_ctr = (uv + 4); |
| if ((curr_mb->cbp >> (uv + 4)) & 0x1) { |
| |
| tablenum = 0; |
| inumblk = 1; |
| inumcoeff = 65; |
| coeff_save[0][0] = 0; |
| coeff_save[0][1] = 0; |
| coeff_ptr = 1; |
| |
| coef_ctr = -1; |
| level = 1; |
| img->subblock_x = 0; |
| img->subblock_y = 0; |
| curr_se.context = CHROMA_AC; |
| curr_se.type = (IS_INTRA(curr_mb) ? |
| SE_CHR_AC_INTRA : |
| SE_CHR_AC_INTER); |
| dp = &(currslice->part_arr[0]); |
| curr_se.reading = readrunlevel_aec_ref; |
| img->is_v_block = uv; |
| img->is_intra_block = IS_INTRA(curr_mb); |
| for (k = 0; (k < 65) && (level != 0); k++) { |
| |
| dp->read_syntax_element |
| (&curr_se, img, dp); |
| level = curr_se.value1; |
| run = curr_se.value2; |
| len = curr_se.len; |
| |
| if (level != 0) { |
| coeff_save[coeff_ptr][0] = run; |
| coeff_save[coeff_ptr][1] = |
| level; |
| coeff_ptr++; |
| } |
| |
| |
| if (level != 0) { |
| coef_ctr = coef_ctr + run + 1; |
| if ((img->picture_structure |
| == FRAME) |
| /*&& (!curr_mb->mb_field)*/) { |
| i0 = |
| SCAN[img->picture_structure] |
| [coef_ctr][0]; |
| j0 = |
| SCAN[img->picture_structure] |
| [coef_ctr][1]; |
| } else { |
| i0 = |
| SCAN[img->picture_structure] |
| [coef_ctr][0]; |
| j0 = |
| SCAN[img->picture_structure] |
| [coef_ctr][1]; |
| } |
| |
| } |
| } |
| |
| while (coeff_ptr > 0) { |
| |
| run = coeff_save[coeff_ptr - 1][0]; |
| level = coeff_save[coeff_ptr - 1][1]; |
| |
| coeff_ptr--; |
| |
| symbol2D = CODE2D_ESCAPE_SYMBOL; |
| if (level > -27 && level < 27 |
| && run < 26) { |
| if (tablenum == 0) |
| |
| symbol2D = |
| AVS_2DVLC_table_chroma |
| [tablenum][run][abs( |
| level) |
| - 1]; |
| else |
| symbol2D = |
| AVS_2DVLC_table_chroma |
| [tablenum][run][abs( |
| level)]; |
| if (symbol2D >= 0 |
| && level < 0) |
| symbol2D++; |
| if (symbol2D < 0) |
| symbol2D = |
| (CODE2D_ESCAPE_SYMBOL |
| + (run |
| << 1) |
| + ((level |
| > 0) ? |
| 1 : |
| 0)); |
| } |
| |
| else { |
| symbol2D = |
| (CODE2D_ESCAPE_SYMBOL |
| + (run |
| << 1) |
| + ((level |
| > 0) ? |
| 1 : |
| 0)); |
| } |
| |
| e_currse->type = SE_LUM_AC_INTER; |
| e_currse->value1 = symbol2D; |
| e_currse->value2 = 0; |
| e_currse->golomb_grad = |
| vlc_golomb_order[2] |
| [tablenum][0]; |
| e_currse->golomb_maxlevels = |
| vlc_golomb_order[2] |
| [tablenum][1]; |
| |
| writesyntaxelement_golomb(e_currse, |
| write_to_stream); |
| |
| /* |
| * if (write_to_stream) |
| * { |
| * bitCount[BITS_COEFF_UV_MB]+=e_currse->len; |
| * e_currse++; |
| * curr_mb->currSEnr++; |
| * } |
| * no_bits+=e_currse->len; |
| |
| |
| * if (icoef == 0) break; |
| */ |
| |
| if (symbol2D >= CODE2D_ESCAPE_SYMBOL) { |
| |
| e_currse->type = SE_LUM_AC_INTER; |
| e_currse->golomb_grad = 0; |
| e_currse->golomb_maxlevels = 11; |
| escape_level_diff = |
| abs(level) |
| - ((run |
| > MaxRun[2][tablenum]) ? |
| 1 : |
| refabslevel[tablenum |
| + 14][run]); |
| e_currse->value1 = |
| escape_level_diff; |
| |
| writesyntaxelement_golomb( |
| e_currse, |
| write_to_stream); |
| |
| } |
| |
| if (abs(level) |
| > incvlc_chroma[tablenum]) { |
| if (abs(level) <= 2) |
| tablenum = abs(level); |
| else if (abs(level) <= 4) |
| tablenum = 3; |
| else |
| tablenum = 4; |
| } |
| } |
| |
| } |
| } |
| } |
| |
| /* |
| ************************************************************************* |
| * Function:Get the syntax elements from the NAL |
| * Input: |
| * Output: |
| * Return: |
| * Attention: |
| ************************************************************************* |
| */ |
| |
| int read_one_macroblock(struct img_par *img) |
| { |
| int i, j; |
| |
| struct syntaxelement curr_se; |
| struct macroblock *curr_mb = &mb_data[img->current_mb_nr]; |
| |
| int cabp_flag; |
| |
| int tempcbp; |
| int fixqp; |
| |
| struct slice_s *currslice = img->current_slice; |
| struct datapartition *dp; |
| |
| fixqp = (fixed_picture_qp || fixed_slice_qp); |
| |
| for (i = 0; i < 8; i++) |
| for (j = 0; j < 8; j++) { |
| img->m8[0][i][j] = 0; |
| img->m8[1][i][j] = 0; |
| img->m8[2][i][j] = 0; |
| img->m8[3][i][j] = 0; |
| } |
| |
| current_mb_skip = 0; |
| |
| curr_mb->qp = img->qp; |
| curr_se.type = SE_MBTYPE; |
| curr_se.mapping = linfo_ue; |
| |
| curr_mb->mb_type_2 = 0; |
| |
| if (img->type == I_IMG) |
| curr_mb->mb_type = 0; |
| |
| interpret_mb_mode_i(img); |
| |
| init_macroblock(img); |
| |
| if ((IS_INTRA(curr_mb)) && (img->abt_flag)) { |
| |
| #if TRACE |
| strncpy(curr_se.tracestring, "cabp_flag", TRACESTRING_SIZE); |
| #endif |
| |
| curr_se.len = 1; |
| curr_se.type = SE_CABP; |
| read_syntaxelement_flc(&curr_se); |
| cabp_flag = curr_se.value1; |
| if (cabp_flag == 0) { |
| curr_mb->CABP[0] = 0; |
| curr_mb->CABP[1] = 0; |
| curr_mb->CABP[2] = 0; |
| curr_mb->CABP[3] = 0; |
| } else { |
| for (i = 0; i < 4; i++) { |
| curr_se.len = 1; |
| curr_se.type = SE_CABP; |
| read_syntaxelement_flc(&curr_se); |
| curr_mb->CABP[i] = curr_se.value1; |
| } |
| } |
| |
| } else { |
| curr_mb->CABP[0] = 0; |
| curr_mb->CABP[1] = 0; |
| curr_mb->CABP[2] = 0; |
| curr_mb->CABP[3] = 0; |
| |
| } |
| |
| if (IS_INTRA(curr_mb)) { |
| for (i = 0; i < /*5*/(chroma_format + 4); i++) |
| |
| read_ipred_block_modes(img, i); |
| } |
| |
| curr_se.type = SE_CBP_INTRA; |
| curr_se.mapping = linfo_cbp_intra; |
| |
| #if TRACE |
| snprintf(curr_se.tracestring, TRACESTRING_SIZE, "CBP"); |
| #endif |
| |
| if (img->type == I_IMG || IS_INTER(curr_mb)) { |
| curr_se.golomb_maxlevels = 0; |
| |
| if (1) { |
| dp = &(currslice->part_arr[0]); |
| curr_se.reading = readcp_aec; |
| dp->read_syntax_element(&curr_se, img, dp); |
| } |
| |
| |
| curr_mb->cbp = curr_se.value1; |
| push_es(UE[NCBP[curr_se.value1][0]][0], |
| UE[NCBP[curr_se.value1][0]][1]); |
| |
| } |
| |
| # if 1 |
| if (curr_mb->cbp != 0) |
| tempcbp = 1; |
| else |
| tempcbp = 0; |
| #else |
| |
| if (chroma_format == 2) { |
| #if TRACE |
| snprintf(curr_se.tracestring, TRACESTRING_SIZE, "CBP422"); |
| #endif |
| curr_se.mapping = /*linfo_se*/linfo_ue; |
| curr_se.type = SE_CBP_INTRA; |
| readsyntaxelement_uvlc(&curr_se, inp); |
| curr_mb->cbp01 = curr_se.value1; |
| io_printf(" * UE cbp01 read : 0x%02X\n", curr_mb->cbp01); |
| } |
| |
| if (chroma_format == 2) { |
| if (curr_mb->cbp != 0 || curr_mb->cbp01 != 0) |
| tempcbp = 1; |
| else |
| tempcbp = 0; |
| |
| } else { |
| if (curr_mb->cbp != 0) |
| tempcbp = 1; |
| else |
| tempcbp = 0; |
| } |
| |
| #endif |
| |
| if (IS_INTRA(curr_mb) && (img->abt_flag) && (curr_mb->cbp & (0xF))) { |
| curr_mb->CABT[0] = curr_mb->CABP[0]; |
| curr_mb->CABT[1] = curr_mb->CABP[1]; |
| curr_mb->CABT[2] = curr_mb->CABP[2]; |
| curr_mb->CABT[3] = curr_mb->CABP[3]; |
| } else { |
| |
| curr_mb->CABT[0] = 0; |
| curr_mb->CABT[1] = 0; |
| curr_mb->CABT[2] = 0; |
| curr_mb->CABT[3] = 0; |
| |
| if (!fixqp && (tempcbp)) { |
| if (IS_INTER(curr_mb)) |
| curr_se.type = SE_DELTA_QUANT_INTER; |
| else |
| curr_se.type = SE_DELTA_QUANT_INTRA; |
| |
| #if TRACE |
| snprintf(curr_se.tracestring, |
| TRACESTRING_SIZE, "Delta quant "); |
| #endif |
| |
| if (1) { |
| dp = &(currslice->part_arr[0]); |
| curr_se.reading = readdquant_aec; |
| dp->read_syntax_element(&curr_se, img, dp); |
| } |
| |
| curr_mb->delta_quant = curr_se.value1; |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & MB_INFO_DUMP) { |
| io_printf(" * SE delta_quant read : %d\n", |
| curr_mb->delta_quant); |
| } |
| #endif |
| CHECKDELTAQP |
| |
| if (transcoding_error_flag) |
| return -1; |
| |
| img->qp = (img->qp - MIN_QP + curr_mb->delta_quant |
| + (MAX_QP - MIN_QP + 1)) |
| % (MAX_QP - MIN_QP + 1) + MIN_QP; |
| } |
| |
| if (fixqp) { |
| curr_mb->delta_quant = 0; |
| img->qp = (img->qp - MIN_QP + curr_mb->delta_quant |
| + (MAX_QP - MIN_QP + 1)) |
| % (MAX_QP - MIN_QP + 1) + MIN_QP; |
| |
| } |
| #ifdef DUMP_DEBUG |
| if (avs_get_debug_flag() & MB_INFO_DUMP) |
| io_printf(" - img->qp : %d\n", img->qp); |
| #endif |
| } |
| |
| read_cbpandcoeffsfrom_nal(img); |
| return DECODE_MB; |
| } |
| |
| /*! |
| ************************************************************************ |
| * \brief |
| * finding end of a slice in case this is not the end of a frame |
| * |
| * Unsure whether the "correction" below actually solves an off-by-one |
| * problem or whether it introduces one in some cases :-( Anyway, |
| * with this change the bit stream format works with AEC again. |
| * StW, 8.7.02 |
| ************************************************************************ |
| */ |
| int aec_startcode_follows(struct img_par *img, int eos_bit) |
| { |
| struct slice_s *currslice = img->current_slice; |
| struct datapartition *dp; |
| unsigned int bit; |
| struct decoding_environment_s *dep_dp; |
| |
| dp = &(currslice->part_arr[0]); |
| dep_dp = &(dp->de_aec); |
| |
| if (eos_bit) |
| bit = biari_decode_final(dep_dp); |
| else |
| bit = 0; |
| |
| return bit == 1 ? 1 : 0; |
| } |
| |
| #ifdef AVSP_LONG_CABAC |
| int process_long_cabac(void) |
| #else |
| void main(void) |
| #endif |
| { |
| int data32; |
| int current_header; |
| int i; |
| int tmp; |
| int ret; |
| |
| int byte_startposition; |
| int aec_mb_stuffing_bit; |
| struct slice_s *currslice; |
| #ifdef PERFORMANCE_DEBUG |
| pr_info("enter %s\r\n", __func__); |
| #endif |
| transcoding_error_flag = 0; |
| ret = 0; |
| es_buf = es_write_addr_virt; |
| |
| if (local_heap_init(MAX_CODED_FRAME_SIZE * 4) < 0) { |
| ret = -1; |
| goto End; |
| } |
| |
| img = (struct img_par *)local_alloc(1, sizeof(struct img_par)); |
| if (img == NULL) { |
| no_mem_exit("main: img"); |
| ret = -1; |
| goto End; |
| } |
| stat_bits_ptr = (struct stat_bits *)local_alloc(1, |
| sizeof(struct stat_bits)); |
| if (stat_bits_ptr == NULL) { |
| no_mem_exit("main: stat_bits"); |
| ret = -1; |
| goto End; |
| } |
| |
| curr_stream = alloc_bitstream(); |
| if (curr_stream == NULL) { |
| io_printf("alloc bitstream failed\n"); |
| ret = -1; |
| goto End; |
| } |
| |
| chroma_format = 1; |
| demulate_enable = 0; |
| img->seq_header_indicate = 1; |
| |
| #ifdef AVSP_LONG_CABAC |
| data32 = READ_VREG(LONG_CABAC_REQ); |
| progressive_sequence = (data32 >> 1) & 1; |
| fixed_picture_qp = (data32 >> 2) & 1; |
| img->picture_structure = (data32 >> 3) & 1; |
| img->type = (data32 >> 4) & 3; |
| skip_mode_flag = (data32 >> 6) & 1; |
| |
| src_start = READ_VREG(LONG_CABAC_SRC_ADDR); |
| des_start = READ_VREG(LONG_CABAC_DES_ADDR); |
| |
| data32 = READ_VREG(LONG_CABAC_PIC_SIZE); |
| horizontal_size = (data32 >> 0) & 0xffff; |
| vertical_size = (data32 >> 16) & 0xffff; |
| if (horizontal_size * vertical_size > 1920 * 1080) { |
| io_printf("pic size check failed: width = %d, height = %d\n", |
| horizontal_size, vertical_size); |
| ret = -1; |
| goto End; |
| } |
| |
| vld_mem_start_addr = READ_VREG(VLD_MEM_VIFIFO_START_PTR); |
| vld_mem_end_addr = READ_VREG(VLD_MEM_VIFIFO_END_PTR); |
| |
| #else |
| progressive_sequence = 0; |
| fixed_picture_qp = 0; |
| img->picture_structure = 0; |
| img->type = I_IMG; |
| skip_mode_flag = 1; |
| horizontal_size = 1920; |
| vertical_size = 1080; |
| |
| src_start = 0; |
| #endif |
| |
| if (horizontal_size % 16 != 0) |
| img->auto_crop_right = 16 - (horizontal_size % 16); |
| else |
| img->auto_crop_right = 0; |
| |
| if (!progressive_sequence) { |
| if (vertical_size % 32 != 0) |
| img->auto_crop_bottom = 32 - (vertical_size % 32); |
| else |
| img->auto_crop_bottom = 0; |
| } else { |
| if (vertical_size % 16 != 0) |
| img->auto_crop_bottom = 16 - (vertical_size % 16); |
| else |
| img->auto_crop_bottom = 0; |
| } |
| |
| img->width = (horizontal_size + img->auto_crop_right); |
| if (img->picture_structure) |
| img->height = (vertical_size + img->auto_crop_bottom); |
| else |
| img->height = (vertical_size + img->auto_crop_bottom) / 2; |
| img->width_cr = (img->width >> 1); |
| |
| img->pic_width_inmbs = img->width / MB_BLOCK_SIZE; |
| img->pic_height_inmbs = img->height / MB_BLOCK_SIZE; |
| img->pic_size_inmbs = img->pic_width_inmbs * img->pic_height_inmbs; |
| |
| io_printf( |
| "[LONG CABAC] Start Transcoding from 0x%x to 0x%x Size : %d x %d\r\n", |
| src_start, des_start, horizontal_size, vertical_size); |
| #if 0 |
| io_printf("VLD_MEM_VIFIFO_START_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_START_PTR)); |
| io_printf("VLD_MEM_VIFIFO_CURR_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_CURR_PTR)); |
| io_printf("VLD_MEM_VIFIFO_END_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_END_PTR)); |
| io_printf("VLD_MEM_VIFIFO_WP %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_WP)); |
| io_printf("VLD_MEM_VIFIFO_RP %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_RP)); |
| io_printf("VLD_MEM_VBUF_RD_PTR %x\r\n", |
| READ_VREG(VLD_MEM_VBUF_RD_PTR)); |
| io_printf("VLD_MEM_VIFIFO_BUF_CNTL %x\r\n", |
| READ_VREG(VLD_MEM_VIFIFO_BUF_CNTL)); |
| #endif |
| io_printf( |
| "[LONG CABAC] progressive_sequence : %d, fixed_picture_qp : %d, skip_mode_flag : %d\r\n", |
| progressive_sequence, fixed_picture_qp, skip_mode_flag); |
| io_printf("[LONG CABAC] picture_structure : %d, picture_type : %d\r\n", |
| img->picture_structure, img->type); |
| |
| open_irabs(p_irabs); |
| |
| |
| if (initial_decode() == 0) { |
| io_printf("initial_decode failed\n"); |
| ret = -1; |
| goto End; |
| } |
| |
| init_es(); |
| |
| current_header = header(); |
| io_printf("[LONG CABAC] header Return : %d\n", current_header); |
| |
| tmp = slice_header(temp_slice_buf, first_slice_startpos, |
| first_slice_length); |
| |
| init_contexts(img); |
| aec_new_slice(); |
| byte_startposition = (curr_stream->frame_bitoffset) / 8; |
| |
| currslice = img->current_slice; |
| |
| if (1) { |
| for (i = 0; i < 1; i++) { |
| img->current_slice->part_arr[i].read_syntax_element = |
| read_syntaxelement_aec; |
| img->current_slice->part_arr[i].bitstream = curr_stream; |
| } |
| curr_stream = currslice->part_arr[0].bitstream; |
| } |
| if ((curr_stream->frame_bitoffset) % 8 != 0) |
| byte_startposition++; |
| |
| arideco_start_decoding(&img->current_slice->part_arr[0].de_aec, |
| curr_stream->stream_buffer, (byte_startposition), |
| &(curr_stream->read_len), img->type); |
| |
| img->current_mb_nr = 0; |
| total_mb_count = 0; |
| while (img->current_mb_nr < img->pic_size_inmbs) |
| |
| { |
| start_macroblock(img); |
| if (-1 == read_one_macroblock(img)) { |
| ret = -1; |
| pr_info("macroblock trans failed, exit\n"); |
| goto End; |
| } |
| if (img->cod_counter <= 0) |
| aec_mb_stuffing_bit = aec_startcode_follows(img, 1); |
| img->current_mb_nr++; |
| } |
| |
| push_es(0xff, 8); |
| io_printf(" Total ES_LENGTH : %d\n", es_ptr); |
| |
| #ifdef AVSP_LONG_CABAC |
| push_es(0xff, 64); |
| if (es_buf_is_overflow) { |
| io_printf("fatal error: es_buf_is_overflow\n"); |
| ret = -1; |
| goto End; |
| } |
| |
| if (transcoding_error_flag == 0) { |
| #if 1 |
| dma_sync_single_for_device(amports_get_dma_device(), |
| es_write_addr_phy, |
| es_ptr, DMA_TO_DEVICE); |
| |
| wmb(); /**/ |
| #endif |
| } |
| #else |
| fclose(f_es); |
| #endif |
| |
| End: |
| #ifdef AVSP_LONG_CABAC |
| WRITE_VREG(LONG_CABAC_REQ, 0); |
| #endif |
| local_heap_uninit(); |
| #ifdef PERFORMANCE_DEBUG |
| pr_info("exit %s\r\n", __func__); |
| #endif |
| return ret; |
| } |
| #endif |