mirror of
https://github.com/libretro/pcsx2.git
synced 2025-02-12 21:28:26 +00:00
![Jonathan Li](/assets/img/avatar_default.png)
Update it to the version found at https://github.com/Microsoft/Windows-classic-samples , which is in an MIT licensed repo, and add the LICENSE file (edited to remove the SIL Open Font LICENSE part since that doesn't apply). Some modifications have been made to reduce the diff/stop git complaining (not including any file that wasn't in the previous version and removing the related header includes in streams.h, and fixing some but not all of the whitespace issues).
153 lines
4.2 KiB
C++
153 lines
4.2 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: PullPin.h
|
|
//
|
|
// Desc: DirectShow base classes - defines CPullPin class.
|
|
//
|
|
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef __PULLPIN_H__
|
|
#define __PULLPIN_H__
|
|
|
|
//
|
|
// CPullPin
|
|
//
|
|
// object supporting pulling data from an IAsyncReader interface.
|
|
// Given a start/stop position, calls a pure Receive method with each
|
|
// IMediaSample received.
|
|
//
|
|
// This is essentially for use in a MemInputPin when it finds itself
|
|
// connected to an IAsyncReader pin instead of a pushing pin.
|
|
//
|
|
|
|
class CPullPin : public CAMThread
|
|
{
|
|
IAsyncReader* m_pReader;
|
|
REFERENCE_TIME m_tStart;
|
|
REFERENCE_TIME m_tStop;
|
|
REFERENCE_TIME m_tDuration;
|
|
BOOL m_bSync;
|
|
|
|
enum ThreadMsg {
|
|
TM_Pause, // stop pulling and wait for next message
|
|
TM_Start, // start pulling
|
|
TM_Exit, // stop and exit
|
|
};
|
|
|
|
ThreadMsg m_State;
|
|
|
|
// override pure thread proc from CAMThread
|
|
DWORD ThreadProc(void);
|
|
|
|
// running pull method (check m_bSync)
|
|
void Process(void);
|
|
|
|
// clean up any cancelled i/o after a flush
|
|
void CleanupCancelled(void);
|
|
|
|
// suspend thread from pulling, eg during seek
|
|
HRESULT PauseThread();
|
|
|
|
// start thread pulling - create thread if necy
|
|
HRESULT StartThread();
|
|
|
|
// stop and close thread
|
|
HRESULT StopThread();
|
|
|
|
// called from ProcessAsync to queue and collect requests
|
|
HRESULT QueueSample(
|
|
__inout REFERENCE_TIME& tCurrent,
|
|
REFERENCE_TIME tAlignStop,
|
|
BOOL bDiscontinuity);
|
|
|
|
HRESULT CollectAndDeliver(
|
|
REFERENCE_TIME tStart,
|
|
REFERENCE_TIME tStop);
|
|
|
|
HRESULT DeliverSample(
|
|
IMediaSample* pSample,
|
|
REFERENCE_TIME tStart,
|
|
REFERENCE_TIME tStop);
|
|
|
|
protected:
|
|
IMemAllocator * m_pAlloc;
|
|
|
|
public:
|
|
CPullPin();
|
|
virtual ~CPullPin();
|
|
|
|
// returns S_OK if successfully connected to an IAsyncReader interface
|
|
// from this object
|
|
// Optional allocator should be proposed as a preferred allocator if
|
|
// necessary
|
|
// bSync is TRUE if we are to use sync reads instead of the
|
|
// async methods.
|
|
HRESULT Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync);
|
|
|
|
// disconnect any connection made in Connect
|
|
HRESULT Disconnect();
|
|
|
|
// agree an allocator using RequestAllocator - optional
|
|
// props param specifies your requirements (non-zero fields).
|
|
// returns an error code if fail to match requirements.
|
|
// optional IMemAllocator interface is offered as a preferred allocator
|
|
// but no error occurs if it can't be met.
|
|
virtual HRESULT DecideAllocator(
|
|
IMemAllocator* pAlloc,
|
|
__inout_opt ALLOCATOR_PROPERTIES * pProps);
|
|
|
|
// set start and stop position. if active, will start immediately at
|
|
// the new position. Default is 0 to duration
|
|
HRESULT Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop);
|
|
|
|
// return the total duration
|
|
HRESULT Duration(__out REFERENCE_TIME* ptDuration);
|
|
|
|
// start pulling data
|
|
HRESULT Active(void);
|
|
|
|
// stop pulling data
|
|
HRESULT Inactive(void);
|
|
|
|
// helper functions
|
|
LONGLONG AlignDown(LONGLONG ll, LONG lAlign) {
|
|
// aligning downwards is just truncation
|
|
return ll & ~(lAlign-1);
|
|
};
|
|
|
|
LONGLONG AlignUp(LONGLONG ll, LONG lAlign) {
|
|
// align up: round up to next boundary
|
|
return (ll + (lAlign -1)) & ~(lAlign -1);
|
|
};
|
|
|
|
// GetReader returns the (addrefed) IAsyncReader interface
|
|
// for SyncRead etc
|
|
IAsyncReader* GetReader() {
|
|
m_pReader->AddRef();
|
|
return m_pReader;
|
|
};
|
|
|
|
// -- pure --
|
|
|
|
// override this to handle data arrival
|
|
// return value other than S_OK will stop data
|
|
virtual HRESULT Receive(IMediaSample*) PURE;
|
|
|
|
// override this to handle end-of-stream
|
|
virtual HRESULT EndOfStream(void) PURE;
|
|
|
|
// called on runtime errors that will have caused pulling
|
|
// to stop
|
|
// these errors are all returned from the upstream filter, who
|
|
// will have already reported any errors to the filtergraph.
|
|
virtual void OnError(HRESULT hr) PURE;
|
|
|
|
// flush this pin and all downstream
|
|
virtual HRESULT BeginFlush() PURE;
|
|
virtual HRESULT EndFlush() PURE;
|
|
|
|
};
|
|
|
|
#endif //__PULLPIN_H__
|