/*
 * drivers/amlogic/media/frame_provider/decoder/utils/vdec_input.h
 *
 * Copyright (C) 2016 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 VDEC_INPUT_H
#define VDEC_INPUT_H

struct vdec_s;
struct vdec_input_s;

typedef void (*chunk_free)(void *priv, u32 handle);

struct vframe_block_list_s {
	u32 magic;
	int id;
	struct list_head list;
	ulong start;
	void *start_virt;
	ulong addr;
	bool is_mapped;
	int type;
	u32 size;
	u32 wp;
	u32 rp;
	int data_size;
	int chunk_count;
	int is_out_buf;
	u32 handle;
	ulong mem_handle;
	/* free callback */
	chunk_free free;
	void* priv;

	struct vdec_input_s *input;
};

#define VFRAME_CHUNK_FLAG_CONSUMED  0x0001

struct vframe_chunk_s {
	u32 magic;
	struct list_head list;
	int flag;
	u32 offset;
	u32 size;
	u32 pts;
	u32 pading_size;
	u64 pts64;
	bool pts_valid;
	u64 timestamp;
	bool timestamp_valid;
	u64 sequence;
	struct vframe_block_list_s *block;
	u32 hdr10p_data_size;
	char *hdr10p_data_buf;
};

#define VDEC_INPUT_TARGET_VLD           0
#define VDEC_INPUT_TARGET_HEVC          1
#define VLD_PADDING_SIZE                1024
#define HEVC_PADDING_SIZE               (1024*16)

struct vdec_input_s {
	struct list_head vframe_block_list;
	struct list_head vframe_chunk_list;
	struct list_head vframe_block_free_list;
	struct vframe_block_list_s *wr_block;
	int have_free_blocks;
	int no_mem_err_cnt;/*when alloc no mem cnt++*/
	int block_nums;
	int block_id_seq;
	int id;
	spinlock_t lock;
	int type;
	int target;
	struct vdec_s *vdec;
	bool swap_valid;
	bool swap_needed;
	bool eos;
	ulong mem_handle;
	void *swap_page;
	dma_addr_t swap_page_phys;
	u64 total_wr_count;
	u64 total_rd_count;
	u64 streaming_rp;
	u32 swap_rp;
	bool last_swap_slave;
	int dirty_count;
	u64 sequence;
	unsigned start;
	unsigned size;
	int default_block_size;
	int data_size;
	int frame_max_size;
	int prepare_level;
/*for check frame delay.*/
	u64 last_inpts_u64;
	u64 last_comsumed_pts_u64;
	int last_in_nopts_cnt;
	int last_comsumed_no_pts_cnt;
	int last_duration;
/*for check frame delay.*/
	int have_frame_num;
	int stream_cookie; /* wrap count for vld_mem and
			      HEVC_SHIFT_BYTE_COUNT for hevc */
	char vdec_input_name[32];
	bool (*vdec_is_input_frame_empty)(struct vdec_s *);
	void (*vdec_up)(struct vdec_s *);
};

struct vdec_input_status_s {
	int size;
	int data_len;
	int free_len;
	int read_pointer;
};

#define input_frame_based(input) \
	(((input)->type == VDEC_TYPE_FRAME_BLOCK) || \
	 ((input)->type == VDEC_TYPE_FRAME_CIRCULAR))
#define input_stream_based(input) \
	(((input)->type == VDEC_TYPE_STREAM_PARSER) || \
	 ((input)->type == VDEC_TYPE_SINGLE))

/* Initialize vdec_input structure */
extern void vdec_input_init(struct vdec_input_s *input, struct vdec_s *vdec);
extern int vdec_input_prepare_bufs(struct vdec_input_s *input,
	int frame_width, int frame_height);

/* Get available input data size */
extern int vdec_input_level(struct vdec_input_s *input);

/* Set input type and target */
extern void vdec_input_set_type(struct vdec_input_s *input, int type,
	int target);

/* Set stream buffer information for stream based input */
extern int vdec_input_set_buffer(struct vdec_input_s *input, u32 start,
	u32 size);

/* Add enqueue video data into decoder's input */
extern int vdec_input_add_frame(struct vdec_input_s *input, const char *buf,
	size_t count);

extern int vdec_input_add_frame_with_dma(struct vdec_input_s *input, ulong addr,
	size_t count, u32 handle, chunk_free free, void* priv);

/* Peek next frame data from decoder's input */
extern struct vframe_chunk_s *vdec_input_next_chunk(
			struct vdec_input_s *input);

/* Peek next frame data from decoder's input, not marked as consumed */
extern struct vframe_chunk_s *vdec_input_next_input_chunk(
			struct vdec_input_s *input);

/* Consume next frame data from decoder's input */
extern void vdec_input_release_chunk(struct vdec_input_s *input,
	struct vframe_chunk_s *chunk);

/* Get decoder input buffer status */
extern int vdec_input_get_status(struct vdec_input_s *input,
	struct vdec_input_status_s *status);

extern unsigned long vdec_input_lock(struct vdec_input_s *input);

extern void vdec_input_unlock(struct vdec_input_s *input, unsigned long lock);

/* release all resource for decoder's input */
extern void vdec_input_release(struct vdec_input_s *input);
/* return block handle and free block */
extern u32 vdec_input_get_freed_handle(struct vdec_s *vdec);
int vdec_input_dump_chunks(int id, struct vdec_input_s *input,
	char *bufs, int size);
int vdec_input_dump_blocks(struct vdec_input_s *input,
	char *bufs, int size);

int vdec_input_get_duration_u64(struct vdec_input_s *input);

#endif /* VDEC_INPUT_H */
