forked from Minki/linux
1802d0beec
Based on 1 normalized pattern(s): 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 extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 655 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Richard Fontana <rfontana@redhat.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070034.575739538@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
155 lines
4.4 KiB
C
155 lines
4.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* 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_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_ */
|