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

Bug 513144. Split static nsMediaStream::Open into static nsMediaStream::Create...

Bug 513144. Split static nsMediaStream::Open into static nsMediaStream::Create and nonstatic nsMediaStream::Open. Move call to NS_GetFinalChannelURI down into nsMediaStream::Create. r=doublec

--HG--
extra : rebase_source : be999ad63f1bb1f8adcbbac0640a916f022203a7
parent c764bf18
Loading
Loading
Loading
Loading
+11 −33
Original line number Diff line number Diff line
@@ -923,47 +923,25 @@ PRInt64 nsMediaFileStream::Tell()
  return offset;
}

nsresult
nsMediaStream::Open(nsMediaDecoder* aDecoder, nsIURI* aURI,
                    nsIChannel* aChannel, nsMediaStream** aStream,
                    nsIStreamListener** aListener)
nsMediaStream*
nsMediaStream::Create(nsMediaDecoder* aDecoder, nsIChannel* aChannel)
{
  NS_ASSERTION(NS_IsMainThread(), 
	             "nsMediaStream::Open called on non-main thread");

  *aStream = nsnull;

  nsCOMPtr<nsIChannel> channel;
  if (aChannel) {
    channel = aChannel;
  } else {
    nsHTMLMediaElement* element = aDecoder->GetMediaElement();
    NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER);
    nsCOMPtr<nsILoadGroup> loadGroup = element->GetDocumentLoadGroup();
    nsresult rv = NS_NewChannel(getter_AddRefs(channel), 
                                aURI, 
                                nsnull,
                                loadGroup,
                                nsnull,
                                nsICachingChannel::LOAD_BYPASS_LOCAL_CACHE_IF_BUSY);
    NS_ENSURE_SUCCESS(rv, rv);
  }
  // If the channel was redirected, we want the post-redirect URI;
  // but if the URI scheme was expanded, say from chrome: to jar:file:,
  // we want the original URI.
  nsCOMPtr<nsIURI> uri;
  nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
  NS_ENSURE_SUCCESS(rv, nsnull);

  nsMediaStream* stream;
  nsCOMPtr<nsIFileChannel> fc = do_QueryInterface(channel);
  nsCOMPtr<nsIFileChannel> fc = do_QueryInterface(aChannel);
  if (fc) {
    stream = new nsMediaFileStream(aDecoder, channel, aURI);
  } else {
    stream = new nsMediaChannelStream(aDecoder, channel, aURI);
    return new nsMediaFileStream(aDecoder, aChannel, uri);
  }
  if (!stream)
    return NS_ERROR_OUT_OF_MEMORY;

  nsresult rv = stream->Open(aListener);
  NS_ENSURE_SUCCESS(rv, rv);

  *aStream = stream;
  return NS_OK;
  return new nsMediaChannelStream(aDecoder, aChannel, uri);
}

void nsMediaStream::MoveLoadsToBackground() {
+10 −16
Original line number Diff line number Diff line
@@ -249,15 +249,17 @@ public:
  virtual PRBool IsSuspendedByCache() = 0;

  /**
   * Create a stream, reading data from the 
   * media resource at the URI. Call on main thread only.
   * @param aChannel if non-null, this channel is used and aListener
   * is set to the listener we want for the channel. aURI must
   * be the URI for the channel, obtained via NS_GetFinalChannelURI.
   * Create a stream, reading data from the media resource via the
   * channel. Call on main thread only.
   * The caller must follow up by calling aStream->Open.
   */
  static nsresult Open(nsMediaDecoder* aDecoder, nsIURI* aURI,
                       nsIChannel* aChannel, nsMediaStream** aStream,
                       nsIStreamListener** aListener);
  static nsMediaStream* Create(nsMediaDecoder* aDecoder, nsIChannel* aChannel);

  /**
   * Open the stream. This creates a stream listener and returns it in
   * aStreamListener; this listener needs to be notified of incoming data.
   */
  virtual nsresult Open(nsIStreamListener** aStreamListener) = 0;

protected:
  nsMediaStream(nsMediaDecoder* aDecoder, nsIChannel* aChannel, nsIURI* aURI) :
@@ -269,14 +271,6 @@ protected:
    MOZ_COUNT_CTOR(nsMediaStream);
  }

  /**
   * @param aStreamListener if null, the strategy should open mChannel
   * itself. Otherwise, mChannel is already open and the strategy
   * should just return its stream listener in aStreamListener (or set
   * *aStreamListener to null, if it doesn't need a listener).
   */
  virtual nsresult Open(nsIStreamListener** aStreamListener) = 0;

  // This is not an nsCOMPointer to prevent a circular reference
  // between the decoder to the media stream object. The stream never
  // outlives the lifetime of the decoder.
+9 −13
Original line number Diff line number Diff line
@@ -1973,12 +1973,11 @@ nsresult nsOggDecoder::Load(nsIChannel* aChannel,

  *aStreamListener = nsnull;

  // If the channel was redirected, we want the post-redirect URI;
  // but if the URI scheme was expanded, say from chrome: to jar:file:,
  // we want the original URI.
  nsCOMPtr<nsIURI> uri;
  nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
  NS_ENSURE_SUCCESS(rv, rv);
  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
@@ -1986,17 +1985,14 @@ nsresult nsOggDecoder::Load(nsIChannel* aChannel,
    // should be grabbed before the cache lock
    nsAutoMonitor mon(mMonitor);

    nsAutoPtr<nsMediaStream> stream;
    nsresult rv = nsMediaStream::Open(this, uri, aChannel,
                                      getter_Transfers(stream),
                                      aStreamListener);
    if (NS_FAILED(rv)) {
    nsresult rv = stream->Open(aStreamListener);
    if (NS_FAILED(rv))
      return rv;
    }

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

  rv = NS_NewThread(getter_AddRefs(mDecodeThread));
  nsresult rv = NS_NewThread(getter_AddRefs(mDecodeThread));
  NS_ENSURE_SUCCESS(rv, rv);

  mDecodeStateMachine = new nsOggDecodeStateMachine(this);
+4 −5
Original line number Diff line number Diff line
@@ -1289,13 +1289,12 @@ nsWaveDecoder::Load(nsIChannel* aChannel, nsIStreamListener** aStreamListener)

  *aStreamListener = nsnull;

  nsCOMPtr<nsIURI> uri;
  nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
  NS_ENSURE_SUCCESS(rv, rv);
  mStream = nsMediaStream::Create(this, aChannel);
  NS_ENSURE_TRUE(mStream, NS_ERROR_OUT_OF_MEMORY);

  rv = nsMediaStream::Open(this, uri, aChannel, getter_Transfers(mStream),
                           aStreamListener);
  nsresult rv = mStream->Open(aStreamListener);
  NS_ENSURE_SUCCESS(rv, rv);

  mPlaybackStateMachine->SetStream(mStream);

  rv = NS_NewThread(getter_AddRefs(mPlaybackThread));