dom/media/directshow/AudioSinkInputPin.h
author Nathan Froyd <froydnj@mozilla.com>
Wed, 17 Jun 2015 10:00:52 -0400
changeset 282406 c664375c0d5bed41821b4a9eaa298e3856efe1d2
parent 263771 ac4464790ec4896a5188fa50cfc69ae0ffeddc08
child 284279 91d6e262b662a0b4e47358665e222d3927337af9
permissions -rw-r--r--
Bug 1161627 - part 2 - machine-convert TemporaryRef<T> to already_AddRefed<T>; r=ehsan This conversion was done with the script: find . -name '*.cpp' -o -name '*.h' -o -name '*.mm' -o -name '*.idl' | \ egrep -v 'cairo-win32-refptr.h|RefPtr.h|TestRefPtr.cpp' | \ xargs sed -i -e 's/mozilla::TemporaryRef</already_AddRefed</g' \ -e 's/TemporaryRef</already_AddRefed</g' Manual fixups were performed in the following instances: - We handled mfbt/RefPtr.h manually so as to not convert TemporaryRef itself into already_AddRefed. - The following files had explicit Move() calls added to make up for the lack of a copy constructor on already_AddRefed: dom/base/ImageEncoder.cpp dom/media/MediaTaskQueue.{h,cpp} dom/media/webaudio/PannerNode.cpp - A redundant overload for MediaTaskQueue::Dispatch was deleted. - A few manual fixups were required in mfbt/tests/TestRefPtr.cpp. - Comments, using declarations, and forward declarations relating to TemporaryRef in dom/canvas/ and gfx/layers/ were changed to refer to already_AddRefed.

/* -*- 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(AudioSinkInputPin_h_)
#define AudioSinkInputPin_h_

#include "BaseInputPin.h"
#include "DirectShowUtils.h"
#include "mozilla/RefPtr.h"
#include "nsAutoPtr.h"

namespace mozilla {

namespace media {
  class MediaType;
}

class AudioSinkFilter;
class SampleSink;


// Input pin for capturing audio output of a DirectShow filter graph.
// This is the input pin for the AudioSinkFilter.
class AudioSinkInputPin: public mozilla::media::BaseInputPin
{
public:
  AudioSinkInputPin(wchar_t* aObjectName,
                    AudioSinkFilter* aFilter,
                    mozilla::CriticalSection* aLock,
                    HRESULT* aOutResult);
  virtual ~AudioSinkInputPin();

  HRESULT GetMediaType (IN int iPos, OUT mozilla::media::MediaType * pmt);
  HRESULT CheckMediaType (IN const mozilla::media::MediaType * pmt);
  STDMETHODIMP Receive (IN IMediaSample *);
  STDMETHODIMP BeginFlush() override;
  STDMETHODIMP EndFlush() override;

  // Called when we start decoding a new segment, that happens directly after
  // a seek. This captures the segment's start time. Samples decoded by the
  // MP3 decoder have their timestamps offset from the segment start time.
  // Storing the segment start time enables us to set each sample's MediaTime
  // as an offset in the stream relative to the start of the stream, rather
  // than the start of the segment, i.e. its absolute time in the stream.
  STDMETHODIMP NewSegment(REFERENCE_TIME tStart,
                          REFERENCE_TIME tStop,
                          double dRate) override;

  STDMETHODIMP EndOfStream() override;

  // Returns the IMediaSeeking interface of the connected output pin.
  // We forward seeking requests upstream from the sink to the source
  // filters.
  already_AddRefed<IMediaSeeking> GetConnectedPinSeeking();

  SampleSink* GetSampleSink();

private:
  AudioSinkFilter* GetAudioSinkFilter();

  // Sets the media time on the media sample, relative to the segment
  // start time.
  HRESULT SetAbsoluteMediaTime(IMediaSample* aSample);

  nsAutoPtr<SampleSink> mSampleSink;

  // Synchronized by the filter lock; BaseInputPin::mLock.
  REFERENCE_TIME mSegmentStartTime;
};

} // namespace mozilla
#endif // AudioSinkInputPin_h_