Commit | Line | Data |
---|---|---|
4e855a6e TL |
1 | /* |
2 | * Copyright (c) 2016 MediaTek Inc. | |
3 | * Author: Daniel Hsiao <daniel.hsiao@mediatek.com> | |
4 | * Jungchang Tsao <jungchang.tsao@mediatek.com> | |
5 | * Tiffany Lin <tiffany.lin@mediatek.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or | |
8 | * modify | |
9 | * it under the terms of the GNU General Public License version 2 as | |
10 | * published by the Free Software Foundation. | |
11 | * | |
12 | * This program is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | */ | |
17 | ||
18 | #ifndef _VENC_DRV_IF_H_ | |
19 | #define _VENC_DRV_IF_H_ | |
20 | ||
21 | #include "mtk_vcodec_drv.h" | |
22 | #include "mtk_vcodec_util.h" | |
23 | ||
24 | /* | |
25 | * enum venc_yuv_fmt - The type of input yuv format | |
26 | * (VPU related: If you change the order, you must also update the VPU codes.) | |
27 | * @VENC_YUV_FORMAT_I420: I420 YUV format | |
28 | * @VENC_YUV_FORMAT_YV12: YV12 YUV format | |
29 | * @VENC_YUV_FORMAT_NV12: NV12 YUV format | |
30 | * @VENC_YUV_FORMAT_NV21: NV21 YUV format | |
31 | */ | |
32 | enum venc_yuv_fmt { | |
33 | VENC_YUV_FORMAT_I420 = 3, | |
34 | VENC_YUV_FORMAT_YV12 = 5, | |
35 | VENC_YUV_FORMAT_NV12 = 6, | |
36 | VENC_YUV_FORMAT_NV21 = 7, | |
37 | }; | |
38 | ||
39 | /* | |
40 | * enum venc_start_opt - encode frame option used in venc_if_encode() | |
41 | * @VENC_START_OPT_ENCODE_SEQUENCE_HEADER: encode SPS/PPS for H264 | |
42 | * @VENC_START_OPT_ENCODE_FRAME: encode normal frame | |
43 | */ | |
44 | enum venc_start_opt { | |
45 | VENC_START_OPT_ENCODE_SEQUENCE_HEADER, | |
46 | VENC_START_OPT_ENCODE_FRAME, | |
47 | }; | |
48 | ||
49 | /* | |
50 | * enum venc_set_param_type - The type of set parameter used in | |
51 | * venc_if_set_param() | |
52 | * (VPU related: If you change the order, you must also update the VPU codes.) | |
53 | * @VENC_SET_PARAM_ENC: set encoder parameters | |
54 | * @VENC_SET_PARAM_FORCE_INTRA: force an intra frame | |
55 | * @VENC_SET_PARAM_ADJUST_BITRATE: adjust bitrate (in bps) | |
56 | * @VENC_SET_PARAM_ADJUST_FRAMERATE: set frame rate | |
57 | * @VENC_SET_PARAM_GOP_SIZE: set IDR interval | |
58 | * @VENC_SET_PARAM_INTRA_PERIOD: set I frame interval | |
59 | * @VENC_SET_PARAM_SKIP_FRAME: set H264 skip one frame | |
60 | * @VENC_SET_PARAM_PREPEND_HEADER: set H264 prepend SPS/PPS before IDR | |
61 | * @VENC_SET_PARAM_TS_MODE: set VP8 temporal scalability mode | |
62 | */ | |
63 | enum venc_set_param_type { | |
64 | VENC_SET_PARAM_ENC, | |
65 | VENC_SET_PARAM_FORCE_INTRA, | |
66 | VENC_SET_PARAM_ADJUST_BITRATE, | |
67 | VENC_SET_PARAM_ADJUST_FRAMERATE, | |
68 | VENC_SET_PARAM_GOP_SIZE, | |
69 | VENC_SET_PARAM_INTRA_PERIOD, | |
70 | VENC_SET_PARAM_SKIP_FRAME, | |
71 | VENC_SET_PARAM_PREPEND_HEADER, | |
72 | VENC_SET_PARAM_TS_MODE, | |
73 | }; | |
74 | ||
75 | /* | |
76 | * struct venc_enc_prm - encoder settings for VENC_SET_PARAM_ENC used in | |
77 | * venc_if_set_param() | |
78 | * @input_fourcc: input yuv format | |
79 | * @h264_profile: V4L2 defined H.264 profile | |
80 | * @h264_level: V4L2 defined H.264 level | |
81 | * @width: image width | |
82 | * @height: image height | |
83 | * @buf_width: buffer width | |
84 | * @buf_height: buffer height | |
85 | * @frm_rate: frame rate in fps | |
86 | * @intra_period: intra frame period | |
87 | * @bitrate: target bitrate in bps | |
88 | * @gop_size: group of picture size | |
89 | */ | |
90 | struct venc_enc_param { | |
91 | enum venc_yuv_fmt input_yuv_fmt; | |
92 | unsigned int h264_profile; | |
93 | unsigned int h264_level; | |
94 | unsigned int width; | |
95 | unsigned int height; | |
96 | unsigned int buf_width; | |
97 | unsigned int buf_height; | |
98 | unsigned int frm_rate; | |
99 | unsigned int intra_period; | |
100 | unsigned int bitrate; | |
101 | unsigned int gop_size; | |
102 | }; | |
103 | ||
104 | /* | |
105 | * struct venc_frm_buf - frame buffer information used in venc_if_encode() | |
106 | * @fb_addr: plane frame buffer addresses | |
107 | */ | |
108 | struct venc_frm_buf { | |
109 | struct mtk_vcodec_mem fb_addr[MTK_VCODEC_MAX_PLANES]; | |
110 | }; | |
111 | ||
112 | /* | |
113 | * struct venc_done_result - This is return information used in venc_if_encode() | |
114 | * @bs_size: output bitstream size | |
115 | * @is_key_frm: output is key frame or not | |
116 | */ | |
117 | struct venc_done_result { | |
118 | unsigned int bs_size; | |
119 | bool is_key_frm; | |
120 | }; | |
121 | ||
122 | /* | |
123 | * venc_if_init - Create the driver handle | |
124 | * @ctx: device context | |
125 | * @fourcc: encoder input format | |
126 | * Return: 0 if creating handle successfully, otherwise it is failed. | |
127 | */ | |
128 | int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc); | |
129 | ||
130 | /* | |
131 | * venc_if_deinit - Release the driver handle | |
132 | * @ctx: device context | |
133 | * Return: 0 if releasing handle successfully, otherwise it is failed. | |
134 | */ | |
135 | int venc_if_deinit(struct mtk_vcodec_ctx *ctx); | |
136 | ||
137 | /* | |
138 | * venc_if_set_param - Set parameter to driver | |
139 | * @ctx: device context | |
140 | * @type: parameter type | |
141 | * @in: input parameter | |
142 | * Return: 0 if setting param successfully, otherwise it is failed. | |
143 | */ | |
144 | int venc_if_set_param(struct mtk_vcodec_ctx *ctx, | |
145 | enum venc_set_param_type type, | |
146 | struct venc_enc_param *in); | |
147 | ||
148 | /* | |
149 | * venc_if_encode - Encode one frame | |
150 | * @ctx: device context | |
151 | * @opt: encode frame option | |
152 | * @frm_buf: input frame buffer information | |
153 | * @bs_buf: output bitstream buffer infomraiton | |
154 | * @result: encode result | |
155 | * Return: 0 if encoding frame successfully, otherwise it is failed. | |
156 | */ | |
157 | int venc_if_encode(struct mtk_vcodec_ctx *ctx, | |
158 | enum venc_start_opt opt, | |
159 | struct venc_frm_buf *frm_buf, | |
160 | struct mtk_vcodec_mem *bs_buf, | |
161 | struct venc_done_result *result); | |
162 | ||
163 | #endif /* _VENC_DRV_IF_H_ */ |