未经网安备案开设网站的,linux玩wordpress,中企动力网站案例,58同城广告推广电话rv1126解码篇中#xff0c;出现最重要的两个api一个是#xff0c;send_vdec_thread线程里面调用的RK_MPI_SYS_SendMediaBuffer#xff0c;把数据发到解码器。另外一个是read_vdec_thread线程的RK_MPI_SYS_GetMediaBuffer获取解码器里面的数据。 今天想探讨一下他的底层原理。… rv1126解码篇中出现最重要的两个api一个是send_vdec_thread线程里面调用的RK_MPI_SYS_SendMediaBuffer把数据发到解码器。另外一个是read_vdec_thread线程的RK_MPI_SYS_GetMediaBuffer获取解码器里面的数据。 今天想探讨一下他的底层原理。是怎么实现的为什么在其中的一个线程里调用RK_MPI_SYS_SendMediaBuffer发送数据另外一个线程调用RK_MPI_SYS_GetMediaBuffer就可以获取到数据为什么呢不管是海思还是瑞芯微的编解码都是放到一个地方再从其他地方拿来使用流程知道但是实现的原理不知道。通过画图分析。
用解码演示编码也是一样的。下面两个柱子就表示两个线程左边的send_vdec_thread发的是vdec的数据有没有想过这个数据send后会到哪里 其实vdec存放在一个队列里面可以像一下队列是起到一个桥梁的作用让两个线程通讯。 所以上面的两个线程都要使用vdec的数据所以下图瑞芯微在rkmedia底层维护了一个队列。 这个队列不仅是放解码数据编码数据它也能放或者一些其他数据都能放所以底层是void*的 所以vdec的数据发到了这个rk-queue里面所以这个队列里面就有vdec的每一帧数据队列有了数据RK_MPI_SYS_GetMediaBuffer线程就可以使用接口获取到每一帧的vdec的数据。大致的一个框图就是这样的 但是还有一个问题 左边发的是编码后的数据右边拿的应该是解码后的数据所以底层这个队列不止要存放数据还要能解码数据如果是编码还要对数据编码。就是还要根据传入模模块号编解码数据。如果模块号是ednc就编码vdec就是解码。 总结在RV1126/RV1109上面若对数据进行编解码操作通常使用RK_MPI_SYS_SendMediaBuffer根据MOD_ID对其进行对应的编解码工作编解码工作完成之后就把对应的数据存放到RKMEDIA_QUEUE里面。若要获取对应的编解码数据则调用RK_MPI_SYS_GetMediaBuffer从RKMEDIA_QUEUE获取每一帧编解码数据。应该海思平台也是这样做的。 真正情况就是通过编解码器拿到数据还有一种把编码器bind之后也能拿到数据但是bind拿到数据是最原始的数据没有修改的。一般数据都是VI的数据如果是文件的就要通过RK_MPI_SYS_SendMediaBuffer拿到。
在RV1126上面做对应的编解码工作一般分为两种
.RK_MPI_SYS_Bind方式RK_MPI_SYS_Bind方式通常用在直接获取CMOS摄像头的数据(原生的VI数据)并且不做任何加工处理。.RK_MPI_SYS_SendMediaBuffer方式这种方式能够解码CMOS摄像头VI处理过后的数据(包括opencv、yolov3、asfort)或者读取文件的编解码数据等等。