更新时间:2021-03-18 GMT+08:00
分享

VdecCtl

函数原型

int VdecCtl(IDVPPAPI*& pIDVPPAPI, int CMD, dvppapi_ctl_msg* MSG, int singleton)

功能

使用CreateVdecApi接口创建的实例调用VdecCtl接口,控制DVPP执行器进行视频解码。

输入说明

  • IDVPPAPI类型指针引用。
  • 控制命令字CMD(VDEC为DVPP_CTL_VDEC_PROC)。
  • dvppapi_ctl_msg类型的vdec执行器配置信息MSG。其中此结构体中的in请见入参:vdec_in_msg
  • 输入singleton为内部保留使用,为以后实现pIDVPPAPI单例预留,建议调用方当前设置为0。

输出说明

输出为MSG的配置信息中的输出buffer,以及VDEC的输出状态信息(都存储于MSG中)。

返回值说明

  • 返回值“0”代表接口调用成功,并不代表解码成功(由于VDEC解码是异步方式)。
  • 返回值“-1”代表接口调用失败。

使用说明

调用方调用VdecCtl接口,传入IDVPPAPI对象指针,配置好相应功能的dvppapi_ctl_msg,并传入正确的控制命令字CMD。VDEC解码为异步方式,调用VdecCtl接口会将用户码流buffer中的数据拷贝到VDEC内部输入buffer后即返回,故调用VdecCtl接口后并不代表解码成功(仅表示数据拷贝成功),并且此接口返回后,用户码流buffer即可释放。

使用约束

对于一个视频码流,调用一次CreateVdecApi接口创建实例后,必须使用同一个实例调用VdecCtl接口进行视频解码,最后再调用一次DestroyVdecApi接口释放实例。

入参:vdec_in_msg

表1 入参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。

使用注意点:

  1. 在用户自定义子类hiai_data_sp对象中,不能包含需申请过大内存空间的成员变量。因为针对每路视频码流的解码,VDEC内部最多支持100个hiai_data_sp对象,如果成员变量申请的内存空间过大,可能会导致内存消耗过大;
  2. 用户自定义子类hiai_data_sp对象中若有需要申请内存空间的成员变量,在申请内存并使用完成后,需在析构函数中释放内存,避免内存泄露;
  3. 使用VDEC进行视频码流解码时,如果使用了hiai_data_sp对象,但视频码流中存在异常帧,VDEC会直接将异常帧的hiai_data_sp对象丢弃,因此建议用户在析构函数的实现代码中对这个异常情况做处理。
  4. 使用VDEC进行视频码流解码时,如果使用了hiai_data_sp对象,仅支持码流参考帧间距不超出30帧,例如解码第30帧时可以参考第1帧,但解码第31帧时不能再参考第1帧。
  5. VDEC会将用户传入的hiai_data_sp对象缓存至内部队列,队列最大长度为100。若某帧解码失败则对应的hiai_data_sp对象最快会在之后30帧解码全部返回的时刻被丢弃,例如第1帧解码失败,第1帧对应的hiai_data_sp对象会在第31帧解码结束后被丢弃;若码流中全是异常帧,则第1帧对应的hiai_data_sp对象会在第101帧开始解码时被丢弃。
  6. hiai_data_sp和hiai_data只能选其一,如果使用hiai_data_sp,则必须与channelId参数配合使用。
  7. 若码流中含有B帧,帧序号只支持按显示顺序输出,不支持按解码顺序输出。

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。

分享:

    相关文档

    相关产品