/*
* 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/amports/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
