Bug 1171311: P10. Add MediaDataDemuxer::GetSamplesMayBlock() method. r=cpearce

This is used by the MediaFormatReader to dermine if buffering heuristics should
be used.

--HG--
extra : rebase_source : 49d67f021ce8660cd67a12510e5c631d6b96698a
This commit is contained in:
Jean-Yves Avenard 2015-06-12 09:26:58 +10:00
Родитель 4b7429a4cd
Коммит 50d6f9e616
4 изменённых файлов: 25 добавлений и 0 удалений

Просмотреть файл

@ -156,6 +156,15 @@ public:
// sample will contains multiple audio frames.
virtual nsRefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) = 0;
// Returns true if a call to GetSamples() may block while waiting on the
// underlying resource to return the data.
// This is used by the MediaFormatReader to determine if buffering heuristics
// should be used.
virtual bool GetSamplesMayBlock() const
{
return true;
}
// Cancel all pending actions (Seek, GetSamples) and reset current state
// All pending promises are to be rejected with CANCEL.
// The next call to GetSamples would return the first sample available in the

Просмотреть файл

@ -72,6 +72,7 @@ MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder,
, mInitDone(false)
, mSeekable(false)
, mIsEncrypted(false)
, mTrackDemuxersMayBlock(false)
, mCachedTimeRangesStale(true)
#if defined(READER_DORMANT_HEURISTIC)
, mDormantEnabled(Preferences::GetBool("media.decoder.heuristic.dormant.enabled", false))
@ -304,6 +305,7 @@ MediaFormatReader::OnDemuxerInitDone(nsresult)
mInfo.mVideo = *mVideo.mTrackDemuxer->GetInfo()->GetAsVideoInfo();
mVideo.mCallback = new DecoderCallback(this, TrackInfo::kVideoTrack);
mVideo.mTimeRanges = mVideo.mTrackDemuxer->GetBuffered();
mTrackDemuxersMayBlock |= mVideo.mTrackDemuxer->GetSamplesMayBlock();
}
bool audioActive = !!mDemuxer->GetNumberTracks(TrackInfo::kAudioTrack);
@ -313,6 +315,7 @@ MediaFormatReader::OnDemuxerInitDone(nsresult)
mInfo.mAudio = *mAudio.mTrackDemuxer->GetInfo()->GetAsAudioInfo();
mAudio.mCallback = new DecoderCallback(this, TrackInfo::kAudioTrack);
mAudio.mTimeRanges = mAudio.mTrackDemuxer->GetBuffered();
mTrackDemuxersMayBlock |= mAudio.mTrackDemuxer->GetSamplesMayBlock();
}
UniquePtr<EncryptionInfo> crypto = mDemuxer->GetCrypto();

Просмотреть файл

@ -99,6 +99,11 @@ public:
int64_t ComputeStartTime(const VideoData* aVideo, const AudioData* aAudio) override;
bool UseBufferingHeuristics() override
{
return mTrackDemuxersMayBlock;
}
private:
bool InitDemuxer();
// Notify the demuxer that new data has been received.
@ -366,6 +371,9 @@ private:
// become incorrect.
bool mIsEncrypted;
// Set to true if any of our track buffers may be blocking.
bool mTrackDemuxersMayBlock;
// Seeking objects.
bool IsSeeking() const { return mPendingSeekTime.isSome(); }
void AttemptSeek();

Просмотреть файл

@ -107,6 +107,11 @@ public:
void BreakCycles() override;
bool GetSamplesMayBlock() const override
{
return false;
}
// Called by TrackBuffersManager to indicate that new frames were added or
// removed.
void NotifyTimeRangesChanged();