Bug 631058 - Backing out changesets 0d43e33ce134 and 60d7b8a4c275. r=wes, a=backout-scary-stuff GECKO20b12pre_20110216_RELBRANCH FENNEC_4_0b5_BUILD3 FENNEC_4_0b5_RELEASE
authorDoug Turner <dougt@dougt.org>
Thu, 17 Feb 2011 08:41:07 -0800
branchGECKO20b12pre_20110216_RELBRANCH
changeset 62755 8a91ff54417a
parent 62714 dab36a22bd19
child 62761 0b40d535e53a
push idunknown
push userunknown
push dateunknown
reviewerswes, backout-scary-stuff
bugs631058
milestone2.0b12pre
Bug 631058 - Backing out changesets 0d43e33ce134 and 60d7b8a4c275. r=wes, a=backout-scary-stuff
content/base/test/file_mozfiledataurl_inner.html
content/base/test/test_mozfiledataurl.html
content/html/content/public/nsHTMLMediaElement.h
content/media/nsBuiltinDecoder.cpp
content/media/nsBuiltinDecoder.h
content/media/nsBuiltinDecoderStateMachine.cpp
content/media/nsMediaCache.cpp
content/media/webm/nsWebMReader.cpp
--- a/content/base/test/file_mozfiledataurl_inner.html
+++ b/content/base/test/file_mozfiledataurl_inner.html
@@ -57,17 +57,17 @@ function iframeNotifyParent(e) {
 }
 
 onload = function() {
   img = document.getElementById('img');
   img.onerror = img.onload = imgNotifyParent;
   iframe = document.getElementById('iframe');
   iframe.onerror = iframe.onload = iframeNotifyParent;
   audio = document.getElementById('audio');
-  audio.onerror = audio.onloadedmetadata = audioNotifyParent;
+  audio.onerror = audio.oncanplay = audioNotifyParent;
 }
 
 </script>
 <body>
 <img id=img>
 <audio id=audio>
 <iframe id=iframe></iframe>
 </html>
--- a/content/base/test/test_mozfiledataurl.html
+++ b/content/base/test/test_mozfiledataurl.html
@@ -7,17 +7,17 @@
   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body onload="gen.next()">
 <p id="display">
 <iframe id=inner></iframe>
 <iframe id=iframe></iframe>
 <img id=img onload="gen.send(event);">
-<audio id=audio onloadedmetadata="gen.send(event);">
+<audio id=audio oncanplay="gen.send(event);">
 <input type=file id=fileList>
 </p>
 <div id="content" style="display: none">
   
 </div>
 <pre id="test">
 <script class="testbody" type="application/javascript;version=1.8">
 
@@ -85,21 +85,21 @@ function runTest() {
   isnot(res.width, 120, "correct error width");
   isnot(res.height, 90, "correct error height");
 
   // Attempt to load an audio in this document
   var file = getFile("file_mozfiledataurl_audio.ogg");
   var fileurl = URL.createObjectURL(file);
   audio.src = fileurl;
   var e = (yield);
-  is(e.type, "loadedmetadata", "loaded successfully");
+  is(e.type, "canplay", "loaded successfully");
 
   // Revoke url and attempt to load a audio in this document
   audio.src = "file_mozfiledataurl_audio.ogg";
-  is((yield).type, "loadedmetadata", "successfully reset audio");
+  is((yield).type, "canplay", "successfully reset audio");
   URL.revokeObjectURL(fileurl);
   todo(false, "urls need to act like 404s, not fail to parse");
 /*  img.src = fileurl;
   var e = (yield);
   is(e.type, "error", "failed successfully");
   isnot(img.width, 120, "correct error width");
   isnot(img.height, 90, "correct error height");
 */
@@ -108,17 +108,17 @@ function runTest() {
   var fileurl = URL.createObjectURL(file);
   isnot(fileurl, oldFileurl, "URL.createObjectURL generated the same url twice");
 
   // Attempt to load an audio in a different same-origin document
   inner.src = innerSameSiteURI;
   yield;
   inner.contentWindow.postMessage(JSON.stringify({audio:fileurl}), "*");
   var res = (yield);
-  is(res.type, "loadedmetadata", "loaded successfully");
+  is(res.type, "canplay", "loaded successfully");
   
   // Attempt to load an audio in a different cross-origin document
   inner.src = innerCrossSiteURI;
   yield;
   inner.contentWindow.postMessage(JSON.stringify({audio:fileurl}), "*");
   var res = (yield);
   is(res.type, "error", "failed successfully");
 
--- a/content/html/content/public/nsHTMLMediaElement.h
+++ b/content/html/content/public/nsHTMLMediaElement.h
@@ -323,29 +323,16 @@ public:
   already_AddRefed<nsILoadGroup> GetDocumentLoadGroup();
 
   /**
    * Returns PR_TRUE if the media has played or completed a seek.
    * Used by video frame to determine whether to paint the poster.
    */
   PRBool GetPlayedOrSeeked() const { return mHasPlayedOrSeeked; }
 
-  /**
-   * The preloading action to perform. These dictate how we react to the 
-   * preload attribute. See mPreloadAction.
-   */
-  enum PreloadAction {
-    PRELOAD_UNDEFINED = 0, // not determined - used only for initialization
-    PRELOAD_NONE = 1,      // do not preload
-    PRELOAD_METADATA = 2,  // preload only the metadata (and first frame)
-    PRELOAD_ENOUGH = 3     // preload enough data to allow uninterrupted
-                           // playback
-  };
-  PreloadAction GetPreloadAction() const { return mPreloadAction; }
-
   nsresult CopyInnerTo(nsGenericElement* aDest) const;
 
   /**
    * Sets the Accept header on the HTTP channel to the required
    * video or audio MIME types.
    */
   virtual nsresult SetAcceptHeader(nsIHttpChannel* aChannel) = 0;
 
@@ -487,16 +474,28 @@ protected:
   enum PreloadAttrValue {
     PRELOAD_ATTR_EMPTY,    // set to ""
     PRELOAD_ATTR_NONE,     // set to "none"
     PRELOAD_ATTR_METADATA, // set to "metadata"
     PRELOAD_ATTR_AUTO      // set to "auto"
   };
 
   /**
+   * The preloading action to perform. These dictate how we react to the 
+   * preload attribute. See mPreloadAction.
+   */
+  enum PreloadAction {
+    PRELOAD_UNDEFINED = 0, // not determined - used only for initialization
+    PRELOAD_NONE = 1,      // do not preload
+    PRELOAD_METADATA = 2,  // preload only the metadata (and first frame)
+    PRELOAD_ENOUGH = 3     // preload enough data to allow uninterrupted
+                           // playback
+  };
+
+  /**
    * Suspends the load of resource at aURI, so that it can be resumed later
    * by ResumeLoad(). This is called when we have a media with a 'preload'
    * attribute value of 'none', during the resource selection algorithm.
    */
   void SuspendLoad(nsIURI* aURI);
 
   /**
    * Resumes a previously suspended load (suspended by SuspendLoad(uri)).
--- a/content/media/nsBuiltinDecoder.cpp
+++ b/content/media/nsBuiltinDecoder.cpp
@@ -850,20 +850,16 @@ void nsBuiltinDecoder::Resume(PRBool aFo
     mStream->Resume();
   }
   if (aForceBuffering) {
     MonitorAutoEnter mon(mMonitor);
     mDecoderStateMachine->StartBuffering();
   }
 }
 
-nsHTMLMediaElement::PreloadAction nsBuiltinDecoder::GetPreloadAction() {
-  return mElement->GetPreloadAction();
-}
-
 void nsBuiltinDecoder::StopProgressUpdates()
 {
   NS_ASSERTION(IsCurrentThread(mStateMachineThread), "Should be on state machine thread.");
   mIgnoreProgressData = PR_TRUE;
   if (mStream) {
     mStream->SetReadMode(nsMediaCacheStream::MODE_METADATA);
   }
 }
--- a/content/media/nsBuiltinDecoder.h
+++ b/content/media/nsBuiltinDecoder.h
@@ -445,19 +445,16 @@ class nsBuiltinDecoder : public nsMediaD
     return mDecoderStateMachine->GetBuffered(aBuffered);
   }
 
   virtual void NotifyDataArrived(const char* aBuffer, PRUint32 aLength, PRUint32 aOffset) {
     return mDecoderStateMachine->NotifyDataArrived(aBuffer, aLength, aOffset);
   }
 
  public:
-  // Return the preloadAction
-  nsHTMLMediaElement::PreloadAction GetPreloadAction();
-
   // Return the current state. Can be called on any thread. If called from
   // a non-main thread, the decoder monitor must be held.
   PlayState GetState() {
     return mPlayState;
   }
 
   // Stop updating the bytes downloaded for progress notifications. Called
   // when seeking to prevent wild changes to the progress notification.
--- a/content/media/nsBuiltinDecoderStateMachine.cpp
+++ b/content/media/nsBuiltinDecoderStateMachine.cpp
@@ -982,24 +982,21 @@ nsresult nsBuiltinDecoderStateMachine::R
           continue;
         }
 
         VideoData* videoData = FindStartTime();
         if (videoData) {
           MonitorAutoExit exitMon(mDecoder->GetMonitor());
           RenderVideoFrame(videoData);
         }
-        if (mDecoder->GetPreloadAction() == nsHTMLMediaElement::PRELOAD_ENOUGH ||
-            mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING)
-        {
-          // Start the decode threads, so that we can pre buffer the streams
-          // and calculate the start time in order to determine the duration.
-          if (NS_FAILED(StartDecodeThreads())) {
-            continue;
-          }
+
+        // Start the decode threads, so that we can pre buffer the streams.
+        // and calculate the start time in order to determine the duration.
+        if (NS_FAILED(StartDecodeThreads())) {
+          continue;
         }
 
         NS_ASSERTION(mStartTime != -1, "Must have start time");
         NS_ASSERTION((!HasVideo() && !HasAudio()) ||
                      !mSeekable || mEndTime != -1,
                      "Active seekable media should have end time");
         NS_ASSERTION(!mSeekable || GetDuration() != -1, "Seekable media should have duration");
         LOG(PR_LOG_DEBUG, ("%p Media goes from %lldms to %lldms (duration %lldms) seekable=%d",
@@ -1021,49 +1018,22 @@ nsresult nsBuiltinDecoderStateMachine::R
         if (HasAudio()) {
           mEventManager.Init(info.mAudioChannels, info.mAudioRate);
           mDecoder->RequestFrameBufferLength(frameBufferLength);
         }
 
         if (mState == DECODER_STATE_DECODING_METADATA) {
           LOG(PR_LOG_DEBUG, ("%p Changed state from DECODING_METADATA to DECODING", mDecoder));
           mState = DECODER_STATE_DECODING;
-
-          // Start playback.
-          if (mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING) {
-            if (!IsPlaying()) {
-              StartPlayback();
-            }
-          } else if (mDecoder->GetPreloadAction() != nsHTMLMediaElement::PRELOAD_ENOUGH) {
-            if (mReader) {
-              // Clear any frames queued up during FindStartTime() and reset
-              // to the start of the stream  to save memory.
-              MonitorAutoExit exitMon(mDecoder->GetMonitor());
-              mReader->ResetDecode();
+        }
 
-              nsMediaStream* stream = mDecoder->GetCurrentStream();
-              PRInt64 offset = mReader->GetInfo().mDataOffset;
-              if (NS_FAILED(stream->Seek(nsISeekableStream::NS_SEEK_SET, offset))) {
-                mState = DECODER_STATE_SHUTDOWN;
-              }
-            }
-            // Note state can change when we release the decoder monitor to
-            // call ResetDecode() above, so we must re-verify the state here.
-            if (mState != DECODER_STATE_DECODING ||
-                mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING) {
-              continue;
-            }
-
-            // Shutdown the state machine thread, in order to save
-            // memory on thread stacks, particuarly on Linux.
-            nsCOMPtr<nsIRunnable> event = new ShutdownThreadEvent(mDecoder->mStateMachineThread);
-            NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
-            mDecoder->mStateMachineThread = nsnull;
-
-            return NS_OK;
+        // Start playback.
+        if (mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING) {
+          if (!IsPlaying()) {
+            StartPlayback();
           }
         }
       }
       break;
 
     case DECODER_STATE_DECODING:
       {
         if (NS_FAILED(StartDecodeThreads())) {
--- a/content/media/nsMediaCache.cpp
+++ b/content/media/nsMediaCache.cpp
@@ -2062,38 +2062,33 @@ nsMediaCacheStream::Seek(PRInt32 aWhence
 {
   NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
 
   nsAutoMonitor mon(gMediaCache->Monitor());
   if (mClosed)
     return NS_ERROR_FAILURE;
 
   PRInt64 oldOffset = mStreamOffset;
-  PRInt64 newOffset = mStreamOffset;
   switch (aWhence) {
   case PR_SEEK_END:
     if (mStreamLength < 0)
       return NS_ERROR_FAILURE;
-    newOffset = mStreamLength + aOffset;
+    mStreamOffset = mStreamLength + aOffset;
     break;
   case PR_SEEK_CUR:
-    newOffset += aOffset;
+    mStreamOffset += aOffset;
     break;
   case PR_SEEK_SET:
-    newOffset = aOffset;
+    mStreamOffset = aOffset;
     break;
   default:
     NS_ERROR("Unknown whence");
     return NS_ERROR_FAILURE;
   }
 
-  if (newOffset < 0)
-    return NS_ERROR_FAILURE;
-  mStreamOffset = newOffset;
-
   LOG(PR_LOG_DEBUG, ("Stream %p Seek to %lld", this, (long long)mStreamOffset));
   gMediaCache->NoteSeek(this, oldOffset);
 
   gMediaCache->QueueUpdate();
   return NS_OK;
 }
 
 PRInt64
--- a/content/media/webm/nsWebMReader.cpp
+++ b/content/media/webm/nsWebMReader.cpp
@@ -330,17 +330,17 @@ nsresult nsWebMReader::ReadMetadata()
         default:
           mInfo.mStereoMode = STEREO_MODE_MONO;
         }
       }
 
       // mDataOffset is not used by the WebM backend.
       // See bug 566779 for a suggestion to refactor
       // and remove it.
-      mInfo.mDataOffset = 0;
+      mInfo.mDataOffset = -1;
     }
     else if (!mHasAudio && type == NESTEGG_TRACK_AUDIO) {
       nestegg_audio_params params;
       r = nestegg_track_audio_params(mContext, track, &params);
       if (r == -1) {
         Cleanup();
         return NS_ERROR_FAILURE;
       }