windows-nt/Source/XPSP1/NT/multimedia/dshow/streams/ddstream/bytestrm.h
2020-09-26 16:20:57 +08:00

157 lines
4.1 KiB
C++

// Copyright (c) 1997 Microsoft Corporation. All Rights Reserved.
// bytestrm.h : Declaration of the CByteStream
#ifndef __BYTESTRM_H_
#define __BYTESTRM_H_
class CByteSample;
/////////////////////////////////////////////////////////////////////////////
// CByteStream
class ATL_NO_VTABLE CByteStream :
public CStream
{
public:
//
// METHODS
//
CByteStream();
STDMETHODIMP SetState(
/* [in] */ FILTER_STATE State
);
//
// IPin
//
STDMETHODIMP BeginFlush();
STDMETHODIMP EndOfStream(void);
//
// IMemInputPin
//
STDMETHODIMP Receive(IMediaSample *pSample);
STDMETHODIMP GetAllocator(IMemAllocator ** ppAllocator);
//
// IMemAllocator
//
STDMETHODIMP GetBuffer(IMediaSample **ppBuffer, REFERENCE_TIME * pStartTime,
REFERENCE_TIME * pEndTime, DWORD dwFlags);
// Fill any samples waiting to be filled
void FillSamples();
// Check if it's time to do the real EndOfStream
void CheckEndOfStream();
protected:
/* Queue of samples */
CDynamicArray<IMediaSample *, CComPtr<IMediaSample> >
m_arSamples;
/* Current sample/buffer */
PBYTE m_pbData;
DWORD m_cbData;
DWORD m_dwPosition;
/* Track time stamps */
CTimeStamp m_TimeStamp;
/* Byte rate for time stamp computation */
LONG m_lBytesPerSecond;
/* End Of Stream pending - it will be delivered when we've
emptied the last sample off our list
*/
bool m_bEOSPending;
};
/////////////////////////////////////////////////////////////////////////////
// CByteStreamSample
class ATL_NO_VTABLE CByteStreamSample :
public CSample
{
friend class CByteStream;
public:
CByteStreamSample();
//
// IStreamSample
//
STDMETHODIMP GetMediaStream(
/* [in] */ IMediaStream **ppMediaStream)
{
return CSample::GetMediaStream(ppMediaStream);
}
STDMETHODIMP GetSampleTimes(
/* [optional][out] */ STREAM_TIME *pStartTime,
/* [optional][out] */ STREAM_TIME *pEndTime,
/* [optional][out] */ STREAM_TIME *pCurrentTime)
{
return CSample::GetSampleTimes(
pStartTime,
pEndTime,
pCurrentTime
);
}
STDMETHODIMP SetSampleTimes(
/* [optional][in] */ const STREAM_TIME *pStartTime,
/* [optional][in] */ const STREAM_TIME *pEndTime)
{
return CSample::SetSampleTimes(pStartTime, pEndTime);
}
STDMETHODIMP CompletionStatus(
/* [in] */ DWORD dwFlags,
/* [optional][in] */ DWORD dwMilliseconds)
{
return CSample::CompletionStatus(dwFlags, dwMilliseconds);
}
HRESULT Init(
IMemoryData *pMemData
);
STDMETHODIMP GetInformation(
/* [out] */ DWORD *pdwLength,
/* [out] */ BYTE **ppbData,
/* [out] */ DWORD *pcbActualData
);
// Override to make sure samples get updated
HRESULT InternalUpdate(
DWORD dwFlags,
HANDLE hEvent,
PAPCFUNC pfnAPC,
DWORD_PTR dwAPCData
);
//
// Methods forwarded from MediaSample object.
//
HRESULT MSCallback_GetPointer(BYTE ** ppBuffer) { *ppBuffer = m_pbData; return NOERROR; };
LONG MSCallback_GetSize(void) { return m_cbSize; };
LONG MSCallback_GetActualDataLength(void) { return m_cbData; };
HRESULT MSCallback_SetActualDataLength(LONG lActual)
{
if ((DWORD)lActual <= m_cbSize) {
m_cbData = lActual;
return NOERROR;
}
return E_INVALIDARG;
};
protected:
PBYTE m_pbData;
DWORD m_cbSize;
DWORD m_cbData;
CComPtr<IMemoryData> m_pMemData;
};
#endif // __BYTESTRM_H_