• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * Description:
19 */
20 #ifndef _AML_VCODEC_DEC_H_
21 #define _AML_VCODEC_DEC_H_
22 
23 #include <media/videobuf2-core.h>
24 #include <media/videobuf2-v4l2.h>
25 #include <linux/amlogic/media/codec_mm/codec_mm.h>
26 #include <linux/amlogic/media/video_sink/v4lvideo_ext.h>
27 #include "aml_vcodec_util.h"
28 
29 #define VCODEC_CAPABILITY_4K_DISABLED	0x10
30 #define VCODEC_DEC_4K_CODED_WIDTH	4096U
31 #define VCODEC_DEC_4K_CODED_HEIGHT	2304U
32 #define AML_VDEC_MAX_W			2048U
33 #define AML_VDEC_MAX_H			1088U
34 
35 #define AML_VDEC_IRQ_STATUS_DEC_SUCCESS	0x10000
36 #define V4L2_BUF_FLAG_LAST		0x00100000
37 
38 #define VDEC_GATHER_MEMORY_TYPE		0
39 #define VDEC_SCATTER_MEMORY_TYPE	1
40 
41 /**
42  * struct vdec_fb  - decoder frame buffer
43  * @mem_type	: gather or scatter memory.
44  * @num_planes	: used number of the plane
45  * @mem[4]	: array mem for used planes,
46  *		  mem[0]: Y, mem[1]: C/U, mem[2]: V
47  * @vf_fd	: the file handle of video frame
48  * @vf_handle	: video frame handle
49  * @status      : frame buffer status (vdec_fb_status)
50  */
51 
52 struct vdec_v4l2_buffer {
53 	int	mem_type;
54 	int	num_planes;
55 	union {
56 		struct	aml_vcodec_mem mem[4];
57 		u32	vf_fd;
58 	} m;
59 	ulong	vf_handle;
60 	u32	status;
61 };
62 
63 
64 /**
65  * struct aml_video_dec_buf - Private data related to each VB2 buffer.
66  * @b:		VB2 buffer
67  * @list:	link list
68  * @used:	Capture buffer contain decoded frame data and keep in
69  *			codec data structure
70  * @ready_to_display:	Capture buffer not display yet
71  * @queued_in_vb2:	Capture buffer is queue in vb2
72  * @queued_in_v4l2:	Capture buffer is in v4l2 driver, but not in vb2
73  *			queue yet
74  * @lastframe:		Intput buffer is last buffer - EOS
75  * @error:		An unrecoverable error occurs on this buffer.
76  * @frame_buffer:	Decode status, and buffer information of Capture buffer
77  *
78  * Note : These status information help us track and debug buffer state
79  */
80 struct aml_video_dec_buf {
81 	struct vb2_v4l2_buffer vb;
82 	struct list_head list;
83 
84 	struct vdec_v4l2_buffer frame_buffer;
85 	struct file_private_data privdata;
86 	struct codec_mm_s *mem[2];
87 	char mem_onwer[32];
88 	bool used;
89 	bool ready_to_display;
90 	bool que_in_m2m;
91 	bool queued_in_vb2;
92 	bool queued_in_v4l2;
93 	bool lastframe;
94 	bool error;
95 };
96 
97 extern const struct v4l2_ioctl_ops aml_vdec_ioctl_ops;
98 extern const struct v4l2_m2m_ops aml_vdec_m2m_ops;
99 
100 /*
101  * aml_vdec_lock/aml_vdec_unlock are for ctx instance to
102  * get/release lock before/after access decoder hw.
103  * aml_vdec_lock get decoder hw lock and set curr_ctx
104  * to ctx instance that get lock
105  */
106 void aml_vdec_unlock(struct aml_vcodec_ctx *ctx);
107 void aml_vdec_lock(struct aml_vcodec_ctx *ctx);
108 int aml_vcodec_dec_queue_init(void *priv, struct vb2_queue *src_vq,
109 			   struct vb2_queue *dst_vq);
110 void aml_vcodec_dec_set_default_params(struct aml_vcodec_ctx *ctx);
111 void aml_vcodec_dec_release(struct aml_vcodec_ctx *ctx);
112 int aml_vcodec_dec_ctrls_setup(struct aml_vcodec_ctx *ctx);
113 void vdec_device_vf_run(struct aml_vcodec_ctx *ctx);
114 void try_to_capture(struct aml_vcodec_ctx *ctx);
115 void aml_thread_notify(struct aml_vcodec_ctx *ctx,
116 	enum aml_thread_type type);
117 int aml_thread_start(struct aml_vcodec_ctx *ctx, aml_thread_func func,
118 	enum aml_thread_type type, const char *thread_name);
119 void aml_thread_stop(struct aml_vcodec_ctx *ctx);
120 void wait_vcodec_ending(struct aml_vcodec_ctx *ctx);
121 void vdec_frame_buffer_release(void *data);
122 void aml_vdec_dispatch_event(struct aml_vcodec_ctx *ctx, u32 changes);
123 void* v4l_get_vf_handle(int fd);
124 
125 #endif /* _AML_VCODEC_DEC_H_ */
126