/*
 * drivers/amvdec_ports/decoder/aml_hevc_parser.h
 *
 * Copyright (C) 2015 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.
 *
 */


#ifndef AML_HEVC_PARSER_H
#define AML_HEVC_PARSER_H

#include "../aml_vcodec_drv.h"
#include "../utils/common.h"

#define MAX_DPB_SIZE				16 // A.4.1
#define MAX_REFS				16

#define MAX_NB_THREADS				16
#define SHIFT_CTB_WPP				2

/**
 * 7.4.2.1
 */
#define MAX_SUB_LAYERS				7
#define MAX_VPS_COUNT				16
#define MAX_SPS_COUNT				32
#define MAX_PPS_COUNT				256
#define MAX_SHORT_TERM_RPS_COUNT 		64
#define MAX_CU_SIZE				128

//TODO: check if this is really the maximum
#define MAX_TRANSFORM_DEPTH			5

#define MAX_TB_SIZE				32
#define MAX_PB_SIZE				64
#define MAX_LOG2_CTB_SIZE			6
#define MAX_QP					51
#define DEFAULT_INTRA_TC_OFFSET			2

#define HEVC_CONTEXTS				183

#define MRG_MAX_NUM_CANDS			5

#define L0					0
#define L1					1

#define EPEL_EXTRA_BEFORE			1
#define EPEL_EXTRA_AFTER			2
#define EPEL_EXTRA				3

#define FF_PROFILE_HEVC_MAIN			1
#define FF_PROFILE_HEVC_MAIN_10			2
#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE	3
#define FF_PROFILE_HEVC_REXT			4

/**
 * Value of the luma sample at position (x, y) in the 2D array tab.
 */
#define SAMPLE(tab, x, y) ((tab)[(y) * s->sps->width + (x)])
#define SAMPLE_CTB(tab, x, y) ((tab)[(y) * min_cb_width + (x)])
#define SAMPLE_CBF(tab, x, y) ((tab)[((y) & ((1<<log2_trafo_size)-1)) * MAX_CU_SIZE + ((x) & ((1<<log2_trafo_size)-1))])

#define IS_IDR(s) (s->nal_unit_type == NAL_IDR_W_RADL || s->nal_unit_type == NAL_IDR_N_LP)
#define IS_BLA(s) (s->nal_unit_type == NAL_BLA_W_RADL || s->nal_unit_type == NAL_BLA_W_LP || \
                   s->nal_unit_type == NAL_BLA_N_LP)
#define IS_IRAP(s) (s->nal_unit_type >= 16 && s->nal_unit_type <= 23)

/**
 * Table 7-3: NAL unit type codes
 */
enum HEVCNALUnitType {
	HEVC_NAL_TRAIL_N    = 0,
	HEVC_NAL_TRAIL_R    = 1,
	HEVC_NAL_TSA_N      = 2,
	HEVC_NAL_TSA_R      = 3,
	HEVC_NAL_STSA_N     = 4,
	HEVC_NAL_STSA_R     = 5,
	HEVC_NAL_RADL_N     = 6,
	HEVC_NAL_RADL_R     = 7,
	HEVC_NAL_RASL_N     = 8,
	HEVC_NAL_RASL_R     = 9,
	HEVC_NAL_VCL_N10    = 10,
	HEVC_NAL_VCL_R11    = 11,
	HEVC_NAL_VCL_N12    = 12,
	HEVC_NAL_VCL_R13    = 13,
	HEVC_NAL_VCL_N14    = 14,
	HEVC_NAL_VCL_R15    = 15,
	HEVC_NAL_BLA_W_LP   = 16,
	HEVC_NAL_BLA_W_RADL = 17,
	HEVC_NAL_BLA_N_LP   = 18,
	HEVC_NAL_IDR_W_RADL = 19,
	HEVC_NAL_IDR_N_LP   = 20,
	HEVC_NAL_CRA_NUT    = 21,
	HEVC_NAL_IRAP_VCL22 = 22,
	HEVC_NAL_IRAP_VCL23 = 23,
	HEVC_NAL_RSV_VCL24  = 24,
	HEVC_NAL_RSV_VCL25  = 25,
	HEVC_NAL_RSV_VCL26  = 26,
	HEVC_NAL_RSV_VCL27  = 27,
	HEVC_NAL_RSV_VCL28  = 28,
	HEVC_NAL_RSV_VCL29  = 29,
	HEVC_NAL_RSV_VCL30  = 30,
	HEVC_NAL_RSV_VCL31  = 31,
	HEVC_NAL_VPS        = 32,
	HEVC_NAL_SPS        = 33,
	HEVC_NAL_PPS        = 34,
	HEVC_NAL_AUD        = 35,
	HEVC_NAL_EOS_NUT    = 36,
	HEVC_NAL_EOB_NUT    = 37,
	HEVC_NAL_FD_NUT     = 38,
	HEVC_NAL_SEI_PREFIX = 39,
	HEVC_NAL_SEI_SUFFIX = 40,
};

enum HEVCSliceType {
	HEVC_SLICE_B = 0,
	HEVC_SLICE_P = 1,
	HEVC_SLICE_I = 2,
};

enum {
	// 7.4.3.1: vps_max_layers_minus1 is in [0, 62].
	HEVC_MAX_LAYERS     = 63,
	// 7.4.3.1: vps_max_sub_layers_minus1 is in [0, 6].
	HEVC_MAX_SUB_LAYERS = 7,
	// 7.4.3.1: vps_num_layer_sets_minus1 is in [0, 1023].
	HEVC_MAX_LAYER_SETS = 1024,

	// 7.4.2.1: vps_video_parameter_set_id is u(4).
	HEVC_MAX_VPS_COUNT = 16,
	// 7.4.3.2.1: sps_seq_parameter_set_id is in [0, 15].
	HEVC_MAX_SPS_COUNT = 16,
	// 7.4.3.3.1: pps_pic_parameter_set_id is in [0, 63].
	HEVC_MAX_PPS_COUNT = 64,

	// A.4.2: MaxDpbSize is bounded above by 16.
	HEVC_MAX_DPB_SIZE = 16,
	// 7.4.3.1: vps_max_dec_pic_buffering_minus1[i] is in [0, MaxDpbSize - 1].
	HEVC_MAX_REFS     = HEVC_MAX_DPB_SIZE,

	// 7.4.3.2.1: num_short_term_ref_pic_sets is in [0, 64].
	HEVC_MAX_SHORT_TERM_REF_PIC_SETS = 64,
	// 7.4.3.2.1: num_long_term_ref_pics_sps is in [0, 32].
	HEVC_MAX_LONG_TERM_REF_PICS      = 32,

	// A.3: all profiles require that CtbLog2SizeY is in [4, 6].
	HEVC_MIN_LOG2_CTB_SIZE = 4,
	HEVC_MAX_LOG2_CTB_SIZE = 6,

	// E.3.2: cpb_cnt_minus1[i] is in [0, 31].
	HEVC_MAX_CPB_CNT = 32,

	// A.4.1: in table A.6 the highest level allows a MaxLumaPs of 35 651 584.
	HEVC_MAX_LUMA_PS = 35651584,
	// A.4.1: pic_width_in_luma_samples and pic_height_in_luma_samples are
	// constrained to be not greater than sqrt(MaxLumaPs * 8).  Hence height/
	// width are bounded above by sqrt(8 * 35651584) = 16888.2 samples.
	HEVC_MAX_WIDTH  = 16888,
	HEVC_MAX_HEIGHT = 16888,

	// A.4.1: table A.6 allows at most 22 tile rows for any level.
	HEVC_MAX_TILE_ROWS    = 22,
	// A.4.1: table A.6 allows at most 20 tile columns for any level.
	HEVC_MAX_TILE_COLUMNS = 20,

	// 7.4.7.1: in the worst case (tiles_enabled_flag and
	// entropy_coding_sync_enabled_flag are both set), entry points can be
	// placed at the beginning of every Ctb row in every tile, giving an
	// upper bound of (num_tile_columns_minus1 + 1) * PicHeightInCtbsY - 1.
	// Only a stream with very high resolution and perverse parameters could
	// get near that, though, so set a lower limit here with the maximum
	// possible value for 4K video (at most 135 16x16 Ctb rows).
	HEVC_MAX_ENTRY_POINT_OFFSETS = HEVC_MAX_TILE_COLUMNS * 135,
};

struct ShortTermRPS {
	u32 num_negative_pics;
	int num_delta_pocs;
	int rps_idx_num_delta_pocs;
	int delta_poc[32];
	u8 used[32];
};

struct LongTermRPS {
	int poc[32];
	u8 used[32];
	u8 nb_refs;
};

struct SliceHeader {
	u32 pps_id;

	///< address (in raster order) of the first block in the current slice segment
	u32   slice_segment_addr;
	///< address (in raster order) of the first block in the current slice
	u32   slice_addr;

	enum HEVCSliceType slice_type;

	int pic_order_cnt_lsb;

	u8 first_slice_in_pic_flag;
	u8 dependent_slice_segment_flag;
	u8 pic_output_flag;
	u8 colour_plane_id;

	///< RPS coded in the slice header itself is stored here
	int short_term_ref_pic_set_sps_flag;
	int short_term_ref_pic_set_size;
	struct ShortTermRPS slice_rps;
	const struct ShortTermRPS *short_term_rps;
	int long_term_ref_pic_set_size;
	struct LongTermRPS long_term_rps;
	u32 list_entry_lx[2][32];

	u8 rpl_modification_flag[2];
	u8 no_output_of_prior_pics_flag;
	u8 slice_temporal_mvp_enabled_flag;

	u32 nb_refs[2];

	u8 slice_sample_adaptive_offset_flag[3];
	u8 mvd_l1_zero_flag;

	u8 cabac_init_flag;
	u8 disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag
	u8 slice_loop_filter_across_slices_enabled_flag;
	u8 collocated_list;

	u32 collocated_ref_idx;

	int slice_qp_delta;
	int slice_cb_qp_offset;
	int slice_cr_qp_offset;

	u8 cu_chroma_qp_offset_enabled_flag;

	int beta_offset;    ///< beta_offset_div2 * 2
	int tc_offset;      ///< tc_offset_div2 * 2

	u32 max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand

	u8 *entry_point_offset;
	int * offset;
	int * size;
	int num_entry_point_offsets;

	char slice_qp;

	u8 luma_log2_weight_denom;
	s16 chroma_log2_weight_denom;

	s16 luma_weight_l0[16];
	s16 chroma_weight_l0[16][2];
	s16 chroma_weight_l1[16][2];
	s16 luma_weight_l1[16];

	s16 luma_offset_l0[16];
	s16 chroma_offset_l0[16][2];

	s16 luma_offset_l1[16];
	s16 chroma_offset_l1[16][2];

	int slice_ctb_addr_rs;
};

struct HEVCWindow {
	u32 left_offset;
	u32 right_offset;
	u32 top_offset;
	u32 bottom_offset;
};

struct VUI {
#ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER
	struct AVRational sar;
#endif
	int overscan_info_present_flag;
	int overscan_appropriate_flag;

	int video_signal_type_present_flag;
	int video_format;
	int video_full_range_flag;
	int colour_description_present_flag;
	u8 colour_primaries;
	u8 transfer_characteristic;
	u8 matrix_coeffs;

	int chroma_loc_info_present_flag;
	int chroma_sample_loc_type_top_field;
	int chroma_sample_loc_type_bottom_field;
	int neutra_chroma_indication_flag;

	int field_seq_flag;
	int frame_field_info_present_flag;

	int default_display_window_flag;
	struct HEVCWindow def_disp_win;

	int vui_timing_info_present_flag;
	u32 vui_num_units_in_tick;
	u32 vui_time_scale;
	int vui_poc_proportional_to_timing_flag;
	int vui_num_ticks_poc_diff_one_minus1;
	int vui_hrd_parameters_present_flag;

	int bitstream_restriction_flag;
	int tiles_fixed_structure_flag;
	int motion_vectors_over_pic_boundaries_flag;
	int restricted_ref_pic_lists_flag;
	int min_spatial_segmentation_idc;
	int max_bytes_per_pic_denom;
	int max_bits_per_min_cu_denom;
	int log2_max_mv_length_horizontal;
	int log2_max_mv_length_vertical;
};

struct PTLCommon {
    u8 profile_space;
    u8 tier_flag;
    u8 profile_idc;
    u8 profile_compatibility_flag[32];
    u8 level_idc;
    u8 progressive_source_flag;
    u8 interlaced_source_flag;
    u8 non_packed_constraint_flag;
    u8 frame_only_constraint_flag;
};

struct PTL {
    struct PTLCommon general_ptl;
    struct PTLCommon sub_layer_ptl[HEVC_MAX_SUB_LAYERS];

    u8 sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS];
    u8 sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS];
};

struct h265_VPS_t {
	u8 vps_temporal_id_nesting_flag;
	int vps_max_layers;
	int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1

	struct PTL ptl;
	int vps_sub_layer_ordering_info_present_flag;
	u32 vps_max_dec_pic_buffering[HEVC_MAX_SUB_LAYERS];
	u32 vps_num_reorder_pics[HEVC_MAX_SUB_LAYERS];
	u32 vps_max_latency_increase[HEVC_MAX_SUB_LAYERS];
	int vps_max_layer_id;
	int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1
	u8 vps_timing_info_present_flag;
	u32 vps_num_units_in_tick;
	u32 vps_time_scale;
	u8 vps_poc_proportional_to_timing_flag;
	int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1
	int vps_num_hrd_parameters;
};

struct ScalingList {
	/* This is a little wasteful, since sizeID 0 only needs 8 coeffs,
	* and size ID 3 only has 2 arrays, not 6. */
	u8 sl[4][6][64];
	u8 sl_dc[2][6];
};

struct h265_SPS_t {
	u8 vps_id;
	u8 sps_id;
	int chroma_format_idc;
	u8 separate_colour_plane_flag;

	struct HEVCWindow output_window;
	struct HEVCWindow pic_conf_win;

	int bit_depth;
	int bit_depth_chroma;
	int pixel_shift;
	int pix_fmt;

	u32 log2_max_poc_lsb;
	int pcm_enabled_flag;

	int max_sub_layers;
	struct {
		int max_dec_pic_buffering;
		int num_reorder_pics;
		int max_latency_increase;
	} temporal_layer[HEVC_MAX_SUB_LAYERS];
	u8 temporal_id_nesting_flag;

	struct VUI vui;
	struct PTL ptl;

	u8 scaling_list_enable_flag;
	struct ScalingList scaling_list;

	u32 nb_st_rps;
	struct ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_REF_PIC_SETS];

	u8 amp_enabled_flag;
	u8 sao_enabled;

	u8 long_term_ref_pics_present_flag;
	u16 lt_ref_pic_poc_lsb_sps[HEVC_MAX_LONG_TERM_REF_PICS];
	u8 used_by_curr_pic_lt_sps_flag[HEVC_MAX_LONG_TERM_REF_PICS];
	u8 num_long_term_ref_pics_sps;

	struct {
		u8 bit_depth;
		u8 bit_depth_chroma;
		u32 log2_min_pcm_cb_size;
		u32 log2_max_pcm_cb_size;
		u8 loop_filter_disable_flag;
	} pcm;
	u8 sps_temporal_mvp_enabled_flag;
	u8 sps_strong_intra_smoothing_enable_flag;

	u32 log2_min_cb_size;
	u32 log2_diff_max_min_coding_block_size;
	u32 log2_min_tb_size;
	u32 log2_max_trafo_size;
	u32 log2_ctb_size;
	u32 log2_min_pu_size;

	int max_transform_hierarchy_depth_inter;
	int max_transform_hierarchy_depth_intra;

	int sps_range_extension_flag;
	int transform_skip_rotation_enabled_flag;
	int transform_skip_context_enabled_flag;
	int implicit_rdpcm_enabled_flag;
	int explicit_rdpcm_enabled_flag;
	int extended_precision_processing_flag;
	int intra_smoothing_disabled_flag;
	int high_precision_offsets_enabled_flag;
	int persistent_rice_adaptation_enabled_flag;
	int cabac_bypass_alignment_enabled_flag;

	///< coded frame dimension in various units
	int width;
	int height;
	int ctb_width;
	int ctb_height;
	int ctb_size;
	int min_cb_width;
	int min_cb_height;
	int min_tb_width;
	int min_tb_height;
	int min_pu_width;
	int min_pu_height;
	int tb_mask;

	int hshift[3];
	int vshift[3];

	int qp_bd_offset;

	u8 data[4096];
	int data_size;
};

struct h265_PPS_t {
	u32 sps_id; ///< seq_parameter_set_id

	u8 sign_data_hiding_flag;

	u8 cabac_init_present_flag;

	int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1
	int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1
	int pic_init_qp_minus26;

	u8 constrained_intra_pred_flag;
	u8 transform_skip_enabled_flag;

	u8 cu_qp_delta_enabled_flag;
	int diff_cu_qp_delta_depth;

	int cb_qp_offset;
	int cr_qp_offset;
	u8 pic_slice_level_chroma_qp_offsets_present_flag;
	u8 weighted_pred_flag;
	u8 weighted_bipred_flag;
	u8 output_flag_present_flag;
	u8 transquant_bypass_enable_flag;

	u8 dependent_slice_segments_enabled_flag;
	u8 tiles_enabled_flag;
	u8 entropy_coding_sync_enabled_flag;

	int num_tile_columns;   ///< num_tile_columns_minus1 + 1
	int num_tile_rows;      ///< num_tile_rows_minus1 + 1
	u8 uniform_spacing_flag;
	u8 loop_filter_across_tiles_enabled_flag;

	u8 seq_loop_filter_across_slices_enabled_flag;

	u8 deblocking_filter_control_present_flag;
	u8 deblocking_filter_override_enabled_flag;
	u8 disable_dbf;
	int beta_offset;    ///< beta_offset_div2 * 2
	int tc_offset;      ///< tc_offset_div2 * 2

	u8 scaling_list_data_present_flag;
	struct ScalingList scaling_list;

	u8 lists_modification_present_flag;
	int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2
	int num_extra_slice_header_bits;
	u8 slice_header_extension_present_flag;
	u8 log2_max_transform_skip_block_size;
	u8 cross_component_prediction_enabled_flag;
	u8 chroma_qp_offset_list_enabled_flag;
	u8 diff_cu_chroma_qp_offset_depth;
	u8 chroma_qp_offset_list_len_minus1;
	char  cb_qp_offset_list[6];
	char  cr_qp_offset_list[6];
	u8 log2_sao_offset_scale_luma;
	u8 log2_sao_offset_scale_chroma;

	// Inferred parameters
	u32 *column_width;  ///< ColumnWidth
	u32 *row_height;    ///< RowHeight
	u32 *col_bd;        ///< ColBd
	u32 *row_bd;        ///< RowBd
	int *col_idxX;

	int *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS
	int *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS
	int *tile_id;           ///< TileId
	int *tile_pos_rs;       ///< TilePosRS
	int *min_tb_addr_zs;    ///< MinTbAddrZS
	int *min_tb_addr_zs_tab;///< MinTbAddrZS
};

struct h265_param_sets {
	bool vps_parsed;
	bool sps_parsed;
	bool pps_parsed;
	/* currently active parameter sets */
	struct h265_VPS_t vps;
	struct h265_SPS_t sps;
	struct h265_PPS_t pps;
};

#ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER
int h265_decode_extradata_ps(u8 *data, int size, struct h265_param_sets *ps);
#else
inline int h265_decode_extradata_ps(u8 *data, int size, struct h265_param_sets *ps) { return -1; }
#endif

#endif /* AML_HEVC_PARSER_H */

