VDEC功能接口
总体说明
对于一个视频码流,调用一次CreateVdecApi接口创建实例后,必须使用同一个实例调用VdecCtl接口进行视频解码,最后再调用一次DestroyVdecApi接口释放实例。
在视频解码时,如果需要从一个视频码流切换到另一个视频码流,则需要先调用DestroyVdecApi接口释放前一个码流的实例,再调用CreateVdecApi接口创建新的实例,用于处理新的视频码流。
CreateVdecApi
函数原型 |
int CreateVdecApi(IDVPPAPI*& pIDVPPAPI, int singleton) |
---|---|
功能 |
获取vdecapi实例,相当于vdec执行器句柄。调用方可以使用申请到的vdecapi实例调用CreateVdecApi接口进行视频解码,可以跨函数调用,跨线程调用。 |
输入说明 |
|
输出说明 |
输出为IDVPPAPI类型指针引用,输出可能为NULL,可能不为NULL,获取失败则为NULL,成功则不为NULL。 |
返回值说明 |
|
使用说明 |
调用方创建IDVPPAPI对象指针,初始化为NULL,调用CreateVdecApi函数将IDVPPAPI对象指针传入。如果申请成功,CreateVdecApi接口会返回DvppApi实例,否则返回NULL。调用方需要对返回值进行校验。 |
使用约束 |
调用方负责vdecapi实例的生命周期,即申请与释放,申请使用CreateVdecApi接口,释放使用DestroyVdecApi接口。 |
VdecCtl
函数原型 |
int VdecCtl(IDVPPAPI*& pIDVPPAPI, int CMD, dvppapi_ctl_msg* MSG, int singleton) |
---|---|
功能 |
使用CreateVdecApi接口创建的实例调用VdecCtl接口,控制DVPP执行器进行视频解码。 |
输入说明 |
|
输出说明 |
输出为MSG的配置信息中的输出buffer,以及VDEC的输出状态信息(都存储于MSG中)。 |
返回值说明 |
|
使用说明 |
调用方调用VdecCtl接口,传入IDVPPAPI对象指针,配置好相应功能的dvppapi_ctl_msg,并传入正确的控制命令字CMD。VDEC解码为异步方式,调用VdecCtl接口会将用户码流buffer中的数据拷贝到VDEC内部输入buffer后即返回,故调用VdecCtl接口后并不代表解码成功(仅表示数据拷贝成功),并且此接口返回后,用户码流buffer即可释放。 |
使用约束 |
对于一个视频码流,调用一次CreateVdecApi接口创建实例后,必须使用同一个实例调用VdecCtl接口进行视频解码,最后再调用一次DestroyVdecApi接口释放实例。 |
入参:vdec_in_msg
成员变量 |
说明 |
---|---|
char video_format[10] |
输入视频格式,“h264”或者“h265”,默认是“h264”, 仅支持yuv420sp(NV12、NV21)编码后的h264和h265码流。 |
char image_format[10] |
输出帧格式,“nv12”或者“nv21”,默认是“nv12”。 |
void (*call_back)(FRAME* frame,void * hiai_data) |
调用方回调函数,FRAME为vdec解码后的输出结构体,详见vdec_in_msg中的结构体和类 FRAME结构体。用户可以根据该指针获取输出结果。 建议用户在回调函数内仅调用DvppCtl接口输出yuv格式的图片数据,其它功能不建议放在回调函数内实现,因为回调函数内实现的功能太多,可能会耗时过长,导致解码过程阻塞等待资源。回调函数允许的最大耗时和帧率相关,计算公式为:最大耗时=1/帧率,例如帧率=30fps,则最大耗时=1/(30fps)=0.033s;帧率=25fps,则允许最大耗时=1/(25fps)=0.04s。 |
char* in_buffer |
输入视频码流内存,此码流为h264或h265裸码流。 用户将存放解码前码流的内存(由用户自行申请)赋值给in_buffer,调用VdecCtl接口有返回后,就可以释放存放解码前码流的buffer。 |
int32_t in_buffer_size |
输入视频码流内存大小。 |
void * hiai_data |
解码后输出结果帧回调函数的形参指针,指针指向对象由调用方定义具体的结构。 须知:
VDEC内部仅调用第一次传给VDEC的hiai_data,若要想多次使用hiai_data传送不同对象,请用下面智能指针对象。 |
std::shared_ptr<HIAI_DATA_SP> hiai_data_sp |
如果不涉及帧序号的配置,可不设置该参数,默认为NULL。如果需要设置帧序号,使用方法如下。 调用方回调函数形参指针,其中HIAI_DATA_SP为VDEC内部定义的父类,具体类HIAI_DATA_SP结构请见vdec_in_msg中的结构体和类 HIAI_DATA_SP类,用户可以继承衍生子类,使用方式可以参考实现VDEC功能。此指针指向的类对象必须设置帧序号信息,只支持一帧(必须包含I帧或P帧或B帧)对应一个帧序号,不支持多帧对应同一个帧序号,并且帧序号需以等差数列方式设置,从1开始,间隔大小为1。 使用注意点:
|
int32_t channelId |
输入码流对应的解码通道的ID,不同码流同时解码需设置不同的值,取值范围0~15。 |
void (*err_report)(VDECERR* vdecErr) |
错误上报回调函数,用于将解码过程中出现的异常通知用户,比如码流错误、硬件问题、解码器状态错误等,以便用户决定如何处理。其中形参VDECERR为VDEC内部定义结构体,具体请见vdec_in_msg中的结构体和类 VDECERR结构体。 |
bool isEOS |
码流结束标志,标识本路解码结束。用户可以不用关心此标志,默认在DestroyVdecApi接口中会将isEOS设置true,并在内部实现结束本路解码同时释放资源。若用户主动配置isEOS为true,则在调用VdecCtl接口中优先使用用户配置,结束本路解码并释放资源。具体使用请见实现VDEC功能。 |
int32_t isOneInOneOutMode |
预留参数,请保持默认值0。 |
DestroyVdecApi
函数原型 |
int DestroyVdecApi(IDVPPAPI*& pIDVPPAPI, int singleton) |
---|---|
功能 |
释放由CreateVdecApi接口创建的vdecapi实例,关闭VDEC执行器。 |
输入说明 |
输入为IDVPPAPI类型指针引用。 输入singleton为内部保留使用,为以后实现pIDVPPAPI单例预留,建议调用方当前设置为0。 |
输出说明 |
无输出。 |
返回值说明 |
|
使用说明 |
无特殊说明。 |
使用约束 |
一旦调用DestroyVdecApi接口,如果还想在继续调用VDEC,需要重新创建vdecapi实例。 |