96 lines
3.0 KiB
C++
96 lines
3.0 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// MPEG1Stream.h
|
|
// Implements the stream object (IMFMediaStream) for the MPEG-1 source.
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
class MPEG1Source;
|
|
|
|
// The media stream object.
|
|
class MPEG1Stream : BaseObject, RefCountedObject, public IMFMediaStream
|
|
{
|
|
public:
|
|
|
|
MPEG1Stream(MPEG1Source *pSource, IMFStreamDescriptor *pSD, HRESULT& hr);
|
|
~MPEG1Stream();
|
|
|
|
// IUnknown
|
|
STDMETHODIMP QueryInterface(REFIID iid, void** ppv);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
// IMFMediaEventGenerator
|
|
STDMETHODIMP BeginGetEvent(IMFAsyncCallback* pCallback,IUnknown* punkState);
|
|
STDMETHODIMP EndGetEvent(IMFAsyncResult* pResult, IMFMediaEvent** ppEvent);
|
|
STDMETHODIMP GetEvent(DWORD dwFlags, IMFMediaEvent** ppEvent);
|
|
STDMETHODIMP QueueEvent(MediaEventType met, REFGUID guidExtendedType, HRESULT hrStatus, const PROPVARIANT* pvValue);
|
|
|
|
// IMFMediaStream
|
|
STDMETHODIMP GetMediaSource(IMFMediaSource** ppMediaSource);
|
|
STDMETHODIMP GetStreamDescriptor(IMFStreamDescriptor** ppStreamDescriptor);
|
|
STDMETHODIMP RequestSample(IUnknown* pToken);
|
|
|
|
// Other methods (called by source)
|
|
HRESULT Activate(BOOL bActive);
|
|
HRESULT Start(const PROPVARIANT& varStart);
|
|
HRESULT Pause();
|
|
HRESULT Stop();
|
|
HRESULT EndOfStream();
|
|
HRESULT Shutdown();
|
|
|
|
BOOL IsActive() const { return m_bActive; }
|
|
BOOL NeedsData();
|
|
|
|
HRESULT DeliverPayload(IMFSample *pSample);
|
|
|
|
// Callbacks
|
|
HRESULT OnDispatchSamples(IMFAsyncResult *pResult);
|
|
|
|
private:
|
|
|
|
// SourceLock class:
|
|
// Small helper class to lock and unlock the source.
|
|
// It works like the AutoLock class in Common\critsec.h.
|
|
class SourceLock
|
|
{
|
|
private:
|
|
MPEG1Source *m_pSource;
|
|
public:
|
|
SourceLock(MPEG1Source *pSource);
|
|
~SourceLock();
|
|
};
|
|
|
|
private:
|
|
|
|
HRESULT CheckShutdown() const
|
|
{
|
|
return ( m_state == STATE_SHUTDOWN ? MF_E_SHUTDOWN : S_OK );
|
|
}
|
|
HRESULT DispatchSamples();
|
|
|
|
|
|
private:
|
|
MPEG1Source *m_pSource; // Parent media source
|
|
IMFStreamDescriptor *m_pStreamDescriptor;
|
|
IMFMediaEventQueue *m_pEventQueue; // Event generator helper
|
|
|
|
SourceState m_state; // Current state (running, stopped, paused)
|
|
BOOL m_bActive; // Is the stream active?
|
|
BOOL m_bEOS; // Did the source reach the end of the stream?
|
|
|
|
SampleList m_Samples; // Samples waiting to be delivered.
|
|
TokenList m_Requests; // Sample requests, waiting to be dispatched.
|
|
};
|
|
|
|
|