GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / media / platform / mediatek / vcodec / venc_drv_if.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2016 MediaTek Inc.
4  * Author: Daniel Hsiao <daniel.hsiao@mediatek.com>
5  *              Jungchang Tsao <jungchang.tsao@mediatek.com>
6  *              Tiffany Lin <tiffany.lin@mediatek.com>
7  */
8
9 #ifndef _VENC_DRV_IF_H_
10 #define _VENC_DRV_IF_H_
11
12 #include "mtk_vcodec_drv.h"
13 #include "mtk_vcodec_util.h"
14
15 /*
16  * enum venc_yuv_fmt - The type of input yuv format
17  * (VPU related: If you change the order, you must also update the VPU codes.)
18  * @VENC_YUV_FORMAT_I420: I420 YUV format
19  * @VENC_YUV_FORMAT_YV12: YV12 YUV format
20  * @VENC_YUV_FORMAT_NV12: NV12 YUV format
21  * @VENC_YUV_FORMAT_NV21: NV21 YUV format
22  */
23 enum venc_yuv_fmt {
24         VENC_YUV_FORMAT_I420 = 3,
25         VENC_YUV_FORMAT_YV12 = 5,
26         VENC_YUV_FORMAT_NV12 = 6,
27         VENC_YUV_FORMAT_NV21 = 7,
28 };
29
30 /*
31  * enum venc_start_opt - encode frame option used in venc_if_encode()
32  * @VENC_START_OPT_ENCODE_SEQUENCE_HEADER: encode SPS/PPS for H264
33  * @VENC_START_OPT_ENCODE_FRAME: encode normal frame
34  */
35 enum venc_start_opt {
36         VENC_START_OPT_ENCODE_SEQUENCE_HEADER,
37         VENC_START_OPT_ENCODE_FRAME,
38 };
39
40 /*
41  * enum venc_set_param_type - The type of set parameter used in
42  *                                                    venc_if_set_param()
43  * (VPU related: If you change the order, you must also update the VPU codes.)
44  * @VENC_SET_PARAM_ENC: set encoder parameters
45  * @VENC_SET_PARAM_FORCE_INTRA: force an intra frame
46  * @VENC_SET_PARAM_ADJUST_BITRATE: adjust bitrate (in bps)
47  * @VENC_SET_PARAM_ADJUST_FRAMERATE: set frame rate
48  * @VENC_SET_PARAM_GOP_SIZE: set IDR interval
49  * @VENC_SET_PARAM_INTRA_PERIOD: set I frame interval
50  * @VENC_SET_PARAM_SKIP_FRAME: set H264 skip one frame
51  * @VENC_SET_PARAM_PREPEND_HEADER: set H264 prepend SPS/PPS before IDR
52  * @VENC_SET_PARAM_TS_MODE: set VP8 temporal scalability mode
53  */
54 enum venc_set_param_type {
55         VENC_SET_PARAM_ENC,
56         VENC_SET_PARAM_FORCE_INTRA,
57         VENC_SET_PARAM_ADJUST_BITRATE,
58         VENC_SET_PARAM_ADJUST_FRAMERATE,
59         VENC_SET_PARAM_GOP_SIZE,
60         VENC_SET_PARAM_INTRA_PERIOD,
61         VENC_SET_PARAM_SKIP_FRAME,
62         VENC_SET_PARAM_PREPEND_HEADER,
63         VENC_SET_PARAM_TS_MODE,
64 };
65
66 /*
67  * struct venc_enc_prm - encoder settings for VENC_SET_PARAM_ENC used in
68  *                                        venc_if_set_param()
69  * @input_fourcc: input yuv format
70  * @h264_profile: V4L2 defined H.264 profile
71  * @h264_level: V4L2 defined H.264 level
72  * @width: image width
73  * @height: image height
74  * @buf_width: buffer width
75  * @buf_height: buffer height
76  * @frm_rate: frame rate in fps
77  * @intra_period: intra frame period
78  * @bitrate: target bitrate in bps
79  * @gop_size: group of picture size
80  */
81 struct venc_enc_param {
82         enum venc_yuv_fmt input_yuv_fmt;
83         unsigned int h264_profile;
84         unsigned int h264_level;
85         unsigned int width;
86         unsigned int height;
87         unsigned int buf_width;
88         unsigned int buf_height;
89         unsigned int frm_rate;
90         unsigned int intra_period;
91         unsigned int bitrate;
92         unsigned int gop_size;
93 };
94
95 /**
96  * struct venc_frame_info - per-frame information to pass to the firmware.
97  *
98  * @frm_count:          sequential number for this frame
99  * @skip_frm_count:     number of frames skipped so far while decoding
100  * @frm_type:           type of the frame, from enum venc_h264_frame_type
101  */
102 struct venc_frame_info {
103         unsigned int frm_count;         /* per frame update */
104         unsigned int skip_frm_count;    /* per frame update */
105         unsigned int frm_type;          /* per frame update */
106 };
107
108 /*
109  * struct venc_frm_buf - frame buffer information used in venc_if_encode()
110  * @fb_addr: plane frame buffer addresses
111  */
112 struct venc_frm_buf {
113         struct mtk_vcodec_fb fb_addr[MTK_VCODEC_MAX_PLANES];
114 };
115
116 /*
117  * struct venc_done_result - This is return information used in venc_if_encode()
118  * @bs_size: output bitstream size
119  * @is_key_frm: output is key frame or not
120  */
121 struct venc_done_result {
122         unsigned int bs_size;
123         bool is_key_frm;
124 };
125
126 extern const struct venc_common_if venc_h264_if;
127 extern const struct venc_common_if venc_vp8_if;
128
129 /*
130  * venc_if_init - Create the driver handle
131  * @ctx: device context
132  * @fourcc: encoder input format
133  * Return: 0 if creating handle successfully, otherwise it is failed.
134  */
135 int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc);
136
137 /*
138  * venc_if_deinit - Release the driver handle
139  * @ctx: device context
140  * Return: 0 if releasing handle successfully, otherwise it is failed.
141  */
142 int venc_if_deinit(struct mtk_vcodec_ctx *ctx);
143
144 /*
145  * venc_if_set_param - Set parameter to driver
146  * @ctx: device context
147  * @type: parameter type
148  * @in: input parameter
149  * Return: 0 if setting param successfully, otherwise it is failed.
150  */
151 int venc_if_set_param(struct mtk_vcodec_ctx *ctx,
152                       enum venc_set_param_type type,
153                       struct venc_enc_param *in);
154
155 /*
156  * venc_if_encode - Encode one frame
157  * @ctx: device context
158  * @opt: encode frame option
159  * @frm_buf: input frame buffer information
160  * @bs_buf: output bitstream buffer infomraiton
161  * @result: encode result
162  * Return: 0 if encoding frame successfully, otherwise it is failed.
163  */
164 int venc_if_encode(struct mtk_vcodec_ctx *ctx,
165                    enum venc_start_opt opt,
166                    struct venc_frm_buf *frm_buf,
167                    struct mtk_vcodec_mem *bs_buf,
168                    struct venc_done_result *result);
169
170 #endif /* _VENC_DRV_IF_H_ */