namespace dshow.Core
{
	using System;
	using System.Runtime.InteropServices;

	// ISampleGrabber interface
	//
	// This interface provides methods for retrieving individual
	// media samples as they move through the filter graph
	//
	[ComImport,
	Guid("6B652FFF-11FE-4FCE-92AD-0266B5D7C78F"),
	InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
	public interface ISampleGrabber
	{
		// Specifies whether the filter should stop the graph
		// after receiving one sample
		[PreserveSig]
		int SetOneShot(
			[In, MarshalAs(UnmanagedType.Bool)] bool OneShot);

		// Specifies the media type for the connection on
		// the Sample Grabber's input pin
		[PreserveSig]
		int SetMediaType(
			[In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt);

		// Retrieves the media type for the connection on
		// the Sample Grabber's input pin
		[PreserveSig]
		int GetConnectedMediaType(
			[Out, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt);

		// Specifies whether to copy sample data into a buffer
		// as it goes through the filter
		[PreserveSig]
		int SetBufferSamples(
			[In, MarshalAs(UnmanagedType.Bool)] bool BufferThem);

		// Retrieves a copy of the sample that
		// the filter received most recently
		[PreserveSig]
		int GetCurrentBuffer(
			ref int pBufferSize,
			IntPtr pBuffer);

		//
		[PreserveSig]
		int GetCurrentSample(
			IntPtr ppSample);

		// Specifies a callback method to call on incoming samples
		[PreserveSig]
		int SetCallback(
			ISampleGrabberCB pCallback,
			int WhichMethodToCallback);
	}


	// ISampleGrabberCB interface
	//
	// This interface provides callback methods for the
	// ISampleGrabber::SetCallback method
	//
	[ComImport,
	Guid("0579154A-2B53-4994-B0D0-E773148EFF85"),
	InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
	public interface ISampleGrabberCB
	{
		// Callback method that receives a pointer to the media sample
		[PreserveSig]
//		int SampleCB(
//			double SampleTime,
//			IMediaSample pSample);
		int SampleCB(
			double SampleTime,
			IntPtr pSample);

		// Callback method that receives a pointer to the sample buffer
		[PreserveSig]
		int BufferCB(
			double SampleTime,
			IntPtr pBuffer,
			int BufferLen);
	}
}