本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。
欢迎和大家交流。qq:1037701636 email:[email protected]
本文承接上文的主要内容,对视频缓存区队列的相关执行过程进行一个解析。先给出之前的应用层的调用流程
上周把TI的开源JPEG算法库在dm6437上进行了初步简单的移植与实现,便于日后二次开发。本文更多的从Client层角度以整个encode流程和部分细节为核心记录整个算法的基本流程。
TI的media library:h.264,MPEG,JPEG等都基于XDAIS和XDM的标志算法结构来实现。在此基础上有产生了DMAI等2次封装用于在Davinci的开发。做为TI的算法合成标准,XDAIS和XDM都有其固定的开发模式,只需将自己的算法添加到其中即可。
XDAIS主要维护了一个算法IALG_Fxns来完成算法实例的创建,算法的实现主要需要实现该结构体的相关操作函数即可给上层应用带来开发的便利性。而之所以以这种模式开发,在于可以讲算法集成为.x64p库,方便多核的调用与通信。
1.下图是JPEG的encode主要流程:
对应用层这个最上层来说,算法实例的创建阶段,主要是将一个memTab进行初始化,algNumAlloc获得memab的数量,应用层对memTab[]分配其base地址(地址由client指定)。algAlloc对实际的memTab相关内容进行初始化,包括buffer存放的内容,buffer类型(SDRAM,DDR等)。alginit会再将之前初始化配置好的memTab,去初始化底层算法需要用到的buffer空间。之后这个最终的句柄handle就将上层和底层联系在了一起。而这个handle具备所有IALG的功能。
2.JPEG相关编码参数的设置,主要包括以下结构体内容。
这部分主要由handle的control来完成,包括当前编码器的状态,process需要的输入输出参数,以及动态和静态参数。
IIMGENC1_Status status; IIMGENC1_InArgs inArgs; IIMGENC1_OutArgs outArgs; IIMGENC1_DynamicParams dynamic_params;IIMGENC1_Params encode_static_params
上述中静态参数配置如下:确定了JPEG图像输出的格式YUV422,输出的端序。
IIMGENC1_Params encode_static_params = { sizeof(IIMGENC1_Params), IMAGE_H, IMAGE_W, XDM_DEFAULT, XDM_BYTE, //output dataEndianness XDM_YUV_422P //output color format };
IIMGENC1_DynamicParams encode_dynamic_default_params = { sizeof(IIMGENC1_DynamicParams), 0, XDM_YUV_422ILE,//input color format,UYVY IMAGE_H, IMAGE_W, 0, 0, JPEG_ENCODE_QP, };
上述的参数为动态参数的设置:YUV422小端的视频输入格式,QP决定编码的品质因素。
最重要的是control需要通过以上相关参数后,获得相关对输入输出的buffer信息。如下:
IIMGENC1Fxns->control((IIMGENC1_Handle)jpeg_encode_handle, XDM_GETBUFINFO, (IIMGENC1_DynamicParams *)&dynamic_params, (IIMGENC1_Status *)&status);//获取输入输出buffer的信息
/* set space for buffer descriptors */ inputBufDesc.numBufs = status.bufInfo.minNumInBufs ; inputBufDesc.descs[0].bufSize = status.bufInfo.minInBufSize[0] ; inputBufDesc.descs[0].buf = (XDAS_Int8 *)pin_buf; outputBufDesc.descs[0].buf = (XDAS_Int8 *)pout_buf; outputBufDesc.numBufs = status.bufInfo.minNumOutBufs ; outputBufDesc.descs[0].bufSize = status.bufInfo.minOutBufSize[0] ;
上述代码分别决定了算法需要的输入输入的buffer数和大小、地址的设置。
3.在解决完以上的基础内容,就可以进行process的处理,输入的参数包括输入,输出两个buffer的相关信息,以及输出参数。
IIMGENC1Fxns->process((IIMGENC1_Handle)jpeg_encode_handle, (XDM1_BufDesc *)&inputBufDesc, (XDM1_BufDesc *)&outputBufDesc, (IIMGENC1_InArgs *)&inArgs, (IIMGENC1_OutArgs *)&outArgs);//处理信息
其中输出参数outAgrs可以获得当前编码处理是否完成了对所有的待编码的AU的处理。
以上三个部分组成JPEG的整个编码流程,decode的过程和这个类似,只是需要先对头信息处理,再进行相关的解码操作。后续将会移植h.264等算法到6437上。
上述JPEG的decode和encode详细代码可以见下方的链接,欢迎交流!!!
JPEG decode and encode on dm6437:http://download.csdn.net/detail/gzzaigcn/6430423