hi_mpi_venc_get_stream
产品支持情况
| 
          产品  | 
        
          是否支持  | 
       
|---|---|
| 
          | 
        
          √  | 
       
| 
          | 
        
          √  | 
       
| 
          | 
        
          √  | 
       
| 
          | 
        
          √  | 
       
| 
          | 
        
          x  | 
       
| 
          | 
        
          x  | 
       
功能说明
获取编码的码流。
函数原型
hi_s32 hi_mpi_venc_get_stream(hi_venc_chn chn, hi_venc_stream *stream, hi_s32 milli_sec)
参数说明
| 
          参数名  | 
        
          输入/输出  | 
        
          说明  | 
       
|---|---|---|
| 
          chn  | 
        
          输入  | 
        
          编码通道号。  | 
       
| 
          stream  | 
        
          输出  | 
        
          输出码流数据的指针。 该结构体内的addr参数配置的地址为Device上的内存地址,表示输出的码流存放在Device的内存中。 
          对于以下产品,若用户需在Host上访问输出码流数据,则需要将Device中的数据传输回Host: 
           
  | 
       
| 
          milli_sec  | 
        
          输入  | 
        
          
          超时时间,单位是毫秒。 
           
  | 
       
返回值说明
- 0:成功,获取编码结果数据成功后,需调用hi_mpi_venc_release_stream接口释放码流缓存资源。 
      
本接口虽返回成功,但有可能获取到的是编码失败的数据,编码是否成功,需要查看hi_venc_stream结构体的pack成员下的len参数值,len=0表示编码失败。
 - 非0:失败,参见VENC视频编码/JPEGE图片编码返回码
 
约束说明
- 如果通道未创建,返回失败。
 - 如果stream为空,返回错误码HI_ERR_VENC_NULL_PTR。
 - 如果milli_sec小于-1,返回错误码HI_ERR_VENC_ILLEGAL_PARAM。
 - 支持超时方式获取。支持select/poll系统调用。 
      
- milli_sec = 0 时,则为非阻塞获取,即如果缓冲无数据,则返回错误码HI_ERR_VENC_BUF_EMPTY。
 - milli_sec = -1 时,则为阻塞,即如果缓冲无数据,则会等待有数据时才返回获取成功。
 - milli_sec > 0 时,则为超时,即如果缓冲无数据,则会等待用户设定的超时时间,若在设定的时间内有数据则返回获取成功,否则返回超时失败。
 
 - 支持按包或按帧方式获取码流。如果按包获取,则: 
      
- 对于JPEG编码协议, 每次获取的是一个参数包或数据包。
 - 对于H.265编码协议,每次获取的是一个NAL单元。
 
 - 码流结构体hi_venc_stream包含以下部分: 
      
- 码流包信息指针pack 
        
指向一组hi_venc_pack结构体的连续的内存空间,该空间由调用者分配。如果是按包获取,则此空间不小于sizeof(hi_venc_pack)的大小;如果按帧获取,则此空间不小于N*sizeof(hi_venc_pack)的大小,其中,N代表当前帧之中的包的个数,可以在select之后通过hi_mpi_venc_query_status接口获得。
 - 码流包个数pack_cnt 
        
在输入时,此值指定pack中hi_venc_pack结构体内存的个数。按包获取时,pack_cnt必须不小于 1;按帧获取时,pack_cnt必须不小于当前帧的包个数。在函数调用成功后,pack_cnt返回实际填充pack的包的个数。
 - 序列号seq按帧获取时是帧序列号;按包获取时为包序列号。
 - 码流特征信息,数据类型为联合体,包含了不同编码协议对应的码流特征信息h264_info/jpeg_info/h265_info,码流特征信息的输出用于支持用户的上层应用。
 - 码流高级特征信息,数据类型为联合体,包含了不同编码协议对应的码流高级特征信息h264_adv_info/h265_adv_info,码流高级特征信息的输出用于支持用户的上层应用。
 
 - 码流包信息指针pack 
        
 - 如果用户长时间不获取码流,码流缓冲区就会满。一个编码通道如果发生码流缓冲区满,就会不再启动编码,直到用户获取码流并释放码流,从而有足够的码流缓冲可以用于编码时,才开始继续编码。
 - 建议用户获取码流接口调用与释放码流的接口调用成对出现,且尽快释放码流,防止出现由于用户获取码流,释放不及时而导致的码流buffer满,停止编码。
 - 建议用户使用select方式获取码流,且按照如下的流程: 
      
- 调用hi_mpi_venc_query_status函数查询编码通道状态;
 - 确保cur_packs和left_stream_frames同时大于0;
 - 调用malloc分配cur_packs个包信息结构体;
 - 调用hi_mpi_venc_get_stream获取编码码流;
 - 调用hi_mpi_venc_release_stream释放码流缓存。
 
 - 当one_stream_buf为1时,用户获取一帧码流时只会得到一个码流包(不包含用户数据)的地址,即pack_cnt为1,地址为pack[0].addr。而在hi_venc_pack结构体中增加offset,用来指出一帧码流中有效数据的地址和pack[0].addr的偏移。如图1所示(以H.264单包为例),pack[0].data_num = 3,即3种NAL包,分别为SPS、PPS、SEI: 
      
- pack[0].pack_info[0]. pack_type. h264_type = HI_VENC_H264_NALU_SPS
 - pack[0].pack_info[1]. pack_type. h264_type = HI_VENC_H264_NALU_PPS
 - pack[0].pack_info[2]. pack_type. h264_type = HI_VENC_H264_NALU_SEI
 
其他协议以此类推,data_num和pack_info只在单包模式才有意义。
 - 两种模式可通过调用接口hi_mpi_venc_set_mod_param设置h.265e/h264e/jpege模块参数one_stream_buf来选择。 
      
- one_stream_buf=1 表示单包模式,系统默认one_stream_buf=1;注意,JPEGE目前只支持单帧单包模式。
 - one_stream_buf=0 表示非单包模式。
 
 
