author | Jean-Yves Avenard <jyavenard@mozilla.com> |
Thu, 06 Nov 2014 19:08:04 +1100 | |
changeset 214363 | fd98b545a4b967bd1c34ace83aae2b2233b1d38f |
parent 214362 | 04d5a617450fd168b7c98fc84cc5ffc2b427c3ab |
child 214364 | 71c607c0f4f2d4906d64700ee6e1a0459c1520cb |
push id | 27780 |
push user | kwierso@gmail.com |
push date | Fri, 07 Nov 2014 02:25:05 +0000 |
treeherder | mozilla-central@e6d47abb6a7b [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | kinetik |
bugs | 1092996 |
milestone | 36.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
|
--- a/dom/media/AbstractMediaDecoder.h +++ b/dom/media/AbstractMediaDecoder.h @@ -122,16 +122,20 @@ public: virtual void SetPlatformCanOffloadAudio(bool aCanOffloadAudio) {} // Called by Decoder/State machine to check audio offload condtions are met virtual bool CheckDecoderCanOffloadAudio() { return false; } // Called from HTMLMediaElement when owner document activity changes virtual void SetElementVisibility(bool aIsVisible) {} + // Called by some MediaDecoderReader to determine if we can rely + // on the resource length to limit reads. + virtual bool HasInitializationData() { return false; } + // Stack based class to assist in notifying the frame statistics of // parsed and decoded frames. Use inside video demux & decode functions // to ensure all parsed and decoded frames are reported on all return paths. class AutoNotifyDecoded { public: AutoNotifyDecoded(AbstractMediaDecoder* aDecoder, uint32_t& aParsed, uint32_t& aDecoded) : mDecoder(aDecoder), mParsed(aParsed), mDecoded(aDecoded) {} ~AutoNotifyDecoded() {
--- a/dom/media/mediasource/SourceBufferDecoder.cpp +++ b/dom/media/mediasource/SourceBufferDecoder.cpp @@ -114,16 +114,22 @@ SourceBufferDecoder::SetMediaEndTime(int } void SourceBufferDecoder::UpdatePlaybackPosition(int64_t aTime) { MSE_DEBUG("SourceBufferDecoder(%p)::UpdatePlaybackPosition UNIMPLEMENTED", this); } +bool +SourceBufferDecoder::HasInitializationData() +{ + return true; +} + void SourceBufferDecoder::OnReadMetadataCompleted() { MSE_DEBUG("SourceBufferDecoder(%p)::OnReadMetadataCompleted UNIMPLEMENTED", this); } void SourceBufferDecoder::NotifyWaitingForResourcesStatusChanged()
--- a/dom/media/mediasource/SourceBufferDecoder.h +++ b/dom/media/mediasource/SourceBufferDecoder.h @@ -55,16 +55,17 @@ public: virtual void OnReadMetadataCompleted() MOZ_FINAL MOZ_OVERRIDE; virtual void QueueMetadata(int64_t aTime, MediaInfo* aInfo, MetadataTags* aTags) MOZ_FINAL MOZ_OVERRIDE; virtual void RemoveMediaTracks() MOZ_FINAL MOZ_OVERRIDE; virtual void SetMediaDuration(int64_t aDuration) MOZ_FINAL MOZ_OVERRIDE; virtual void SetMediaEndTime(int64_t aTime) MOZ_FINAL MOZ_OVERRIDE; virtual void SetMediaSeekable(bool aMediaSeekable) MOZ_FINAL MOZ_OVERRIDE; virtual void UpdateEstimatedMediaDuration(int64_t aDuration) MOZ_FINAL MOZ_OVERRIDE; virtual void UpdatePlaybackPosition(int64_t aTime) MOZ_FINAL MOZ_OVERRIDE; + virtual bool HasInitializationData() MOZ_FINAL MOZ_OVERRIDE; // SourceBufferResource specific interface below. // Warning: this mirrors GetBuffered in MediaDecoder, but this class's base is // AbstractMediaDecoder, which does not supply this interface. nsresult GetBuffered(dom::TimeRanges* aBuffered); void SetReader(MediaDecoderReader* aReader)
--- a/dom/media/webm/WebMReader.cpp +++ b/dom/media/webm/WebMReader.cpp @@ -282,17 +282,18 @@ nsresult WebMReader::ReadMetadata(MediaI { NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); nestegg_io io; io.read = webm_read; io.seek = webm_seek; io.tell = webm_tell; io.userdata = mDecoder; - int64_t maxOffset = -1; + int64_t maxOffset = mDecoder->HasInitializationData() ? + mDecoder->GetResource()->GetLength() : -1; int r = nestegg_init(&mContext, io, &webm_log, maxOffset); if (r == -1) { return NS_ERROR_FAILURE; } uint64_t duration = 0; r = nestegg_duration(mContext, &duration); if (r == 0) {