# HG changeset patch # User voroshil # Date 1170003213 0 # Node ID 24dc4ec0d08dc23387e6e2f181bc8244dc142648 # Parent 0b262e00bc99a1ee1262d41fd497f4a582578d7b Doxygen comments for used DirectShow methods. Info was got from DirectShow SDK. diff -r 0b262e00bc99 -r 24dc4ec0d08d loader/dshow/cmediasample.c --- a/loader/dshow/cmediasample.c Sun Jan 28 16:48:01 2007 +0000 +++ b/loader/dshow/cmediasample.c Sun Jan 28 16:53:33 2007 +0000 @@ -17,6 +17,18 @@ */ static const int SAFETY_ACEL = 1024; +/** + * \brief IPin::QueryInternalConnections (retries pin's internal connections) + * + * \param[in] This pointer to IPin interface + * \param[out] apPin Array that receives pins, internally connected to this + * \param[in,out] nPint Size of an array + * + * \return S_OK - success + * \return S_FALSE - pin rejects media type + * \return E_NOTIMPL - not implemented + * + */ static long STDCALL CMediaSample_QueryInterface(IUnknown* This, /* [in] */ const GUID* iid, /* [iid_is][out] */ void **ppv) @@ -39,6 +51,17 @@ return E_NOINTERFACE; } +/** + * \brief IUnknown::AddRef (increases reference counter for interface) + * + * \param[in] This pointer to IUnknown class + * + * \return new value of reference counter + * + * \remarks + * Return value should be used only for debug purposes + * + */ static long STDCALL CMediaSample_AddRef(IUnknown* This) { Debug printf("CMediaSample_AddRef(%p) called\n", This); @@ -46,6 +69,12 @@ return 0; } +/** + * \brief CMediaSample destructor + * + * \param[in] This pointer to CMediaSample object + * + */ void CMediaSample_Destroy(CMediaSample* This) { @@ -57,6 +86,18 @@ free(This); } +/** + * \brief IUnknown::Release (desreases reference counter for interface) + * + * \param[in] This pointer to IUnknown class + * + * \return new value of reference counter + * + * \remarks + * When reference counter reaches zero calls destructor + * Return value should be used only for debug purposes + * + */ static long STDCALL CMediaSample_Release(IUnknown* This) { CMediaSample* parent = (CMediaSample*)This; @@ -71,6 +112,18 @@ return 0; } +/** + * \brief IMediaSample::GetPointer (retrieves a read/write pointer to the media sample's buffer) + * + * \param[in] This pointer to CMediaSample object + * \param[out] address of variable that receives pointer to sample's buffer + * + * \return S_OK success + * \return apropriate error otherwise + * + * \note The calles should not free or reallocate buffer + * + */ static HRESULT STDCALL CMediaSample_GetPointer(IMediaSample* This, /* [out] */ BYTE** ppBuffer) { @@ -81,12 +134,35 @@ return 0; } +/** + * \brief IMediaSample::GetSize (retrieves a size of buffer in bytes) + * + * \param[in] This pointer to CMediaSample object + * + * \return size of buffer in bytes + * + */ static long STDCALL CMediaSample_GetSize(IMediaSample * This) { Debug printf("CMediaSample_GetSize(%p) called -> %d\n", This, ((CMediaSample*) This)->size); return ((CMediaSample*) This)->size; } +/** + * \brief IMediaSample::GetTime (retrieves a stream time at wich sample sould start and finish) + * + * \param[in] This pointer to CMediaSample object + * \param[out] pTimeStart pointer to variable that receives start time + * \param[out] pTimeEnd pointer to variable that receives end time + * + * \return S_OK success + * \return VFW_E_NO_STOP_TIME The sample has valid start time, but no stop time + * \return VFW_E_SAMPLE_TIME_NOT_SET The sample is not time-stamped + * + * \remarks + * Both values are relative to stream time + * + */ static HRESULT STDCALL CMediaSample_GetTime(IMediaSample * This, /* [out] */ REFERENCE_TIME *pTimeStart, /* [out] */ REFERENCE_TIME *pTimeEnd) @@ -95,6 +171,22 @@ return E_NOTIMPL; } +/** + * \brief IMediaSample::SetTime (sets a stream time at wich sample sould start and finish) + * + * \param[in] This pointer to CMediaSample object + * \param[out] pTimeStart pointer to variable that contains start time + * \param[out] pTimeEnd pointer to variable that contains end time + * + * \return S_OK success + * \return apropriate error otherwise + * + * \remarks + * Both values are relative to stream time + * To invalidate the stream times set pTimeStart and pTimeEnd to NULL. this will cause + * IMEdiaSample::GetTime to return VFW_E_SAMPLE_TIME_NOT_SET + * + */ static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This, /* [in] */ REFERENCE_TIME *pTimeStart, /* [in] */ REFERENCE_TIME *pTimeEnd) @@ -103,6 +195,18 @@ return E_NOTIMPL; } +/** + * \brief IMediaSample::IsSyncPoint (determines if start of this sample is sync point) + * + * \param[in] This pointer to CMediaSample object + * + * \return S_OK start of this sample is sync point + * \return S_FALSE start of this sample is not sync point + * + * \remarks + * If bTemporalCompression of AM_MEDIA_TYPE is FALSE, all samples are sync points. + * + */ static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This) { Debug printf("CMediaSample_IsSyncPoint(%p) called\n", This); @@ -111,6 +215,16 @@ return 1; } +/** + * \brief IMediaSample::SetSyncPoint (specifies if start of this sample is sync point) + * + * \param[in] This pointer to CMediaSample object + * \param[in] bIsSyncPoint specifies whether this is sync point or not + * + * \return S_OK success + * \return apropriate error code otherwise + * + */ static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This, long bIsSyncPoint) { @@ -119,6 +233,19 @@ return 0; } +/** + * \brief IMediaSample::IsPreroll (determines if this sample is preroll sample) + * + * \param[in] This pointer to CMediaSample object + * + * \return S_OK if this sample is preroll sample + * \return S_FALSE if this sample is not preroll sample + * + * \remarks + * Preroll samples are processed but not displayed. They are lokated in media stream + * before displayable samples. + * + */ static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This) { Debug printf("CMediaSample_IsPreroll(%p) called\n", This); @@ -129,6 +256,20 @@ return 1;//S_FALSE } +/** + * \brief IMediaSample::SetPreroll (specifies if this sample is preroll sample) + * + * \param[in] This pointer to CMediaSample object + * \param[in] bIsPreroll specifies whether this sample is preroll sample or not + * + * \return S_OK success + * \return apropriate error code otherwise + * + * \remarks + * Preroll samples are processed but not displayed. They are lokated in media stream + * before displayable samples. + * + */ static HRESULT STDCALL CMediaSample_SetPreroll(IMediaSample * This, long bIsPreroll) { @@ -137,12 +278,30 @@ return 0; } +/** + * \brief IMediaSample::GetActualDataLength (retrieves the length of valid data in the buffer) + * + * \param[in] This pointer to CMediaSample object + * + * \return length of valid data in buffer in bytes + * + */ static long STDCALL CMediaSample_GetActualDataLength(IMediaSample* This) { Debug printf("CMediaSample_GetActualDataLength(%p) called -> %d\n", This, ((CMediaSample*)This)->actual_size); return ((CMediaSample*)This)->actual_size; } +/** + * \brief IMediaSample::SetActualDataLength (specifies the length of valid data in the buffer) + * + * \param[in] This pointer to CMediaSample object + * \param[in] __MIDL_0010 length of data in sample in bytes + * + * \return S_OK success + * \return VFW_E_BUFFER_OVERFLOW length specified by parameter is larger than buffer size + * + */ static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample* This, long __MIDL_0010) { @@ -163,6 +322,21 @@ return 0; } +/** + * \brief IMediaSample::GetMediaType (retrieves media type, if it changed from previous sample) + * + * \param[in] This pointer to CMediaSample object + * \param[out] ppMediaType address of variable that receives pointer to AM_MEDIA_TYPE. + * + * \return S_OK success + * \return S_FALSE Media type was not changed from previous sample + * \return E_OUTOFMEMORY Insufficient memory + * + * \remarks + * If media type is not changed from previous sample, ppMediaType is null + * If method returns S_OK caller should free memory allocated for structure + * including pbFormat block + */ static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample* This, AM_MEDIA_TYPE** ppMediaType) { @@ -186,6 +360,16 @@ return 0; } +/** + * \brief IMediaType::SetMediaType (specifies media type for sample) + * + * \param[in] This pointer to CMediaSample object + * \param[in] pMediaType pointer to AM_MEDIA_TYPE specifies new media type + * + * \return S_OK success + * \return E_OUTOFMEMORY insufficient memory + * + */ static HRESULT STDCALL CMediaSample_SetMediaType(IMediaSample * This, AM_MEDIA_TYPE *pMediaType) { @@ -209,12 +393,37 @@ return 0; } +/** + * \brief IMediaSample::IsDiscontinuity (determines if this sample represents data break + * in stream) + * + * \param[in] This pointer to CMediaSample object + * + * \return S_OK if this sample is break in data stream + * \return S_FALSE otherwise + * + * \remarks + * Discontinuity occures when filter seeks to different place in the stream or when drops + * samples. + * + */ static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This) { Debug printf("CMediaSample_IsDiscontinuity(%p) called\n", This); return ((CMediaSample*) This)->isDiscontinuity; } +/** + * \brief IMediaSample::IsDiscontinuity (specifies whether this sample represents data break + * in stream) + * + * \param[in] This pointer to CMediaSample object + * \param[in] bDiscontinuity if TRUE this sample represents discontinuity with previous sample + * + * \return S_OK success + * \return apropriate error code otherwise + * + */ static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This, long bDiscontinuity) { @@ -223,6 +432,17 @@ return 0; } +/** + * \brief IMediaSample::GetMediaTime (retrieves the media times of this sample) + * + * \param[in] This pointer to CMediaSample object + * \param[out] pTimeStart pointer to variable that receives start time + * \param[out] pTimeEnd pointer to variable that receives end time + * + * \return S_OK success + * \return VFW_E_MEDIA_TIME_NOT_SET The sample is not time-stamped + * + */ static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This, /* [out] */ LONGLONG *pTimeStart, /* [out] */ LONGLONG *pTimeEnd) @@ -235,6 +455,20 @@ return 0; } +/** + * \brief IMediaSample::GetMediaTime (retrieves the media times of this sample) + * + * \param[in] This pointer to CMediaSample object + * \param[out] pTimeStart pointer to variable that specifies start time + * \param[out] pTimeEnd pointer to variable that specifies end time + * + * \return S_OK success + * \return apropriate error code otherwise + * + * \remarks + * To invalidate the media times set pTimeStart and pTimeEnd to NULL. this will cause + * IMEdiaSample::GetTime to return VFW_E_MEDIA_TIME_NOT_SET + */ static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This, /* [in] */ LONGLONG *pTimeStart, /* [in] */ LONGLONG *pTimeEnd) @@ -247,7 +481,13 @@ return 0; } -// extension for direct memory write or decompressed data +/** + * \brief CMediaSample::SetPointer (extension for direct memory write of decompressed data) + * + * \param[in] This pointer to CMediaSample object + * \param[in] pointer pointer to an external buffer to store data to + * + */ static void CMediaSample_SetPointer(CMediaSample* This, char* pointer) { Debug printf("CMediaSample_SetPointer(%p) called -> %p\n", This, pointer); @@ -257,12 +497,27 @@ This->block = This->own_block; } +/** + * \brief CMediaSample::SetPointer (resets pointer to external buffer with internal one) + * + * \param[in] This pointer to CMediaSample object + * + */ static void CMediaSample_ResetPointer(CMediaSample* This) { Debug printf("CMediaSample_ResetPointer(%p) called\n", This); This->block = This->own_block; } +/** + * \brief CMediaSample constructor + * + * \param[in] allocator IMemallocator interface of allocator to use + * \param[in] _size size of internal buffer + * + * \return pointer to CMediaSample object of NULL if error occured + * + */ CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size) { CMediaSample* This = (CMediaSample*) malloc(sizeof(CMediaSample)); diff -r 0b262e00bc99 -r 24dc4ec0d08d loader/dshow/inputpin.c --- a/loader/dshow/inputpin.c Sun Jan 28 16:48:01 2007 +0000 +++ b/loader/dshow/inputpin.c Sun Jan 28 16:53:33 2007 +0000 @@ -30,6 +30,21 @@ GUID interfaces[2]; } CEnumPins; +/** + * \brief IEnumPins:Next (retrives a specified number of pins ) + * + * \param[in] This pointer to CEnumPins object + * \param[in] cMediaTypes number of pins to retrive + * \param[out] ppMediaTypes array of IPin interface pointers of size cMediaTypes + * \param[out] pcFetched address of variables that receives number of returned pins + * + * \return S_OK - success + * \return S_FALSE - did not return as meny pins as requested + * \return E_INVALIDARG Invalid argument + * \return E_POINTER Null pointer + * \return VFW_E_ENUM_OUT_OF_SYNC - filter's state has changed and is now inconsistent with enumerator + * + */ static long STDCALL CEnumPins_Next(IEnumPins* This, /* [in] */ unsigned long cMediaTypes, /* [size_is][out] */ IPin** ppMediaTypes, @@ -74,6 +89,17 @@ return 1; } +/** + * \brief IEnumPins::Skip (skips over a specified number of pins) + * + * \param[in] This pointer to CEnumPinss object + * \param[in] cMediaTypes number of pins to skip + * + * \return S_OK - success + * \return S_FALSE - skipped past the end of the sequence + * \return VFW_E_ENUM_OUT_OF_SYNC - filter's state has changed and is now inconsistent with enumerator + * + */ static long STDCALL CEnumPins_Skip(IEnumPins* This, /* [in] */ unsigned long cMediaTypes) { @@ -81,6 +107,14 @@ return E_NOTIMPL; } +/** + * \brief IEnumPins::Reset (resets enumeration sequence to beginning) + * + * \param[in] This pointer to CEnumPins object + * + * \return S_OK - success + * + */ static long STDCALL CEnumPins_Reset(IEnumPins* This) { Debug printf("CEnumPins_Reset(%p) called\n", This); @@ -88,6 +122,19 @@ return 0; } +/** + * \brief IEnumPins::Clone (makes a copy of enumerator, returned object + * starts at the same position as original) + * + * \param[in] This pointer to CEnumPins object + * \param[out] ppEnum address of variable that receives pointer to IEnumPins interface + * + * \return S_OK - success + * \return E_OUTOFMEMRY - Insufficient memory + * \return E_POINTER - Null pointer + * \return VFW_E_ENUM_OUT_OF_SYNC - filter's state has changed and is now inconsistent with enumerator + * + */ static long STDCALL CEnumPins_Clone(IEnumPins* This, /* [out] */ IEnumPins** ppEnum) { @@ -95,6 +142,12 @@ return E_NOTIMPL; } +/** + * \brief CEnumPins destructor + * + * \param[in] This pointer to CEnumPins object + * + */ static void CEnumPins_Destroy(CEnumPins* This) { free(This->vt); @@ -103,6 +156,15 @@ IMPLEMENT_IUNKNOWN(CEnumPins) +/** + * \brief CEnumPins constructor + * + * \param[in] p first pin for enumerator + * \param[in] pp second pin for enumerator + * + * \return pointer to CEnumPins object or NULL if error occured + * + */ static CEnumPins* CEnumPinsCreate(IPin* p, IPin* pp) { CEnumPins* This = (CEnumPins*) malloc(sizeof(CEnumPins)); @@ -139,8 +201,26 @@ /*********** * InputPin + * + * WARNING: + * This is implementation of OUTPUT pin in DirectShow's terms + * ***********/ +/** + * \brief IPin::Connect (connects pin to another pin) + * + * \param[in] This pointer to IPin interface + * \param[in] pReceivePin pointer to IPin interface of remote pin + * \param[in] pmt suggested media type for link. Can be NULL (any media type) + * + * \return S_OK - success. + * \return VFW_E_ALREADY_CONNECTED - pin already connected + * \return VFW_E_NOT_STOPPED - filter is active + * \return VFW_E_TYPE_NOT_ACCEPT - type is not acceptable + * \return Apropriate error code otherwise. + * + */ static long STDCALL CInputPin_Connect(IPin* This, /* [in] */ IPin* pReceivePin, /* [in] */ AM_MEDIA_TYPE* pmt) @@ -149,6 +229,25 @@ return E_NOTIMPL; } +/** + * \brief IPin::ReceiveConnection (accepts a connection from another pin) + * + * \param[in] This pointer to IPin interface + * \param[in] pConnector connecting pin's IPin interface + * \param[in] pmt suggested media type for connection + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * \return VFW_E_ALREADY_CONNECTED - pin already connected + * \return VFW_E_NOT_STOPPED - filter is active + * \return VFW_E_TYPE_NOT_ACCEPT - type is not acceptable + * + * \note + * When returning S_OK method should also do the following: + * - store media type and return the same type in IPin::ConnectionMediaType + * - store pConnector and return it in IPin::ConnectedTo + * + */ static long STDCALL CInputPin_ReceiveConnection(IPin* This, /* [in] */ IPin* pConnector, /* [in] */ const AM_MEDIA_TYPE *pmt) @@ -157,12 +256,37 @@ return E_NOTIMPL; } +/** + * \brief IPin::Disconnect (accepts a connection from another pin) + * + * \param[in] This pointer to IPin interface + * + * \return S_OK - success + * \return S_FALSE - pin was not connected + * \return VFW_E_NOT_STOPPED - filter is active + * + * \note + * To break connection you have to also call Disconnect on other pin + */ static long STDCALL CInputPin_Disconnect(IPin* This) { Debug unimplemented("CInputPin_Disconnect", This); return E_NOTIMPL; } +/** + * \brief IPin::ConnectedTo (retrieves pointer to the connected pin, if such exist) + * + * \param[in] This pointer to IPin interface + * \param[out] pPin pointer to remote pin's IPin interface + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * \return VFW_E_NOT_CONNECTED - pin is not connected + * + * \note + * Caller must call Release on received IPin, when done + */ static long STDCALL CInputPin_ConnectedTo(IPin* This, /* [out] */ IPin** pPin) { @@ -170,6 +294,17 @@ return E_NOTIMPL; } +/** + * \brief IPin::ConnectionMediaType (retrieves media type for connection, if such exist) + * + * \param[in] This pointer to IPin interface + * \param[out] pmt pointer to AM_MEDIA_TYPE, that receives connection media type + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * \return VFW_E_NOT_CONNECTED - pin is not connected + * + */ static long STDCALL CInputPin_ConnectionMediaType(IPin* This, /* [out] */ AM_MEDIA_TYPE *pmt) { @@ -185,6 +320,19 @@ return 0; } +/** + * \brief IPin::QueryPinInfo (retrieves information about the pin) + * + * \param[in] This pointer to IPin interface + * \param[out] pInfo pointer to PIN_INFO structure, that receives pin info + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * + * \note + * If pInfo->pFilter is not NULL, then caller must call Release on pInfo->pFilter when done + * + */ static long STDCALL CInputPin_QueryPinInfo(IPin* This, /* [out] */ PIN_INFO *pInfo) { @@ -197,6 +345,16 @@ return 0; } +/** + * \brief IPin::QueryDirection (retrieves pin direction) + * + * \param[in] This pointer to IPin interface + * \param[out] pPinDir pointer to variable, that receives pin direction (PINDIR_INPUT,PINDIR_OUTPUT) + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * + */ static long STDCALL CInputPin_QueryDirection(IPin* This, /* [out] */ PIN_DIRECTION *pPinDir) { @@ -205,6 +363,20 @@ return 0; } +/** + * \brief IPin::QueryId (retrieves pin identificator) + * + * \param[in] This pointer to IPin interface + * \param[out] Id adress of variable, that receives string with pin's Id. + * + * \return S_OK - success + * \return E_OUTOFMEMORY - Insufficient memory + * \return E_POINTER - Null pointer + * + * \note + * Pin's Id is not the same as pin's name + * + */ static long STDCALL CInputPin_QueryId(IPin* This, /* [out] */ unsigned short* *Id) { @@ -212,6 +384,16 @@ return E_NOTIMPL; } +/** + * \brief IPin::QueryAccept (determines can media type be accepted or not) + * + * \param[in] This pointer to IPin interface + * \param[in] pmt Media type to check + * + * \return S_OK - success + * \return S_FALSE - pin rejects media type + * + */ static long STDCALL CInputPin_QueryAccept(IPin* This, /* [in] */ const AM_MEDIA_TYPE* pmt) { @@ -219,6 +401,20 @@ return E_NOTIMPL; } +/** + * \brief IPin::EnumMediaTypes (enumerates the pin's preferred media types) + * + * \param[in] This pointer to IPin interface + * \param[out] ppEnum adress of variable that receives pointer to IEnumMEdiaTypes interface + * + * \return S_OK - success + * \return E_OUTOFMEMORY - Insufficient memory + * \return E_POINTER - Null pointer + * + * \note + * Caller must call Release on received interface when done + * + */ static long STDCALL CInputPin_EnumMediaTypes(IPin* This, /* [out] */ IEnumMediaTypes** ppEnum) { @@ -226,6 +422,18 @@ return E_NOTIMPL; } +/** + * \brief IPin::QueryInternalConnections (retries pin's internal connections) + * + * \param[in] This pointer to IPin interface + * \param[out] apPin Array that receives pins, internally connected to this + * \param[in,out] nPint Size of an array + * + * \return S_OK - success + * \return S_FALSE - pin rejects media type + * \return E_NOTIMPL - not implemented + * + */ static long STDCALL CInputPin_QueryInternalConnections(IPin* This, /* [out] */ IPin** apPin, /* [out][in] */ unsigned long *nPin) @@ -234,6 +442,22 @@ return E_NOTIMPL; } +/** + * \brief IPin::EndOfStream (notifies pin, that no data is expected, until new run command) + * + * \param[in] This pointer to IPin interface + * + * \return S_OK - success + * \return E_UNEXPECTED - The pin is output pin + * + * \note + * IMemoryInputPin::Receive,IMemoryInputPin::ReceiveMultiple, IMemoryInputPin::EndOfStream, + * IMemAllocator::GetBuffer runs in different (streaming) thread then other + * methods (application thread). + * IMemoryInputPin::NewSegment runs either in streaming or application thread. + * Developer must use critical sections for thread-safing work. + * + */ static long STDCALL CInputPin_EndOfStream(IPin * This) { Debug unimplemented("CInputPin_EndOfStream", This); @@ -241,6 +465,15 @@ } +/** + * \brief IPin::BeginFlush (begins a flush operation) + * + * \param[in] This pointer to IPin interface + * + * \return S_OK - success + * \return E_UNEXPECTED - The pin is output pin + * + */ static long STDCALL CInputPin_BeginFlush(IPin * This) { Debug unimplemented("CInputPin_BeginFlush", This); @@ -248,12 +481,34 @@ } +/** + * \brief IPin::EndFlush (ends a flush operation) + * + * \param[in] This pointer to IPin interface + * + * \return S_OK - success + * \return E_UNEXPECTED - The pin is output pin + * + */ static long STDCALL CInputPin_EndFlush(IPin* This) { Debug unimplemented("CInputPin_EndFlush", This); return E_NOTIMPL; } +/** + * \brief IPin::NewSegment (media sample received after this call grouped as segment with common + * start,stop time and rate) + * + * \param[in] This pointer to IPin interface + * \param[in] tStart start time of new segment + * \param[in] tStop end time of new segment + * \param[in] dRate rate at wich segment should be processed + * + * \return S_OK - success + * \return E_UNEXPECTED - The pin is output pin + * + */ static long STDCALL CInputPin_NewSegment(IPin* This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, @@ -263,6 +518,12 @@ return E_NOTIMPL; } +/** + * \brief CInputPin destructor + * + * \param[in] This pointer to CInputPin class + * + */ static void CInputPin_Destroy(CInputPin* This) { free(This->vt); @@ -271,6 +532,15 @@ IMPLEMENT_IUNKNOWN(CInputPin) +/** + * \brief CInputPin constructor + * + * \param[in] amt media type for pin + * + * \return pointer to CInputPin if success + * \return NULL if error occured + * + */ CInputPin* CInputPinCreate(CBaseFilter* p, const AM_MEDIA_TYPE* amt) { CInputPin* This = (CInputPin*) malloc(sizeof(CInputPin)); @@ -326,24 +596,84 @@ return E_NOTIMPL; } +/** + * \brief IMediaFilter::Stop (stops the filter) + * + * \param[in] This pointer to IBaseFilter interface + * + * \return S_OK success + * \return S_FALSE transition is not complete + * + * \remarks + * When filter is stopped it does onot deliver or process any samples and rejects any samples + * from upstream filter. + * Transition may be asynchronous. In this case method should return S_FALSE. + * Method always sets filter's state to State_Stopped even if error occured. + * + */ static long STDCALL CBaseFilter_Stop(IBaseFilter* This) { Debug unimplemented("CBaseFilter_Stop", This); return E_NOTIMPL; } +/** + * \brief IMediaFilter::Pause (pauses filter) + * + * \param[in] This pointer to IBaseFilter interface + * + * \return S_OK success + * \return S_FALSE transition is not complete + * + * \remarks + * When filter is paused it can receive, process and deliver samples. + * Live source filters do not deliver any samples while paused. + * Transition may be asynchronous. In this case method should return S_FALSE. + * Method always sets filter's state to State_Stopped even if error occured. + * + */ static long STDCALL CBaseFilter_Pause(IBaseFilter* This) { Debug unimplemented("CBaseFilter_Pause", This); return E_NOTIMPL; } +/** + * \brief IMediaFilter::Run (runs the filter) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] tStart Reference time corresponding to stream time 0. + * + * \return S_OK success + * \return S_FALSE transition is not complete + * + * \remarks + * When filter is running it can receive, process and deliver samples. Source filters + * generatesnew samples, and renderers renders them. + * Stream time is calculated as the current reference time minus tStart. + * Graph Manager sets tStart slightly in the future according to graph latency. + * + */ static long STDCALL CBaseFilter_Run(IBaseFilter* This, REFERENCE_TIME tStart) { Debug unimplemented("CBaseFilter_Run", This); return E_NOTIMPL; } +/** + * \brief IMediaFilter::GetState (retrieves the filter's state (running, stopped or paused)) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] dwMilliSecsTimeout Timeout interval in milliseconds. To block indifinitely pass + * INFINITE. + * \param[out] State pointer to variable that receives a member of FILTER_STATE enumeration. + * + * \return S_OK success + * \return E_POINTER Null pointer + * \return VFW_S_STATE_INTERMEDATE Intermediate state + * \return VFW_S_CANT_CUE The filter is active, but cannot deliver data. + * + */ static long STDCALL CBaseFilter_GetState(IBaseFilter* This, /* [in] */ unsigned long dwMilliSecsTimeout, // /* [out] */ FILTER_STATE *State) @@ -353,6 +683,16 @@ return E_NOTIMPL; } +/** + * \brief IMediaFilter::SetSyncSource (sets the reference clock) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] pClock IReferenceClock interface of reference clock + * + * \return S_OK success + * \return apripriate error otherwise + * + */ static long STDCALL CBaseFilter_SetSyncSource(IBaseFilter* This, /* [in] */ IReferenceClock *pClock) { @@ -360,6 +700,17 @@ return E_NOTIMPL; } +/** + * \brief IMediafilter::GetSyncSource (gets current reference clock) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] pClock address of variable that receives pointer to clock's + * IReferenceClock interface + * + * \return S_OK success + * \return E_POINTER Null pointer + * + */ static long STDCALL CBaseFilter_GetSyncSource(IBaseFilter* This, /* [out] */ IReferenceClock **pClock) { @@ -368,6 +719,17 @@ } +/** + * \brief IBaseFilter::EnumPins (enumerates the pins of this filter) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] ppEnum address of variable that receives pointer to IEnumPins interface + * + * \return S_OK success + * \return E_OUTOFMEMORY Insufficient memory + * \return E_POINTER Null pointer + * + */ static long STDCALL CBaseFilter_EnumPins(IBaseFilter* This, /* [out] */ IEnumPins **ppEnum) { @@ -376,6 +738,21 @@ return 0; } +/** + * \brief IBaseFilter::FindPin (retrieves the pin with specified id) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] Id constant wide string, containing pin id + * \param[out] ppPin address of variable that receives pointer to pin's IPin interface + * + * \return S_OK success + * \return E_POINTER Null pointer + * \return VFW_E_NOT_FOUND Could not find a pin with specified id + * + * \note + * Be sure to release the interface after use. + * + */ static long STDCALL CBaseFilter_FindPin(IBaseFilter* This, /* [string][in] */ const unsigned short* Id, /* [out] */ IPin **ppPin) @@ -384,6 +761,19 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::QueryFilterInfo (retrieves information aboud the filter) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] pInfo pointer to FILTER_INFO structure + * + * \return S_OK success + * \return E_POINTER Null pointer + * + * \note + * If pGraph member of FILTER_INFO is not NULL, be sure to release IFilterGraph interface after use. + * + */ static long STDCALL CBaseFilter_QueryFilterInfo(IBaseFilter* This, // /* [out] */ FILTER_INFO *pInfo) void* pInfo) @@ -392,6 +782,22 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::JoinFilterGraph (notifies the filter that it has joined of left filter graph) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] pInfo pointer to graph's IFilterGraph interface or NULL if filter is leaving graph + * \param[in] pName pointer to wide character string that specifies a name for the filter + * + * \return S_OK success + * \return apropriate error code otherwise + * + * \remarks + * Filter should not call to graph's AddRef method. + * The IFilterGraph is guaranteed to be valid until graph manager calls this method again with + * the value NULL. + * + */ static long STDCALL CBaseFilter_JoinFilterGraph(IBaseFilter* This, /* [in] */ IFilterGraph* pGraph, /* [string][in] */ const unsigned short* pName) @@ -400,6 +806,20 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::QueryVendorInfo (retrieves a string containing vendor info) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] address of variable that receives pointer to a string containing vendor info + * + * \return S_OK success + * \return E_POINTER Null pointer + * \return E_NOTIMPL Not implemented + * + * \remarks + * Call to CoTaskMemFree to free memory allocated for string + * + */ static long STDCALL CBaseFilter_QueryVendorInfo(IBaseFilter* This, /* [string][out] */ unsigned short** pVendorInfo) { @@ -407,16 +827,38 @@ return E_NOTIMPL; } +/** + * \brief CBaseFilter::GetPin (gets used pin) + * + * \param[in] This pointer to CBaseFilter object + * + * \return pointer to used pin's IPin interface + * + */ static IPin* CBaseFilter_GetPin(CBaseFilter* This) { return This->pin; } +/** + * \brief CBaseFilter::GetUnusedPin (gets used pin) + * + * \param[in] This pointer to CBaseFilter object + * + * \return pointer to unused pin's IPin interface + * + */ static IPin* CBaseFilter_GetUnusedPin(CBaseFilter* This) { return This->unused_pin; } +/** + * \brief CBaseFilter destructor + * + * \param[in] This pointer to CBaseFilter object + * + */ static void CBaseFilter_Destroy(CBaseFilter* This) { if (This->vt) @@ -430,6 +872,15 @@ IMPLEMENT_IUNKNOWN(CBaseFilter) +/** + * \brief CBaseFilter constructor + * + * \param[in] type Pointer to media type for connection + * \param[in] parent Pointer to parent CBaseFilter2 object + * + * \return pointer to CBaseFilter object or NULL if error occured + * + */ CBaseFilter* CBaseFilterCreate(const AM_MEDIA_TYPE* type, CBaseFilter2* parent) { CBaseFilter* This = (CBaseFilter*) malloc(sizeof(CBaseFilter)); @@ -486,18 +937,64 @@ return E_NOTIMPL; } +/** + * \brief IMediaFilter::Stop (stops the filter) + * + * \param[in] This pointer to IBaseFilter interface + * + * \return S_OK success + * \return S_FALSE transition is not complete + * + * \remarks + * When filter is stopped it does onot deliver or process any samples and rejects any samples + * from upstream filter. + * Transition may be asynchronous. In this case method should return S_FALSE. + * Method always sets filter's state to State_Stopped even if error occured. + * + */ static long STDCALL CBaseFilter2_Stop(IBaseFilter* This) { Debug unimplemented("CBaseFilter2_Stop", This); return E_NOTIMPL; } +/** + * \brief IMediaFilter::Pause (pauses filter) + * + * \param[in] This pointer to IBaseFilter interface + * + * \return S_OK success + * \return S_FALSE transition is not complete + * + * \remarks + * When filter is paused it can receive, process and deliver samples. + * Live source filters do not deliver any samples while paused. + * Transition may be asynchronous. In this case method should return S_FALSE. + * Method always sets filter's state to State_Stopped even if error occured. + * + */ static long STDCALL CBaseFilter2_Pause(IBaseFilter* This) { Debug unimplemented("CBaseFilter2_Pause", This); return E_NOTIMPL; } +/** + * \brief IMediaFilter::Run (runs the filter) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] tStart Reference time corresponding to stream time 0. + * + * \return S_OK success + * \return S_FALSE transition is not complete + * + * \remarks + * When filter is running it can receive, process and deliver samples. Source filters + * generatesnew samples, and renderers renders them. + * Stream time is calculated as the current reference time minus tStart. + * Graph Manager sets tStart slightly in the future according to graph latency. + * + */ static long STDCALL CBaseFilter2_Run(IBaseFilter* This, REFERENCE_TIME tStart) { Debug unimplemented("CBaseFilter2_Run", This); @@ -505,6 +1002,20 @@ } +/** + * \brief IMediaFilter::GetState (retrieves the filter's state (running, stopped or paused)) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] dwMilliSecsTimeout Timeout interval in milliseconds. To block indifinitely pass + * INFINITE. + * \param[out] State pointer to variable that receives a member of FILTER_STATE enumeration. + * + * \return S_OK success + * \return E_POINTER Null pointer + * \return VFW_S_STATE_INTERMEDATE Intermediate state + * \return VFW_S_CANT_CUE The filter is active, but cannot deliver data. + * + */ static long STDCALL CBaseFilter2_GetState(IBaseFilter* This, /* [in] */ unsigned long dwMilliSecsTimeout, // /* [out] */ FILTER_STATE *State) @@ -514,6 +1025,16 @@ return E_NOTIMPL; } +/** + * \brief IMediaFilter::SetSyncSource (sets the reference clock) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] pClock IReferenceClock interface of reference clock + * + * \return S_OK success + * \return apripriate error otherwise + * + */ static long STDCALL CBaseFilter2_SetSyncSource(IBaseFilter* This, /* [in] */ IReferenceClock* pClock) { @@ -521,6 +1042,17 @@ return E_NOTIMPL; } +/** + * \brief IMediafilter::GetSyncSource (gets current reference clock) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] pClock address of variable that receives pointer to clock's + * IReferenceClock interface + * + * \return S_OK success + * \return E_POINTER Null pointer + * + */ static long STDCALL CBaseFilter2_GetSyncSource(IBaseFilter* This, /* [out] */ IReferenceClock** pClock) { @@ -528,6 +1060,17 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::EnumPins (enumerates the pins of this filter) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] ppEnum address of variable that receives pointer to IEnumPins interface + * + * \return S_OK success + * \return E_OUTOFMEMORY Insufficient memory + * \return E_POINTER Null pointer + * + */ static long STDCALL CBaseFilter2_EnumPins(IBaseFilter* This, /* [out] */ IEnumPins** ppEnum) { @@ -536,6 +1079,21 @@ return 0; } +/** + * \brief IBaseFilter::FindPin (retrieves the pin with specified id) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] Id constant wide string, containing pin id + * \param[out] ppPin address of variable that receives pointer to pin's IPin interface + * + * \return S_OK success + * \return E_POINTER Null pointer + * \return VFW_E_NOT_FOUND Could not find a pin with specified id + * + * \note + * Be sure to release the interface after use. + * + */ static long STDCALL CBaseFilter2_FindPin(IBaseFilter* This, /* [string][in] */ const unsigned short* Id, /* [out] */ IPin** ppPin) @@ -544,6 +1102,19 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::QueryFilterInfo (retrieves information aboud the filter) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] pInfo pointer to FILTER_INFO structure + * + * \return S_OK success + * \return E_POINTER Null pointer + * + * \note + * If pGraph member of FILTER_INFO is not NULL, be sure to release IFilterGraph interface after use. + * + */ static long STDCALL CBaseFilter2_QueryFilterInfo(IBaseFilter* This, // /* [out] */ FILTER_INFO *pInfo) void* pInfo) @@ -552,6 +1123,22 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::JoinFilterGraph (notifies the filter that it has joined of left filter graph) + * + * \param[in] This pointer to IBaseFilter interface + * \param[in] pInfo pointer to graph's IFilterGraph interface or NULL if filter is leaving graph + * \param[in] pName pointer to wide character string that specifies a name for the filter + * + * \return S_OK success + * \return apropriate error code otherwise + * + * \remarks + * Filter should not call to graph's AddRef method. + * The IFilterGraph is guaranteed to be valid until graph manager calls this method again with + * the value NULL. + * + */ static long STDCALL CBaseFilter2_JoinFilterGraph(IBaseFilter* This, /* [in] */ IFilterGraph* pGraph, /* [string][in] */ @@ -561,6 +1148,20 @@ return E_NOTIMPL; } +/** + * \brief IBaseFilter::QueryVendorInfo (retrieves a string containing vendor info) + * + * \param[in] This pointer to IBaseFilter interface + * \param[out] address of variable that receives pointer to a string containing vendor info + * + * \return S_OK success + * \return E_POINTER Null pointer + * \return E_NOTIMPL Not implemented + * + * \remarks + * Call to CoTaskMemFree to free memory allocated for string + * + */ static long STDCALL CBaseFilter2_QueryVendorInfo(IBaseFilter* This, /* [string][out] */ unsigned short** pVendorInfo) @@ -569,11 +1170,25 @@ return E_NOTIMPL; } +/** + * \brief CBaseFilter2::GetPin (gets used pin) + * + * \param[in] This pointer to CBaseFilter2 object + * + * \return pointer to used pin's IPin interface + * + */ static IPin* CBaseFilter2_GetPin(CBaseFilter2* This) { return This->pin; } +/** + * \brief CBaseFilter2 destructor + * + * \param[in] This pointer to CBaseFilter2 object + * + */ static void CBaseFilter2_Destroy(CBaseFilter2* This) { Debug printf("CBaseFilter2_Destroy(%p) called\n", This); @@ -588,11 +1203,19 @@ static GUID CBaseFilter2_interf1 = {0x76c61a30, 0xebe1, 0x11cf, {0x89, 0xf9, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}; +/// IID_IAMNetShowPreroll static GUID CBaseFilter2_interf2 = {0xaae7e4e2, 0x6388, 0x11d1, {0x8d, 0x93, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}; +/// IID_IAMRebuild static GUID CBaseFilter2_interf3 = {0x02ef04dd, 0x7580, 0x11d1, {0xbe, 0xce, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x37}}; +/** + * \brief CBaseFilter2 constructor + * + * \return pointer to CBaseFilter2 object or NULL if error occured + * + */ CBaseFilter2* CBaseFilter2Create() { CBaseFilter2* This = (CBaseFilter2*) malloc(sizeof(CBaseFilter2)); @@ -645,6 +1268,19 @@ *************/ +/** + * \brief IPin::ConnectedTo (retrieves pointer to the connected pin, if such exist) + * + * \param[in] This pointer to IPin interface + * \param[out] pPin pointer to remote pin's IPin interface + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * \return VFW_E_NOT_CONNECTED - pin is not connected + * + * \note + * Caller must call Release on received IPin, when done + */ static long STDCALL CRemotePin_ConnectedTo(IPin* This, /* [out] */ IPin** pPin) { Debug printf("CRemotePin_ConnectedTo(%p) called\n", This); @@ -655,6 +1291,16 @@ return 0; } +/** + * \brief IPin::QueryDirection (retrieves pin direction) + * + * \param[in] This pointer to IPin interface + * \param[out] pPinDir pointer to variable, that receives pin direction (PINDIR_INPUT,PINDIR_OUTPUT) + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * + */ static long STDCALL CRemotePin_QueryDirection(IPin* This, /* [out] */ PIN_DIRECTION* pPinDir) { @@ -665,12 +1311,36 @@ return 0; } +/** + * \brief IPin::ConnectionMediaType (retrieves media type for connection, if such exist) + * + * \param[in] This pointer to IPin interface + * \param[out] pmt pointer to AM_MEDIA_TYPE, that receives connection media type + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * \return VFW_E_NOT_CONNECTED - pin is not connected + * + */ static long STDCALL CRemotePin_ConnectionMediaType(IPin* This, /* [out] */ AM_MEDIA_TYPE* pmt) { Debug unimplemented("CRemotePin_ConnectionMediaType", This); return E_NOTIMPL; } +/** + * \brief IPin::QueryPinInfo (retrieves information about the pin) + * + * \param[in] This pointer to IPin interface + * \param[out] pInfo pointer to PIN_INFO structure, that receives pin info + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * + * \note + * If pInfo->pFilter is not NULL, then caller must call Release on pInfo->pFilter when done + * + */ static long STDCALL CRemotePin_QueryPinInfo(IPin* This, /* [out] */ PIN_INFO* pInfo) { CBaseFilter* lparent = ((CRemotePin*)This)->parent; @@ -682,6 +1352,12 @@ return 0; } +/** + * \brief CRemotePin destructor + * + * \param[in] This pointer to CRemotePin object + * + */ static void CRemotePin_Destroy(CRemotePin* This) { Debug printf("CRemotePin_Destroy(%p) called\n", This); @@ -691,6 +1367,15 @@ IMPLEMENT_IUNKNOWN(CRemotePin) +/** + * \brief CRemotePin constructor + * + * \param[in] pt parent filter + * \param[in] rpin remote pin + * + * \return pointer to CRemotePin or NULL if error occured + * + */ CRemotePin* CRemotePinCreate(CBaseFilter* pt, IPin* rpin) { CRemotePin* This = (CRemotePin*) malloc(sizeof(CRemotePin)); @@ -732,6 +1417,19 @@ *************/ +/** + * \brief IPin::QueryPinInfo (retrieves information about the pin) + * + * \param[in] This pointer to IPin interface + * \param[out] pInfo pointer to PIN_INFO structure, that receives pin info + * + * \return S_OK - success + * \return E_POINTER - Null pointer + * + * \note + * If pInfo->pFilter is not NULL, then caller must call Release on pInfo->pFilter when done + * + */ static long STDCALL CRemotePin2_QueryPinInfo(IPin* This, /* [out] */ PIN_INFO* pInfo) { @@ -744,7 +1442,13 @@ return 0; } -// FIXME - not being released! +/** + * \brief CremotePin2 destructor + * + * \param This pointer to CRemotePin2 object + * + * FIXME - not being released! + */ static void CRemotePin2_Destroy(CRemotePin2* This) { Debug printf("CRemotePin2_Destroy(%p) called\n", This); @@ -754,6 +1458,14 @@ IMPLEMENT_IUNKNOWN(CRemotePin2) +/** + * \brief CRemotePin2 contructor + * + * \param[in] p pointer to parent CBaseFilter2 object + * + * \return pointer to CRemotePin2 object or NULL if error occured + * + */ CRemotePin2* CRemotePin2Create(CBaseFilter2* p) { CRemotePin2* This = (CRemotePin2*) malloc(sizeof(CRemotePin2));