author | Robert O'Callahan <robert@ocallahan.org> |
Wed, 04 Sep 2013 23:13:06 +1200 | |
changeset 145439 | 43566dc5dfbbdc3d31653623ac131d9461854c97 |
parent 145438 | f186c97c90117a68f1dc91793e5a9e6e8f07b1a4 |
child 145440 | b48f9c8d7aff27f9b072a59a1fd3694cfde29f06 |
push id | 25213 |
push user | kwierso@gmail.com |
push date | Wed, 04 Sep 2013 23:18:26 +0000 |
treeherder | mozilla-central@dffedf20a02d [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | cpearce |
bugs | 904926 |
milestone | 26.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
content/media/MediaDecoder.cpp | file | annotate | diff | comparison | revisions | |
content/media/MediaDecoder.h | file | annotate | diff | comparison | revisions |
--- a/content/media/MediaDecoder.cpp +++ b/content/media/MediaDecoder.cpp @@ -357,26 +357,26 @@ bool MediaDecoder::IsInfinite() MediaDecoder::MediaDecoder() : mDecoderPosition(0), mPlaybackPosition(0), mCurrentTime(0.0), mInitialVolume(0.0), mInitialPlaybackRate(1.0), mInitialPreservesPitch(true), - mRequestedSeekTime(-1.0), mDuration(-1), mTransportSeekable(true), mMediaSeekable(true), mSameOriginMedia(false), mReentrantMonitor("media.decoder"), mIsDormant(false), mIsExitingDormant(false), mPlayState(PLAY_STATE_PAUSED), mNextState(PLAY_STATE_PAUSED), + mRequestedSeekTime(-1.0), mCalledResourceLoaded(false), mIgnoreProgressData(false), mInfiniteStream(false), mTriggerPlaybackEndedWhenSourceStreamFinishes(false), mOwner(nullptr), mFrameBufferLength(0), mPinnedForSeek(false), mShuttingDown(false), @@ -703,18 +703,17 @@ void MediaDecoder::QueueMetadata(int64_t GetReentrantMonitor().AssertCurrentThreadIn(); mDecoderStateMachine->QueueMetadata(aPublishTime, aChannels, aRate, aHasAudio, aHasVideo, aTags); } bool MediaDecoder::IsDataCachedToEndOfResource() { NS_ASSERTION(!mShuttingDown, "Don't call during shutdown!"); - GetReentrantMonitor().AssertCurrentThreadIn(); - + ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); return (mResource && mResource->IsDataCachedToEndOfResource(mDecoderPosition)); } void MediaDecoder::MetadataLoaded(int aChannels, int aRate, bool aHasAudio, bool aHasVideo, MetadataTags* aTags) { MOZ_ASSERT(NS_IsMainThread()); if (mShuttingDown) { @@ -750,17 +749,16 @@ void MediaDecoder::MetadataLoaded(int aC } else if (mOwner) { // Resource was loaded during metadata loading, when progress // events are being ignored. Fire the final progress event. mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("progress")); } // Only inform the element of FirstFrameLoaded if not doing a load() in order // to fulfill a seek, otherwise we'll get multiple loadedfirstframe events. - ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); bool notifyResourceIsLoaded = !mCalledResourceLoaded && IsDataCachedToEndOfResource(); if (mOwner) { mOwner->FirstFrameLoaded(notifyResourceIsLoaded); } // This can run cache callbacks. mResource->EnsureCacheUpToDate();
--- a/content/media/MediaDecoder.h +++ b/content/media/MediaDecoder.h @@ -687,17 +687,17 @@ public: // Called when the metadata from the media file has been loaded by the // state machine. Call on the main thread only. void MetadataLoaded(int aChannels, int aRate, bool aHasAudio, bool aHasVideo, MetadataTags* aTags); // Called when the first frame has been loaded. // Call on the main thread only. void FirstFrameLoaded(); - // Returns true if the resource has been loaded. Must be in monitor. + // Returns true if the resource has been loaded. Acquires the monitor. // Call from any thread. virtual bool IsDataCachedToEndOfResource(); // Called when the video has completed playing. // Call on the main thread only. void PlaybackEnded(); // Seeking has stopped. Inform the element on the main @@ -941,23 +941,16 @@ public: // volume. Readable/Writeable from the main thread. double mInitialVolume; // PlaybackRate and pitch preservation status we should start at. // Readable/Writeable from the main thread. double mInitialPlaybackRate; bool mInitialPreservesPitch; - // Position to seek to when the seek notification is received by the - // decode thread. Written by the main thread and read via the - // decode thread. Synchronised using mReentrantMonitor. If the - // value is negative then no seek has been requested. When a seek is - // started this is reset to negative. - double mRequestedSeekTime; - // Duration of the media resource. Set to -1 if unknown. // Set when the metadata is loaded. Accessed on the main thread // only. int64_t mDuration; // True when playback should start with audio captured (not playing). bool mInitialAudioCaptured; @@ -1050,16 +1043,25 @@ public: // The state to change to after a seek or load operation. // This can only be changed on the main thread while holding the decoder // monitor. Thus, it can be safely read while holding the decoder monitor // OR on the main thread. // Any change to the state must call NotifyAll on the monitor. // This can only be PLAY_STATE_PAUSED or PLAY_STATE_PLAYING. PlayState mNextState; + // Position to seek to when the seek notification is received by the + // decode thread. + // This can only be changed on the main thread while holding the decoder + // monitor. Thus, it can be safely read while holding the decoder monitor + // OR on the main thread. + // If the value is negative then no seek has been requested. When a seek is + // started this is reset to negative. + double mRequestedSeekTime; + // True when we have fully loaded the resource and reported that // to the element (i.e. reached NETWORK_LOADED state). // Accessed on the main thread only. bool mCalledResourceLoaded; // True when seeking or otherwise moving the play position around in // such a manner that progress event data is inaccurate. This is set // during seek and duration operations to prevent the progress indicator