Bug 1266304. Part 1 - Merge MediaDecoderReader::AudioDataPromise and MediaDecoderReader::VideoDataPromise. r=kaku.

MozReview-Commit-ID: BhhA7sjCTtQ
This commit is contained in:
JW Wang 2016-04-22 14:16:49 +08:00
Родитель 55fea48a3f
Коммит 69b738fc15
10 изменённых файлов: 40 добавлений и 47 удалений

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

@ -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;