diff options
Diffstat (limited to 'dom/media/directshow/SampleSink.h')
-rw-r--r-- | dom/media/directshow/SampleSink.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/dom/media/directshow/SampleSink.h b/dom/media/directshow/SampleSink.h new file mode 100644 index 000000000..6a1af9fee --- /dev/null +++ b/dom/media/directshow/SampleSink.h @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#if !defined(SampleSink_h_) +#define SampleSink_h_ + +#include "BaseFilter.h" +#include "DirectShowUtils.h" +#include "mozilla/RefPtr.h" +#include "mozilla/ReentrantMonitor.h" + +namespace mozilla { + +class SampleSink { +public: + SampleSink(); + virtual ~SampleSink(); + + // Sets the audio format of the incoming samples. The upstream filter + // calls this. This makes a copy. + void SetAudioFormat(const WAVEFORMATEX* aInFormat); + + // Copies the format of incoming audio samples into into *aOutFormat. + void GetAudioFormat(WAVEFORMATEX* aOutFormat); + + // Called when a sample is delivered by the DirectShow graph to the sink. + // The decode thread retrieves the sample by calling WaitForSample(). + // Blocks if there's already a sample waiting to be consumed by the decode + // thread. + HRESULT Receive(IMediaSample* aSample); + + // Retrieves a sample from the sample queue, blocking until one becomes + // available, or until an error occurs. Returns S_FALSE on EOS. + HRESULT Extract(RefPtr<IMediaSample>& aOutSample); + + // Unblocks any threads waiting in GetSample(). + // Clears mSample, which unblocks upstream stream. + void Flush(); + + // Opens up the sink to receive more samples in PutSample(). + // Clears EOS flag. + void Reset(); + + // Marks that we've reacehd the end of stream. + void SetEOS(); + + // Returns whether we're at end of stream. + bool AtEOS(); + +private: + // All data in this class is syncronized by mMonitor. + ReentrantMonitor mMonitor; + RefPtr<IMediaSample> mSample; + + // Format of the audio stream we're receiving. + WAVEFORMATEX mAudioFormat; + + bool mIsFlushing; + bool mAtEOS; +}; + +} // namespace mozilla + +#endif // SampleSink_h_ |