[Windows Mobile] Capturing Raw Frames or SampleGrabber and DirectShow.NETCF
What is SampleGrabber? this is filter (as a rule Transform or TransInPlace) that goes after filter which samples we are going to grab.
Why do we need SampleGrabber?
1. In windows mobile this is the fastest way to still images, more than that we still uncompressed images (so we dont loose time for encoding/decoding)
2. We can use SampleGrabber to draw text or images on received stream
3. We grab images to memory.
I Think this is enough to say that sample grabber is useful.
The problem is that windows already have sample grabber and we dont need to make any extra moves to use it, but Windows Mobile knows nothing about sample grabber
On www.codeproject.com you can find some articles that explain how to implement SampleGrabber. But there tons limits and problems in every case, so i decided to implement my own.
The main question was “Is it possible to implement SampleGrabber that not need to registered?”. I meant that if i programming on C++ i can use unit (class) that contain samplegrabber code, i if i programming on any other language i can use this unit compiled to dll. Yes its possible (!!!!) we dont need resvrCE and anything else, just unit or dll
I was going to use developed SampleGrabber for barcode reader, but samples that i receive were too blurred to be recognized even by human (may be this is my cam dieing? O,o). anyway that was reason i decided to stop work on it, so here is what i got for this time:
DirectShowNETCF.Native.dll that contain SampleGrabber. How to use it?
[DllImport("DirectShowNETCF.Native.dll")]
private static extern IntPtr GetBaseFilter();
this is method returns IntPtr that equal to IBaseFilter*
how to get IBaseFilter?
IntPtr grabber_ = GetBaseFilter(); IBaseFilter grabber = (IBaseFilter)Marshal.GetTypedObjectForIUnknown(grabber_, typeof(IBaseFilter));
To grab raw frame you have to call
1. getSize(out long size)
2. alloc memory (use DirectShowNETCF.PInvoke.LocalAlloc(0×40, size))
3. call getFrame(IntPtr pBuff)
[ComVisible(true), ComImport,
Guid("2B21644A-D405-4E27-A51C-A4812bE0CE4C"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IGetFrame
{
[PreserveSig]
int getFrame(IntPtr pBuff);
[PreserveSig]
int getSize([Out] out long size);
}
//example of grabbing frame
public IntPtr grabFrame(ref long bufSize)
{
IntPtr res_ = IntPtr.Zero;
long size = 0;
frmGrabber.getSize(out size);
bufSize = size;
res_ = PInvoke.LocalAlloc(0x40, (int)size);
frmGrabber.getFrame(res_);
return res_;
}
last version of DirectShowNETCF you can download here
Filed under: Programming
January 25th, 2011 at 7:41 pm
Alex - Thank you for your examples. It appears that I need the DirectShowNETCF.Native.dll in order to PInvoke the GetBaseFilter() function but it is not provided in the download. Is there a separate location where I could download this?
August 31st, 2010 at 10:23 am
Hey alex..thanks for the post..i have ru into a problem though..the camera never captures any frames…says “cannot init camera” when i press start..whats going wrong?please help!
thanks!
April 30th, 2010 at 7:03 pm
Hi Alex, sorry for all my questions. your blog helps me a lot. I can’t understand how to use the next code you developed.
//example of grabbing frame
public IntPtr grabFrame(ref long bufSize)
{
IntPtr res_ = IntPtr.Zero;
long size = 0;
frmGrabber.getSize(out size);
bufSize = size;
res_ = PInvoke.LocalAlloc(0×40, (int)size);
frmGrabber.getFrame(res_);
return res_;
}
can you show me a mothod calling it?
thanks!
April 30th, 2010 at 6:31 pm
hi!, where is DirectShowNETCF.Native.dll located? I downloaded the DirectShowNetCF libraries, but I have:
-DirectShowNETCF.dll
-AMCameraEx.Native.dll
-AMCamera.Native.dll
-NullRenderer.dll
I don’t have DirectShowNETCF.Native.dll. thanks
December 16th, 2009 at 2:40 pm
Hey thanks, that worked on the device. It doesn’t work on the simulator however, but solved my problem
December 15th, 2009 at 11:05 pm
you should put DirectShowNETCF.dll on device where executable deployed
December 15th, 2009 at 9:37 pm
Sorry to bother you again with this issue… I copied both DirectShowNETCF.dll and DirectShowNETCF.Native.dll to \AMCamera\bin\Debug, the folder where the executable is placed and I still receive MissingMethodException was unhandled: Can’t find PInvoke DLL ‘DirectShowNETCF.Native.dll’ in the Init method.
Am I missing something?
In the Output window in VS 2008 all references are loaded except for this one.
Sorry and thanks for your help.
November 26th, 2009 at 9:12 am
seems like HTC cant render rgb24, i`m working on custom renderer now
November 20th, 2009 at 11:49 pm
Same here: “Cannot init camera! Result: ConnectGrabberError_2 ”
Also DirectShowNETCF.Camera.Camera works fine, but not the others.
It’s a HTC-8900 - Win 6.0
Any ideas?
November 17th, 2009 at 9:19 pm
2vinay: its not implemented yet, but if you want you can buy samplegrabber sources and draw image you need on raw frame