/*
* 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/module.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/semaphore.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/kfifo.h>
#include <linux/kthread.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>
#include <linux/amlogic/media/vfm/vframe.h>
#include <linux/amlogic/media/utils/amstream.h>
#include <linux/amlogic/media/utils/vformat.h>
#include <linux/amlogic/media/frame_sync/ptsserv.h>
#include <linux/amlogic/media/canvas/canvas.h>
#include <linux/amlogic/media/vfm/vframe_provider.h>
#include <linux/amlogic/media/vfm/vframe_receiver.h>
#include <linux/dma-mapping.h>
#include <linux/dma-contiguous.h>
#include <linux/slab.h>
//#include <linux/amlogic/tee.h>
#include <uapi/linux/tee.h>
#include <linux/sched/clock.h>
#include "../../../stream_input/amports/amports_priv.h"
#include <linux/amlogic/media/codec_mm/codec_mm.h>
#include "../../decoder/utils/decoder_mmu_box.h"
#include "../../decoder/utils/decoder_bmmu_box.h"
#include "avs2_global.h"

#include <linux/amlogic/media/utils/vdec_reg.h>
#include "../../decoder/utils/vdec.h"
#include "../../decoder/utils/amvdec.h"

#undef pr_info
#define pr_info printk

#define assert(chk_cond) {\
	if (!(chk_cond))\
		pr_info("error line %d\n", __LINE__);\
	while (!(chk_cond))\
		;\
}

int16_t get_param(uint16_t value, int8_t *print_info)
{
	if (is_avs2_print_param())
		pr_info("%s = %x\n", print_info, value);
	return (int16_t)value;
}

void readAlfCoeff(struct avs2_decoder *avs2_dec, struct ALFParam_s *Alfp)
{
	int32_t pos;
	union param_u *rpm_param = &avs2_dec->param;

	int32_t f = 0, symbol, pre_symbole;
	const int32_t numCoeff = (int32_t)ALF_MAX_NUM_COEF;

	switch (Alfp->componentID) {
	case ALF_Cb:
	case ALF_Cr: {
		for (pos = 0; pos < numCoeff; pos++) {
			if (Alfp->componentID == ALF_Cb)
				Alfp->coeffmulti[0][pos] =
					get_param(
					rpm_param->alf.alf_cb_coeffmulti[pos],
					"Chroma ALF coefficients");
			else
				Alfp->coeffmulti[0][pos] =
					get_param(
					rpm_param->alf.alf_cr_coeffmulti[pos],
					"Chroma ALF coefficients");
#if Check_Bitstream
			if (pos <= 7)
				assert(Alfp->coeffmulti[0][pos] >= -64
					&& Alfp->coeffmulti[0][pos] <= 63);
			if (pos == 8)
				assert(Alfp->coeffmulti[0][pos] >= -1088
					&& Alfp->coeffmulti[0][pos] <= 1071);
#endif
		}
	}
	break;
	case ALF_Y: {
		int32_t region_distance_idx = 0;
		Alfp->filters_per_group =
			get_param(rpm_param->alf.alf_filters_num_m_1,
				"ALF_filter_number_minus_1");
#if Check_Bitstream
		assert(Alfp->filters_per_group >= 0
			&& Alfp->filters_per_group <= 15);
#endif
		Alfp->filters_per_group = Alfp->filters_per_group + 1;

		memset(Alfp->filterPattern, 0, NO_VAR_BINS * sizeof(int32_t));
		pre_symbole = 0;
		symbol = 0;
		for (f = 0; f < Alfp->filters_per_group; f++) {
			if (f > 0) {
				if (Alfp->filters_per_group != 16) {
					symbol =
					get_param(rpm_param->alf.region_distance
						[region_distance_idx++],
						"Region distance");
				} else {
					symbol = 1;
				}
				Alfp->filterPattern[symbol + pre_symbole] = 1;
				pre_symbole = symbol + pre_symbole;
			}

			for (pos = 0; pos < numCoeff; pos++) {
				Alfp->coeffmulti[f][pos] =
				get_param(
					rpm_param->alf.alf_y_coeffmulti[f][pos],
					"Luma ALF coefficients");
#if Check_Bitstream
				if (pos <= 7)
					assert(
						Alfp->coeffmulti[f][pos]
						>= -64 &&
						Alfp->coeffmulti[f][pos]
						<= 63);
				if (pos == 8)
					assert(
						Alfp->coeffmulti[f][pos]
						>= -1088 &&
						Alfp->coeffmulti[f][pos]
						<= 1071);
#endif

			}
		}

#if Check_Bitstream
		assert(pre_symbole >= 0 && pre_symbole <= 15);

#endif
	}
	break;
	default: {
		pr_info("Not a legal component ID\n");
		assert(0);
		return; /* exit(-1);*/
	}
	}
}

void Read_ALF_param(struct avs2_decoder *avs2_dec)
{
	struct inp_par    *input = &avs2_dec->input;
	struct ImageParameters_s    *img = &avs2_dec->img;
	union param_u *rpm_param = &avs2_dec->param;
	int32_t compIdx;
	if (input->alf_enable) {
		img->pic_alf_on[0] =
			get_param(
			rpm_param->alf.picture_alf_enable_Y,
			"alf_pic_flag_Y");
		img->pic_alf_on[1] =
			get_param(
			rpm_param->alf.picture_alf_enable_Cb,
			"alf_pic_flag_Cb");
		img->pic_alf_on[2] =
			get_param(
			rpm_param->alf.picture_alf_enable_Cr,
			"alf_pic_flag_Cr");

		avs2_dec->m_alfPictureParam[ALF_Y].alf_flag
			= img->pic_alf_on[ALF_Y];
		avs2_dec->m_alfPictureParam[ALF_Cb].alf_flag
			= img->pic_alf_on[ALF_Cb];
		avs2_dec->m_alfPictureParam[ALF_Cr].alf_flag
			= img->pic_alf_on[ALF_Cr];
		if (img->pic_alf_on[0]
			|| img->pic_alf_on[1]
			|| img->pic_alf_on[2]) {
			for (compIdx = 0;
				compIdx < NUM_ALF_COMPONENT;
				compIdx++) {
				if (img->pic_alf_on[compIdx]) {
					readAlfCoeff(
					avs2_dec,
					&avs2_dec->m_alfPictureParam[compIdx]);
				}
			}
		}
	}

}

void Get_SequenceHeader(struct avs2_decoder *avs2_dec)
{
	struct inp_par    *input = &avs2_dec->input;
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	union param_u *rpm_param = &avs2_dec->param;
	/*int32_t i, j;*/

	/*fpr_info(stdout, "Sequence Header\n");*/
	/*memcpy(currStream->streamBuffer, buf, length);*/
	/*currStream->code_len = currStream->bitstream_length = length;*/
	/*currStream->read_len = currStream->frame_bitoffset = (startcodepos +
	  1) * 8;*/

	input->profile_id           =
		get_param(rpm_param->p.profile_id, "profile_id");
	input->level_id             =
		get_param(rpm_param->p.level_id, "level_id");
	hd->progressive_sequence        =
		get_param(
			rpm_param->p.progressive_sequence,
			"progressive_sequence");
#if INTERLACE_CODING
	hd->is_field_sequence           =
		get_param(
			rpm_param->p.is_field_sequence,
			"field_coded_sequence");
#endif
#if HALF_PIXEL_COMPENSATION || HALF_PIXEL_CHROMA
	img->is_field_sequence = hd->is_field_sequence;
#endif
	hd->horizontal_size =
		get_param(rpm_param->p.horizontal_size, "horizontal_size");
	hd->vertical_size =
		get_param(rpm_param->p.vertical_size, "vertical_size");
	input->chroma_format               =
		get_param(rpm_param->p.chroma_format, "chroma_format");
	input->output_bit_depth = 8;
	input->sample_bit_depth = 8;
	hd->sample_precision = 1;
	if (input->profile_id == BASELINE10_PROFILE) { /* 10bit profile (0x52)*/
		input->output_bit_depth =
			get_param(rpm_param->p.sample_precision,
			"sample_precision");
		input->output_bit_depth =
			6 + (input->output_bit_depth) * 2;
		input->sample_bit_depth =
			get_param(rpm_param->p.encoding_precision,
			"encoding_precision");
		input->sample_bit_depth =
			6 + (input->sample_bit_depth) * 2;
	} else { /* other profile*/
		hd->sample_precision =
			get_param(rpm_param->p.sample_precision,
				"sample_precision");
	}
	hd->aspect_ratio_information    =
		get_param(rpm_param->p.aspect_ratio_information,
			"aspect_ratio_information");
	hd->frame_rate_code             =
		get_param(rpm_param->p.frame_rate_code, "frame_rate_code");

	hd->bit_rate_lower              =
		get_param(rpm_param->p.bit_rate_lower, "bit_rate_lower");
	/*hd->marker_bit                  = get_param(rpm_param->p.marker_bit,
	 * "marker bit");*/
	/*CHECKMARKERBIT*/
	hd->bit_rate_upper              =
		get_param(rpm_param->p.bit_rate_upper, "bit_rate_upper");
	hd->low_delay                   =
		get_param(rpm_param->p.low_delay, "low_delay");
	/*hd->marker_bit                  =
		get_param(rpm_param->p.marker_bit2,
	 "marker bit");*/
	/*CHECKMARKERBIT*/
#if M3480_TEMPORAL_SCALABLE
	hd->temporal_id_exist_flag      =
		get_param(rpm_param->p.temporal_id_exist_flag,
			"temporal_id exist flag"); /*get
		Extention Flag*/
#endif
	/*u_v(18, "bbv buffer size");*/
	input->g_uiMaxSizeInBit         =
		get_param(rpm_param->p.g_uiMaxSizeInBit,
		"Largest Coding Block Size");


	/*hd->background_picture_enable = 0x01 ^
		(get_param(rpm_param->p.avs2_seq_flags,
		"background_picture_disable")
		>> BACKGROUND_PICTURE_DISABLE_BIT) & 0x1;*/
	/*rain???*/
	hd->background_picture_enable = 0x01 ^
		((get_param(rpm_param->p.avs2_seq_flags,
		"background_picture_disable")
		>> BACKGROUND_PICTURE_DISABLE_BIT) & 0x1);


	hd->b_dmh_enabled           = 1;

	hd->b_mhpskip_enabled       =
		get_param(rpm_param->p.avs2_seq_flags >> B_MHPSKIP_ENABLED_BIT,
			"mhpskip enabled") & 0x1;
	hd->dhp_enabled             =
		get_param(rpm_param->p.avs2_seq_flags >> DHP_ENABLED_BIT,
			"dhp enabled") & 0x1;
	hd->wsm_enabled             =
		get_param(rpm_param->p.avs2_seq_flags >> WSM_ENABLED_BIT,
			"wsm enabled") & 0x1;

	img->inter_amp_enable       =
		get_param(rpm_param->p.avs2_seq_flags >> INTER_AMP_ENABLE_BIT,
			"Asymmetric Motion Partitions") & 0x1;
	input->useNSQT              =
		get_param(rpm_param->p.avs2_seq_flags >> USENSQT_BIT,
			"useNSQT") & 0x1;
	input->useSDIP              =
		get_param(rpm_param->p.avs2_seq_flags >> USESDIP_BIT,
			"useNSIP") & 0x1;

	hd->b_secT_enabled          =
		get_param(rpm_param->p.avs2_seq_flags >> B_SECT_ENABLED_BIT,
			"secT enabled") & 0x1;

	input->sao_enable           =
		get_param(rpm_param->p.avs2_seq_flags >> SAO_ENABLE_BIT,
			"SAO Enable Flag") & 0x1;
	input->alf_enable           =
		get_param(rpm_param->p.avs2_seq_flags >> ALF_ENABLE_BIT,
			"ALF Enable Flag") & 0x1;
	hd->b_pmvr_enabled          =
		get_param(rpm_param->p.avs2_seq_flags >> B_PMVR_ENABLED_BIT,
			"pmvr enabled") & 0x1;


	hd->gop_size = get_param(rpm_param->p.num_of_RPS,
		"num_of_RPS");
#if Check_Bitstream
	/*assert(hd->gop_size<=32);*/
#endif

	if (hd->low_delay == 0) {
		hd->picture_reorder_delay  =
			get_param(rpm_param->p.picture_reorder_delay,
			"picture_reorder_delay");
	}

	input->crossSliceLoopFilter    =
		get_param(rpm_param->p.avs2_seq_flags
			>> CROSSSLICELOOPFILTER_BIT,
			"Cross Loop Filter Flag") & 0x1;

#if BCBR
	if ((input->profile_id == SCENE_PROFILE ||
		input->profile_id == SCENE10_PROFILE) &&
		hd->background_picture_enable) {
		hd->bcbr_enable = u_v(1,
			"block_composed_background_picture_enable");
		u_v(1, "reserved bits");
	} else {
		hd->bcbr_enable = 0;
		u_v(2, "reserved bits");
	}
#else
	/*u_v(2, "reserved bits");*/
#endif

	img->width          = hd->horizontal_size;
	img->height         = hd->vertical_size;
	img->width_cr       = (img->width >> 1);

	if (input->chroma_format == 1) {
		img->height_cr
		= (img->height >> 1);
	}

	img->PicWidthInMbs  = img->width / MIN_CU_SIZE;
	img->PicHeightInMbs = img->height / MIN_CU_SIZE;
	img->PicSizeInMbs   = img->PicWidthInMbs * img->PicHeightInMbs;
	img->buf_cycle      = input->buf_cycle + 1;
	img->max_mb_nr      = (img->width * img->height)
		/ (MIN_CU_SIZE * MIN_CU_SIZE);

#ifdef AML
avs2_dec->lcu_size =
	get_param(rpm_param->p.lcu_size, "lcu_size");
avs2_dec->lcu_size = 1<<(avs2_dec->lcu_size);
#endif
hc->seq_header++;
}


void Get_I_Picture_Header(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	union param_u *rpm_param = &avs2_dec->param;

#if RD1501_FIX_BG /*//Longfei.Wang@mediatek.com*/
	hd->background_picture_flag = 0;
	hd->background_picture_output_flag = 0;
	img->typeb = 0;
#endif

	hd->time_code_flag       =
		get_param(rpm_param->p.time_code_flag,
		"time_code_flag");

	if (hd->time_code_flag) {
		hd->time_code        =
			get_param(rpm_param->p.time_code,
			"time_code");
	}
	if (hd->background_picture_enable) {
		hd->background_picture_flag =
			get_param(rpm_param->p.background_picture_flag,
			"background_picture_flag");

		if (hd->background_picture_flag) {
			img->typeb =
				BACKGROUND_IMG;
		} else {
			img->typeb = 0;
		}

		if (img->typeb == BACKGROUND_IMG) {
			hd->background_picture_output_flag =
				get_param(
				rpm_param->p.background_picture_output_flag,
				"background_picture_output_flag");
		}
	}


	{
		img->coding_order         =
			get_param(rpm_param->p.coding_order,
			"coding_order");



#if M3480_TEMPORAL_SCALABLE
		if (hd->temporal_id_exist_flag == 1) {
			hd->cur_layer =
				get_param(rpm_param->p.cur_layer,
				"temporal_id");
		}
#endif
#if RD1501_FIX_BG  /*Longfei.Wang@mediatek.com*/
		if (hd->low_delay == 0
			&& !(hd->background_picture_flag &&
		!hd->background_picture_output_flag)) { /*cdp*/
#else
			if (hd->low_delay == 0 &&
			    !(hd->background_picture_enable &&
			      !hd->background_picture_output_flag)) { /*cdp*/
#endif
				hd->displaydelay =
					get_param(rpm_param->p.displaydelay,
					"picture_output_delay");
			}

		}
		{
			int32_t RPS_idx;/* = (img->coding_order-1) % gop_size;*/
			int32_t predict;
			int32_t j;
			predict =
				get_param(rpm_param->p.predict,
				"use RCS in SPS");
			/*if (predict) {*/
			RPS_idx =
				get_param(rpm_param->p.RPS_idx,
				"predict for RCS");
			/*    hd->curr_RPS = hd->decod_RPS[RPS_idx];*/
			/*} else {*/
			/*gop size16*/
			hd->curr_RPS.referd_by_others =
				get_param(rpm_param->p.referd_by_others_cur,
				"refered by others");
			hd->curr_RPS.num_of_ref =
				get_param(rpm_param->p.num_of_ref_cur,
				"num of reference picture");
			for (j = 0; j < hd->curr_RPS.num_of_ref; j++) {
				hd->curr_RPS.ref_pic[j] =
					get_param(rpm_param->p.ref_pic_cur[j],
					"delta COI of ref pic");
			}
			hd->curr_RPS.num_to_remove =
				get_param(rpm_param->p.num_to_remove_cur,
				"num of removed picture");
#ifdef SANITY_CHECK
			if (hd->curr_RPS.num_to_remove > MAXREF)	{
				hd->curr_RPS.num_to_remove = MAXREF;
				pr_info("Warning, %s: num_to_remove %d beyond range, force to MAXREF\n",
					__func__, hd->curr_RPS.num_to_remove);
			}
#endif

			for (j = 0; j < hd->curr_RPS.num_to_remove; j++) {
				hd->curr_RPS.remove_pic[j] =
					get_param(
					rpm_param->p.remove_pic_cur[j],
					"delta COI of removed pic");
			}
			/*u_v(1, "marker bit");*/

			/*}*/
		}
		/*xyji 12.23*/
		if (hd->low_delay) {
			/*ue_v(
			"bbv check times");*/
		}

		hd->progressive_frame =
			get_param(rpm_param->p.progressive_frame,
			"progressive_frame");

		if (!hd->progressive_frame) {
			img->picture_structure   =
				get_param(rpm_param->p.picture_structure,
				"picture_structure");
		} else {
			img->picture_structure
				= 1;
		}

		hd->top_field_first =
			get_param(rpm_param->p.top_field_first,
			"top_field_first");
		hd->repeat_first_field =
			get_param(rpm_param->p.repeat_first_field,
			"repeat_first_field");
#if INTERLACE_CODING
		if (hd->is_field_sequence) {
			hd->is_top_field         =
				get_param(rpm_param->p.is_top_field,
				"is_top_field");
#if HALF_PIXEL_COMPENSATION || HALF_PIXEL_CHROMA
			img->is_top_field       = hd->is_top_field;
#endif
		}
#endif


	img->qp                = hd->picture_qp;

	img->type              = I_IMG;

}

/*
 * Function:pb picture header
 * Input:
 * Output:
 * Return:
 * Attention:
 */

void Get_PB_Picture_Header(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	union param_u *rpm_param = &avs2_dec->param;


	/*u_v(32, "bbv delay");*/

	hd->picture_coding_type                =
		get_param(rpm_param->p.picture_coding_type,
		"picture_coding_type");

	if (hd->background_picture_enable &&
		(hd->picture_coding_type == 1 ||
			hd->picture_coding_type == 3)) {
		if (hd->picture_coding_type == 1) {
			hd->background_pred_flag       =
				get_param(
				rpm_param->p.background_pred_flag,
				"background_pred_flag");
		} else {
			hd->background_pred_flag = 0;
		}
		if (hd->background_pred_flag == 0) {

			hd->background_reference_enable =
				get_param(
				rpm_param->
				p.background_reference_enable,
				"background_reference_enable");

		} else {
#if RD170_FIX_BG
			hd->background_reference_enable = 1;
#else
			hd->background_reference_enable = 0;
#endif
		}

	} else {
		hd->background_pred_flag = 0;
		hd->background_reference_enable = 0;
	}



	if (hd->picture_coding_type == 1) {
		img->type =
			P_IMG;
	} else if (hd->picture_coding_type == 3) {
		img->type =
			F_IMG;
	} else {
		img->type =
			B_IMG;
	}


	if (hd->picture_coding_type == 1 &&
		hd->background_pred_flag) {
		img->typeb = BP_IMG;
	} else {
		img->typeb = 0;
	}


	{
		img->coding_order         =
			get_param(
			rpm_param->p.coding_order,
			"coding_order");


#if M3480_TEMPORAL_SCALABLE
		if (hd->temporal_id_exist_flag == 1) {
			hd->cur_layer =
				get_param(rpm_param->p.cur_layer,
				"temporal_id");
		}
#endif

		if (hd->low_delay == 0) {
			hd->displaydelay      =
			get_param(rpm_param->p.displaydelay,
			"displaydelay");
		}
	}
	{
		int32_t RPS_idx;/* = (img->coding_order-1) % gop_size;*/
		int32_t predict;
		predict    =
			get_param(rpm_param->p.predict,
			"use RPS in SPS");
		if (predict) {
			RPS_idx =
				get_param(rpm_param->p.RPS_idx,
				"predict for RPS");
			hd->curr_RPS = hd->decod_RPS[RPS_idx];
		} /*else*/
		{
			/*gop size16*/
			int32_t j;
			hd->curr_RPS.referd_by_others =
				get_param(
				rpm_param->p.referd_by_others_cur,
				"refered by others");
			hd->curr_RPS.num_of_ref =
				get_param(
				rpm_param->p.num_of_ref_cur,
				"num of reference picture");
			for (j = 0; j < hd->curr_RPS.num_of_ref; j++) {
				hd->curr_RPS.ref_pic[j] =
					get_param(
					rpm_param->p.ref_pic_cur[j],
					"delta COI of ref pic");
			}
			hd->curr_RPS.num_to_remove =
				get_param(
				rpm_param->p.num_to_remove_cur,
				"num of removed picture");
#ifdef SANITY_CHECK
			if (hd->curr_RPS.num_to_remove > MAXREF)	{
				hd->curr_RPS.num_to_remove = MAXREF;
				pr_info("Warning, %s: num_to_remove %d beyond range, force to MAXREF\n",
					__func__, hd->curr_RPS.num_to_remove);
			}
#endif
			for (j = 0;
				j < hd->curr_RPS.num_to_remove; j++) {
				hd->curr_RPS.remove_pic[j] =
				get_param(
					rpm_param->p.remove_pic_cur[j],
					"delta COI of removed pic");
			}
			/*u_v(1, "marker bit");*/

		}
	}
	/*xyji 12.23*/
	if (hd->low_delay) {
		/*ue_v(
		"bbv check times");*/
	}

	hd->progressive_frame       =
	get_param(rpm_param->p.progressive_frame,
		"progressive_frame");

	if (!hd->progressive_frame) {
		img->picture_structure  =
		get_param(rpm_param->p.picture_structure,
			"picture_structure");
	} else {
		img->picture_structure  = 1;
	}

	hd->top_field_first         =
	get_param(rpm_param->p.top_field_first,
		"top_field_first");
	hd->repeat_first_field      =
	get_param(rpm_param->p.repeat_first_field,
		"repeat_first_field");
#if INTERLACE_CODING
	if (hd->is_field_sequence) {
		hd->is_top_field        =
		get_param(rpm_param->p.is_top_field,
			"is_top_field");
#if HALF_PIXEL_COMPENSATION || HALF_PIXEL_CHROMA
		img->is_top_field = hd->is_top_field;
#endif
		/*u_v(1, "reserved bit for interlace coding");*/
	}
#endif

#if Check_Bitstream
	/*assert(hd->picture_qp>=0&&hd->picture_qp<=(63 + 8 *
	  (input->sample_bit_depth - 8)));*/
#endif

	img->random_access_decodable_flag =
	get_param(rpm_param->p.random_access_decodable_flag,
		"random_access_decodable_flag");

	img->qp                = hd->picture_qp;
}




void calc_picture_distance(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	/*
	union param_u *rpm_param = &avs2_dec->param;

	for POC mode 0:
	uint32_t        MaxPicDistanceLsb = (1 << 8);
	 */
	if (img->coding_order  <  img->PrevPicDistanceLsb)

	{
		int32_t i, j;

		hc->total_frames++;
		for (i = 0; i < avs2_dec->ref_maxbuffer; i++) {
			if (
				avs2_dec->fref[i]->imgtr_fwRefDistance
				>= 0) {
				avs2_dec->fref[i]->
				imgtr_fwRefDistance -= 256;
				avs2_dec->fref[i]->
				imgcoi_ref -= 256;
			}
#if RD170_FIX_BG
	for (j = 0; j < MAXREF; j++) {
#else
		for (j = 0; j < 4; j++) {
#endif
			avs2_dec->fref[i]->ref_poc[j] -= 256;
		}
	}
	for (i = 0; i < avs2_dec->outprint.buffer_num; i++) {
		avs2_dec->outprint.stdoutdata[i].framenum -= 256;
		avs2_dec->outprint.stdoutdata[i].tr -= 256;
	}

	hd->last_output -= 256;
	hd->curr_IDRtr -= 256;
	hd->curr_IDRcoi -= 256;
	hd->next_IDRtr -= 256;
	hd->next_IDRcoi -= 256;
	}
	if (hd->low_delay == 0) {
		img->tr = img->coding_order +
		hd->displaydelay - hd->picture_reorder_delay;
	} else {
		img->tr =
		img->coding_order;
	}

#if REMOVE_UNUSED
	img->pic_distance = img->tr;
#else
	img->pic_distance = img->tr % 256;
#endif
	hc->picture_distance = img->pic_distance;

}

int32_t avs2_init_global_buffers(struct avs2_decoder *avs2_dec)
{
	struct inp_par    *input = &avs2_dec->input;
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;

	int32_t refnum;

	int32_t memory_size = 0;
	/*
int32_t img_height = (hd->vertical_size + img->auto_crop_bottom);
	 */
	img->buf_cycle = input->buf_cycle + 1;

	img->buf_cycle *= 2;

	hc->background_ref = hc->backgroundReferenceFrame;

	for (refnum = 0; refnum < REF_MAXBUFFER; refnum++) {
		avs2_dec->fref[refnum] = &avs2_dec->frm_pool[refnum];

		/*//avs2_dec->fref[i] memory allocation*/
		if (is_avs2_print_bufmgr_detail())
			pr_info("[t] avs2_dec->fref[%d]@0x%p\n",
			refnum, avs2_dec->fref[refnum]);
		avs2_dec->fref[refnum]->imgcoi_ref = -257;
		avs2_dec->fref[refnum]->is_output = -1;
		avs2_dec->fref[refnum]->refered_by_others = -1;
		avs2_dec->fref[refnum]->
			imgtr_fwRefDistance = -256;
		init_frame_t(avs2_dec->fref[refnum]);
#ifdef AML
		avs2_dec->fref[refnum]->index = refnum;
#endif
	}
#ifdef AML
	avs2_dec->f_bg = NULL;

	avs2_dec->m_bg = &avs2_dec->frm_pool[REF_MAXBUFFER];
		/*///avs2_dec->fref[i] memory allocation*/
	if (is_avs2_print_bufmgr_detail())
		pr_info("[t] avs2_dec->m_bg@0x%p\n",
		avs2_dec->m_bg);
	avs2_dec->m_bg->imgcoi_ref = -257;
	avs2_dec->m_bg->is_output = -1;
	avs2_dec->m_bg->refered_by_others = -1;
	avs2_dec->m_bg->imgtr_fwRefDistance = -256;
	init_frame_t(avs2_dec->m_bg);
	avs2_dec->m_bg->index = refnum;
#endif

#if BCBR
	/*init BCBR related*/
	img->iNumCUsInFrame =
		((img->width + MAX_CU_SIZE - 1) / MAX_CU_SIZE)
		* ((img->height + MAX_CU_SIZE - 1)
		/ MAX_CU_SIZE);
	/*img->BLCUidx =  (int32_t*) calloc(
	  img->iNumCUsInFrame, sizeof(int32_t));*/
	/*memset( img->BLCUidx, 0, img->iNumCUsInFrame);*/
#endif
	return memory_size;
}

#ifdef AML
static void free_unused_buffers(struct avs2_decoder *avs2_dec)
{
	struct inp_par    *input = &avs2_dec->input;
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;

	int32_t refnum;

	img->buf_cycle = input->buf_cycle + 1;

	img->buf_cycle *= 2;

	hc->background_ref = hc->backgroundReferenceFrame;

	for (refnum = 0; refnum < REF_MAXBUFFER; refnum++) {
#ifndef NO_DISPLAY
		if (avs2_dec->fref[refnum]->vf_ref > 0 ||
			avs2_dec->fref[refnum]->to_prepare_disp)
			continue;
#endif
		if (is_avs2_print_bufmgr_detail())
			pr_info("%s[t] avs2_dec->fref[%d]@0x%p\n",
			__func__, refnum, avs2_dec->fref[refnum]);
		avs2_dec->fref[refnum]->imgcoi_ref = -257;
		avs2_dec->fref[refnum]->is_output = -1;
		avs2_dec->fref[refnum]->refered_by_others = -1;
		avs2_dec->fref[refnum]->
			imgtr_fwRefDistance = -256;
		memset(avs2_dec->fref[refnum]->ref_poc, 0,
			sizeof(avs2_dec->fref[refnum]->ref_poc));
	}
	avs2_dec->f_bg = NULL;

	if (is_avs2_print_bufmgr_detail())
		pr_info("%s[t] avs2_dec->m_bg@0x%p\n",
		__func__, avs2_dec->m_bg);
	avs2_dec->m_bg->imgcoi_ref = -257;
	avs2_dec->m_bg->is_output = -1;
	avs2_dec->m_bg->refered_by_others = -1;
	avs2_dec->m_bg->imgtr_fwRefDistance = -256;
	memset(avs2_dec->m_bg->ref_poc, 0,
		sizeof(avs2_dec->m_bg->ref_poc));

#if BCBR
	/*init BCBR related*/
	img->iNumCUsInFrame =
		((img->width + MAX_CU_SIZE - 1) / MAX_CU_SIZE)
		* ((img->height + MAX_CU_SIZE - 1)
		/ MAX_CU_SIZE);
	/*img->BLCUidx =  (int32_t*) calloc(
	  img->iNumCUsInFrame, sizeof(int32_t));*/
	/*memset( img->BLCUidx, 0, img->iNumCUsInFrame);*/
#endif
}
#endif

void init_frame_t(struct avs2_frame_s *currfref)
{
	memset(currfref, 0, sizeof(struct avs2_frame_s));
	currfref->imgcoi_ref          = -257;
	currfref->is_output           = -1;
	currfref->refered_by_others   = -1;
	currfref->imgtr_fwRefDistance = -256;
	memset(currfref->ref_poc, 0, sizeof(currfref->ref_poc));
}

void get_reference_list_info(struct avs2_decoder *avs2_dec, int8_t *str)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;

	int8_t str_tmp[16];
	int32_t i;
	/* int32_t poc = hc->f_rec->imgtr_fwRefDistance;
	  fred.chiu@mediatek.com*/

	if (img->num_of_references > 0) {
		strcpy(str, "[");
		for (i = 0; i < img->num_of_references; i++) {
#if RD1510_FIX_BG
			if (img->type == B_IMG) {
				sprintf(str_tmp, "%4d    ",
					hc->f_rec->
					ref_poc[
					img->num_of_references - 1 - i]);
			} else {
				sprintf(str_tmp, "%4d    ",
					hc->f_rec->ref_poc[i]);
			}
#else
			sprintf(str_tmp, "%4d     ",
				avs2_dec->fref[i]->imgtr_fwRefDistance);
#endif

			str_tmp[5] = '\0';
			strcat(str, str_tmp);
		}
		strcat(str, "]");
	} else {
		str[0] = '\0';
	}
}

void prepare_RefInfo(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;

	int32_t i, j;
	int32_t ii;
	struct avs2_frame_s *tmp_fref;

	/*update IDR frame*/
	if (img->tr > hd->next_IDRtr && hd->curr_IDRtr != hd->next_IDRtr) {
		hd->curr_IDRtr  = hd->next_IDRtr;
		hd->curr_IDRcoi = hd->next_IDRcoi;
	}
	/* re-order the ref buffer according to RPS*/
	img->num_of_references = hd->curr_RPS.num_of_ref;

#if 1
	/*rain*/
	if (is_avs2_print_bufmgr_detail()) {
		pr_info("%s: coding_order is %d, curr_IDRcoi is %d\n",
		__func__, img->coding_order, hd->curr_IDRcoi);
		for (ii = 0; ii < MAXREF; ii++) {
			pr_info("ref_pic(%d)=%d\n",
			ii, hd->curr_RPS.ref_pic[ii]);
	}
	for (ii = 0; ii < avs2_dec->ref_maxbuffer; ii++) {
		pr_info(
			"fref[%d]: index %d imgcoi_ref %d imgtr_fwRefDistance %d\n",
			ii, avs2_dec->fref[ii]->index,
			avs2_dec->fref[ii]->imgcoi_ref,
			avs2_dec->fref[ii]->imgtr_fwRefDistance);
	}
	}
#endif

	for (i = 0; i < hd->curr_RPS.num_of_ref; i++) {
		/*int32_t accumulate = 0;*/
		/* copy tmp_fref from avs2_dec->fref[i] */
		tmp_fref = avs2_dec->fref[i];

#if REMOVE_UNUSED
		for (j = i; j < avs2_dec->ref_maxbuffer; j++) {
			/*/////////////to be modified  IDR*/
			if (avs2_dec->fref[j]->imgcoi_ref ==
				img->coding_order -
				hd->curr_RPS.ref_pic[i]) {
				break;
			}
		}
#else

		for (j = i; j < avs2_dec->ref_maxbuffer; j++) {
			/*/////////////to be modified  IDR*/
			int32_t k , tmp_tr;
			for (k = 0; k < avs2_dec->ref_maxbuffer; k++) {
				if (((int32_t)img->coding_order -
					(int32_t)hd->curr_RPS.ref_pic[i]) ==
					avs2_dec->fref[k]->imgcoi_ref &&
					avs2_dec->fref[k]->imgcoi_ref >= -256) {
					break;
				}
			}
			if (k == avs2_dec->ref_maxbuffer) {
				tmp_tr =
				-1-1;
			} else {
				tmp_tr =
					avs2_dec->fref[k]->imgtr_fwRefDistance;
			}
			if (tmp_tr < hd->curr_IDRtr) {
				hd->curr_RPS.ref_pic[i] =
					img->coding_order - hd->curr_IDRcoi;

				for (k = 0; k < i; k++) {
					if (hd->curr_RPS.ref_pic[k] ==
						hd->curr_RPS.ref_pic[i]) {
						accumulate++;
						break;
					}
				}
			}
			if (avs2_dec->fref[j]->imgcoi_ref ==
				img->coding_order - hd->curr_RPS.ref_pic[i]) {
				break;
			}
		}
		if (j == avs2_dec->ref_maxbuffer || accumulate)
			img->num_of_references--;
#endif
		if (j != avs2_dec->ref_maxbuffer) {
			/* copy avs2_dec->fref[i] from avs2_dec->fref[j] */
			avs2_dec->fref[i] = avs2_dec->fref[j];
			/* copy avs2_dec->fref[j] from ferf[tmp] */
			avs2_dec->fref[j] = tmp_fref;
			if (is_avs2_print_bufmgr_detail()) {
				pr_info("%s, switch %d %d: ", __func__, i, j);
				for (ii = 0; ii < hd->curr_RPS.num_of_ref
				|| ii <= j; ii++)
					pr_info("%d ",
					avs2_dec->fref[ii]->index);
				pr_info("\n");
			}
		}
	}
	if (img->type == B_IMG &&
		(avs2_dec->fref[0]->imgtr_fwRefDistance <= img->tr
		|| avs2_dec->fref[1]->imgtr_fwRefDistance >= img->tr)) {

		pr_info("wrong reference configuration for B frame\n");
		pr_info(
			"fref0 imgtr_fwRefDistance %d, fref1 imgtr_fwRefDistance %d, img->tr %d\n",
				avs2_dec->fref[0]->imgtr_fwRefDistance,
				avs2_dec->fref[1]->imgtr_fwRefDistance,
				img->tr);
		hc->f_rec->error_mark = 1;
		avs2_dec->bufmgr_error_flag = 1;
		return; /* exit(-1);*/
		/*******************************************/
	}

#if !FIX_PROFILE_LEVEL_DPB_RPS_1
	/* delete the frame that will never be used*/
	for (i = 0; i < hd->curr_RPS.num_to_remove; i++) {
		for (j = 0; j < avs2_dec->ref_maxbuffer; j++) {
			if (avs2_dec->fref[j]->imgcoi_ref >= -256
				&& avs2_dec->fref[j]->imgcoi_ref
				== img->coding_order -
				hd->curr_RPS.remove_pic[i]) {
				break;
			}
		}
		if (j < avs2_dec->ref_maxbuffer &&
			j >= img->num_of_references) {
			avs2_dec->fref[j]->imgcoi_ref = -257;
#if M3480_TEMPORAL_SCALABLE
			avs2_dec->fref[j]->temporal_id = -1;
#endif
			if (avs2_dec->fref[j]->is_output == -1) {
				avs2_dec->fref[j]->
				imgtr_fwRefDistance = -256;
			}
		}
	}
#endif

	/* add inter-view reference picture*/

	/*   add current frame to ref buffer*/
	for (i = 0; i < avs2_dec->ref_maxbuffer; i++) {
		if ((avs2_dec->fref[i]->imgcoi_ref < -256
			|| abs(avs2_dec->fref[i]->
				imgtr_fwRefDistance - img->tr) >= 128)
				&& avs2_dec->fref[i]->is_output == -1
				&& avs2_dec->fref[i]->bg_flag == 0
#ifndef NO_DISPLAY
				&& avs2_dec->fref[i]->vf_ref == 0
				&& avs2_dec->fref[i]->to_prepare_disp == 0
#endif
				) {
			break;
		}
	}
	if (i == avs2_dec->ref_maxbuffer) {
		pr_info(
			"%s, warning, no enough buf\n",
			__func__);
		i--;
	}

	hc->f_rec        = avs2_dec->fref[i];
	hc->currentFrame = hc->f_rec->ref;
	hc->f_rec->imgtr_fwRefDistance = img->tr;
	hc->f_rec->imgcoi_ref = img->coding_order;
#if M3480_TEMPORAL_SCALABLE
	hc->f_rec->temporal_id = hd->cur_layer;
#endif
	hc->f_rec->is_output = 1;
#ifdef AML
	hc->f_rec->error_mark = 0;
	hc->f_rec->decoded_lcu = 0;
	hc->f_rec->slice_type = img->type;
#endif
	hc->f_rec->refered_by_others = hd->curr_RPS.referd_by_others;
	if (is_avs2_print_bufmgr_detail())
		pr_info(
			"%s, set f_rec (cur_pic) <= fref[%d] img->tr %d coding_order %d img_type %d\n",
			__func__, i, img->tr, img->coding_order,
			img->type);

	if (img->type != B_IMG) {
		for (j = 0;
			j < img->num_of_references; j++) {
			hc->f_rec->ref_poc[j] =
			avs2_dec->fref[j]->imgtr_fwRefDistance;
		}
	} else {
		hc->f_rec->ref_poc[0] =
			avs2_dec->fref[1]->imgtr_fwRefDistance;
		hc->f_rec->ref_poc[1] =
			avs2_dec->fref[0]->imgtr_fwRefDistance;
	}

#if M3480_TEMPORAL_SCALABLE

	for (j = img->num_of_references;
		j < 4; j++) {
		/**/
		hc->f_rec->ref_poc[j] = 0;
	}

	if (img->type == INTRA_IMG) {
		int32_t l;
		for (l = 0; l < 4; l++) {
			hc->f_rec->ref_poc[l]
			= img->tr;
		}
	}

#endif

/*////////////////////////////////////////////////////////////////////////*/
	/* updata ref pointer*/

	if (img->type != I_IMG) {

		img->imgtr_next_P = img->type == B_IMG ?
			avs2_dec->fref[0]->imgtr_fwRefDistance : img->tr;
		if (img->type == B_IMG) {
			hd->trtmp = avs2_dec->fref[0]->imgtr_fwRefDistance;
			avs2_dec->fref[0]->imgtr_fwRefDistance =
			avs2_dec->fref[1]->imgtr_fwRefDistance;
		}
	}
#if 1
	/*rain*/
	if (is_avs2_print_bufmgr_detail()) {
		for (ii = 0; ii < avs2_dec->ref_maxbuffer; ii++) {
			pr_info(
			"fref[%d]: index %d imgcoi_ref %d imgtr_fwRefDistance %d refered %d, is_out %d, bg %d, vf_ref %d ref_pos(%d,%d,%d,%d,%d,%d,%d)\n",
			ii, avs2_dec->fref[ii]->index,
			avs2_dec->fref[ii]->imgcoi_ref,
			avs2_dec->fref[ii]->imgtr_fwRefDistance,
			avs2_dec->fref[ii]->refered_by_others,
			avs2_dec->fref[ii]->is_output,
			avs2_dec->fref[ii]->bg_flag,
			avs2_dec->fref[ii]->vf_ref,
			avs2_dec->fref[ii]->ref_poc[0],
			avs2_dec->fref[ii]->ref_poc[1],
			avs2_dec->fref[ii]->ref_poc[2],
			avs2_dec->fref[ii]->ref_poc[3],
			avs2_dec->fref[ii]->ref_poc[4],
			avs2_dec->fref[ii]->ref_poc[5],
			avs2_dec->fref[ii]->ref_poc[6]
		);
	}
	}
#endif
}

int32_t init_frame(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;


#if RD1510_FIX_BG
	if (img->type == I_IMG &&
		img->typeb == BACKGROUND_IMG) { /*G/GB frame*/
		img->num_of_references = 0;
	} else if (img->type == P_IMG && img->typeb == BP_IMG) {
		/* only one reference frame(G\GB) for S frame*/
		img->num_of_references = 1;
	}
#endif

	if (img->typeb == BACKGROUND_IMG &&
		hd->background_picture_output_flag == 0) {
		hc->currentFrame = hc->background_ref;
#ifdef AML
		hc->cur_pic = avs2_dec->m_bg;
#endif
	} else {
		prepare_RefInfo(avs2_dec);
#ifdef AML
		hc->cur_pic = hc->f_rec;
#endif
	}


#ifdef FIX_CHROMA_FIELD_MV_BK_DIST
	if (img->typeb == BACKGROUND_IMG
		&& img->is_field_sequence) {
		avs2_dec->bk_img_is_top_field
			= img->is_top_field;
	}
#endif
	return 0;
}

void delete_trbuffer(struct outdata_s *data, int32_t pos)
{
	int32_t i;
	for (i = pos;
		i < data->buffer_num - 1; i++) {
		data->stdoutdata[i] =
		data->stdoutdata[i + 1];
	}
	data->buffer_num--;
}

#if RD170_FIX_BG
void flushDPB(struct avs2_decoder *avs2_dec)
{
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	int j, tmp_min, i, pos = -1;
	int search_times = avs2_dec->outprint.buffer_num;

	tmp_min = 1 << 20;
	i = 0, j = 0;
	pos = -1;

	for (j = 0; j < search_times; j++) {
		pos = -1;
		tmp_min = (1 << 20);
		/*search for min poi picture to display*/
		for (i = 0; i < avs2_dec->outprint.buffer_num; i++) {
			if (avs2_dec->outprint.stdoutdata[i].tr < tmp_min) {
				pos = i;
				tmp_min = avs2_dec->outprint.stdoutdata[i].tr;
			}
		}

		if (pos != -1) {
			hd->last_output = avs2_dec->outprint.stdoutdata[pos].tr;
			report_frame(avs2_dec, &avs2_dec->outprint, pos);
			if (avs2_dec->outprint.stdoutdata[pos].typeb
				== BACKGROUND_IMG &&
			avs2_dec->outprint.stdoutdata[pos].
			background_picture_output_flag
			== 0) {
				/*write_GB_frame(hd->p_out_background);*/
			} else {
				write_frame(avs2_dec,
					avs2_dec->outprint.stdoutdata[pos].tr);
			}

			delete_trbuffer(&avs2_dec->outprint, pos);
		}
	}

	/*clear dpb info*/
	for (j = 0; j < REF_MAXBUFFER; j++) {
		avs2_dec->fref[j]->imgtr_fwRefDistance = -256;
		avs2_dec->fref[j]->imgcoi_ref = -257;
		avs2_dec->fref[j]->temporal_id = -1;
		avs2_dec->fref[j]->refered_by_others = 0;
	}
}
#endif



#if M3480_TEMPORAL_SCALABLE
void cleanRefMVBufRef(int pos)
{
#if 0
	int k, x, y;
	/*re-init mvbuf*/
	for (k = 0; k < 2; k++) {
		for (y = 0; y < img->height / MIN_BLOCK_SIZE; y++) {
			for (x = 0; x < img->width / MIN_BLOCK_SIZE; x++)
				fref[pos]->mvbuf[y][x][k] = 0;

		}
	}
	/*re-init refbuf*/
	for (y = 0; y < img->height / MIN_BLOCK_SIZE; y++) {
		for (x = 0; x < img->width / MIN_BLOCK_SIZE ; x++)
			fref[pos]->refbuf[y][x] = -1;

	}
#endif
}
#endif

static int frame_postprocessing(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;

	int32_t pointer_tmp = avs2_dec->outprint.buffer_num;
	int32_t i;
	struct STDOUT_DATA_s *p_outdata;
#if RD160_FIX_BG
	int32_t j, tmp_min, output_cur_dec_pic, pos = -1;
	int32_t search_times = avs2_dec->outprint.buffer_num;
#endif
	/*pic dist by Grandview Semi. @ [06-07-20 15:25]*/
	img->PrevPicDistanceLsb = (img->coding_order % 256);

	pointer_tmp = avs2_dec->outprint.buffer_num;
	p_outdata   = &avs2_dec->outprint.stdoutdata[pointer_tmp];

	p_outdata->type = img->type;
	p_outdata->typeb = img->typeb;
	p_outdata->framenum = img->tr;
	p_outdata->tr = img->tr;
#if 0 /*def ORI*/
	p_outdata->qp = img->qp;
#else
	p_outdata->qp = 0;
#endif
	/*p_outdata->snr_y = snr->snr_y;*/
	/*p_outdata->snr_u = snr->snr_u;*/
	/*p_outdata->snr_v = snr->snr_v;*/
	p_outdata->tmp_time = hd->tmp_time;
	p_outdata->picture_structure = img->picture_structure;
	/*p_outdata->curr_frame_bits =
	  StatBitsPtr->curr_frame_bits;*/
	/*p_outdata->emulate_bits = StatBitsPtr->emulate_bits;*/
#if RD1501_FIX_BG
	p_outdata->background_picture_output_flag
		= hd->background_picture_output_flag;
		/*Longfei.Wang@mediatek.com*/
#endif

#if RD160_FIX_BG
	p_outdata->picture_reorder_delay = hd->picture_reorder_delay;
#endif
	avs2_dec->outprint.buffer_num++;

#if RD170_FIX_BG
	search_times = avs2_dec->outprint.buffer_num;
#endif
	/* record the reference list*/
	strcpy(p_outdata->str_reference_list, hc->str_list_reference);

#if !REF_OUTPUT
	#error "!!!REF_OUTPUT should be 1"
	for (i = 0; i < avs2_dec->outprint.buffer_num; i++) {
		min_tr(avs2_dec->outprint, &pos);
		if (avs2_dec->outprint.stdoutdata[pos].tr < img->tr
			|| avs2_dec->outprint.stdoutdata[pos].tr
			== (hd->last_output + 1)) {
			hd->last_output = avs2_dec->outprint.stdoutdata[pos].tr;
			report_frame(avs2_dec, &avs2_dec->outprint, pos);
#if 0 /*def ORI*/
			write_frame(hd->p_out,
			avs2_dec->outprint.stdoutdata[pos].tr);
#endif
			delete_trbuffer(&avs2_dec->outprint, pos);
			i--;
		} else {
			break;
		}
	}
#else
#if RD160_FIX_BG /*Longfei.Wang@mediatek.com*/
	tmp_min = 1 << 20;
	i = 0, j = 0;
	output_cur_dec_pic = 0;
	pos = -1;
	for (j = 0; j < search_times; j++) {
		pos = -1;
		tmp_min = (1 << 20);
		/*search for min poi picture to display*/
		for (i = 0; i < avs2_dec->outprint.buffer_num; i++) {
			if ((avs2_dec->outprint.stdoutdata[i].tr < tmp_min) &&
				((avs2_dec->outprint.stdoutdata[i].tr
				+ avs2_dec->outprint.stdoutdata[i].
					picture_reorder_delay)
				<= (int32_t)img->coding_order)) {
				pos = i;
				tmp_min = avs2_dec->outprint.stdoutdata[i].tr;
			}
		}

		if ((0 == hd->displaydelay) && (0 == output_cur_dec_pic)) {
			if (img->tr <= tmp_min)	{/*fred.chiu@mediatek.com*/
				/*output current decode picture
				  right now*/
				pos = avs2_dec->outprint.buffer_num - 1;
				output_cur_dec_pic = 1;
			}
		}
		if (pos != -1) {
			hd->last_output = avs2_dec->outprint.stdoutdata[pos].tr;
			report_frame(avs2_dec, &avs2_dec->outprint, pos);
#if 1 /*def ORI*/
			if (avs2_dec->outprint.stdoutdata[pos].typeb
				== BACKGROUND_IMG &&
				avs2_dec->outprint.stdoutdata[pos].
				background_picture_output_flag == 0) {
				/**/
				/**/
			} else {
				write_frame(avs2_dec,
				avs2_dec->outprint.stdoutdata[pos].tr);
			}
#endif
			delete_trbuffer(&avs2_dec->outprint, pos);
		}

	}

#else
	#error "!!!RD160_FIX_BG should be defined"
	if (img->coding_order +
		(uint32_t)hc->total_frames * 256 >=
		(uint32_t)hd->picture_reorder_delay) {
		int32_t tmp_min, pos = -1;
		tmp_min = 1 << 20;

		for (i = 0; i <
			avs2_dec->outprint.buffer_num; i++) {
			if (avs2_dec->outprint.stdoutdata[i].tr
				< tmp_min &&
				avs2_dec->outprint.stdoutdata[i].tr
				>= hd->last_output) {
				/*GB has the same "tr" with "last_output"*/
				pos = i;
				tmp_min =
				avs2_dec->outprint.stdoutdata[i].tr;
			}
		}

		if (pos != -1) {
			hd->last_output = avs2_dec->outprint.stdoutdata[pos].tr;
			report_frame(avs2_dec, &avs2_dec->outprint, pos);
#if RD1501_FIX_BG
			if (avs2_dec->outprint.stdoutdata[pos].typeb
				== BACKGROUND_IMG && avs2_dec->
				outprint.stdoutdata[pos].
				background_picture_output_flag == 0) {
#else
				if (avs2_dec->outprint.stdoutdata[pos].typeb
					== BACKGROUND_IMG &&
					hd->background_picture_output_flag
					== 0) {
#endif
					write_GB_frame(
						hd->p_out_background);
				} else {
					write_frame(avs2_dec,
					avs2_dec->outprint.stdoutdata[pos].tr);
				}
				delete_trbuffer(&avs2_dec->outprint, pos);

			}

		}
#endif
#endif
	return pos;

	}

void write_frame(struct avs2_decoder *avs2_dec, int32_t pos)
{
	int32_t j;

	if (is_avs2_print_bufmgr_detail())
		pr_info("%s(pos = %d)\n", __func__, pos);

	for (j = 0; j < avs2_dec->ref_maxbuffer; j++) {
		if (avs2_dec->fref[j]->imgtr_fwRefDistance == pos) {
			avs2_dec->fref[j]->imgtr_fwRefDistance_bak = pos;
			avs2_dec->fref[j]->is_output = -1;
			avs2_dec->fref[j]->to_prepare_disp =
				avs2_dec->to_prepare_disp_count++;
			if (avs2_dec->fref[j]->refered_by_others == 0
				|| avs2_dec->fref[j]->imgcoi_ref
				== -257) {
				avs2_dec->fref[j]->imgtr_fwRefDistance
					= -256;
				avs2_dec->fref[j]->imgcoi_ref = -257;
#if M3480_TEMPORAL_SCALABLE
				avs2_dec->fref[j]->temporal_id = -1;
#endif
				if (is_avs2_print_bufmgr_detail())
					pr_info("%s, fref index %d\n",
						 __func__, j);
			}
			break;
		}
	}
}

/*rain???, outdata *data*/
void report_frame(struct avs2_decoder *avs2_dec,
	struct outdata_s *data, int32_t pos)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;

	int8_t *Frmfld;
	int8_t Frm[] = "FRM";
	int8_t Fld[] = "FLD";
	struct STDOUT_DATA_s *p_stdoutdata
	= &data->stdoutdata[pos];
	const int8_t *typ;

#if 0
	if (input->MD5Enable & 0x02) {
		sprintf(MD5str, "%08X%08X%08X%08X\0",
				p_stdoutdata->DecMD5Value[0],
				p_stdoutdata->DecMD5Value[1],
				p_stdoutdata->DecMD5Value[2],
				p_stdoutdata->DecMD5Value[3]);
	} else {
		memset(MD5val, 0, 16);
		memset(MD5str, 0, 33);
	}
#endif

	if (p_stdoutdata->
		picture_structure) {
		Frmfld = Frm;
	} else {
		Frmfld = Fld;
	}
#if INTERLACE_CODING
	if (img->is_field_sequence) { /*rcs??*/
		Frmfld = Fld;
	}
#endif
	if ((p_stdoutdata->tr + hc->total_frames * 256)
	    == hd->end_SeqTr) {   /* I picture*/
		/*if ( img->new_sequence_flag == 1 )*/
		{
			img->sequence_end_flag = 0;
			/*fprintf(stdout, "Sequence
			  End\n\n");*/
		}
	}
	if ((p_stdoutdata->tr + hc->total_frames * 256)
		== hd->next_IDRtr) {
#if !RD170_FIX_BG
		if (hd->vec_flag) /**/
#endif
		{
			hd->vec_flag = 0;
			/*fprintf(stdout, "Video Edit
			  Code\n");*/
		}
	}

	if (p_stdoutdata->typeb == BACKGROUND_IMG) {
		typ = (hd->background_picture_output_flag != 0) ? "G" : "GB";
	} else {
#if REMOVE_UNUSED
		typ = (p_stdoutdata->type == INTRA_IMG)
			? "I" : (p_stdoutdata->type == INTER_IMG) ?
			((p_stdoutdata->typeb == BP_IMG) ? "S" : "P")
			: (p_stdoutdata->type == F_IMG ? "F" : "B");
#else
		typ = (p_stdoutdata->type == INTRA_IMG) ? "I" :
			(p_stdoutdata->type == INTER_IMG) ?
			((p_stdoutdata->type == BP_IMG) ? "S" : "P")
			: (p_stdoutdata->type == F_IMG ? "F" : "B");
#endif
	}

#if 0
	/*rain???*/
	pr_info("%3d(%s)  %3d %5d %7.4f %7.4f %7.4f %5d\t\t%s %8d %6d\t%s",
			p_stdoutdata->framenum + hc->total_frames * 256,
			typ, p_stdoutdata->tr + hc->total_frames * 256,
			p_stdoutdata->qp, p_stdoutdata->snr_y,
			p_stdoutdata->snr_u, p_stdoutdata->snr_v,
			p_stdoutdata->tmp_time, Frmfld,
			p_stdoutdata->curr_frame_bits,
			p_stdoutdata->emulate_bits,
			"");
#endif
	if (is_avs2_print_bufmgr_detail())
		pr_info(" %s\n", p_stdoutdata->str_reference_list);

	/*fflush(stdout);*/
	hd->FrameNum++;
}

void avs2_prepare_header(struct avs2_decoder *avs2_dec, int32_t start_code)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;

	switch (start_code) {
	case SEQUENCE_HEADER_CODE:
		img->new_sequence_flag = 1;
		if (is_avs2_print_bufmgr_detail())
			pr_info("SEQUENCE\n");
#ifdef TO_CHECK
#if SEQ_CHANGE_CHECKER
		if (seq_checker_buf == NULL) {
			seq_checker_buf = malloc(length);
			seq_checker_length = length;
			memcpy(seq_checker_buf, Buf, length);
		} else {
			if ((seq_checker_length != length) ||
				(memcmp(seq_checker_buf, Buf, length) != 0)) {
				free(seq_checker_buf);
				/*fprintf(stdout,
				  "Non-conformance
				  stream: sequence
				  header cannot change
				  !!\n");*/
#if RD170_FIX_BG
				seq_checker_buf = NULL;
				seq_checker_length = 0;
				seq_checker_buf = malloc(length);
				seq_checker_length = length;
				memcpy(seq_checker_buf, Buf, length);
#endif
			}


		}
#endif
#if RD170_FIX_BG
		if (input->alf_enable
			&& alfParAllcoated == 1) {
			ReleaseAlfGlobalBuffer();
			alfParAllcoated = 0;
		}
#endif
/*TO_CHECK*/
#endif
#if FIX_FLUSH_DPB_BY_LF
		if (hd->vec_flag) {
			int32_t k;
			if (is_avs2_print_bufmgr_detail())
				pr_info("vec_flag is 1, flushDPB and reinit bugmgr\n");

			flushDPB(avs2_dec);
			for (k = 0; k < avs2_dec->ref_maxbuffer; k++)
				cleanRefMVBufRef(k);

			hd->vec_flag = 0;
#ifdef AML
			free_unused_buffers(avs2_dec);
#else
			free_global_buffers(avs2_dec);
#endif
			img->number = 0;
			img->PrevPicDistanceLsb = 0;
			avs2_dec->init_hw_flag = 0;
		}
#endif

#if FIX_SEQ_END_FLUSH_DPB_BY_LF
		if (img->new_sequence_flag
			&& img->sequence_end_flag) {
			int32_t k;
			if (is_avs2_print_bufmgr_detail())
				pr_info(
				"new_sequence_flag after sequence_end_flag, flushDPB and reinit bugmgr\n");
			flushDPB(avs2_dec);
			for (k = 0; k < avs2_dec->ref_maxbuffer; k++)
				cleanRefMVBufRef(k);

#ifdef AML
			free_unused_buffers(avs2_dec);
#else
			free_global_buffers(avs2_dec);
#endif
			img->number = 0;
			img->PrevPicDistanceLsb = 0;
			avs2_dec->init_hw_flag = 0;
		}
#endif
		img->seq_header_indicate = 1;
		break;
	case I_PICTURE_START_CODE:
		if (is_avs2_print_bufmgr_detail())
			pr_info("PIC-I\n");
		Get_SequenceHeader(avs2_dec);
		Get_I_Picture_Header(avs2_dec);
		calc_picture_distance(avs2_dec);
		Read_ALF_param(avs2_dec);
		if (!img->seq_header_indicate) {
			img->B_discard_flag = 1;
			/*fprintf(stdout, "    I
			  %3d\t\tDIDSCARD!!\n",
			  img->tr);*/
			break;
		}
		break;
	case PB_PICTURE_START_CODE:
		if (is_avs2_print_bufmgr_detail())
			pr_info("PIC-PB\n");
		Get_SequenceHeader(avs2_dec);
		Get_PB_Picture_Header(avs2_dec);
		calc_picture_distance(avs2_dec);
		Read_ALF_param(avs2_dec);
		/* xiaozhen zheng, 20071009*/
		if (!img->seq_header_indicate) {
			img->B_discard_flag = 1;

			if (img->type == P_IMG) {
				/*fprintf(stdout, "    P
				  %3d\t\tDIDSCARD!!\n",
				  img->tr);*/
			}
			if (img->type == F_IMG) {
				/*fprintf(stdout, "    F
				  %3d\t\tDIDSCARD!!\n",
				  img->tr);*/
			} else {
				/*fprintf(stdout, "    B
				  %3d\t\tDIDSCARD!!\n",
				  img->tr);*/
			}

			break;
		}

		if (img->seq_header_indicate == 1
			&& img->type != B_IMG) {
			img->B_discard_flag = 0;
		}
		if (img->type == B_IMG && img->B_discard_flag == 1
			&& !img->random_access_decodable_flag) {
			/*fprintf(stdout, "    B
			  %3d\t\tDIDSCARD!!\n",
			  img->tr);*/
			break;
		}

		break;
	case SEQUENCE_END_CODE:
		if (is_avs2_print_bufmgr_detail())
			pr_info("SEQUENCE_END_CODE\n");
#ifdef TO_CHECK
#if SEQ_CHANGE_CHECKER
		if (seq_checker_buf != NULL) {
			free(seq_checker_buf);
			seq_checker_buf = NULL;
			seq_checker_length = 0;
		}
#endif
#endif
img->new_sequence_flag = 1;
img->sequence_end_flag = 1;
break;
	case VIDEO_EDIT_CODE:
		if (is_avs2_print_bufmgr_detail())
			pr_info("VIDEO_EDIT_CODE\n");
		/*video_edit_code_data(Buf, startcodepos, length);*/
		hd->vec_flag = 1;
#ifdef TO_CHECK
#if SEQ_CHANGE_CHECKER
		if (seq_checker_buf != NULL) {
			free(seq_checker_buf);
			seq_checker_buf = NULL;
			seq_checker_length = 0;
		}
#endif
#endif

break;
	}
}

#ifdef AML
static uint32_t log2i(uint32_t val)
{
	uint32_t ret = -1;
	while (val != 0) {
		val >>= 1;
		ret++;
	}
	return ret;
}
#endif

int32_t avs2_process_header(struct avs2_decoder *avs2_dec)
{
	struct inp_par    *input = &avs2_dec->input;
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	int32_t lcu_x_num_div;
	int32_t lcu_y_num_div;

	int32_t N8_SizeScale;
	/*pr_info("%s\n", __func__);*/
	{
		N8_SizeScale = 1;

		if (hd->horizontal_size %
			(MIN_CU_SIZE * N8_SizeScale) != 0) {
			img->auto_crop_right =
				(MIN_CU_SIZE * N8_SizeScale) -
				(hd->horizontal_size %
				(MIN_CU_SIZE * N8_SizeScale));
		} else
			img->auto_crop_right = 0;

#if !INTERLACE_CODING
		if (hd->progressive_sequence) /**/
#endif
		{
			if (hd->vertical_size %
				(MIN_CU_SIZE * N8_SizeScale) != 0) {
				img->auto_crop_bottom =
				(MIN_CU_SIZE * N8_SizeScale) -
				(hd->vertical_size %
				(MIN_CU_SIZE * N8_SizeScale));
			} else
				img->auto_crop_bottom = 0;
		}

		/* Reinit parameters (NOTE: need to do
		  before init_frame //*/
		img->width          =
			(hd->horizontal_size + img->auto_crop_right);
		img->height         =
			(hd->vertical_size + img->auto_crop_bottom);
		img->width_cr       = (img->width >> 1);

		if (input->chroma_format == 1)
			img->height_cr      = (img->height >> 1);

		img->PicWidthInMbs  = img->width / MIN_CU_SIZE;
		img->PicHeightInMbs = img->height / MIN_CU_SIZE;
		img->PicSizeInMbs   = img->PicWidthInMbs * img->PicHeightInMbs;
		img->max_mb_nr      = (img->width * img->height) /
			(MIN_CU_SIZE * MIN_CU_SIZE);
	}

	if (img->new_sequence_flag && img->sequence_end_flag) {
#if 0/*RD170_FIX_BG //*/
		int32_t k;
		flushDPB();
		for (k = 0; k < avs2_dec->ref_maxbuffer; k++)
			cleanRefMVBufRef(k);

		free_global_buffers();
		img->number = 0;
#endif
		hd->end_SeqTr = img->tr;
		img->sequence_end_flag = 0;
	}
	if (img->new_sequence_flag) {
		hd->next_IDRtr = img->tr;
		hd->next_IDRcoi = img->coding_order;
		img->new_sequence_flag = 0;
	}
#if 0/*RD170_FIX_BG*/
	if (hd->vec_flag) {
		int32_t k;
		flushDPB();
		for (k = 0; k < avs2_dec->ref_maxbuffer; k++)
			cleanRefMVBufRef(k);

		hd->vec_flag = 0;
		free_global_buffers();
		img->number = 0;
	}
#endif
/* allocate memory for frame buffers*/
#if 0
/* called in vavs2.c*/
	if (img->number == 0)
		avs2_init_global_buffers(avs2_dec);
#endif
	img->current_mb_nr = 0;

	init_frame(avs2_dec);

	img->types = img->type;   /* jlzheng 7.15*/

	if (img->type != B_IMG) {
		hd->pre_img_type = img->type;
		hd->pre_img_types = img->types;
	}

#ifdef AML
	avs2_dec->lcu_size_log2 = log2i(avs2_dec->lcu_size);
	lcu_x_num_div = (img->width/avs2_dec->lcu_size);
	lcu_y_num_div = (img->height/avs2_dec->lcu_size);
	avs2_dec->lcu_x_num = ((img->width % avs2_dec->lcu_size) == 0) ?
		lcu_x_num_div : lcu_x_num_div+1;
	avs2_dec->lcu_y_num = ((img->height % avs2_dec->lcu_size) == 0) ?
		lcu_y_num_div : lcu_y_num_div+1;
	avs2_dec->lcu_total = avs2_dec->lcu_x_num*avs2_dec->lcu_y_num;
#endif
	return SOP;
}

int avs2_post_process(struct avs2_decoder *avs2_dec)
{
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	int32_t i;
	int ret;
	if (img->typeb == BACKGROUND_IMG && hd->background_picture_enable) {
#ifdef AML
		for (i = 0; i < avs2_dec->ref_maxbuffer; i++) {
			if (avs2_dec->fref[i]->bg_flag != 0) {
				avs2_dec->fref[i]->bg_flag = 0;
				if (is_avs2_print_bufmgr_detail())
					pr_info(
					"clear old BACKGROUND_IMG for index %d\r\n",
					avs2_dec->fref[i]->index);
			}
		}
		if (is_avs2_print_bufmgr_detail())
			pr_info(
			"post_process: set BACKGROUND_IMG flag for %d\r\n",
			hc->cur_pic->index);
		avs2_dec->f_bg = hc->cur_pic;
		hc->cur_pic->bg_flag = 1;
#endif
	}

#if BCBR
	if (hd->background_picture_enable
		&& hd->bcbr_enable && img->number > 0)
		updateBgReference();
#endif

	if (img->typeb == BACKGROUND_IMG &&
		hd->background_picture_output_flag == 0)
		hd->background_number++;

	if (img->type == B_IMG) {
		avs2_dec->fref[0]->imgtr_fwRefDistance
		= hd->trtmp;
	}

	/* record the reference list information*/
	get_reference_list_info(avs2_dec, avs2_dec->hc.str_list_reference);

	/*pr_info("%s\n", __func__);*/
	ret = frame_postprocessing(avs2_dec);

#if FIX_PROFILE_LEVEL_DPB_RPS_1
	/* delete the frame that will never be used*/
	{
		int32_t i, j;
		if (is_avs2_print_bufmgr_detail()) {
			pr_info(
				"%s, coding_order %d to remove %d buf: ",
				__func__,
				img->coding_order,
				hd->curr_RPS.num_to_remove);
			for (i = 0; i < hd->curr_RPS.num_to_remove; i++)
				pr_info("%d ", hd->curr_RPS.remove_pic[i]);
			pr_info("\n");
		}
		for (i = 0; i < hd->curr_RPS.num_to_remove; i++) {
			for (j = 0; j < avs2_dec->ref_maxbuffer; j++) {

				if (avs2_dec->fref[j]->imgcoi_ref >= -256
					&& avs2_dec->fref[j]->imgcoi_ref ==
					img->coding_order -
					hd->curr_RPS.remove_pic[i])
					break;
			}
			if (j < avs2_dec->ref_maxbuffer) { /**/
#if FIX_RPS_PICTURE_REMOVE
/* Label new frames as "un-referenced" */
				avs2_dec->fref[j]->refered_by_others = 0;

				/* remove frames which have been outputted */
				if (avs2_dec->fref[j]->is_output == -1) {
					avs2_dec->fref[j]->
					imgtr_fwRefDistance = -256;
					avs2_dec->fref[j]->imgcoi_ref = -257;
					avs2_dec->fref[j]->temporal_id = -1;

				}
#else
				avs2_dec->fref[j]->imgcoi_ref = -257;
#if M3480_TEMPORAL_SCALABLE
				avs2_dec->fref[j]->temporal_id = -1;
#endif
				if (avs2_dec->fref[j]->is_output == -1) {
					avs2_dec->fref[j]->imgtr_fwRefDistance
						= -256;
				}
#endif
			}
		}
	}
#endif


	/*! TO 19.11.2001 Known Problem: for init_frame
	 * we have to know the picture type of the
	 * actual frame*/
	/*! in case the first slice of the P-Frame
	 * following the I-Frame was lost we decode this
	 * P-Frame but! do not write it because it
	 * was
	 * assumed to be an I-Frame in init_frame.So we
	 * force the decoder to*/
	/*! guess the right picture type. This is a hack
	 * a should be removed by the time there is a
	 * clean*/
	/*! solution where we do not have to know the
	 * picture type for the function init_frame.*/
	/*! End TO 19.11.2001//Lou*/

	{
		if (img->type == I_IMG ||
			img->type == P_IMG ||
			img->type == F_IMG)
			img->number++;
		else {
			hc->Bframe_ctr++;  /* B
					      pictures*/
		}
	}
	return ret;
}

void init_avs2_decoder(struct avs2_decoder *avs2_dec)
{
	int32_t i, j, k;

	struct inp_par    *input = &avs2_dec->input;
	struct ImageParameters_s    *img = &avs2_dec->img;
	struct Video_Com_data_s *hc = &avs2_dec->hc;
	struct Video_Dec_data_s *hd = &avs2_dec->hd;
	if (is_avs2_print_bufmgr_detail())
		pr_info("[t] struct avs2_dec @0x%p\n", avs2_dec);
	memset(avs2_dec, 0, sizeof(struct avs2_decoder));
#ifdef AML
	avs2_dec->to_prepare_disp_count = 1;
#endif
	/*
	 * ALFParam init
	 */
	for (i = 0; i < 3; i++) {
		avs2_dec->m_alfPictureParam[i].alf_flag = 0; /*1*/
		avs2_dec->m_alfPictureParam[i].num_coeff = 9; /*1*/
		avs2_dec->m_alfPictureParam[i].filters_per_group = 3;  /*1*/
		avs2_dec->m_alfPictureParam[i].componentID = i; /*1*/
		for (j = 0; j < 16; j++) {
			avs2_dec->m_alfPictureParam[i].filterPattern[j]	= 0;
			/*16*/
		}
		for (j = 0; j < 16; j++) {
			for (k = 0; k < 9; k++) {
				avs2_dec->
				m_alfPictureParam[i].coeffmulti[j][k] = 0;
				/*16*9*/
			}
		}
	}

	img->seq_header_indicate = 0;
	img->B_discard_flag = 0;

	hd->eos = 0;

	if (input->ref_pic_order) {   /*ref order*/
		hd->dec_ref_num = 0;
	}

	/*
	memset(g_log2size, -1, MAX_CU_SIZE + 1);
	c = 2;
	for (k = 4; k <= MAX_CU_SIZE; k *= 2) {
		g_log2size[k] = c;
		c++;
	}
	 */

	avs2_dec->outprint.buffer_num = 0;

	hd->last_output = -1;
	hd->end_SeqTr = -1;
	hd->curr_IDRtr = 0;
	hd->curr_IDRcoi = 0;
	hd->next_IDRtr = 0;
	hd->next_IDRcoi = 0;
	/* Allocate Slice data struct*/
	img->number = 0;
	img->type = I_IMG;

	img->imgtr_next_P = 0;

	img->imgcoi_next_ref = 0;


	img->num_of_references = 0;
	hc->seq_header = 0;

	img->new_sequence_flag   = 1;

	hd->vec_flag = 0;

	hd->FrameNum = 0;

	/* B pictures*/
	hc->Bframe_ctr = 0;
	hc->total_frames = 0;

	/* time for total decoding session*/
	hc->tot_time = 0;

}

