| /* |
| * Copyright (c) 2016 MediaTek Inc. |
| * Author: Daniel Hsiao <daniel.hsiao@mediatek.com> |
| * Jungchang Tsao <jungchang.tsao@mediatek.com> |
| * Tiffany Lin <tiffany.lin@mediatek.com> |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #ifndef _VENC_DRV_IF_H_ |
| #define _VENC_DRV_IF_H_ |
| |
| #include "mtk_vcodec_drv.h" |
| #include "mtk_vcodec_util.h" |
| |
| /* |
| * enum venc_yuv_fmt - The type of input yuv format |
| * (VPU related: If you change the order, you must also update the VPU codes.) |
| * @VENC_YUV_FORMAT_I420: I420 YUV format |
| * @VENC_YUV_FORMAT_YV12: YV12 YUV format |
| * @VENC_YUV_FORMAT_NV12: NV12 YUV format |
| * @VENC_YUV_FORMAT_NV21: NV21 YUV format |
| */ |
| enum venc_yuv_fmt { |
| VENC_YUV_FORMAT_I420 = 3, |
| VENC_YUV_FORMAT_YV12 = 5, |
| VENC_YUV_FORMAT_NV12 = 6, |
| VENC_YUV_FORMAT_NV21 = 7, |
| }; |
| |
| /* |
| * enum venc_start_opt - encode frame option used in venc_if_encode() |
| * @VENC_START_OPT_ENCODE_SEQUENCE_HEADER: encode SPS/PPS for H264 |
| * @VENC_START_OPT_ENCODE_FRAME: encode normal frame |
| */ |
| enum venc_start_opt { |
| VENC_START_OPT_ENCODE_SEQUENCE_HEADER, |
| VENC_START_OPT_ENCODE_FRAME, |
| }; |
| |
| /* |
| * enum venc_set_param_type - The type of set parameter used in |
| * venc_if_set_param() |
| * (VPU related: If you change the order, you must also update the VPU codes.) |
| * @VENC_SET_PARAM_ENC: set encoder parameters |
| * @VENC_SET_PARAM_FORCE_INTRA: force an intra frame |
| * @VENC_SET_PARAM_ADJUST_BITRATE: adjust bitrate (in bps) |
| * @VENC_SET_PARAM_ADJUST_FRAMERATE: set frame rate |
| * @VENC_SET_PARAM_GOP_SIZE: set IDR interval |
| * @VENC_SET_PARAM_INTRA_PERIOD: set I frame interval |
| * @VENC_SET_PARAM_SKIP_FRAME: set H264 skip one frame |
| * @VENC_SET_PARAM_PREPEND_HEADER: set H264 prepend SPS/PPS before IDR |
| * @VENC_SET_PARAM_TS_MODE: set VP8 temporal scalability mode |
| */ |
| enum venc_set_param_type { |
| VENC_SET_PARAM_ENC, |
| VENC_SET_PARAM_FORCE_INTRA, |
| VENC_SET_PARAM_ADJUST_BITRATE, |
| VENC_SET_PARAM_ADJUST_FRAMERATE, |
| VENC_SET_PARAM_GOP_SIZE, |
| VENC_SET_PARAM_INTRA_PERIOD, |
| VENC_SET_PARAM_SKIP_FRAME, |
| VENC_SET_PARAM_PREPEND_HEADER, |
| VENC_SET_PARAM_TS_MODE, |
| }; |
| |
| /* |
| * struct venc_enc_prm - encoder settings for VENC_SET_PARAM_ENC used in |
| * venc_if_set_param() |
| * @input_fourcc: input yuv format |
| * @h264_profile: V4L2 defined H.264 profile |
| * @h264_level: V4L2 defined H.264 level |
| * @width: image width |
| * @height: image height |
| * @buf_width: buffer width |
| * @buf_height: buffer height |
| * @frm_rate: frame rate in fps |
| * @intra_period: intra frame period |
| * @bitrate: target bitrate in bps |
| * @gop_size: group of picture size |
| */ |
| struct venc_enc_param { |
| enum venc_yuv_fmt input_yuv_fmt; |
| unsigned int h264_profile; |
| unsigned int h264_level; |
| unsigned int width; |
| unsigned int height; |
| unsigned int buf_width; |
| unsigned int buf_height; |
| unsigned int frm_rate; |
| unsigned int intra_period; |
| unsigned int bitrate; |
| unsigned int gop_size; |
| }; |
| |
| /* |
| * struct venc_frm_buf - frame buffer information used in venc_if_encode() |
| * @fb_addr: plane frame buffer addresses |
| */ |
| struct venc_frm_buf { |
| struct mtk_vcodec_fb fb_addr[MTK_VCODEC_MAX_PLANES]; |
| }; |
| |
| /* |
| * struct venc_done_result - This is return information used in venc_if_encode() |
| * @bs_size: output bitstream size |
| * @is_key_frm: output is key frame or not |
| */ |
| struct venc_done_result { |
| unsigned int bs_size; |
| bool is_key_frm; |
| }; |
| |
| /* |
| * venc_if_init - Create the driver handle |
| * @ctx: device context |
| * @fourcc: encoder input format |
| * Return: 0 if creating handle successfully, otherwise it is failed. |
| */ |
| int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc); |
| |
| /* |
| * venc_if_deinit - Release the driver handle |
| * @ctx: device context |
| * Return: 0 if releasing handle successfully, otherwise it is failed. |
| */ |
| int venc_if_deinit(struct mtk_vcodec_ctx *ctx); |
| |
| /* |
| * venc_if_set_param - Set parameter to driver |
| * @ctx: device context |
| * @type: parameter type |
| * @in: input parameter |
| * Return: 0 if setting param successfully, otherwise it is failed. |
| */ |
| int venc_if_set_param(struct mtk_vcodec_ctx *ctx, |
| enum venc_set_param_type type, |
| struct venc_enc_param *in); |
| |
| /* |
| * venc_if_encode - Encode one frame |
| * @ctx: device context |
| * @opt: encode frame option |
| * @frm_buf: input frame buffer information |
| * @bs_buf: output bitstream buffer infomraiton |
| * @result: encode result |
| * Return: 0 if encoding frame successfully, otherwise it is failed. |
| */ |
| int venc_if_encode(struct mtk_vcodec_ctx *ctx, |
| enum venc_start_opt opt, |
| struct venc_frm_buf *frm_buf, |
| struct mtk_vcodec_mem *bs_buf, |
| struct venc_done_result *result); |
| |
| #endif /* _VENC_DRV_IF_H_ */ |