get_rga_thread线程和low_camera_venc_thread线程获取低分辨率VENC码流数据
一.本章节介绍
本章节主要介绍如何通过get_rga_thread线程和low_camera_venc_thread共同获取低分辨率(1280 * 720)的编码码流并且入队列。从上图我们可以看出。我们经过几个步骤首先要调用get_vi_container获取VI节点,然后把VI节点和RGA节点绑定起来,通过get_rga_thread线程获取1280 * 720的原始数据并把1280 * 720的原始数据发送到1280 * 720的VENC低分辨率编码器。
二.低分辨率码流获取的思维导图
上图是获取低分辨率1280 * 720编码码流的思维导图,从上面的思维导图可以看出来,整个流程最关键是get_vi_container获取VI节点,然后调用RK_SYS_MPI_Bind绑定VI和RGA节点。然后创建get_rga_thread线程获取每一帧rga的1280 * 720的视频原始数据,调用的API是RK_MPI_SYS_GetMediaBuffer,获取每一帧1280 * 720原始数据后再调用RK_MPI_SYS_SendMediaBuffer发送每一帧原始数据到1280 * 720的VENC编码器。
创建low_camera_venc_thread线程获取每一帧1280 * 720的编码码流数据,调用的API是RK_MPI_SYS_GetMediaBuffer。获取完每一帧1280 * 720编码视频数据后,存放到low_video_queue里面,调用的函数是putVideoPacketQueue。
三.代码架构截图并讲解
上面的截图就是如何通过get_rga_thread和low_camera_thread线程的结合获取低分辨率(1280 * 720)的编码码流。首先要通过RGA的节点和VENC的节点进行RK_SYS_MPI_Bind绑定,然后开启get_rga_thread获取每一帧的RGA处理过后的1280 * 720原始数据,并且调用RK_MPI_SYS_SendMediaBuffer这个API把每一帧1280 * 720的原始数据发送到低分辨率的编码器里面,核心代码,如下:。
while (1)
{
mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, 0 , -1); //获取每一帧RGA处理过后的数据
if(!mb)
{
break;
}
RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, 1, mb); //把每一帧RGA数据传输到低分辨率VENC里面
RK_MPI_MB_ReleaseBuffer(mb); //释放资源
}
然后再创建low_camera_thread现成获取每一帧1280 * 720的编码视频数据,然后把每一帧低分辨率的编码数据赋值到video_data_packet_t结构体,包括每一帧的视频流数据RK_MPI_GetPtr(mb),还有每一帧的视频长度RK_MPI_GetSize(mb)。然后把整个video_data_packet包入队,low_video_queue->putVideoPacketQueue里面。video_data_packet_t结构体里面有两个成员变量,一个是buffer(视频缓冲区)、video_frame_size是每一帧视频的长度,frame_flag关键帧标识符。下面是RKMEDIABUFFER赋值到VIDEO_DATA_PACKET_T的核心代码:
memcpy(video_data_packet->buffer, RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb));
video_data_packet->video_frame_size = RK_MPI_MB_GetSize(mb);