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_ */ 164