Camera 应用开发

ok138ok 2009-12-07 08:34:02
平台:6410+WINCE6.0

新开一个贴,再讨论一下这个CAMERA应用开发,因为本人一直是做驱动的,现在要写应用,而且是COM接口的directshow,所以有很多东西要向大家请教,
用640X480分辩进行preview 和 拍照都没有问题,但是,我驱动给directshow传的是RGB数据才行,如果是YUV的话,超过320X240,它就会去调用MFC Decoder的filter,所以程序不能正常运行,把MFC Decoder的filter去掉,它就显示调用出错。
如果给directshow传的是RGB数据,那么,能做到1024x768分辩率的拍照,当我提高到2048x1536分辨率时,它就出错了,

打印信息如下:
//-------------------------------------------------------------
Platform Type : SMDK6410
加载模块: quartz.dll
加载模块: WS2.dll
加载模块: MMTimer.dll
加载模块: urlmon.dll
加载模块: SHLWAPI.dll
加载模块: WININET.dll
加载模块: iphlpapi.dll
加载模块: wmvdmoe.dll
加载模块: msdmo.dll
加载模块: DDRAW.DLL
Width = 642, Height = 480
线程 0x9ee0006 已退出,返回值为 0 (0x0)。
线程 0x9ec000e 已退出,返回值为 0 (0x0)。
线程 0x8020012 已退出,返回值为 0 (0x0)。
线程 0x9fd000e 已退出,返回值为 0 (0x0)。
程序“[7a1006e] CameraDemo.exe”已退出,返回值为 1067 (0x42b)。
//----------------------------------------------------------------
我创建拍照的PIN 代码如下:
// 创建Still Pin,用于抓图
	CHK(m_pImageSinkFilter.CoCreateInstance(CLSID_IMGSinkFilter));
CHK(m_pGraphBuilder->AddFilter(m_pImageSinkFilter, L"Still image filter" ));
CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_STILL, &MEDIATYPE_Video, m_pVideoCaptureFilter, NULL, m_pImageSinkFilter ));

//-----------------------驱动里我给still的配置如下
MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_13, 2048,1536, 16, 15);
......
m_pModeVideoFormat[STILL].pCsDataRangeVideo[0] = &DCAM_StreamMode_13;
//------------------------------------------------------------------------


如果我不创建这个PIN,它是不会退出的,但是不能拍照,或者我驱动给应用返回的still的分辩率小于2048x1536,它也是正常的,


我的问题:
1、是不是directshow的still image filter “CLSID_IMGSinkFilter filter”有分辨率限制? 如果是,我如何修改?
2、我现在要实现2048x1536 分辨率拍照,请问我该如何做?

请做过这个的高手指点迷津!谢谢!

...全文
638 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxhbbc 2011-05-09
  • 打赏
  • 举报
回复
我也想知道LZ最后咋解的
iwillbeback008 2011-05-02
  • 打赏
  • 举报
回复
LZ 这个问题现在解决了吗?
zhfl1314 2010-04-30
  • 打赏
  • 举报
回复
LZ 这个问题现在解决了吗?
ok138ok 2010-03-08
  • 打赏
  • 举报
回复
引用 10 楼 ydh640227 的回复:
同样,要实现2048x1536 分辨率拍照也要改
#define CAPTURE_BUFFER_SIZE        1966080        //  ( 1280*1024*3/2 )
将之增大,否则分配的缓冲区尺寸不够



我改了,为了拍2048x1536,我把它改为如下
#define CAPTURE_BUFFER_SIZE 6291456 // // 2048*1536*3/2 = 4718592
都是不行呀,还是会崩溃。晕,
出错信息:-------------------------------
加载模块: quartz.dll
加载模块: WS2.dll
加载模块: MMTimer.dll
加载模块: urlmon.dll
加载模块: SHLWAPI.dll
加载模块: WININET.dll
加载模块: iphlpapi.dll
加载模块: wmvdmoe.dll
加载模块: msdmo.dll
加载模块: DDRAW.DLL
Width = 642, Height = 480
线程 0x9ee0006 已退出,返回值为 0 (0x0)。
线程 0x9ec000e 已退出,返回值为 0 (0x0)。
线程 0x8020012 已退出,返回值为 0 (0x0)。
线程 0x9fd000e 已退出,返回值为 0 (0x0)。
程序“[7a1006e] CameraDemo.exe”已退出,返回值为 1067 (0x42b)。
ok138ok 2010-03-07
  • 打赏
  • 举报
回复
谢谢楼上各位同行的热情帮助,我现在忙着写3G电话的程序,过些时间再写这个拍照了,特别谢谢ydh640227,过些时间我再试试你的建议,不管如何,我都非常谢谢你,
mabugang 2010-02-18
  • 打赏
  • 举报
回复
期待答案 先标注一下 学习学习
ydh640227 2010-02-18
  • 打赏
  • 举报
回复
同样,要实现2048x1536 分辨率拍照也要改
#define CAPTURE_BUFFER_SIZE 1966080 // ( 1280*1024*3/2 )
将之增大,否则分配的缓冲区尺寸不够
ydh640227 2010-02-18
  • 打赏
  • 举报
回复
我也正在研究摄像头的程序,感谢各位不遗余力的帮忙!在6410的程序中,图像缓冲区是固定的,是三星自己写的,在S3c6410.h中
#define PREVIEW_BUFFER_SIZE 614400 // ( 320*240*2 ) * MAX_HW_FRAMES
因此只能播放320*240分辨率的图像,将该定义改大即可实现高分辨率的播放,当然SensorFormats.h中要增加内容:
MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_0, 320, 240, 16, 30);
MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_1, 176, 144, 16, 30);
MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_2, 320, 240, 16, 15);
MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_3, 640, 480, 16, 15);
MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_4, 720, 576, 16, 15);
MAKE_STREAM_MODE_YV12(DCAM_StreamMode_5, 176, -144, 12, 15);
MAKE_STREAM_MODE_YV12(DCAM_StreamMode_6, 320, -240, 12, 15);
MAKE_STREAM_MODE_YV12(DCAM_StreamMode_7, 176, -144, 12, 15);
MAKE_STREAM_MODE_YV12(DCAM_StreamMode_8, 640, -480, 12, 15);
MAKE_STREAM_MODE_YV12(DCAM_StreamMode_9, 720, -576, 12, 15);
还有在CameraPDD.cpp中做修改
// m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[0] = &DCAM_StreamMode_8;
// m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[0] = &DCAM_StreamMode_3;
m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[0] = &DCAM_StreamMode_4;
m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[1] = &DCAM_StreamMode_1;
m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[2] = &DCAM_StreamMode_2;
m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[3] = &DCAM_StreamMode_3;
// m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[4] = &DCAM_StreamMode_0; //新加
即可实现
gaowei_7743 2010-02-05
  • 打赏
  • 举报
回复
我也正在研究摄像头的程序,定一下。
OneOnce 2010-02-04
  • 打赏
  • 举报
回复
mark
renpine 2010-02-04
  • 打赏
  • 举报
回复
我用YUV给DShow,1024*768拍照ok的,2048*1536不行,可能内存与你的不一致。如果怀疑三星的问题,直接用微软给的camera_null来模拟硬件就可以试出来到底是哪出了问题
xqhrs232 2009-12-08
  • 打赏
  • 举报
回复
只做过流接口的CAMERA应用
zwtchy123 2009-12-08
  • 打赏
  • 举报
回复
xuexiliao
ruritanian 2009-12-07
  • 打赏
  • 举报
回复
1、是不是directshow的still image filter “CLSID_IMGSinkFilter filter”有分辨率限制? 如果是,我如何修改?
没有,
2、我现在要实现2048x1536 分辨率拍照,请问我该如何做?
1.没有明确的限制,但是如果你是靠still image filter压缩的话,限制取决于你的jpeg encoder.这部分6410有可能自己写的。另外一种可能就是内存不够了。
2.先确定问题的原因。你如果用IImage API能够编码2048x1536分辨率的图片的话,就说明jpeg encoder部分没问题。你既然说出错了,先查清楚是那一个函数出错了,返回什么错误吧。

Terryzou 2009-12-07
  • 打赏
  • 举报
回复
本人也刚刚遇到这个问题,主要原因是因为128M的内存不够导致的。
在驱动的PINDEVICE.CPP下有这样的一段代码
case CSPROPERTY_TYPE_SET:

if( OutBufLen < sizeof( CSALLOCATOR_FRAMING ))
{
dwError = ERROR_INVALID_PARAMETER;
break;
}

pCsAllocatorFraming = (PCSALLOCATOR_FRAMING) pOutBuf;
if(( m_CsState != CSSTATE_STOP ) || ( m_dwMemoryModel != pCsAllocatorFraming->RequirementsFlags ))
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
m_ulMaxNumOfBuffers = pCsAllocatorFraming->Frames ;
dwError = ERROR_SUCCESS;
break ;

default :
DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): CSPROPERTY_CONNECTION_ALLOCATORFRAMING Invalid Request\r\n"), this)) ;
}
把其中的m_ulMaxNumOfBuffers = pCsAllocatorFraming->Frames ;
改为pCsAllocatorFraming->Frames = m_ulMaxNumOfBuffers;
然后再改变PDDInit里的m_SensorModeInfo[X].MaxNumOfBuffers的BUFF数量,,我个人认为STILL的BUFF只要开一个就行了。其它的还是开成10个。
不过改了之后。CAMERA启动的时间会很长。和FILTER有关,正在努力中。。。
ok138ok 2009-12-07
  • 打赏
  • 举报
回复
我的上一个贴子地址:http://topic.csdn.net/u/20091205/13/f7adf327-9fd1-4b11-8875-ce9a58ae84c9.html

如果想知道更详细信息, 请看该贴,

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧