4697|14

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Camera 应用开发 [复制链接]

平台: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,用于抓图
  1.         CHK(m_pImageSinkFilter.CoCreateInstance(CLSID_IMGSinkFilter));
  2.         CHK(m_pGraphBuilder->AddFilter(m_pImageSinkFilter, L"Still image filter" ));
  3.         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 分辨率拍照,请问我该如何做?

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

最新回复

LZ  这个问题现在解决了吗?  详情 回复 发表于 2010-4-30 18:29
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我的上一个贴子地址:http://topic.eeworld.net/u/20091205/13/f7adf327-9fd1-4b11-8875-ce9a58ae84c9.html

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

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
本人也刚刚遇到这个问题,主要原因是因为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有关,正在努力中。。。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

4
 
1、是不是directshow的still image filter “CLSID_IMGSinkFilter filter”有分辨率限制?  如果是,我如何修改?
没有,
  2、我现在要实现2048x1536 分辨率拍照,请问我该如何做?
1.没有明确的限制,但是如果你是靠still image filter压缩的话,限制取决于你的jpeg encoder.这部分6410有可能自己写的。另外一种可能就是内存不够了。
2.先确定问题的原因。你如果用IImage API能够编码2048x1536分辨率的图片的话,就说明jpeg encoder部分没问题。你既然说出错了,先查清楚是那一个函数出错了,返回什么错误吧。

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
xuexiliao
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

6
 
只做过流接口的CAMERA应用
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
mark
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

8
 
我用YUV给DShow,1024*768拍照ok的,2048*1536不行,可能内存与你的不一致。如果怀疑三星的问题,直接用微软给的camera_null来模拟硬件就可以试出来到底是哪出了问题
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
我也正在研究摄像头的程序,定一下。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
我也正在研究摄像头的程序,感谢各位不遗余力的帮忙!在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;        //新加
即可实现
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
同样,要实现2048x1536 分辨率拍照也要改
#define CAPTURE_BUFFER_SIZE        1966080        //  ( 1280*1024*3/2 )
将之增大,否则分配的缓冲区尺寸不够
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 
期待答案 先标注一下 学习学习
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢楼上各位同行的热情帮助,我现在忙着写3G电话的程序,过些时间再写这个拍照了,特别谢谢ydh640227,过些时间我再试试你的建议,不管如何,我都非常谢谢你,
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 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)。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

15
 
LZ  这个问题现在解决了吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表