зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1266304. Part 1 - Merge MediaDecoderReader::AudioDataPromise and MediaDecoderReader::VideoDataPromise. r=kaku.
MozReview-Commit-ID: BhhA7sjCTtQ
This commit is contained in:
Родитель
55fea48a3f
Коммит
69b738fc15
|
@ -147,11 +147,11 @@ nsresult MediaDecoderReader::ResetDecode()
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReader::VideoDataPromise>
|
||||
RefPtr<MediaDecoderReader::MediaDataPromise>
|
||||
MediaDecoderReader::DecodeToFirstVideoData()
|
||||
{
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
typedef MediaDecoderReader::VideoDataPromise PromiseType;
|
||||
typedef MediaDecoderReader::MediaDataPromise PromiseType;
|
||||
RefPtr<PromiseType::Private> p = new PromiseType::Private(__func__);
|
||||
RefPtr<MediaDecoderReader> self = this;
|
||||
InvokeUntil([self] () -> bool {
|
||||
|
@ -275,11 +275,11 @@ private:
|
|||
RefPtr<MediaDecoderReader> mReader;
|
||||
};
|
||||
|
||||
RefPtr<MediaDecoderReader::VideoDataPromise>
|
||||
RefPtr<MediaDecoderReader::MediaDataPromise>
|
||||
MediaDecoderReader::RequestVideoData(bool aSkipToNextKeyframe,
|
||||
int64_t aTimeThreshold)
|
||||
{
|
||||
RefPtr<VideoDataPromise> p = mBaseVideoPromise.Ensure(__func__);
|
||||
RefPtr<MediaDataPromise> p = mBaseVideoPromise.Ensure(__func__);
|
||||
bool skip = aSkipToNextKeyframe;
|
||||
while (VideoQueue().GetSize() == 0 &&
|
||||
!VideoQueue().IsFinished()) {
|
||||
|
@ -311,10 +311,10 @@ MediaDecoderReader::RequestVideoData(bool aSkipToNextKeyframe,
|
|||
return p;
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReader::AudioDataPromise>
|
||||
RefPtr<MediaDecoderReader::MediaDataPromise>
|
||||
MediaDecoderReader::RequestAudioData()
|
||||
{
|
||||
RefPtr<AudioDataPromise> p = mBaseAudioPromise.Ensure(__func__);
|
||||
RefPtr<MediaDataPromise> p = mBaseAudioPromise.Ensure(__func__);
|
||||
while (AudioQueue().GetSize() == 0 &&
|
||||
!AudioQueue().IsFinished()) {
|
||||
if (!DecodeAudioData()) {
|
||||
|
|
|
@ -75,9 +75,7 @@ public:
|
|||
|
||||
using MetadataPromise =
|
||||
MozPromise<RefPtr<MetadataHolder>, ReadMetadataFailureReason, IsExclusive>;
|
||||
using AudioDataPromise =
|
||||
MozPromise<RefPtr<MediaData>, NotDecodedReason, IsExclusive>;
|
||||
using VideoDataPromise =
|
||||
using MediaDataPromise =
|
||||
MozPromise<RefPtr<MediaData>, NotDecodedReason, IsExclusive>;
|
||||
using SeekPromise = MozPromise<media::TimeUnit, nsresult, IsExclusive>;
|
||||
|
||||
|
@ -135,7 +133,7 @@ public:
|
|||
// be resolved when it is complete. Don't hold the decoder
|
||||
// monitor while calling this, as the implementation may try to wait
|
||||
// on something that needs the monitor and deadlock.
|
||||
virtual RefPtr<AudioDataPromise> RequestAudioData();
|
||||
virtual RefPtr<MediaDataPromise> RequestAudioData();
|
||||
|
||||
// Requests one video sample from the reader.
|
||||
//
|
||||
|
@ -143,7 +141,7 @@ public:
|
|||
// may try to wait on something that needs the monitor and deadlock.
|
||||
// If aSkipToKeyframe is true, the decode should skip ahead to the
|
||||
// the next keyframe at or after aTimeThreshold microseconds.
|
||||
virtual RefPtr<VideoDataPromise>
|
||||
virtual RefPtr<MediaDataPromise>
|
||||
RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold);
|
||||
|
||||
// By default, the state machine polls the reader once per second when it's
|
||||
|
@ -306,7 +304,7 @@ protected:
|
|||
// called.
|
||||
virtual media::TimeIntervals GetBuffered();
|
||||
|
||||
RefPtr<VideoDataPromise> DecodeToFirstVideoData();
|
||||
RefPtr<MediaDataPromise> DecodeToFirstVideoData();
|
||||
|
||||
bool HaveStartTime()
|
||||
{
|
||||
|
@ -421,8 +419,8 @@ private:
|
|||
|
||||
// Promises used only for the base-class (sync->async adapter) implementation
|
||||
// of Request{Audio,Video}Data.
|
||||
MozPromiseHolder<AudioDataPromise> mBaseAudioPromise;
|
||||
MozPromiseHolder<VideoDataPromise> mBaseVideoPromise;
|
||||
MozPromiseHolder<MediaDataPromise> mBaseAudioPromise;
|
||||
MozPromiseHolder<MediaDataPromise> mBaseVideoPromise;
|
||||
|
||||
// Flags whether a the next audio/video sample comes after a "gap" or
|
||||
// "discontinuity" in the stream. For example after a seek.
|
||||
|
|
|
@ -20,8 +20,6 @@ extern LazyLogModule gMediaDecoderLog;
|
|||
// to know the start time by the time On{Audio,Video}Decoded is called on MDSM.
|
||||
class StartTimeRendezvous {
|
||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(StartTimeRendezvous);
|
||||
typedef MediaDecoderReader::AudioDataPromise AudioDataPromise;
|
||||
typedef MediaDecoderReader::VideoDataPromise VideoDataPromise;
|
||||
|
||||
public:
|
||||
StartTimeRendezvous(AbstractThread* aOwnerThread,
|
||||
|
@ -185,7 +183,7 @@ MediaDecoderReaderWrapper::AwaitStartTime()
|
|||
return mStartTimeRendezvous->AwaitStartTime();
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReaderWrapper::AudioDataPromise>
|
||||
RefPtr<MediaDecoderReaderWrapper::MediaDataPromise>
|
||||
MediaDecoderReaderWrapper::RequestAudioData()
|
||||
{
|
||||
MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
|
||||
|
@ -196,7 +194,7 @@ MediaDecoderReaderWrapper::RequestAudioData()
|
|||
|
||||
if (!mStartTimeRendezvous->HaveStartTime()) {
|
||||
p = p->Then(mOwnerThread, __func__, mStartTimeRendezvous.get(),
|
||||
&StartTimeRendezvous::ProcessFirstSample<AudioDataPromise, MediaData::AUDIO_DATA>,
|
||||
&StartTimeRendezvous::ProcessFirstSample<MediaDataPromise, MediaData::AUDIO_DATA>,
|
||||
&StartTimeRendezvous::FirstSampleRejected<MediaData::AUDIO_DATA>)
|
||||
->CompletionPromise();
|
||||
}
|
||||
|
@ -207,7 +205,7 @@ MediaDecoderReaderWrapper::RequestAudioData()
|
|||
->CompletionPromise();
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReaderWrapper::VideoDataPromise>
|
||||
RefPtr<MediaDecoderReaderWrapper::MediaDataPromise>
|
||||
MediaDecoderReaderWrapper::RequestVideoData(bool aSkipToNextKeyframe,
|
||||
media::TimeUnit aTimeThreshold)
|
||||
{
|
||||
|
@ -225,7 +223,7 @@ MediaDecoderReaderWrapper::RequestVideoData(bool aSkipToNextKeyframe,
|
|||
|
||||
if (!mStartTimeRendezvous->HaveStartTime()) {
|
||||
p = p->Then(mOwnerThread, __func__, mStartTimeRendezvous.get(),
|
||||
&StartTimeRendezvous::ProcessFirstSample<VideoDataPromise, MediaData::VIDEO_DATA>,
|
||||
&StartTimeRendezvous::ProcessFirstSample<MediaDataPromise, MediaData::VIDEO_DATA>,
|
||||
&StartTimeRendezvous::FirstSampleRejected<MediaData::VIDEO_DATA>)
|
||||
->CompletionPromise();
|
||||
}
|
||||
|
|
|
@ -27,8 +27,7 @@ typedef MozPromise<bool, bool, /* isExclusive = */ false> HaveStartTimePromise;
|
|||
*/
|
||||
class MediaDecoderReaderWrapper {
|
||||
typedef MediaDecoderReader::MetadataPromise MetadataPromise;
|
||||
typedef MediaDecoderReader::AudioDataPromise AudioDataPromise;
|
||||
typedef MediaDecoderReader::VideoDataPromise VideoDataPromise;
|
||||
typedef MediaDecoderReader::MediaDataPromise MediaDataPromise;
|
||||
typedef MediaDecoderReader::SeekPromise SeekPromise;
|
||||
typedef MediaDecoderReader::WaitForDataPromise WaitForDataPromise;
|
||||
typedef MediaDecoderReader::BufferedUpdatePromise BufferedUpdatePromise;
|
||||
|
@ -42,8 +41,8 @@ public:
|
|||
media::TimeUnit StartTime() const;
|
||||
RefPtr<MetadataPromise> ReadMetadata();
|
||||
RefPtr<HaveStartTimePromise> AwaitStartTime();
|
||||
RefPtr<AudioDataPromise> RequestAudioData();
|
||||
RefPtr<VideoDataPromise> RequestVideoData(bool aSkipToNextKeyframe,
|
||||
RefPtr<MediaDataPromise> RequestAudioData();
|
||||
RefPtr<MediaDataPromise> RequestVideoData(bool aSkipToNextKeyframe,
|
||||
media::TimeUnit aTimeThreshold);
|
||||
RefPtr<SeekPromise> Seek(SeekTarget aTarget, media::TimeUnit aEndTime);
|
||||
RefPtr<WaitForDataPromise> WaitForData(MediaData::Type aType);
|
||||
|
|
|
@ -135,8 +135,6 @@ class MediaDecoderStateMachine
|
|||
{
|
||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderStateMachine)
|
||||
public:
|
||||
typedef MediaDecoderReader::AudioDataPromise AudioDataPromise;
|
||||
typedef MediaDecoderReader::VideoDataPromise VideoDataPromise;
|
||||
typedef MediaDecoderOwner::NextFrameStatus NextFrameStatus;
|
||||
typedef mozilla::layers::ImageContainer::FrameID FrameID;
|
||||
MediaDecoderStateMachine(MediaDecoder* aDecoder,
|
||||
|
@ -810,7 +808,7 @@ private:
|
|||
// Only one of a given pair of ({Audio,Video}DataPromise, WaitForDataPromise)
|
||||
// should exist at any given moment.
|
||||
|
||||
MozPromiseRequestHolder<MediaDecoderReader::AudioDataPromise> mAudioDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mAudioDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::WaitForDataPromise> mAudioWaitRequest;
|
||||
const char* AudioRequestStatus()
|
||||
{
|
||||
|
@ -825,7 +823,7 @@ private:
|
|||
}
|
||||
|
||||
MozPromiseRequestHolder<MediaDecoderReader::WaitForDataPromise> mVideoWaitRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::VideoDataPromise> mVideoDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mVideoDataRequest;
|
||||
const char* VideoRequestStatus()
|
||||
{
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
|
|
|
@ -484,7 +484,7 @@ MediaFormatReader::ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThr
|
|||
return nextKeyframe < aTimeThreshold && nextKeyframe.ToMicroseconds() >= 0;
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReader::VideoDataPromise>
|
||||
RefPtr<MediaDecoderReader::MediaDataPromise>
|
||||
MediaFormatReader::RequestVideoData(bool aSkipToNextKeyframe,
|
||||
int64_t aTimeThreshold)
|
||||
{
|
||||
|
@ -499,17 +499,17 @@ MediaFormatReader::RequestVideoData(bool aSkipToNextKeyframe,
|
|||
|
||||
if (!HasVideo()) {
|
||||
LOG("called with no video track");
|
||||
return VideoDataPromise::CreateAndReject(DECODE_ERROR, __func__);
|
||||
return MediaDataPromise::CreateAndReject(DECODE_ERROR, __func__);
|
||||
}
|
||||
|
||||
if (IsSeeking()) {
|
||||
LOG("called mid-seek. Rejecting.");
|
||||
return VideoDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
return MediaDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
}
|
||||
|
||||
if (mShutdown) {
|
||||
NS_WARNING("RequestVideoData on shutdown MediaFormatReader!");
|
||||
return VideoDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
return MediaDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
}
|
||||
|
||||
media::TimeUnit timeThreshold{media::TimeUnit::FromMicroseconds(aTimeThreshold)};
|
||||
|
@ -525,12 +525,12 @@ MediaFormatReader::RequestVideoData(bool aSkipToNextKeyframe,
|
|||
mDecoder->NotifyDecodedFrames(0, 0, SizeOfVideoQueueInFrames());
|
||||
|
||||
Flush(TrackInfo::kVideoTrack);
|
||||
RefPtr<VideoDataPromise> p = mVideo.mPromise.Ensure(__func__);
|
||||
RefPtr<MediaDataPromise> p = mVideo.mPromise.Ensure(__func__);
|
||||
SkipVideoDemuxToNextKeyFrame(timeThreshold);
|
||||
return p;
|
||||
}
|
||||
|
||||
RefPtr<VideoDataPromise> p = mVideo.mPromise.Ensure(__func__);
|
||||
RefPtr<MediaDataPromise> p = mVideo.mPromise.Ensure(__func__);
|
||||
NotifyDecodingRequested(TrackInfo::kVideoTrack);
|
||||
|
||||
return p;
|
||||
|
@ -590,7 +590,7 @@ MediaFormatReader::OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder
|
|||
ScheduleUpdate(TrackInfo::kVideoTrack);
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReader::AudioDataPromise>
|
||||
RefPtr<MediaDecoderReader::MediaDataPromise>
|
||||
MediaFormatReader::RequestAudioData()
|
||||
{
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
|
@ -603,20 +603,20 @@ MediaFormatReader::RequestAudioData()
|
|||
|
||||
if (!HasAudio()) {
|
||||
LOG("called with no audio track");
|
||||
return AudioDataPromise::CreateAndReject(DECODE_ERROR, __func__);
|
||||
return MediaDataPromise::CreateAndReject(DECODE_ERROR, __func__);
|
||||
}
|
||||
|
||||
if (IsSeeking()) {
|
||||
LOG("called mid-seek. Rejecting.");
|
||||
return AudioDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
return MediaDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
}
|
||||
|
||||
if (mShutdown) {
|
||||
NS_WARNING("RequestAudioData on shutdown MediaFormatReader!");
|
||||
return AudioDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
return MediaDataPromise::CreateAndReject(CANCELED, __func__);
|
||||
}
|
||||
|
||||
RefPtr<AudioDataPromise> p = mAudio.mPromise.Ensure(__func__);
|
||||
RefPtr<MediaDataPromise> p = mAudio.mPromise.Ensure(__func__);
|
||||
NotifyDecodingRequested(TrackInfo::kAudioTrack);
|
||||
|
||||
return p;
|
||||
|
|
|
@ -37,10 +37,10 @@ public:
|
|||
size_t SizeOfVideoQueueInFrames() override;
|
||||
size_t SizeOfAudioQueueInFrames() override;
|
||||
|
||||
RefPtr<VideoDataPromise>
|
||||
RefPtr<MediaDataPromise>
|
||||
RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold) override;
|
||||
|
||||
RefPtr<AudioDataPromise> RequestAudioData() override;
|
||||
RefPtr<MediaDataPromise> RequestAudioData() override;
|
||||
|
||||
RefPtr<MetadataPromise> AsyncReadMetadata() override;
|
||||
|
||||
|
@ -391,8 +391,8 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
DecoderDataWithPromise<AudioDataPromise> mAudio;
|
||||
DecoderDataWithPromise<VideoDataPromise> mVideo;
|
||||
DecoderDataWithPromise<MediaDataPromise> mAudio;
|
||||
DecoderDataWithPromise<MediaDataPromise> mVideo;
|
||||
|
||||
// Returns true when the decoder for this track needs input.
|
||||
bool NeedInput(DecoderData& aDecoder);
|
||||
|
|
|
@ -157,8 +157,8 @@ protected:
|
|||
* Track the current seek promise made by the reader.
|
||||
*/
|
||||
MozPromiseRequestHolder<MediaDecoderReader::SeekPromise> mSeekRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::AudioDataPromise> mAudioDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::VideoDataPromise> mVideoDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mAudioDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mVideoDataRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::WaitForDataPromise> mAudioWaitRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::WaitForDataPromise> mVideoWaitRequest;
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ class AndroidMediaReader : public MediaDecoderReader
|
|||
int64_t mAudioSeekTimeUs;
|
||||
RefPtr<VideoData> mLastVideoFrame;
|
||||
MozPromiseHolder<MediaDecoderReader::SeekPromise> mSeekPromise;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::VideoDataPromise> mSeekRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mSeekRequest;
|
||||
public:
|
||||
AndroidMediaReader(AbstractMediaDecoder* aDecoder,
|
||||
const nsACString& aContentType);
|
||||
|
|
|
@ -48,7 +48,7 @@ class MediaOmxReader : public MediaOmxCommonReader
|
|||
MozPromiseRequestHolder<MediaResourcePromise> mMediaResourceRequest;
|
||||
|
||||
MozPromiseHolder<MediaDecoderReader::SeekPromise> mSeekPromise;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::VideoDataPromise> mSeekRequest;
|
||||
MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mSeekRequest;
|
||||
protected:
|
||||
android::sp<android::OmxDecoder> mOmxDecoder;
|
||||
android::sp<android::MediaExtractor> mExtractor;
|
||||
|
|
Загрузка…
Ссылка в новой задаче