Commit ea1ab9ac authored by Robert O'Callahan's avatar Robert O'Callahan
Browse files

Bug 513144. Hoist nsMediaStream creation up into nsHTMLMediaElement, out of...

Bug 513144. Hoist nsMediaStream creation up into nsHTMLMediaElement, out of the decoders. Pass the stream as the parameter to nsMediaDecoder::Load. r=doublec

--HG--
extra : rebase_source : f418076a0d534d528dbded66b2d49d8fe908de4b
parent df1c341e
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@
#include "nsHTMLMediaError.h"
#include "nsICategoryManager.h"
#include "nsCommaSeparatedTokenizer.h"
#include "nsMediaStream.h"

#include "nsIContentPolicy.h"
#include "nsContentPolicyUtils.h"
@@ -1206,12 +1207,16 @@ nsresult nsHTMLMediaElement::InitializeDecoderForChannel(nsIChannel *aChannel,

  mNetworkState = nsIDOMHTMLMediaElement::NETWORK_LOADING;

  nsresult rv = mDecoder->Load(aChannel, aListener);
  nsMediaStream* stream = nsMediaStream::Create(mDecoder, aChannel);
  if (!stream)
    return NS_ERROR_OUT_OF_MEMORY;

  nsresult rv = mDecoder->Load(stream, aListener);
  if (NS_FAILED(rv))
    return rv;

  // Decoder successfully created, its nsMediaStream now has responsibility
  // for the channel, and the owning reference.
  // Decoder successfully created, the decoder now owns the nsMediaStream
  // which owns the channel.
  mChannel = nsnull;

  mDecoder->SetVolume(mMuted ? 0.0 : mVolume);
+4 −3
Original line number Diff line number Diff line
@@ -109,11 +109,12 @@ public:
  // called.
  virtual nsresult Play() = 0;

  // Start downloading the video. Decode the downloaded data up to the
  // Start downloading the media. Decode the downloaded data up to the
  // point of the first frame of data.
  // aChannel and aListener must not be null.
  // aStream is the media stream to use. Ownership of aStream passes to
  // the decoder, even if Load returns an error.
  // This is called at most once per decoder, after Init().
  virtual nsresult Load(nsIChannel* aChannel,
  virtual nsresult Load(nsMediaStream* aStream,
                        nsIStreamListener **aListener) = 0;

  // Draw the latest video data. This is done
+6 −11
Original line number Diff line number Diff line
@@ -1965,31 +1965,26 @@ nsOggDecoder::~nsOggDecoder()
  nsAutoMonitor::DestroyMonitor(mMonitor);
}

nsresult nsOggDecoder::Load(nsIChannel* aChannel,
nsresult nsOggDecoder::Load(nsMediaStream* aStream,
                            nsIStreamListener** aStreamListener)
{
  NS_ASSERTION(aChannel, "A channel is required");
  NS_ASSERTION(aStreamListener, "A listener should be requested here");

  *aStreamListener = nsnull;

  nsAutoPtr<nsMediaStream> stream;
  stream = nsMediaStream::Create(this, aChannel);
  if (!stream) {
    return NS_ERROR_OUT_OF_MEMORY;
  }

  {
    // Hold the lock while we do this to set proper lock ordering
    // expectations for dynamic deadlock detectors: decoder lock(s)
    // should be grabbed before the cache lock
    nsAutoMonitor mon(mMonitor);

    nsresult rv = stream->Open(aStreamListener);
    if (NS_FAILED(rv))
    nsresult rv = aStream->Open(aStreamListener);
    if (NS_FAILED(rv)) {
      delete aStream;
      return rv;
    }

    mReader->Init(stream.forget());
    mReader->Init(aStream);
  }

  nsresult rv = NS_NewThread(getter_AddRefs(mDecodeThread));
+2 −2
Original line number Diff line number Diff line
@@ -310,7 +310,7 @@ class nsOggDecoder : public nsMediaDecoder
  
  virtual float GetCurrentTime();

  virtual nsresult Load(nsIChannel* aChannel,
  virtual nsresult Load(nsMediaStream* aStream,
                        nsIStreamListener** aListener);

  // Start playback of a video. 'Load' must have previously been
+3 −4
Original line number Diff line number Diff line
@@ -1282,15 +1282,14 @@ nsWaveDecoder::Stop()
}

nsresult
nsWaveDecoder::Load(nsIChannel* aChannel, nsIStreamListener** aStreamListener)
nsWaveDecoder::Load(nsMediaStream* aStream, nsIStreamListener** aStreamListener)
{
  NS_ASSERTION(aChannel, "A channel is required");
  NS_ASSERTION(aStream, "A stream should be provided");
  NS_ASSERTION(aStreamListener, "A listener should be requested here");

  *aStreamListener = nsnull;

  mStream = nsMediaStream::Create(this, aChannel);
  NS_ENSURE_TRUE(mStream, NS_ERROR_OUT_OF_MEMORY);
  mStream = aStream;

  nsresult rv = mStream->Open(aStreamListener);
  NS_ENSURE_SUCCESS(rv, rv);
Loading