上图是LCD显示摄像头图像的原理,上部分完成了摄像头参数的设置以及数据的读取。这部分要做的是采集到摄像头图像之后的图像转换问题。摄像头采集的图像可能是YUV格式,也可能是MJPEG格式,统一的需要转化成RGB格式。
因此需要实现的是convert文件夹下convert_manager.c、yuv2rgb.c、mjpeg2rgb.c、rgb2rgb.c文件,以及头文件。
实现convert_manager.h
这里需要实现的是成员是函数指针的结构体。
typedef struct VideoConvert {
int (*isSupport)(int iPixelFormatIn, int iPixelFormatOut);
int (*Convert)(PT_VideoBuf ptVideoBufIn, PT_VideoBuf ptVideoBufOut);
int (*ConvertExit)(PT_VideoBuf ptVideoBufOut);
}T_VideoConvert, *PT_VideoConvert;
从上到下依次实现:判断摄像头采集的数据格式是否为支持该应用程序所支持;Convert函数负责转化一个buffer中的摄像头数据;ConvertExit函数负责对Convert函数中临时申请的堆进行清理(因为要读数据所以堆显然不能Convert完成之后马上清理)。
实现convert_manager.c
这部分主要负责是维护一个链表,该链表中是各个格式转化模块的功能函数,并负责相关函数调用。这部分与之前的manager.c函数一样,修改仅限于名称,直接上代码。
#include <config.h>
#include <convert_manager.h>
#include <string.h>
static PT_VideoConvert g_ptVideoConvertHead = NULL;
int RegisterVideoConvert(PT_VideoConvert ptVideoConvert)
{
PT_VideoConvert ptTmp;
if (!g_ptVideoConvertHead)
{
g_ptVideoConvertHead = ptVideoConvert;
ptVideoConvert->ptNext = NULL;
}
else
{
ptTmp = g_ptVideoConvertHead;
while (ptTmp->ptNext)
{
ptTmp = ptTmp->ptNext;
}
ptTmp->ptNext = ptVideoConvert;
ptVideoConvert->ptNext = NULL;
}
return 0;
}
void ShowVideoConvert(void)
{
int i = 0;
PT_VideoConvert ptTmp = g_ptVideoConvertHead;
while (ptTmp)
{
printf("%02d %s\n", i++, ptTmp->name);
ptTmp = ptTmp->ptNext;
}
}
PT_VideoConvert GetVideoConvert(char *pcName)
{
PT_VideoConvert ptTmp = g_ptVideoConvertHead;
while (ptTmp)
{
if (strcmp(ptTmp->name, pcName) == 0)
{
return ptTmp;