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****结构体成员如下:
u32Width:宽度
u32Height:高度
u32HorStride:虚宽
u32VerStride:虚高
enImgType:图像格式类型
图示
video_data_packet_t *video_data_packet = video_queue->getVideoPacketQueue();
获取的video_data_packet中的的video_data_packet->buffer和video_data_packet->video_frame_size