|
S3C6410 Camera接口获取图像成功,但是数据全是0.求助!!!
[复制链接]
我用在WINCE 使用S3C6410的摄像头驱动,应用程序中使用DeviceIoControl来设置摄像头属性和获取一帧数据。
在驱动的程序中看到了它的控制代码如下:
// prepare 准备好DMA缓存,设置成 CAPTURE / VIDEO / PREVIEW 模式
#define IOCTL_CAM_PREPARE 0x0504
// stop 停止获取摄像头数据
#define IOCTL_CAM_STOP 0x0505
// Getting Buffer 获取一帧图像
#define IOCTL_CAM_GETBUFFER 0x0506
// Resume 唤醒
#define IOCTL_CAM_RESUME 0x050
(1)在应用程序中打开设备的时候代码如下:
// 1 创建一个CAM流设备文件
m_hCam = NULL;
m_hCam = CreateFile(
_T("CAM1:"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (NULL == m_hCam)
{
AfxMessageBox(_T("open cam failed!"));
}
结果是打开成功。
(2)然后是准备摄像头:
// 1 准备摄像头信息
if (!DeviceIoControl(
m_hCam,
IOCTL_CAM_PREPARE,
NULL,
0,
NULL,
0,
&dwByteTransfed,
NULL
)
)
{
AfxMessageBox(_T("set camera parameter failed!"));
}
通过成功。
(3)最后是通过按钮来响应获取一帧图像。
BYTE *pbuf = new BYTE[320*240*4];
if (!DeviceIoControl(
m_hCam,
IOCTL_CAM_GETBUFFER,
NULL,
0,
pbuf,
sizeof(pbuf),
&dwByteTransfed,
NULL
)
)
{
AfxMessageBox(_T("failed!"));
}
delete []pbuf;
缓存也是获取成功,pbuf在没有释放之前,我测试了里面的数据,不论怎么摆弄摄像头都是0数据,也就是初始化的数据。
通过跟踪驱动的代码,在驱动的PREVIEW中断IST中,有一行代码:
pfnCameraHandlePreviewFrame(dwCameraDriverContext);
它是为了满足DSHOW的架构,在接受完每一帧图像数据后,形成视频流。
跟踪这个函数,调用了CameraPreviewFrameCallback-》HandleCaptureInterrupt-》MDD_HandleIO-》HandlePinIO
-》PDDFillPinBuffer->PDD_FillBuffer-》CCameraPdd::FillBuffer,实际上处理的部分在Fillbuffer这个函数里面,
Fillbuffer关键代码如下:
// 1 获得当前完成的一帧图像的索引号, DMA缓存中总共有4帧 0,1,2,3
CurrentFrame = CameraGetCurrentFrameNum(PREVIEW_CAPTURE_BUFFER);
// 2 获得一帧图像的大小
dwRet = pCsVideoInfoHdr->bmiHeader.biSizeImage;
// 3 内存复制
memcpy(pImage, (void *)m_CameraHWPreviewBuffers[CurrentFrame].VirtAddr, dwRet);
其中的pImage 是我们外部传入的获取图像的指针,也就是DeviceIoControl中的pbuf,
m_CameraHWPreviewBuffers[CurrentFrame].VirtAddr 是 当前帧的虚拟地址,
dwRet 是图像的大小。
综上所述,我实验排除了硬件设备的问题(采用其他程序测试过,有图像,硬件没有问题),
但是最终memcpy出来的数据总是 0值,不知道那里错了,请大家帮助下,谢谢
|
|