mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 12:43:55 +08:00
8b8130f0c7
The encoder driver has no need to do any CPU access to the source frame buffers. Use a separate structure for holding DMA addresses and sizes for those and remove, so we do not end up introducing any erroneous dereferences of those VAs. This fixes DMA-buf import from exporters that do not provide contiguous kernel mappings, which includes the MTK DRM driver. Signed-off-by: Tomasz Figa <tfiga@chromium.org> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
164 lines
4.8 KiB
C
164 lines
4.8 KiB
C
/*
|
|
* 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_ */
|