Infognition forum
February 11, 2012, 06:22:53 AM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: Last GraphEditPlus version: 1.4.0   Last Video Enhancer version: 1.9.7
 
   Home   Help Search Login Register  
Pages: [1]
  Print  
Author Topic: SampleGrabber filter problem  (Read 1758 times)
cgillopez
Newbie
*

Karma: +1/-0
Posts: 7


View Profile
« on: May 13, 2010, 05:59:38 PM »

Hello,

I want to connect: Render Url -> Video Trans Filter -> SampleGrabber -> SpaceColorConverter -> Video Renderer

The graph runs in graph edit plus an the code is generated by the application.

But when the filter tries to connect "Video Trans Filter" -> "SampleGrabber" i get: HR=-2147220992, COMException: Invalid specified type.

            hr = m_FilterGraph.ConnectDirect(GetPin(pVideoTransFilter, "XForm Out"), GetPin(pSampleGrabber, "Input"), null);--->ERROR

Could the problem because i use a sampleGrabber filter instead of the samplegrabber as type?


Code:
      hr = pBuilder.SetFiltergraph(m_FilterGraph);
            checkHR(hr, "Can't SetFilterGraph");

            Guid CLSID_CamVivotekFilter = new Guid("{0EF5DB94-D007-407D-8356-42765BDACEC6}"); //NetSourceFiltertalk.ax
            //  Guid CLSID_AudioTransFilter = new Guid("{9B021DCF-37EF-4EC5-ADB3-8C53D52EC2B}"); //VideoTransFilter.dll
            Guid CLSID_VideoTransFilter = new Guid("{B473D86D-4A03-4B76-9020-12A41C838548}"); //VideoTransFilter.dll
            Guid CLSID_VideoRenderer = new Guid("{B87BEB7B-8D29-423F-AE4D-6582C10175AC}"); //quartz.dll         
            Guid CLSID_SampleGrabber = new Guid("{C1F400A0-3F08-11D3-9F0B-006008039E37}"); //qedit.dll
           
            // Add Vivotek inetcamtalk
            IBaseFilter pCamVivotekFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_CamVivotekFilter));
            hr = m_FilterGraph.AddFilter(pCamVivotekFilter, "Vivotek inetcamtalk Filter");
            checkHR(hr, "Can't add Vivotek inetcamtalk Filter to graph");

            //set source filename
            IFileSourceFilter pCamVivotekFilter_src = pCamVivotekFilter as IFileSourceFilter;
            if (pCamVivotekFilter_src == null)
                checkHR(unchecked((int)0x80004002), "Can't get IFilsourceFilter");
            hr = pCamVivotekFilter_src.Load(IPAddress, null);
            checkHR(hr, "Can't load file");

            // Add Video TransFilter
            IBaseFilter pVideoTransFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_VideoTransFilter));
            hr = m_FilterGraph.AddFilter(pVideoTransFilter, "Video Trans Filter");
            checkHR(hr, "Can't add Video Trans Filter Filter to graph");

            //connect Vivotek inetcamtalk and Video Trans Filter
            hr = m_FilterGraph.ConnectDirect(GetPin(pCamVivotekFilter, "Video Pin"), GetPin(pVideoTransFilter, "XForm In"), null);
            checkHR(hr, "Can't connect Vivotek inetcamtalk and Video Trans Filter");

                             
           //add sample Grabber
            IBaseFilter pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber));
            hr = m_FilterGraph.AddFilter(pSampleGrabber, "SampleGrabber");
            checkHR(hr, "Can't add sampleGrabber");

            AMMediaType pSampleGrabber_pmt = new AMMediaType();
            pSampleGrabber_pmt.majorType = MediaType.Video;
            pSampleGrabber_pmt.subType = MediaSubType.H264;
            pSampleGrabber_pmt.formatType = FormatType.VideoInfo;
            pSampleGrabber_pmt.fixedSizeSamples = true;
            pSampleGrabber_pmt.formatSize = 1128;
            pSampleGrabber_pmt.sampleSize = 1622016;
            pSampleGrabber_pmt.temporalCompression = false;
            VideoInfoHeader pSampleGrabber_format = new VideoInfoHeader();
            pSampleGrabber_format.SrcRect = new DsRect();
            pSampleGrabber_format.TargetRect = new DsRect();
            pSampleGrabber_format.BmiHeader = new BitmapInfoHeader();
            pSampleGrabber_format.BmiHeader.Size = 40;
            pSampleGrabber_format.BmiHeader.Width = 704;
            pSampleGrabber_format.BmiHeader.Height = 576;
            pSampleGrabber_format.BmiHeader.Planes = 1;
            pSampleGrabber_format.BmiHeader.BitCount = 32;
            pSampleGrabber_format.BmiHeader.ImageSize = 1622016;

            pSampleGrabber_pmt.formatPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(pSampleGrabber_format));
            Marshal.StructureToPtr(pSampleGrabber_format, pSampleGrabber_pmt.formatPtr, false);
            hr = ((ISampleGrabber)pSampleGrabber).SetMediaType(pSampleGrabber_pmt);
            DsUtils.FreeAMMediaType(pSampleGrabber_pmt);
            checkHR(hr, "Canr set media type to sample grabber");
/*
            // Choose to call BufferCB instead of SampleCB
            hr = ((ISampleGrabber)pSampleGrabber).SetCallback(this, 1);
            DsError.ThrowExceptionForHR(hr);
*/
            //connect Video Transfer filter and SampleGrabber
            hr = m_FilterGraph.ConnectDirect(GetPin(pVideoTransFilter, "XForm Out"), GetPin(pSampleGrabber, "Input"), null);--->ERROR
            checkHR(hr, "Cant set connect Video Transfer filter and Sample Grabber");

                //add color space converter
            IBaseFilter pColorSpaceConverter = (IBaseFilter)new Colour();
            hr = m_FilterGraph.AddFilter(pColorSpaceConverter, "Color Space Converter");
            checkHR(hr,"Cant add Color Space Converter");

            //connect SampleGrabber to color space converter
            hr = m_FilterGraph.ConnectDirect(GetPin(pSampleGrabber, "Ouput"), GetPin(pColorSpaceConverter, "Input"), null);
            checkHR(hr, "Cant  connect SampleGraber to color space converter");

            // add Video Renderer
            IBaseFilter pAVideoRenderer = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_VideoRenderer));
            hr = m_FilterGraph.AddFilter(pAVideoRenderer, "Video Renderer");
            checkHR(hr, "Can't add Video Renderer");

            //connect color space converter to video renderer
            hr = m_FilterGraph.ConnectDirect(GetPin(pColorSpaceConverter, "XForm Out"), GetPin(pAVideoRenderer, "VMR Input0"), null);
            checkHR(hr, "Cant  connect SampleGrabe to videorender");

Logged
Dee Mon
Administrator
Hero Member
*****

Karma: +8/-0
Posts: 517



View Profile WWW
« Reply #1 on: May 14, 2010, 02:05:07 PM »

Try connecting those filters without first specifying video type for sample grabber (comment out SetMediaType line).

When you connect these filters in GEP, it doesn't really set such a detailed media type. The preferred media type of sample grabber is either unspecified (if you haven't explicitly done so) or partially specified (just MajorType and SubType). Generated code for media type is much more detailed, but those details aren't really required in most cases.
Logged
cgillopez
Newbie
*

Karma: +1/-0
Posts: 7


View Profile
« Reply #2 on: May 15, 2010, 01:59:13 PM »

Hello,

Its working now! thanks for you help. I have another doubt, i want to get every frame from the graph. To do that, i set:

   hr = pSampleGrabber.SetCallback(this, 1);
   DsError.ThrowExceptionForHR(hr);

And the callback method:
   int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample)
        {

            Marshal.ReleaseComObject(pSample);
            return 0;
        }

But i get: ISampleGrabberCB.SampleCB(double, directshowlib.IMediaSample), container type doesnt implement Directshowlib.ISampleGrabberCB interface.

I tried doing a cast:   hr =((ISampleGrabber) pSampleGrabber).SetCallback(this, 1); but it doesnt seem to be the problem.

Sorry if my problem is out of topic but im stucked with this. Thanks for your help!
Logged
Dee Mon
Administrator
Hero Member
*****

Karma: +8/-0
Posts: 517



View Profile WWW
« Reply #3 on: May 15, 2010, 07:53:39 PM »

Haven't you forgot to inherit your class from ISampleGrabberCB interface?

Here's a piece of code we use in GEP:
Code:
    class SampleGrabberCallback : ISampleGrabberCB
    {
        public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
        {
            return 0;
        }
        public int SampleCB(double SampleTime, IMediaSample pSample)
        {
            ....           
        }
(in this case callback is defined in separate class, not in Form or Application etc.)
Logged
cgillopez
Newbie
*

Karma: +1/-0
Posts: 7


View Profile
« Reply #4 on: May 17, 2010, 12:34:43 PM »

Hello,

Im not very good programming, i have created the class in the same namespace both the graph and SampleGrabberCallback : ISampleGrabberCB. As you told me, i wrote the class with BufferCB and SampleCB method.

But how can i implement SetCallback?

Could i use samplegrabber as SampleGrabber() and get the callback from DirectShowLib.ISampleGrabber?

Thanks for your help.
Logged
Dee Mon
Administrator
Hero Member
*****

Karma: +8/-0
Posts: 517



View Profile WWW
« Reply #5 on: May 19, 2010, 06:20:00 PM »

You don't need to implement SetCallback, it's already implemented in sample grabber filter which you create and then query ISampleGrabber interface by casting pSampleGrabber to that type. So you implement ISampleGrabberCB in your class, create an object of that class and pass it to SetCallback. Something like this:
Code:
SampleGrabberCallback  cb = new SampleGrabberCallback();
((ISampleGrabber)pSampleGrabber).SetCallback(cb, 0);
« Last Edit: May 19, 2010, 06:21:52 PM by Dee Mon » Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.13 | SMF © 2006-2011, Simple Machines LLC Valid XHTML 1.0! Valid CSS!