linux/drivers/media/platform/mtk-vcodec/venc_drv_if.h
<<
>>
Prefs
   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