/*
* 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:
*/

#ifndef AML_TASK_CHAIN_H
#define AML_TASK_CHAIN_H

#include <linux/amlogic/media/vfm/vframe.h>

enum task_type_e {
	TASK_TYPE_DEC,
	TASK_TYPE_VPP,
	TASK_TYPE_V4L_SINK,
	TASK_TYPE_GE2D,
	TASK_TYPE_MAX
};

enum task_dir_e {
	TASK_DIR_SUBMIT,
	TASK_DIR_RECYCLE,
	TASK_DIR_MAX
};

struct task_chain_s;

/*
 * struct task_ops_s - interface of the task item.
 * @type	: type of task ops involves dec, vpp, v4l sink etc.
 * @get_vframe	: get the video frame from caller's fifo.
 * @put_vframe	: put the video frame to caller's fifo.
 * @fill_buffer	: submit the buffer into next process module.
 */
struct task_ops_s {
	enum task_type_e type;
	void	(*get_vframe) (void *caller, struct vframe_s **vf);
	void	(*put_vframe) (void *caller, struct vframe_s *vf);
	void	(*fill_buffer) (void *v4l_ctx, void *fb_ctx);
};

/*
 * struct task_item_s - items of the task chain.
 * @node	: list node of the specific task item.
 * @ref		: reference count of item be used by others.
 * @name	: name of task item, map with task type.
 * @is_active	: indicate this item whether is active.
 * @vframe[3]	: store the vframes that get from caller.
 * @task	: the context of the task chain.
 * @caller	: it's the handle, meght it's dec, vpp or v4l-sink etc.
 * @ops		: sets of interface which attach from task item.
 */
struct task_item_s {
	struct list_head	node;
	struct kref		ref;
	const u8		*name;
	bool			is_active;
	void			*vframe[3];
	struct task_chain_s	*task;
	void			*caller;
	struct task_ops_s	*ops;
};

/*
 * struct task_chain_s - the manager struct of the task chain.
 * @list_item	: all task items be attached are store in the list.
 * @node	: will register to the task chain pool.
 * @ref		: reference count of task chain be used by others.
 * @slock	: used for list item write and read safely.
 * @id		: it's vb index to be a mark used for task chain.
 * @ctx		: the context of the v4l driver.
 * @obj		: the object managed by task chain.
 * @direction	: direction incluse 2 flows submit & recycle.
 * @cur_type	: the latest item type before a new item be attached.
 * @map		: the map store the pipeline information.
 * @attach	: attach a new item to task chain.
 * @submit	: submit the finish item to next item module.
 * @recycle	: if item's date was consumed will be recycled to item.
 */
struct task_chain_s {
	struct list_head	list_item;
	struct list_head	node;
	struct kref		ref;
	spinlock_t		slock;
	int			id;
	void			*ctx;
	void			*obj;
	enum task_dir_e		direction;
	enum task_type_e	cur_type;
	u8			map[2][8];

	void	(*attach) (struct task_chain_s *, struct task_ops_s *, void *);
	void	(*submit) (struct task_chain_s *, enum task_type_e);
	void	(*recycle) (struct task_chain_s *, enum task_type_e);
};


int task_chain_init(struct task_chain_s **task_out,
		     void *v4l_ctx,
		     void *obj,
		     int vb_idx);
void task_order_attach(struct task_chain_s *task,
		       struct task_ops_s *ops,
		       void *caller);
void task_chain_clean(struct task_chain_s *task);
void task_chain_release(struct task_chain_s *task);
void task_chain_show(struct task_chain_s *task);
void task_chain_update_object(struct task_chain_s *task, void *obj);

#endif //AML_TASK_CHAIN_H

