Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | /* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2016 MediaTek Inc. * Author: Daniel Hsiao <daniel.hsiao@mediatek.com> * Jungchang Tsao <jungchang.tsao@mediatek.com> * Tiffany Lin <tiffany.lin@mediatek.com> */ #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_frame_info - per-frame information to pass to the firmware. * * @frm_count: sequential number for this frame * @skip_frm_count: number of frames skipped so far while decoding * @frm_type: type of the frame, from enum venc_h264_frame_type */ struct venc_frame_info { unsigned int frm_count; /* per frame update */ unsigned int skip_frm_count; /* per frame update */ unsigned int frm_type; /* per frame update */ }; /* * 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; }; extern const struct venc_common_if venc_h264_if; extern const struct venc_common_if venc_vp8_if; /* * 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_ */ |