2025-11-28 00:35:46 +09:00

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.
};