PassengerStatistics/3rdparty/rw_mpp/include/rw_mpp_api.h

638 lines
19 KiB
C
Raw Permalink Normal View History

2024-03-12 14:46:37 +08:00
/*
* Copyright(C) 2023 Reconova Information Technologies Co., Ltd.
* All rights reserved.
*
* Hi3516DV500收流封装
*
* Created by Cyberman Wu on Sep 28th, 2023.
*
*/
#ifndef __RW_MPP_API_H__
#define __RW_MPP_API_H__
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
///////////////////////////////////////////////////////////////////////////////
// 编码相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
#define NR__VENC_CHN 4
typedef
enum VENC_CODEC_type
{
CODEC_H264 = 0,
CODEC_H265 = 1,
CODEC_MJPEG = 2
} VENC_CODEC_t;
typedef
enum VENC_PROFILE
{
H264_baseline = 0,
H264_main = 1,
H264_high = 2,
H265_main = 0,
MJPEG_baseline = 0
} VENC_PROFILE_t;
typedef
enum VENC_RC
{
RC_FIXQP = 0,
RC_VBR = 1,
} VENC_RC_t;
/*
* H.264/H.265
* MJPEG之后我们还是用这个数据结构IQp
* [1, 99]
*
* ***H.264/H.265MJPEG则是值
*
*/
typedef
struct venc_rc_fixQp
{
int IQp; /* RW; Range:[0, 51]; qp of the I frame (H.264/H.265) */
/* RW; Range:[1, 99]; image quality. (MJPEG) */
int PQp; /* RW; Range:[0, 51]; qp of the P frame (H.264/H.265) */
int BQp; /* RW; Range:[0, 51]; qp of the B frame (H.264/H.265) */
} S_venc_rc_fixQp;
/*
* H.264/H.265
* MJPEG之后我们还是用这个数据结构minIQp/maxIQp
* [1, 99]
*
* ***H.264/H.265MJPEG则是值
*
*/
typedef
struct venc_rc_vbr
{
// max_bitrate单位是Kbps。
int max_bitrate; /* RW; Range:[2, (160 * 1024)]编码器输出最大码率单位是kbps。 */
int stats_time; /* RW; Range:[1, 60],单位是秒。 */
// 这些高级属性不再支持配置。
#if 0
// 下面的参数在海思里面是单独配置的,可以不配置而使用系统
// 缺省值或者是根据码流以及图像大小、帧率自动计算的。int src_img_spec, int dst_img_spec
// 如果全部设置为-1表示使用缺省缺省值不自己进行配置。
int minIQp; /* RW; Range:[0, 51]; the min I qp (H.264/H.265) */
/* RW; Range:[1, 99]; min image quality allowed (MJPEG)*/
int maxIQp; /* RW; Range:(MinIQp, 51]; the max I qp (H.264/H.265) */
/* RW; Range:[MinIQp, 99]; max image quailty allowed (MJPEG) */
int minQp; /* RW; Range:[0, 51]; the min P B qp (H.264/H.265) */
int maxQp; /* RW; Range:(MinQp, 51]; the max P B qp (H.264/H.265) */
#endif
} S_venc_rc_vbr;
typedef
struct venc_config
{
/*
*
*/
// H.264 or H.265 or MJPEG
VENC_CODEC_t codec;
VENC_PROFILE_t profile;
// 输入图像不严格要求,但限制它的最大值有助于节省存储,通常我们直接设置为进入
// 图像的分辨率。
int raw_max_width;
int raw_max_height;
// 编码输出的图像大小。
int width;
int height;
/* Group of Picture
* H.264/H.265GOP除了帧间隔之前还有其它一些属性
*
* RC类型的配置里面GOP则是配置了其它一些
*
*/
// 关键帧间隔。对MJPEG编码无意义。
int gop;
/*
*
* rate control
* 使
*
* 使VENC的帧率
*
*/
VENC_RC_t rc_type;
// 编码输出的帧率。
int framerate;
// 这个是指向一个S_venc_rc_fixQp或者S_venc_rc_vbr的结构根据前面的
// rc_type来确定。如果这个指针为NULL表示使用库里面的缺省配置。
void *rc_param;
} S_venc_config;
/*
*
*/
typedef
struct mpp_venc_frame
{
uint8_t *data;
uint32_t len;
int is_key_frame;
void *priv;
} S_mpp_venc_frame;
///////////////////////////////////////////////////////////////////////////////
// 编码相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// 解码相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
#define NR__VDEC_CHN 4
/*
* FRAME模式STREAM
*
*
* FRAME模式输出的解码图像帧的PTS保留了发送时的PTSSTREAM模式固定
* 0MPP导致的
* PTS影响不大
*/
#define VDEC_SEND__FRAME 0
#define VDEC_SEND__STREAM 1
typedef
struct vdec_config
{
// H.264 or H.265 or MJPEG
VENC_CODEC_t codec;
// 编码图像的大小。
int raw_max_width;
int raw_max_height;
// 输出图像大小。
int width;
int height;
int send_mode;
} S_vdec_config;
typedef
struct mpp_vdec_frame
{
uint8_t *data;
uint32_t len;
// 如果输出一个非0值发送接口就使用这里输入的值如果输出0则发送接口
// 内部自动生成一个PTS对于STREAM模式PTS无效
uint64_t pts;
} S_mpp_vdec_frame;
///////////////////////////////////////////////////////////////////////////////
// 解码相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// JPEG相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
/*
* JPEG图像
*/
typedef
struct jpeg_img
{
uint8_t *data;
int size;
} S_jpeg_img;
///////////////////////////////////////////////////////////////////////////////
// JPEG相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// 收流相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
#define NR__VIDEO_CHN 1
#define PIX_FMT__NV21 0
#define PIX_FMT__GRAY 1
/*
* NV12YVU420SP
*/
typedef
struct mpp_img
{
// 我们同时传物理地址,这样如果能直接使用物理地址就可以少一此处理,
// 而不能使用物理地址就忽略它。
uint64_t phy_addr;
// 数据格式有可能是NV21或GRAY具体由后面的pix_fmt来确定。对于灰度
// 也确保了指向的空间大小是NV21只是灰度数据后面是随机数据。
// 这个实际上比较理想的是直接在收流部分把它封装掉,但因为这个项目
// 追求极致性能,而有些算法能直接用灰度处理,所以这里只保留空间和
// 给出图像格式具体是否需要用memset()来处理后面VU部分由实际应用sample_vio_sys_init
// 根据算法来确定。
union
{
uint8_t *nv21;
uint8_t *gray;
};
int width;
int height;
// 图像一行的实际长度如果不等于width说明有padding。这个是图像处理中
// 常用的手段。
int linesize;
int pix_fmt;
// 这个或者增加接口通过priv来获取也可以但使用起来不太方便。严格来说
// 在图像信息中增加这个时间信息有些怪异,不过目前我们先这样用起来。
uint64_t pts;
void *priv;
} S_mpp_img;
typedef
struct video_cfg
{
// 这两个配置sensor的属性配置为-1表示使用缺省值如果有多种属性可以
// 选择的话就配置为最相近的。
// 具体内部的旋转等,我们具体的产品上做不同实现,目前在这个库中封装死。
int sns_w;
int sns_h;
// 输出图像大小。
int img_w;
int img_h;
} S_video_cfg;
///////////////////////////////////////////////////////////////////////////////
// 收流相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// 缩放相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
#define NR__VSCALE_CHN 4
typedef
struct vscale_cfg
{
int src_max_width;
int src_max_height;
int width;
int height;
} S_vscale_cfg;
///////////////////////////////////////////////////////////////////////////////
// 缩放相关的一些数据结构 //
///////////////////////////////////////////////////////////////////////////////
/*
* MPP功能
* VB配置的参数
* buffer参数还没太想明白
*
*
*
*
*
*
* 0
*
*/
int rw_mpp__init(void);
/*
*
*
*
* ()
*
*
* 0
*
*/
int rw_mpp__finalize(void);
/*
* 0
* 0
*
*
* level -
*
*
* 0
*
*/
int rw_mpp__set_debug(int level);
/*
*
*
*
* vid - [0, NR__VIDEO_CHN]
* vcfg -
*
*
* 0
*
*/
int rw_mpp__video_start(int vid, S_video_cfg *vcfg);
/*
*
*
*
* vid - [0, NR__VIDEO_CHN]
*
*
* 0
*
*/
int rw_mpp__video_stop(int vid);
/*
* rw_mpp_free()
*
*
*
* vid - [0, NR__VIDEO_CHN]
* ori_img - []
* tmout_ms - ms
*
*
* 0
*
*/
int rw_mpp__video_recv(int vid, S_mpp_img *img, int tmout_ms);
/*
* rw_mpp_recv获取的帧使rw_mpp_recv()
*
*
* vid - [0, NR__VIDEO_CHN]
* img -
*
*
* 0
*
*/
int rw_mpp__video_free(int vid, S_mpp_img *img);
/*
*
*
*
* sid - [0, NR__SCALER_CHN)
* cfg -
*
*
* 00
*/
int rw_mpp__vscale_start(int sid, S_vscale_cfg *cfg);
/*
*
*
*
* sid - [0, NR__SCALER_CHN)
*
*
* 00
*/
int rw_mpp__vscale_stop(int sid);
/*
*
*
*
* sid - [0, NR__SCALER_CHN)
* src_img -
* scaled_img -
*
*
* 00
*/
int rw_mpp__vscale_exec(int sid, S_mpp_img *src_img, S_mpp_img *scaled_img);
/*
*
*
*
* sid - [0, NR__SCALER_CHN)
* scaled_img -
*
*
*
* 00
*/
int rw_mpp__vscale_free(int sid, S_mpp_img *scaled_img);
/*
*
*
*
* chn - [0, NR__VENC_CHN)
* cfg -
* vid - video-1rw_mpp_vend_send()
*
*
*
*
* 0
*
*/
int rw_mpp__venc_start(int chn, S_venc_config *cfg, int vid);
/*
*
*
*
* chn - [0, NR__VENC_CHN)
*
*
* 0
*
*/
int rw_mpp__venc_stop(int chn);
/*
* vid发送会失败
* vid的视频编码
* rw_mpp_venc_recv()
*
*
* chn - [0, 4)
* img - rw_mpp__video_recv()
*
*/
int rw_mpp__venc_send(int chn, S_mpp_img *img);
/*
*
*
*
* chn - [0, 4)
* frame - H.264/H.265NAL格式MJPEG是
* JPEG图像数据
*/
int rw_mpp__venc_recv(int chn, S_mpp_venc_frame *frame, int tmout_ms);
/*
* rw_mpp__venc_recv()
*/
int rw_mpp__venc_free(int chn, S_mpp_venc_frame *frame);
/*
* 使VB
*/
int rw_mpp__vdec_init(void);
/*
*
*/
int rw_mpp__vdec_finalize(void);
/*
*
*
*
* chn - [0, NR__VDEC_CHN)
* cfg -
*
*
* 0
*
*/
int rw_mpp__vdec_start(int chn, S_vdec_config *cfg);
/*
*
*
*
* chn - [0, NR__VDEC_CHN)
*
*
* 0
*
*/
int rw_mpp__vdec_stop(int chn);
/*
*
*
*
* chn - [0, NR__VDEC_CHN)
* frame -
*/
int rw_mpp__vdec_send(int chn, S_mpp_vdec_frame *frame);
/*
*
*
*
*/
int rw_mpp__vdec_send_end(int chn);
/*
*
*
* chn - [0, NR__VDEC_CHN)
* img -
*/
int rw_mpp__vdec_recv(int chn, S_mpp_img *img, int tmout_ms);
/*
* rw_mpp__vdec_recv()
*/
int rw_mpp__vdec_free(int chn, S_mpp_img *img);
/*
* JPEG编码
*
*
* max_width -
* max_height -
*
*
* 00
*/
int rw_mpp__jpeg_init(int max_width, int max_height);
/*
* JPEG编码
*
*
*
*
*
* 00
*/
int rw_mpp__jpeg_finalize(void);
/*
*
*
*
* img - Gray或NV21vscale或者video的
* bufferbuffer这
* priv传NULL
* 0
* jpeg - JPEG图像JPEG图像的信息使
*
*
* 00
*/
int rw_mpp__jpeg_enc(S_mpp_img *img, int quality, S_jpeg_img *jpeg);
/*
*
*
*
* jpeg - JPEG图像
*
*
* 00
*/
int rw_mpp__jpeg_free(S_jpeg_img *jpeg);
#ifdef __cplusplus
}
#endif
#endif /* __RW_MPP_API_H__ */