Merge tag 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford...
[deliverable/linux.git] / drivers / media / platform / mtk-vcodec / venc_drv_if.h
CommitLineData
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 */
32enum 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 */
44enum 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 */
63enum 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 */
90struct 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 */
108struct 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 */
117struct 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 */
128int 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 */
135int 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 */
144int 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 */
157int 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_ */
This page took 0.039927 seconds and 5 git commands to generate.