RV1126解码课程第四课:send_vdec_thread线程的讲解

4.1. send_vdec_thread线程的用处

send_vdec_thread线程的主要作用是通过video_queue(视频压缩队列)获取每一帧视频数据,并通过RV1126创建缓冲区的API去创建视频缓冲区,并把数据传输到RV1126硬件解码器。

4.2. send_vdec_thread的代码

void *send_vdec_thread(void *args)
{
  pthread_detach(pthread_self());
  MEDIA_BUFFER mb = NULL;
  int ret;

  MB_IMAGE_INFO_S stImageInfo = {1920, 1080, 1920, 1080, IMAGE_TYPE_NV12};

  while (1)
  {
    video_data_packet_t *video_data_packet = video_queue->getVideoPacketQueue();                  // 获取video_queue结构体的数据
    MEDIA_BUFFER mb = RK_MPI_MB_CreateImageBuffer(&stImageInfo, RK_TRUE, MB_FLAG_NOCACHED);       // 调用RK_MPI_MB_CreateImageBuffer创建视频缓冲区
    memcpy(RK_MPI_MB_GetPtr(mb), video_data_packet->buffer, video_data_packet->video_frame_size); // video_data_packet的视频缓冲数据,拷贝到RK_MPI_MB_GetPtr(mb)
    RK_MPI_MB_SetSize(mb, video_data_packet->video_frame_size);                                   // 设置缓冲区大小
    ret = RK_MPI_SYS_SendMediaBuffer(RK_ID_VDEC, 0, mb);                                          // 调用RK_MPI_SYS_SendMediaBuffer把数据传输到VDEC解码器
    RK_MPI_MB_ReleaseBuffer(mb);                                                                  // free mb
  }

  return NULL;
}

send_vdec_thread线程主要功能是获取每一帧视频队列的数据,并把每一帧视频压缩数据发送到VDEC解码器。这里需要用到第一个重要的API是RK_MPI_MB_CreateImageBuffer****,这个API是创建图像缓冲区,创建完成之后把视频数据传到视频缓冲区里面。把数据赋值完成之后,则调用RK_MPI_SYS_SendMediaBuffer把其数据发送到对应的VDEC解码器进行解码。
注1:RK1126只能处理mb,因此要先转换成mb类型然后送解码器处理
注2:RK_MPI_SYS_SendMediaBuffer中的第二个参数通道号为0的缘由,VDEC初始化时创建的通道号就为0

 // VDEC解码器初始化
  VDEC_CHN_ATTR_S stVdecAttr;
  stVdecAttr.enCodecType = RK_CODEC_TYPE_H264;       // 解码格式
  stVdecAttr.enMode = VIDEO_MODE_FRAME;              // 解码输入格式,以帧/流格式输入
  stVdecAttr.enDecodecMode = VIDEO_DECODEC_SOFTWARE; // 解码模式,是软解码还是硬件解码
  ret = RK_MPI_VDEC_CreateChn(0, &stVdecAttr);       // 创建VDEC解码器

4.3. 重要API的讲解:

MEDIA_BUFFER RK_MPI_MB_CreateImageBuffer(MB_IMAGE_INFO_S *pstImageInfo, RK_BOOL boolHardWare, RK_U8 u8Flag);

第一个传入参数:****MB_IMAGE_INFO_S结构体指针

第二个传入参数:是否创建硬件类型Buffer

第三个传入参数:硬件类型Buffer附加标记,取值: 0:开辟带缓存类型的硬件Buffer

MB_FLAG_NOCACHED:开辟不带缓存类型的硬件Buffer

MB_IMAGE_INFO_S****结构体成员如下:

image.png

u32Width:宽度

u32Height:高度

u32HorStride:虚宽

u32VerStride:虚高

enImgType:图像格式类型

图示

RK_MPI_MB_CreateImageBuffer.png
video_data_packet_t *video_data_packet = video_queue->getVideoPacketQueue();

获取的video_data_packet中的的video_data_packet->buffer和video_data_packet->video_frame_size

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容