#ifndef AVCODEC_MPEG4VIDEO_H
#define AVCODEC_MPEG4VIDEO_H

#include "../aml_vcodec_drv.h"
#include "../utils/common.h"
#ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER
#include "../utils/pixfmt.h"
#endif

//mpeg4 profile
#define FF_PROFILE_MPEG4_SIMPLE                     0
#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE            1
#define FF_PROFILE_MPEG4_CORE                       2
#define FF_PROFILE_MPEG4_MAIN                       3
#define FF_PROFILE_MPEG4_N_BIT                      4
#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE           5
#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6
#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7
#define FF_PROFILE_MPEG4_HYBRID                     8
#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME         9
#define FF_PROFILE_MPEG4_CORE_SCALABLE             10
#define FF_PROFILE_MPEG4_ADVANCED_CODING           11
#define FF_PROFILE_MPEG4_ADVANCED_CORE             12
#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
#define FF_PROFILE_MPEG4_SIMPLE_STUDIO             14
#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE           15

// shapes
#define RECT_SHAPE       0
#define BIN_SHAPE        1
#define BIN_ONLY_SHAPE   2
#define GRAY_SHAPE       3

#define SIMPLE_VO_TYPE           1
#define CORE_VO_TYPE             3
#define MAIN_VO_TYPE             4
#define NBIT_VO_TYPE             5
#define ARTS_VO_TYPE            10
#define ACE_VO_TYPE             12
#define SIMPLE_STUDIO_VO_TYPE   14
#define CORE_STUDIO_VO_TYPE     15
#define ADV_SIMPLE_VO_TYPE      17

#define VOT_VIDEO_ID 1
#define VOT_STILL_TEXTURE_ID 2

#define FF_PROFILE_UNKNOWN -99
#define FF_PROFILE_RESERVED -100

// aspect_ratio_info
#define EXTENDED_PAR 15

//vol_sprite_usage / sprite_enable
#define STATIC_SPRITE 1
#define GMC_SPRITE 2

#define MOTION_MARKER 0x1F001
#define DC_MARKER     0x6B001

#define VOS_STARTCODE        0x1B0
#define USER_DATA_STARTCODE  0x1B2
#define GOP_STARTCODE        0x1B3
#define VISUAL_OBJ_STARTCODE 0x1B5
#define VOP_STARTCODE        0x1B6
#define SLICE_STARTCODE      0x1B7
#define EXT_STARTCODE        0x1B8

#define QUANT_MATRIX_EXT_ID  0x3

/* smaller packets likely don't contain a real frame */
#define MAX_NVOP_SIZE 19

#define IS_3IV1 0

#define CHROMA_420 1
#define CHROMA_422 2
#define CHROMA_444 3

#define FF_ASPECT_EXTENDED 15

#define AV_NOPTS_VALUE          (LONG_MIN)

/**
 * Return value for header parsers if frame is not coded.
 * */
#define FRAME_SKIPPED 100

enum AVPictureType {
    AV_PICTURE_TYPE_NONE = 0, ///< Undefined
    AV_PICTURE_TYPE_I,     ///< Intra
    AV_PICTURE_TYPE_P,     ///< Predicted
    AV_PICTURE_TYPE_B,     ///< Bi-dir predicted
    AV_PICTURE_TYPE_S,     ///< S(GMC)-VOP MPEG-4
    AV_PICTURE_TYPE_SI,    ///< Switching Intra
    AV_PICTURE_TYPE_SP,    ///< Switching Predicted
    AV_PICTURE_TYPE_BI,    ///< BI type
};

struct VLC {
	int bits;
	short (*table)[2]; ///< code, bits
	int table_size, table_allocated;
};

/**
 * MpegEncContext.
 */
struct MpegEncContext {
	struct mpeg4_dec_param *ctx;

	/* the following parameters must be initialized before encoding */
	int width, height;///< picture size. must be a multiple of 16
	int codec_tag;             ///< internal codec_tag upper case converted from avctx codec_tag
	int picture_number;       //FIXME remove, unclear definition

	/** matrix transmitted in the bitstream */
	u16 intra_matrix[64];
	u16 chroma_intra_matrix[64];
	u16 inter_matrix[64];
	u16 chroma_inter_matrix[64];

	/* MPEG-4 specific */
	int studio_profile;
	int time_base;                  ///< time in seconds of last I,P,S Frame
	int quant_precision;
	int quarter_sample;              ///< 1->qpel, 0->half pel ME/MC
	int aspect_ratio_info; //FIXME remove
	int sprite_warping_accuracy;
	int data_partitioning;           ///< data partitioning flag from header
	int low_delay;                   ///< no reordering needed / has no B-frames
	int vo_type;
	int mpeg_quant;

	/* divx specific, used to workaround (many) bugs in divx5 */
	int divx_packed;

	/* MPEG-2-specific - I wished not to have to support this mess. */
	int progressive_sequence;

	int progressive_frame;
	int interlaced_dct;

	int h_edge_pos, v_edge_pos;///< horizontal / vertical position of the right/bottom edge (pixel replication)
	const u8 *y_dc_scale_table;     ///< qscale -> y_dc_scale table
	const u8 *c_dc_scale_table;     ///< qscale -> c_dc_scale table
	int qscale;		    ///< QP
	int chroma_qscale;	    ///< chroma QP
	int pict_type;		    ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
	int f_code;		    ///< forward MV resolution
	int b_code;		    ///< backward MV resolution for B-frames (MPEG-4)
	int no_rounding;  /**< apply no rounding to motion compensation (MPEG-4, msmpeg4, ...)
	    for B-frames rounding mode is always 0 */
	int last_time_base;
	long time;		    ///< time of current frame
	long last_non_b_time;
	u16 pp_time;		    ///< time distance between the last 2 p,s,i frames
	u16 pb_time;		    ///< time distance between the last b and p,s,i frame
	u16 pp_field_time;
	u16 pb_field_time;	    ///< like above, just for interlaced
	int real_sprite_warping_points;
	int sprite_offset[2][2];	     ///< sprite offset[isChroma][isMVY]
	int sprite_delta[2][2];	     ///< sprite_delta [isY][isMVY]
	int mcsel;
	int partitioned_frame;	     ///< is current frame partitioned
	int top_field_first;
	int alternate_scan;
	int last_dc[3];                ///< last DC values for MPEG-1
	int dct_precision;
	int intra_dc_precision;
	int frame_pred_frame_dct;
	int q_scale_type;
	int context_reinit;
	int chroma_format;
};

struct mpeg4_dec_param {
	struct MpegEncContext m;

	/// number of bits to represent the fractional part of time
	int time_increment_bits;
	int shape;
	int vol_sprite_usage;
	int sprite_brightness_change;
	int num_sprite_warping_points;
	/// sprite trajectory points
	u16 sprite_traj[4][2];
	/// sprite shift [isChroma]
	int sprite_shift[2];

	// reversible vlc
	int rvlc;
	/// could this stream contain resync markers
	int resync_marker;
	/// time distance of first I -> B, used for interlaced B-frames
	int t_frame;

	int new_pred;
	int enhancement_type;
	int scalability;
	int use_intra_dc_vlc;

	/// QP above which the ac VLC should be used for intra dc
	int intra_dc_threshold;

	/* bug workarounds */
	int divx_version;
	int divx_build;
	int xvid_build;
	int lavc_build;

	/// flag for having shown the warning about invalid Divx B-frames
	int showed_packed_warning;
	/** does the stream contain the low_delay flag,
	*  used to work around buggy encoders. */
	int vol_control_parameters;
	int cplx_estimation_trash_i;
	int cplx_estimation_trash_p;
	int cplx_estimation_trash_b;

	struct VLC studio_intra_tab[12];
	struct VLC studio_luma_dc;
	struct VLC studio_chroma_dc;

	int rgb;

	struct AVRational time_base;
	int ticks_per_frame;
	struct AVRational sample_aspect_ratio;
	enum AVColorPrimaries color_primaries;
	enum AVColorTransferCharacteristic color_trc;
	enum AVColorSpace colorspace;
#ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER
	enum AVPixelFormat pix_fmt;
	enum AVColorRange color_range;
	enum AVChromaLocation chroma_sample_location;
#endif
	int err_recognition;
	int idct_algo;
	int bits_per_raw_sample;
	int profile;
	int level;
	struct AVRational framerate;
	int flags;
};

struct mpeg4_param_sets {
	bool head_parsed;
	/* currently active parameter sets */
	struct mpeg4_dec_param dec_ps;
};

#ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER
int mpeg4_decode_extradata_ps(u8 *buf, int size, struct mpeg4_param_sets *ps);
#else
inline int mpeg4_decode_extradata_ps(u8 *buf, int size, struct mpeg4_param_sets *ps) { return -1; }
#endif

#endif

