/*
 *			GPAC - Multimedia Framework C SDK
 *
 *			Authors: Jean Le Feuvre
 *			Copyright (c) Telecom ParisTech 2000-2012
 *					All rights reserved
 *
 *  This file is part of GPAC / BIFS codec sub-project
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC 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 Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */


#ifndef __QUANTIZE_H
#define __QUANTIZE_H

#include <gpac/internal/bifs_dev.h>

#ifndef GPAC_DISABLE_BIFS

/*Quantization Categories*/
enum
{
	QC_NONE				=	0,
	QC_3DPOS			=	1,
	QC_2DPOS			=	2,
	QC_ORDER			=	3,
	QC_COLOR			=	4,
	QC_TEXTURE_COORD	=	5,
	QC_ANGLE			=	6,
	QC_SCALE			=	7,
	QC_INTERPOL_KEYS	=	8,
	QC_NORMALS			=	9,
	QC_ROTATION			=	10,
	QC_SIZE_3D			=	11,
	QC_SIZE_2D			=	12,
	QC_LINEAR_SCALAR	=	13,
	QC_COORD_INDEX		=	14,
	QC_RESERVED			=	15,
	QC_NOTDEF			=	16,
};

#ifdef GPAC_ENABLE_BIFS_PMF
GF_Err gf_bifs_dec_pred_mf_field(GF_BifsDecoder * codec, GF_BitStream *bs, GF_Node *node, GF_FieldInfo *field);
#endif

Bool Q_IsTypeOn(M_QuantizationParameter *qp, u32 q_type, u32 *NbBits, SFVec3f *b_min, SFVec3f *b_max);


/*QP14 decode*/
u32 gf_bifs_dec_qp14_get_bits(GF_BifsDecoder *codec);
void gf_bifs_dec_qp14_enter(GF_BifsDecoder * codec, Bool Enter);
void gf_bifs_dec_qp14_reset(GF_BifsDecoder * codec);
void gf_bifs_dec_qp14_set_length(GF_BifsDecoder * codec, u32 NbElements);
/*QP decoder (un)registration*/
GF_Err gf_bifs_dec_qp_set(GF_BifsDecoder *codec, GF_Node *qp);
GF_Err gf_bifs_dec_qp_remove(GF_BifsDecoder *codec, Bool ActivatePrev);

SFFloat gf_bifs_dec_mantissa_float(GF_BifsDecoder * codec, GF_BitStream *bs);
GF_Err gf_bifs_dec_unquant_field(GF_BifsDecoder * codec, GF_BitStream *bs, GF_Node *node, GF_FieldInfo *field);

#ifndef GPAC_DISABLE_BIFS_ENC

/*QP14 encode*/
u32 gf_bifs_enc_qp14_get_bits(GF_BifsEncoder *codec);
void gf_bifs_enc_qp14_enter(GF_BifsEncoder *codec, Bool Enter);
void gf_bifs_enc_qp14_reset(GF_BifsEncoder *codec);
void gf_bifs_enc_qp14_set_length(GF_BifsEncoder *codec, u32 NbElements);
/*QP encoder (un)registration*/
GF_Err gf_bifs_enc_qp_set(GF_BifsEncoder *codec, GF_Node *qp);
GF_Err gf_bifs_enc_qp_remove(GF_BifsEncoder *codec, Bool ActivatePrev);
void gf_bifs_enc_mantissa_float(GF_BifsEncoder * codec, SFFloat val, GF_BitStream *bs);
GF_Err gf_bifs_enc_quant_field(GF_BifsEncoder * codec, GF_BitStream *bs, GF_Node *node, GF_FieldInfo *field);

#endif /*GPAC_DISABLE_BIFS_ENC*/

#ifdef GPAC_ENABLE_BIFS_PMF

/*
		Predictive MFField decode - mainly IM1 code (GPL H263 AA coder used)
*/

typedef struct _aamodel GF_AAModel;
GF_AAModel *gp_bifs_aa_model_new();
void gp_bifs_aa_model_del(GF_AAModel *model);
void gp_bifs_aa_model_init(GF_AAModel *model, u32 nbBits);

typedef struct _aadecoder GF_AADecoder;
GF_AADecoder *gp_bifs_aa_dec_new(GF_BitStream *bs);
void gp_bifs_aa_dec_del(GF_AADecoder *dec);
void gp_bifs_aa_dec_flush(GF_AADecoder *dec);
/*get input bit*/
s32 gp_bifs_aa_dec_get_bit(GF_AADecoder *dec);
/*resync after input bit has been fetched (full buffer (16 bit) rewind in source stream)*/
void gp_bifs_aa_dec_resync_bit(GF_AADecoder *dec);
/*resync bitstream*/
void gp_bifs_aa_dec_resync(GF_AADecoder *dec);
/*decode symbol in given model*/
s32 gp_bifs_aa_decode(GF_AADecoder *dec, GF_AAModel *model);
/*reset decoder - called after each parsed I frame*/
void gp_bifs_aa_dec_reset(GF_AADecoder *dec);


#endif /*GPAC_ENABLE_BIFS_PMF*/


#endif /*GPAC_DISABLE_BIFS*/

#endif
