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