--- a/dom/media/ADTSDemuxer.cpp
+++ b/dom/media/ADTSDemuxer.cpp
@@ -313,17 +313,17 @@ ADTSDemuxer::InitInternal()
RefPtr<ADTSDemuxer::InitPromise>
ADTSDemuxer::Init()
{
if (!InitInternal()) {
ADTSLOG("Init() failure: waiting for data");
return InitPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
ADTSLOG("Init() successful");
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
bool
ADTSDemuxer::HasTrackType(TrackInfo::TrackType aType) const
@@ -510,20 +510,17 @@ RefPtr<ADTSTrackDemuxer::SamplesPromise>
ADTSTrackDemuxer::GetSamples(int32_t aNumSamples)
{
ADTSLOGV("GetSamples(%d) Begin mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
" mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d "
"mSamplesPerSecond=%d mChannels=%d",
aNumSamples, mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
mSamplesPerFrame, mSamplesPerSecond, mChannels);
- if (!aNumSamples) {
- return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
- }
+ MOZ_ASSERT(aNumSamples);
RefPtr<SamplesHolder> frames = new SamplesHolder();
while (aNumSamples--) {
RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame()));
if (!frame)
break;
@@ -535,17 +532,17 @@ ADTSTrackDemuxer::GetSamples(int32_t aNu
" mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d "
"mChannels=%d",
frames->mSamples.Length(), aNumSamples, mOffset, mNumParsedFrames,
mFrameIndex, mTotalFrameLen, mSamplesPerFrame, mSamplesPerSecond,
mChannels);
if (frames->mSamples.IsEmpty()) {
return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::END_OF_STREAM, __func__);
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
}
return SamplesPromise::CreateAndResolve(frames, __func__);
}
void
ADTSTrackDemuxer::Reset()
{
@@ -557,17 +554,17 @@ ADTSTrackDemuxer::Reset()
FastSeek(media::TimeUnit());
}
RefPtr<ADTSTrackDemuxer::SkipAccessPointPromise>
ADTSTrackDemuxer::SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold)
{
// Will not be called for audio-only resources.
return SkipAccessPointPromise::CreateAndReject(
- SkipFailureHolder(DemuxerFailureReason::DEMUXER_ERROR, 0), __func__);
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
}
int64_t
ADTSTrackDemuxer::GetResourceOffset() const
{
return mOffset;
}
--- a/dom/media/Benchmark.cpp
+++ b/dom/media/Benchmark.cpp
@@ -164,17 +164,17 @@ BenchmarkPlayback::DemuxSamples()
mTrackDemuxer =
mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
if (!mTrackDemuxer) {
MainThreadShutdown();
return;
}
DemuxNextSample();
},
- [this, ref](DemuxerFailureReason aReason) { MainThreadShutdown(); });
+ [this, ref](const MediaResult& aError) { MainThreadShutdown(); });
}
void
BenchmarkPlayback::DemuxNextSample()
{
MOZ_ASSERT(OnThread());
RefPtr<Benchmark> ref(mMainThreadState);
@@ -185,19 +185,19 @@ BenchmarkPlayback::DemuxNextSample()
mSamples.AppendElements(Move(aHolder->mSamples));
if (ref->mParameters.mStopAtFrame &&
mSamples.Length() == (size_t)ref->mParameters.mStopAtFrame.ref()) {
InitDecoder(Move(*mTrackDemuxer->GetInfo()));
} else {
Dispatch(NS_NewRunnableFunction([this, ref]() { DemuxNextSample(); }));
}
},
- [this, ref](DemuxerFailureReason aReason) {
- switch (aReason) {
- case DemuxerFailureReason::END_OF_STREAM:
+ [this, ref](const MediaResult& aError) {
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
InitDecoder(Move(*mTrackDemuxer->GetInfo()));
break;
default:
MainThreadShutdown();
}
});
}
--- a/dom/media/MP3Demuxer.cpp
+++ b/dom/media/MP3Demuxer.cpp
@@ -50,17 +50,17 @@ MP3Demuxer::InitInternal() {
}
RefPtr<MP3Demuxer::InitPromise>
MP3Demuxer::Init() {
if (!InitInternal()) {
MP3LOG("MP3Demuxer::Init() failure: waiting for data");
return InitPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
MP3LOG("MP3Demuxer::Init() successful");
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
bool
MP3Demuxer::HasTrackType(TrackInfo::TrackType aType) const {
@@ -271,17 +271,17 @@ MP3TrackDemuxer::GetSamples(int32_t aNum
MP3LOGV("GetSamples(%d) Begin mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
" mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d "
"mSamplesPerSecond=%d mChannels=%d",
aNumSamples, mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
mSamplesPerFrame, mSamplesPerSecond, mChannels);
if (!aNumSamples) {
return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
RefPtr<SamplesHolder> frames = new SamplesHolder();
while (aNumSamples--) {
RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame()));
if (!frame) {
break;
@@ -295,34 +295,34 @@ MP3TrackDemuxer::GetSamples(int32_t aNum
" mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d "
"mChannels=%d",
frames->mSamples.Length(), aNumSamples, mOffset, mNumParsedFrames,
mFrameIndex, mTotalFrameLen, mSamplesPerFrame, mSamplesPerSecond,
mChannels);
if (frames->mSamples.IsEmpty()) {
return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::END_OF_STREAM, __func__);
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
}
return SamplesPromise::CreateAndResolve(frames, __func__);
}
void
MP3TrackDemuxer::Reset() {
MP3LOG("Reset()");
FastSeek(TimeUnit());
mParser.Reset();
}
RefPtr<MP3TrackDemuxer::SkipAccessPointPromise>
MP3TrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold) {
// Will not be called for audio-only resources.
return SkipAccessPointPromise::CreateAndReject(
- SkipFailureHolder(DemuxerFailureReason::DEMUXER_ERROR, 0), __func__);
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
}
int64_t
MP3TrackDemuxer::GetResourceOffset() const {
return mOffset;
}
TimeIntervals
--- a/dom/media/MediaDataDemuxer.h
+++ b/dom/media/MediaDataDemuxer.h
@@ -7,46 +7,37 @@
#if !defined(MediaDataDemuxer_h)
#define MediaDataDemuxer_h
#include "mozilla/MozPromise.h"
#include "mozilla/UniquePtr.h"
#include "MediaData.h"
#include "MediaInfo.h"
+#include "MediaResult.h"
#include "TimeUnits.h"
#include "nsISupportsImpl.h"
#include "mozilla/RefPtr.h"
#include "nsTArray.h"
namespace mozilla {
class MediaTrackDemuxer;
class TrackMetadataHolder;
-enum class DemuxerFailureReason : int8_t
-{
- WAITING_FOR_DATA,
- END_OF_STREAM,
- DEMUXER_ERROR,
- CANCELED,
- SHUTDOWN,
-};
-
-
// Allows reading the media data: to retrieve the metadata and demux samples.
// MediaDataDemuxer isn't designed to be thread safe.
// When used by the MediaFormatDecoder, care is taken to ensure that the demuxer
// will never be called from more than one thread at once.
class MediaDataDemuxer
{
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDataDemuxer)
- typedef MozPromise<nsresult, DemuxerFailureReason, /* IsExclusive = */ true> InitPromise;
+ typedef MozPromise<nsresult, MediaResult, /* IsExclusive = */ true> InitPromise;
// Initializes the demuxer. Other methods cannot be called unless
// initialization has completed and succeeded.
// Typically a demuxer will wait to parse the metadata before resolving the
// promise. The promise must not be resolved until sufficient data is
// supplied. For example, an incomplete metadata would cause the promise to be
// rejected should no more data be coming, while the demuxer would wait
// otherwise.
@@ -115,26 +106,26 @@ public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SamplesHolder)
nsTArray<RefPtr<MediaRawData>> mSamples;
private:
~SamplesHolder() {}
};
class SkipFailureHolder {
public:
- SkipFailureHolder(DemuxerFailureReason aFailure, uint32_t aSkipped)
+ SkipFailureHolder(const MediaResult& aFailure, uint32_t aSkipped)
: mFailure(aFailure)
, mSkipped(aSkipped)
{}
- DemuxerFailureReason mFailure;
+ MediaResult mFailure;
uint32_t mSkipped;
};
- typedef MozPromise<media::TimeUnit, DemuxerFailureReason, /* IsExclusive = */ true> SeekPromise;
- typedef MozPromise<RefPtr<SamplesHolder>, DemuxerFailureReason, /* IsExclusive = */ true> SamplesPromise;
+ typedef MozPromise<media::TimeUnit, MediaResult, /* IsExclusive = */ true> SeekPromise;
+ typedef MozPromise<RefPtr<SamplesHolder>, MediaResult, /* IsExclusive = */ true> SamplesPromise;
typedef MozPromise<uint32_t, SkipFailureHolder, /* IsExclusive = */ true> SkipAccessPointPromise;
// Returns the TrackInfo (a.k.a Track Description) for this track.
// The TrackInfo returned will be:
// TrackInfo::kVideoTrack -> VideoInfo.
// TrackInfo::kAudioTrack -> AudioInfo.
// respectively.
virtual UniquePtr<TrackInfo> GetInfo() const = 0;
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -371,20 +371,20 @@ MediaFormatReader::OnDemuxerInitDone(nsr
mInitDone = true;
RefPtr<MetadataHolder> metadata = new MetadataHolder();
metadata->mInfo = mInfo;
metadata->mTags = tags->Count() ? tags.release() : nullptr;
mMetadataPromise.Resolve(metadata, __func__);
}
void
-MediaFormatReader::OnDemuxerInitFailed(DemuxerFailureReason aFailure)
+MediaFormatReader::OnDemuxerInitFailed(const MediaResult& aError)
{
mDemuxerInitRequest.Complete();
- mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ mMetadataPromise.Reject(aError, __func__);
}
bool
MediaFormatReader::EnsureDecoderCreated(TrackType aTrack)
{
MOZ_ASSERT(OnTaskQueue());
MOZ_DIAGNOSTIC_ASSERT(!IsSuspended());
@@ -563,47 +563,43 @@ MediaFormatReader::RequestVideoData(bool
RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__);
ScheduleUpdate(TrackInfo::kVideoTrack);
return p;
}
void
-MediaFormatReader::OnDemuxFailed(TrackType aTrack, DemuxerFailureReason aFailure)
+MediaFormatReader::OnDemuxFailed(TrackType aTrack, const MediaResult& aError)
{
MOZ_ASSERT(OnTaskQueue());
- LOG("Failed to demux %s, failure:%d",
- aTrack == TrackType::kVideoTrack ? "video" : "audio", aFailure);
+ LOG("Failed to demux %s, failure:%u",
+ aTrack == TrackType::kVideoTrack ? "video" : "audio", aError.Code());
auto& decoder = GetDecoderData(aTrack);
decoder.mDemuxRequest.Complete();
- switch (aFailure) {
- case DemuxerFailureReason::END_OF_STREAM:
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
if (!decoder.mWaitingForData) {
decoder.mNeedDraining = true;
}
NotifyEndOfStream(aTrack);
break;
- case DemuxerFailureReason::DEMUXER_ERROR:
- NotifyError(aTrack);
- break;
- case DemuxerFailureReason::WAITING_FOR_DATA:
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
if (!decoder.mWaitingForData) {
decoder.mNeedDraining = true;
}
NotifyWaitingForData(aTrack);
break;
- case DemuxerFailureReason::CANCELED: MOZ_FALLTHROUGH;
- case DemuxerFailureReason::SHUTDOWN:
+ case NS_ERROR_DOM_MEDIA_CANCELED:
if (decoder.HasPromise()) {
decoder.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
}
break;
default:
- MOZ_ASSERT(false);
+ NotifyError(aTrack, aError);
break;
}
}
void
MediaFormatReader::DoDemuxVideo()
{
mVideo.mDemuxRequest.Begin(mVideo.mTrackDemuxer->GetSamples(1)
@@ -1047,34 +1043,33 @@ MediaFormatReader::InternalSeek(TrackTyp
auto& decoder = self->GetDecoderData(aTrack);
decoder.mSeekRequest.Complete();
MOZ_ASSERT(decoder.mTimeThreshold,
"Seek promise must be disconnected when timethreshold is reset");
decoder.mTimeThreshold.ref().mHasSeeked = true;
self->SetVideoDecodeThreshold();
self->ScheduleUpdate(aTrack);
},
- [self, aTrack] (DemuxerFailureReason aResult) {
+ [self, aTrack] (const MediaResult& aError) {
auto& decoder = self->GetDecoderData(aTrack);
decoder.mSeekRequest.Complete();
- switch (aResult) {
- case DemuxerFailureReason::WAITING_FOR_DATA:
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
self->NotifyWaitingForData(aTrack);
break;
- case DemuxerFailureReason::END_OF_STREAM:
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
decoder.mTimeThreshold.reset();
self->NotifyEndOfStream(aTrack);
break;
- case DemuxerFailureReason::CANCELED: MOZ_FALLTHROUGH;
- case DemuxerFailureReason::SHUTDOWN:
+ case NS_ERROR_DOM_MEDIA_CANCELED:
decoder.mTimeThreshold.reset();
break;
default:
decoder.mTimeThreshold.reset();
- self->NotifyError(aTrack);
+ self->NotifyError(aTrack, aError);
break;
}
}));
}
void
MediaFormatReader::DrainDecoder(TrackType aTrack)
{
@@ -1561,34 +1556,33 @@ MediaFormatReader::OnVideoSkipCompleted(
void
MediaFormatReader::OnVideoSkipFailed(MediaTrackDemuxer::SkipFailureHolder aFailure)
{
MOZ_ASSERT(OnTaskQueue());
LOG("Skipping failed, skipped %u frames", aFailure.mSkipped);
mSkipRequest.Complete();
- switch (aFailure.mFailure) {
- case DemuxerFailureReason::END_OF_STREAM: MOZ_FALLTHROUGH;
- case DemuxerFailureReason::WAITING_FOR_DATA:
+ switch (aFailure.mFailure.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
// Some frames may have been output by the decoder since we initiated the
// videoskip process and we know they would be late.
DropDecodedSamples(TrackInfo::kVideoTrack);
// We can't complete the skip operation, will just service a video frame
// normally.
ScheduleUpdate(TrackInfo::kVideoTrack);
break;
- case DemuxerFailureReason::CANCELED: MOZ_FALLTHROUGH;
- case DemuxerFailureReason::SHUTDOWN:
+ case NS_ERROR_DOM_MEDIA_CANCELED:
if (mVideo.HasPromise()) {
- mVideo.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ mVideo.RejectPromise(aFailure.mFailure, __func__);
}
break;
default:
- NotifyError(TrackType::kVideoTrack);
+ NotifyError(TrackType::kVideoTrack, aFailure.mFailure);
break;
}
}
RefPtr<MediaDecoderReader::SeekPromise>
MediaFormatReader::Seek(SeekTarget aTarget, int64_t aUnused)
{
MOZ_ASSERT(OnTaskQueue());
@@ -1690,27 +1684,27 @@ MediaFormatReader::AttemptSeek()
} else if (HasAudio()) {
DoAudioSeek();
} else {
MOZ_CRASH();
}
}
void
-MediaFormatReader::OnSeekFailed(TrackType aTrack, DemuxerFailureReason aResult)
+MediaFormatReader::OnSeekFailed(TrackType aTrack, const MediaResult& aError)
{
MOZ_ASSERT(OnTaskQueue());
- LOGV("%s failure:%d", TrackTypeToStr(aTrack), aResult);
+ LOGV("%s failure:%u", TrackTypeToStr(aTrack), aError.Code());
if (aTrack == TrackType::kVideoTrack) {
mVideo.mSeekRequest.Complete();
} else {
mAudio.mSeekRequest.Complete();
}
- if (aResult == DemuxerFailureReason::WAITING_FOR_DATA) {
+ if (aError == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
if (HasVideo() && aTrack == TrackType::kAudioTrack &&
mFallbackSeekTime.isSome() &&
mPendingSeekTime.ref() != mFallbackSeekTime.ref()) {
// We have failed to seek audio where video seeked to earlier.
// Attempt to seek instead to the closest point that we know we have in
// order to limit A/V sync discrepency.
// Ensure we have the most up to date buffered ranges.
@@ -1734,17 +1728,17 @@ MediaFormatReader::OnSeekFailed(TrackTyp
DoAudioSeek();
return;
}
NotifyWaitingForData(aTrack);
return;
}
MOZ_ASSERT(!mVideo.mSeekRequest.Exists() && !mAudio.mSeekRequest.Exists());
mPendingSeekTime.reset();
- mSeekPromise.Reject(NS_ERROR_FAILURE, __func__);
+ mSeekPromise.Reject(aError, __func__);
}
void
MediaFormatReader::DoVideoSeek()
{
MOZ_ASSERT(mPendingSeekTime.isSome());
LOGV("Seeking video to %lld", mPendingSeekTime.ref().ToMicroseconds());
media::TimeUnit seekTime = mPendingSeekTime.ref();
@@ -1775,20 +1769,20 @@ MediaFormatReader::OnVideoSeekCompleted(
DoAudioSeek();
} else {
mPendingSeekTime.reset();
mSeekPromise.Resolve(aTime, __func__);
}
}
void
-MediaFormatReader::OnVideoSeekFailed(DemuxerFailureReason aFailure)
+MediaFormatReader::OnVideoSeekFailed(const MediaResult& aError)
{
mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
- OnSeekFailed(TrackType::kVideoTrack, aFailure);
+ OnSeekFailed(TrackType::kVideoTrack, aError);
}
void
MediaFormatReader::SetVideoDecodeThreshold()
{
MOZ_ASSERT(OnTaskQueue());
if (!HasVideo() || !mVideo.mDecoder) {
@@ -1842,19 +1836,19 @@ MediaFormatReader::OnAudioSeekCompleted(
MOZ_ASSERT(OnTaskQueue());
LOGV("Audio seeked to %lld", aTime.ToMicroseconds());
mAudio.mSeekRequest.Complete();
mPendingSeekTime.reset();
mSeekPromise.Resolve(aTime, __func__);
}
void
-MediaFormatReader::OnAudioSeekFailed(DemuxerFailureReason aFailure)
+MediaFormatReader::OnAudioSeekFailed(const MediaResult& aError)
{
- OnSeekFailed(TrackType::kAudioTrack, aFailure);
+ OnSeekFailed(TrackType::kAudioTrack, aError);
}
media::TimeIntervals
MediaFormatReader::GetBuffered()
{
MOZ_ASSERT(OnTaskQueue());
media::TimeIntervals videoti;
media::TimeIntervals audioti;
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -483,32 +483,32 @@ private:
bool NeedInput(DecoderData& aDecoder);
DecoderData& GetDecoderData(TrackType aTrack);
// Demuxer objects.
RefPtr<MediaDataDemuxer> mDemuxer;
bool mDemuxerInitDone;
void OnDemuxerInitDone(nsresult);
- void OnDemuxerInitFailed(DemuxerFailureReason aFailure);
+ void OnDemuxerInitFailed(const MediaResult& aError);
MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest;
- void OnDemuxFailed(TrackType aTrack, DemuxerFailureReason aFailure);
+ void OnDemuxFailed(TrackType aTrack, const MediaResult& aError);
void DoDemuxVideo();
void OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
- void OnVideoDemuxFailed(DemuxerFailureReason aFailure)
+ void OnVideoDemuxFailed(const MediaResult& aError)
{
- OnDemuxFailed(TrackType::kVideoTrack, aFailure);
+ OnDemuxFailed(TrackType::kVideoTrack, aError);
}
void DoDemuxAudio();
void OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
- void OnAudioDemuxFailed(DemuxerFailureReason aFailure)
+ void OnAudioDemuxFailed(const MediaResult& aError)
{
- OnDemuxFailed(TrackType::kAudioTrack, aFailure);
+ OnDemuxFailed(TrackType::kAudioTrack, aError);
}
void SkipVideoDemuxToNextKeyFrame(media::TimeUnit aTimeThreshold);
MozPromiseRequestHolder<MediaTrackDemuxer::SkipAccessPointPromise> mSkipRequest;
void VideoSkipReset(uint32_t aSkipped);
void OnVideoSkipCompleted(uint32_t aSkipped);
void OnVideoSkipFailed(MediaTrackDemuxer::SkipFailureHolder aFailure);
@@ -546,25 +546,25 @@ private:
media::TimeUnit DemuxStartTime();
bool IsSeeking() const { return mPendingSeekTime.isSome(); }
bool IsVideoSeeking() const
{
return IsSeeking() && mOriginalSeekTarget.IsVideoOnly();
}
void ScheduleSeek();
void AttemptSeek();
- void OnSeekFailed(TrackType aTrack, DemuxerFailureReason aFailure);
+ void OnSeekFailed(TrackType aTrack, const MediaResult& aError);
void DoVideoSeek();
void OnVideoSeekCompleted(media::TimeUnit aTime);
- void OnVideoSeekFailed(DemuxerFailureReason aFailure);
+ void OnVideoSeekFailed(const MediaResult& aError);
bool mSeekScheduled;
void DoAudioSeek();
void OnAudioSeekCompleted(media::TimeUnit aTime);
- void OnAudioSeekFailed(DemuxerFailureReason aFailure);
+ void OnAudioSeekFailed(const MediaResult& aError);
// The SeekTarget that was last given to Seek()
SeekTarget mOriginalSeekTarget;
// Temporary seek information while we wait for the data
Maybe<media::TimeUnit> mFallbackSeekTime;
Maybe<media::TimeUnit> mPendingSeekTime;
MozPromiseHolder<SeekPromise> mSeekPromise;
RefPtr<VideoFrameContainer> mVideoFrameContainer;
--- a/dom/media/flac/FlacDemuxer.cpp
+++ b/dom/media/flac/FlacDemuxer.cpp
@@ -579,17 +579,17 @@ FlacDemuxer::InitInternal()
RefPtr<FlacDemuxer::InitPromise>
FlacDemuxer::Init()
{
if (!InitInternal()) {
LOG("Init() failure: waiting for data");
return InitPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
LOG("Init() successful");
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
bool
FlacDemuxer::HasTrackType(TrackInfo::TrackType aType) const
@@ -850,17 +850,17 @@ FlacTrackDemuxer::GetSamples(int32_t aNu
{
LOGV("GetSamples(%d) Begin offset=%lld mParsedFramesDuration=%f"
" mTotalFrameLen=%llu",
aNumSamples, GetResourceOffset(), mParsedFramesDuration.ToSeconds(),
mTotalFrameLen);
if (!aNumSamples) {
return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
RefPtr<SamplesHolder> frames = new SamplesHolder();
while (aNumSamples--) {
RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame()));
if (!frame)
break;
@@ -870,17 +870,17 @@ FlacTrackDemuxer::GetSamples(int32_t aNu
LOGV("GetSamples() End mSamples.Length=%u aNumSamples=%d offset=%lld"
" mParsedFramesDuration=%f mTotalFrameLen=%llu",
frames->mSamples.Length(), aNumSamples, GetResourceOffset(),
mParsedFramesDuration.ToSeconds(), mTotalFrameLen);
if (frames->mSamples.IsEmpty()) {
return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::END_OF_STREAM, __func__);
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
}
return SamplesPromise::CreateAndResolve(frames, __func__);
}
void
FlacTrackDemuxer::Reset()
{
@@ -894,17 +894,17 @@ FlacTrackDemuxer::Reset()
mParser->EndFrameSession();
}
RefPtr<FlacTrackDemuxer::SkipAccessPointPromise>
FlacTrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold)
{
// Will not be called for audio-only resources.
return SkipAccessPointPromise::CreateAndReject(
- SkipFailureHolder(DemuxerFailureReason::DEMUXER_ERROR, 0), __func__);
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
}
int64_t
FlacTrackDemuxer::GetResourceOffset() const
{
return mSource.Tell();
}
--- a/dom/media/fmp4/MP4Demuxer.cpp
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -120,33 +120,33 @@ MP4Demuxer::MP4Demuxer(MediaResource* aR
RefPtr<MP4Demuxer::InitPromise>
MP4Demuxer::Init()
{
AutoPinned<mp4_demuxer::ResourceStream> stream(mStream);
// Check that we have enough data to read the metadata.
if (!mp4_demuxer::MP4Metadata::HasCompleteMetadata(stream)) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
mInitData = mp4_demuxer::MP4Metadata::Metadata(stream);
if (!mInitData) {
// OOM
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
RefPtr<mp4_demuxer::BufferStream> bufferstream =
new mp4_demuxer::BufferStream(mInitData);
mMetadata = MakeUnique<mp4_demuxer::MP4Metadata>(bufferstream);
if (!mMetadata->GetNumberTracks(mozilla::TrackInfo::kAudioTrack) &&
!mMetadata->GetNumberTracks(mozilla::TrackInfo::kVideoTrack)) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
bool
MP4Demuxer::HasTrackType(TrackInfo::TrackType aType) const
{
@@ -293,17 +293,17 @@ MP4TrackDemuxer::Seek(media::TimeUnit aT
mIterator->Seek(seekTime);
// Check what time we actually seeked to.
RefPtr<MediaRawData> sample;
do {
sample = GetNextSample();
if (!sample) {
- return SeekPromise::CreateAndReject(DemuxerFailureReason::END_OF_STREAM, __func__);
+ return SeekPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
}
if (!sample->Size()) {
// This sample can't be decoded, continue searching.
continue;
}
if (sample->mKeyframe) {
mQueuedSample = sample;
seekTime = mQueuedSample->mTime;
@@ -365,17 +365,17 @@ MP4TrackDemuxer::GetNextSample()
}
RefPtr<MP4TrackDemuxer::SamplesPromise>
MP4TrackDemuxer::GetSamples(int32_t aNumSamples)
{
EnsureUpToDateIndex();
RefPtr<SamplesHolder> samples = new SamplesHolder;
if (!aNumSamples) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
if (mQueuedSample) {
MOZ_ASSERT(mQueuedSample->mKeyframe,
"mQueuedSample must be a keyframe");
samples->mSamples.AppendElement(mQueuedSample);
mQueuedSample = nullptr;
aNumSamples--;
@@ -385,17 +385,17 @@ MP4TrackDemuxer::GetSamples(int32_t aNum
if (!sample->Size()) {
continue;
}
samples->mSamples.AppendElement(sample);
aNumSamples--;
}
if (samples->mSamples.IsEmpty()) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::END_OF_STREAM, __func__);
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
} else {
for (const auto& sample : samples->mSamples) {
// Collect telemetry from h264 Annex B SPS.
if (mNeedSPSForTelemetry && mp4_demuxer::AnnexB::HasSPS(sample)) {
RefPtr<MediaByteBuffer> extradata =
mp4_demuxer::AnnexB::ExtractExtraData(sample);
mNeedSPSForTelemetry = AccumulateSPSTelemetry(extradata);
}
@@ -456,17 +456,17 @@ MP4TrackDemuxer::SkipToNextRandomAccessP
found = true;
mQueuedSample = sample;
}
}
SetNextKeyFrameTime();
if (found) {
return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
} else {
- SkipFailureHolder failure(DemuxerFailureReason::END_OF_STREAM, parsed);
+ SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
return SkipAccessPointPromise::CreateAndReject(Move(failure), __func__);
}
}
media::TimeIntervals
MP4TrackDemuxer::GetBuffered()
{
EnsureUpToDateIndex();
--- a/dom/media/gtest/TestMP4Demuxer.cpp
+++ b/dom/media/gtest/TestMP4Demuxer.cpp
@@ -114,29 +114,29 @@ public:
[track, binding] () {
track->GetSamples()->Then(binding->mTaskQueue, __func__,
[track, binding] (RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
if (aSamples->mSamples.Length()) {
binding->mSamples.AppendElements(aSamples->mSamples);
binding->CheckTrackSamples(track);
}
},
- [binding] (DemuxerFailureReason aReason) {
- if (aReason == DemuxerFailureReason::DEMUXER_ERROR) {
- EXPECT_TRUE(false);
- binding->mCheckTrackSamples.Reject(NS_ERROR_FAILURE, __func__);
- } else if (aReason == DemuxerFailureReason::END_OF_STREAM) {
+ [binding] (const MediaResult& aError) {
+ if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
EXPECT_TRUE(binding->mSamples.Length() > 1);
for (uint32_t i = 0; i < (binding->mSamples.Length() - 1); i++) {
EXPECT_LT(binding->mSamples[i]->mTimecode, binding->mSamples[i + 1]->mTimecode);
if (binding->mSamples[i]->mKeyframe) {
binding->mKeyFrameTimecodes.AppendElement(binding->mSamples[i]->mTimecode);
}
}
binding->mCheckTrackSamples.Resolve(true, __func__);
+ } else {
+ EXPECT_TRUE(false);
+ binding->mCheckTrackSamples.Reject(aError, __func__);
}
}
);
}
);
return p;
}
--- a/dom/media/mediasource/MediaSourceDemuxer.cpp
+++ b/dom/media/mediasource/MediaSourceDemuxer.cpp
@@ -242,17 +242,17 @@ MediaSourceDemuxer::GetManager(TrackType
return mVideoTrack;
default:
return nullptr;
}
}
MediaSourceDemuxer::~MediaSourceDemuxer()
{
- mInitPromise.RejectIfExists(DemuxerFailureReason::SHUTDOWN, __func__);
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
}
void
MediaSourceDemuxer::GetMozDebugReaderData(nsAString& aString)
{
MonitorAutoLock mon(mMonitor);
nsAutoCString result;
result += nsPrintfCString("Dumping data for demuxer %p:\n", this);
@@ -392,17 +392,17 @@ MediaSourceTrackDemuxer::DoSeek(media::T
// to the last sample instead.
seekTime =
std::max(mManager->HighestStartTime(mType) - mPreRoll,
TimeUnit::FromMicroseconds(0));
}
if (!buffered.ContainsWithStrictEnd(seekTime)) {
if (!buffered.ContainsWithStrictEnd(aTime)) {
// We don't have the data to seek to.
- return SeekPromise::CreateAndReject(DemuxerFailureReason::WAITING_FOR_DATA,
+ return SeekPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA,
__func__);
}
// Theoretically we should reject the promise with WAITING_FOR_DATA,
// however, to avoid unwanted regressions we assume that if at this time
// we don't have the wanted data it won't come later.
// Instead of using the pre-rolled time, use the earliest time available in
// the interval.
TimeIntervals::IndexType index = buffered.Find(aTime);
@@ -433,40 +433,40 @@ MediaSourceTrackDemuxer::DoGetSamples(in
if (mReset) {
// If a seek (or reset) was recently performed, we ensure that the data
// we are about to retrieve is still available.
TimeIntervals buffered = mManager->Buffered(mType);
buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
if (!buffered.Length() && mManager->IsEnded()) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::END_OF_STREAM,
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM,
__func__);
}
if (!buffered.ContainsWithStrictEnd(TimeUnit::FromMicroseconds(0))) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::WAITING_FOR_DATA,
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA,
__func__);
}
mReset = false;
}
RefPtr<MediaRawData> sample;
if (mNextSample) {
sample = mNextSample.ref();
mNextSample.reset();
} else {
Result result;
sample = mManager->GetSample(mType, MediaSourceDemuxer::EOS_FUZZ, result);
if (!sample) {
if (result == Result::ERROR) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
return SamplesPromise::CreateAndReject(
(result == Result::EOS && mManager->IsEnded())
- ? DemuxerFailureReason::END_OF_STREAM
- : DemuxerFailureReason::WAITING_FOR_DATA, __func__);
+ ? NS_ERROR_DOM_MEDIA_END_OF_STREAM
+ : NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
}
}
RefPtr<SamplesHolder> samples = new SamplesHolder;
samples->mSamples.AppendElement(sample);
if (mNextRandomAccessPoint.ToMicroseconds() <= sample->mTime) {
MonitorAutoLock mon(mMonitor);
mNextRandomAccessPoint =
mManager->GetNextRandomAccessPoint(mType, MediaSourceDemuxer::EOS_FUZZ);
@@ -487,14 +487,14 @@ MediaSourceTrackDemuxer::DoSkipToNextRan
aTimeThreadshold,
MediaSourceDemuxer::EOS_FUZZ,
found);
if (found) {
return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
}
}
SkipFailureHolder holder(
- mManager->IsEnded() ? DemuxerFailureReason::END_OF_STREAM :
- DemuxerFailureReason::WAITING_FOR_DATA, parsed);
+ mManager->IsEnded() ? NS_ERROR_DOM_MEDIA_END_OF_STREAM :
+ NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, parsed);
return SkipAccessPointPromise::CreateAndReject(holder, __func__);
}
} // namespace mozilla
--- a/dom/media/mediasource/MediaSourceDemuxer.h
+++ b/dom/media/mediasource/MediaSourceDemuxer.h
@@ -15,16 +15,17 @@
#include "MediaDataDemuxer.h"
#include "MediaDecoderReader.h"
#include "MediaResource.h"
#include "MediaSource.h"
#include "TrackBuffersManager.h"
namespace mozilla {
+class MediaResult;
class MediaSourceTrackDemuxer;
class MediaSourceDemuxer : public MediaDataDemuxer
{
public:
explicit MediaSourceDemuxer();
RefPtr<InitPromise> Init() override;
@@ -114,17 +115,17 @@ public:
{
return false;
}
private:
RefPtr<SeekPromise> DoSeek(media::TimeUnit aTime);
RefPtr<SamplesPromise> DoGetSamples(int32_t aNumSamples);
RefPtr<SkipAccessPointPromise> DoSkipToNextRandomAccessPoint(media::TimeUnit aTimeThreadshold);
- already_AddRefed<MediaRawData> GetSample(DemuxerFailureReason& aFailure);
+ already_AddRefed<MediaRawData> GetSample(MediaResult& aError);
// Return the timestamp of the next keyframe after mLastSampleIndex.
media::TimeUnit GetNextRandomAccessPoint();
RefPtr<MediaSourceDemuxer> mParent;
RefPtr<TrackBuffersManager> mManager;
TrackInfo::TrackType mType;
// Monitor protecting members below accessed from multiple threads.
Monitor mMonitor;
--- a/dom/media/mediasource/SourceBuffer.cpp
+++ b/dom/media/mediasource/SourceBuffer.cpp
@@ -446,17 +446,17 @@ SourceBuffer::AppendDataCompletedWithSuc
void
SourceBuffer::AppendDataErrored(const MediaResult& aError)
{
MOZ_ASSERT(mUpdating);
mPendingAppend.Complete();
switch (aError.Code()) {
- case NS_ERROR_ABORT:
+ case NS_ERROR_DOM_MEDIA_CANCELED:
// Nothing further to do as the trackbuffer has been shutdown.
// or append was aborted and abort() has handled all the events.
break;
default:
AppendError(aError);
break;
}
}
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -1090,22 +1090,22 @@ TrackBuffersManager::OnDemuxerInitDone(n
// 4. Set append state to WAITING_FOR_SEGMENT.
SetAppendState(AppendState::WAITING_FOR_SEGMENT);
// 5. Jump to the loop top step above.
ScheduleSegmentParserLoop();
}
void
-TrackBuffersManager::OnDemuxerInitFailed(DemuxerFailureReason aFailure)
+TrackBuffersManager::OnDemuxerInitFailed(const MediaResult& aError)
{
- MOZ_ASSERT(aFailure != DemuxerFailureReason::WAITING_FOR_DATA);
+ MOZ_ASSERT(aError != NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
mDemuxerInitRequest.Complete();
- RejectAppend(NS_ERROR_FAILURE, __func__);
+ RejectAppend(aError, __func__);
}
RefPtr<TrackBuffersManager::CodedFrameProcessingPromise>
TrackBuffersManager::CodedFrameProcessing()
{
MOZ_ASSERT(OnTaskQueue());
MOZ_ASSERT(mProcessingPromise.IsEmpty());
@@ -1144,39 +1144,32 @@ TrackBuffersManager::CodedFrameProcessin
DoDemuxVideo();
return p;
}
void
TrackBuffersManager::OnDemuxFailed(TrackType aTrack,
- DemuxerFailureReason aFailure)
+ const MediaResult& aError)
{
MOZ_ASSERT(OnTaskQueue());
- MSE_DEBUG("Failed to demux %s, failure:%d",
- aTrack == TrackType::kVideoTrack ? "video" : "audio", aFailure);
- switch (aFailure) {
- case DemuxerFailureReason::END_OF_STREAM:
- case DemuxerFailureReason::WAITING_FOR_DATA:
+ MSE_DEBUG("Failed to demux %s, failure:%u",
+ aTrack == TrackType::kVideoTrack ? "video" : "audio", aError.Code());
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
if (aTrack == TrackType::kVideoTrack) {
DoDemuxAudio();
} else {
CompleteCodedFrameProcessing();
}
break;
- case DemuxerFailureReason::DEMUXER_ERROR:
- RejectProcessing(NS_ERROR_FAILURE, __func__);
- break;
- case DemuxerFailureReason::CANCELED:
- case DemuxerFailureReason::SHUTDOWN:
- RejectProcessing(NS_ERROR_ABORT, __func__);
- break;
default:
- MOZ_ASSERT(false);
+ RejectProcessing(aError, __func__);
break;
}
}
void
TrackBuffersManager::DoDemuxVideo()
{
MOZ_ASSERT(OnTaskQueue());
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -23,16 +23,17 @@
#include "nsString.h"
#include "nsTArray.h"
namespace mozilla {
class ContainerParser;
class MediaByteBuffer;
class MediaRawData;
+class MediaResult;
class MediaSourceDemuxer;
class SourceBufferResource;
class SourceBufferTaskQueue
{
public:
SourceBufferTaskQueue()
: mMonitor("SourceBufferTaskQueue")
@@ -238,35 +239,35 @@ private:
RefPtr<MediaByteBuffer> mPendingInputBuffer;
RefPtr<SourceBufferResource> mCurrentInputBuffer;
RefPtr<MediaDataDemuxer> mInputDemuxer;
// Length already processed in current media segment.
uint32_t mProcessedInput;
Maybe<media::TimeUnit> mLastParsedEndTime;
void OnDemuxerInitDone(nsresult);
- void OnDemuxerInitFailed(DemuxerFailureReason aFailure);
+ void OnDemuxerInitFailed(const MediaResult& aFailure);
void OnDemuxerResetDone(nsresult);
MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest;
bool mEncrypted;
- void OnDemuxFailed(TrackType aTrack, DemuxerFailureReason aFailure);
+ void OnDemuxFailed(TrackType aTrack, const MediaResult& aError);
void DoDemuxVideo();
void OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
- void OnVideoDemuxFailed(DemuxerFailureReason aFailure)
+ void OnVideoDemuxFailed(const MediaResult& aError)
{
mVideoTracks.mDemuxRequest.Complete();
- OnDemuxFailed(TrackType::kVideoTrack, aFailure);
+ OnDemuxFailed(TrackType::kVideoTrack, aError);
}
void DoDemuxAudio();
void OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
- void OnAudioDemuxFailed(DemuxerFailureReason aFailure)
+ void OnAudioDemuxFailed(const MediaResult& aError)
{
mAudioTracks.mDemuxRequest.Complete();
- OnDemuxFailed(TrackType::kAudioTrack, aFailure);
+ OnDemuxFailed(TrackType::kAudioTrack, aError);
}
void DoEvictData(const media::TimeUnit& aPlaybackTime, int64_t aSizeToEvict);
struct TrackData
{
TrackData()
: mNumTracks(0)
--- a/dom/media/ogg/OggDemuxer.cpp
+++ b/dom/media/ogg/OggDemuxer.cpp
@@ -210,34 +210,29 @@ OggDemuxer::StartTime(TrackInfo::TrackTy
return OggState(aType).mStartTime.refOr(TimeUnit::FromMicroseconds(0)).ToMicroseconds();
}
RefPtr<OggDemuxer::InitPromise>
OggDemuxer::Init()
{
int ret = ogg_sync_init(OggSyncState(TrackInfo::kAudioTrack));
if (ret != 0) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_OUT_OF_MEMORY, __func__);
}
ret = ogg_sync_init(OggSyncState(TrackInfo::kVideoTrack));
if (ret != 0) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_OUT_OF_MEMORY, __func__);
}
- /*
- if (InitBufferedState() != NS_OK) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::WAITING_FOR_DATA, __func__);
- }
- */
if (ReadMetadata() != NS_OK) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
if (!GetNumberTracks(TrackInfo::kAudioTrack) &&
!GetNumberTracks(TrackInfo::kVideoTrack)) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
bool
OggDemuxer::HasTrackType(TrackInfo::TrackType aType) const
{
@@ -1478,17 +1473,17 @@ OggTrackDemuxer::Seek(TimeUnit aTime)
if (sample != nullptr) {
seekTime = TimeUnit::FromMicroseconds(sample->mTime);
OGG_DEBUG("%p seeked to time %lld", this, seekTime.ToMicroseconds());
}
mQueuedSample = sample;
return SeekPromise::CreateAndResolve(seekTime, __func__);
} else {
- return SeekPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return SeekPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
}
RefPtr<MediaRawData>
OggTrackDemuxer::NextSample()
{
if (mQueuedSample) {
RefPtr<MediaRawData> nextSample = mQueuedSample;
@@ -1511,30 +1506,30 @@ OggTrackDemuxer::NextSample()
return data;
}
RefPtr<OggTrackDemuxer::SamplesPromise>
OggTrackDemuxer::GetSamples(int32_t aNumSamples)
{
RefPtr<SamplesHolder> samples = new SamplesHolder;
if (!aNumSamples) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
}
while (aNumSamples) {
RefPtr<MediaRawData> sample(NextSample());
if (!sample) {
break;
}
samples->mSamples.AppendElement(sample);
aNumSamples--;
}
if (samples->mSamples.IsEmpty()) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::END_OF_STREAM, __func__);
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
} else {
return SamplesPromise::CreateAndResolve(samples, __func__);
}
}
void
OggTrackDemuxer::Reset()
{
@@ -1558,17 +1553,17 @@ OggTrackDemuxer::SkipToNextRandomAccessP
}
}
if (found) {
OGG_DEBUG("next sample: %f (parsed: %d)",
TimeUnit::FromMicroseconds(sample->mTime).ToSeconds(),
parsed);
return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
} else {
- SkipFailureHolder failure(DemuxerFailureReason::END_OF_STREAM, parsed);
+ SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
return SkipAccessPointPromise::CreateAndReject(Move(failure), __func__);
}
}
TimeIntervals
OggTrackDemuxer::GetBuffered()
{
return mParent->GetBuffered(mType);
--- a/dom/media/wave/WaveDemuxer.cpp
+++ b/dom/media/wave/WaveDemuxer.cpp
@@ -38,17 +38,17 @@ WAVDemuxer::InitInternal()
return mTrackDemuxer->Init();
}
RefPtr<WAVDemuxer::InitPromise>
WAVDemuxer::Init()
{
if (!InitInternal()) {
return InitPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
bool
WAVDemuxer::HasTrackType(TrackInfo::TrackType aType) const
{
return aType == TrackInfo::kAudioTrack;
@@ -335,34 +335,31 @@ WAVTrackDemuxer::ScanUntil(const TimeUni
}
return SeekPosition();
}
RefPtr<WAVTrackDemuxer::SamplesPromise>
WAVTrackDemuxer::GetSamples(int32_t aNumSamples)
{
- if (!aNumSamples) {
- return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::DEMUXER_ERROR, __func__);
- }
+ MOZ_ASSERT(aNumSamples);
RefPtr<SamplesHolder> datachunks = new SamplesHolder();
while (aNumSamples--) {
RefPtr<MediaRawData> datachunk = GetNextChunk(FindNextChunk());
if (!datachunk) {
break;
}
datachunks->mSamples.AppendElement(datachunk);
}
if (datachunks->mSamples.IsEmpty()) {
return SamplesPromise::CreateAndReject(
- DemuxerFailureReason::END_OF_STREAM, __func__);
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
}
return SamplesPromise::CreateAndResolve(datachunks, __func__);
}
void
WAVTrackDemuxer::Reset()
{
@@ -372,17 +369,17 @@ WAVTrackDemuxer::Reset()
mRIFFParser.Reset();
mFmtParser.Reset();
}
RefPtr<WAVTrackDemuxer::SkipAccessPointPromise>
WAVTrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold)
{
return SkipAccessPointPromise::CreateAndReject(
- SkipFailureHolder(DemuxerFailureReason::DEMUXER_ERROR, 0), __func__);
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
}
int64_t
WAVTrackDemuxer::GetResourceOffset() const
{
return mOffset;
}
--- a/dom/media/webm/WebMDemuxer.cpp
+++ b/dom/media/webm/WebMDemuxer.cpp
@@ -183,22 +183,22 @@ WebMDemuxer::~WebMDemuxer()
}
RefPtr<WebMDemuxer::InitPromise>
WebMDemuxer::Init()
{
InitBufferedState();
if (NS_FAILED(ReadMetadata())) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
if (!GetNumberTracks(TrackInfo::kAudioTrack) &&
!GetNumberTracks(TrackInfo::kVideoTrack)) {
- return InitPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
}
return InitPromise::CreateAndResolve(NS_OK, __func__);
}
void
WebMDemuxer::InitBufferedState()
{
@@ -950,35 +950,33 @@ WebMTrackDemuxer::NextSample()
}
return nullptr;
}
RefPtr<WebMTrackDemuxer::SamplesPromise>
WebMTrackDemuxer::GetSamples(int32_t aNumSamples)
{
RefPtr<SamplesHolder> samples = new SamplesHolder;
- if (!aNumSamples) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
- }
+ MOZ_ASSERT(aNumSamples);
while (aNumSamples) {
RefPtr<MediaRawData> sample(NextSample());
if (!sample) {
break;
}
if (mNeedKeyframe && !sample->mKeyframe) {
continue;
}
mNeedKeyframe = false;
samples->mSamples.AppendElement(sample);
aNumSamples--;
}
if (samples->mSamples.IsEmpty()) {
- return SamplesPromise::CreateAndReject(DemuxerFailureReason::END_OF_STREAM, __func__);
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
} else {
UpdateSamples(samples->mSamples);
return SamplesPromise::CreateAndResolve(samples, __func__);
}
}
void
WebMTrackDemuxer::SetNextKeyFrameTime()
@@ -1104,17 +1102,17 @@ WebMTrackDemuxer::SkipToNextRandomAccess
}
SetNextKeyFrameTime();
if (found) {
WEBM_DEBUG("next sample: %f (parsed: %d)",
media::TimeUnit::FromMicroseconds(sampleTime).ToSeconds(),
parsed);
return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
} else {
- SkipFailureHolder failure(DemuxerFailureReason::END_OF_STREAM, parsed);
+ SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
return SkipAccessPointPromise::CreateAndReject(Move(failure), __func__);
}
}
media::TimeIntervals
WebMTrackDemuxer::GetBuffered()
{
return mParent->GetBuffered();