Bug 1299072: P14. Use MediaResult between TrackBuffersManager and MediaSourceDemuxer. r?gerald
MozReview-Commit-ID: 99EopLYqjWh
--- a/dom/media/mediasource/MediaSourceDemuxer.cpp
+++ b/dom/media/mediasource/MediaSourceDemuxer.cpp
@@ -374,18 +374,16 @@ MediaSourceTrackDemuxer::BreakCycles()
self->mManager = nullptr;
} );
mParent->GetTaskQueue()->Dispatch(task.forget());
}
RefPtr<MediaSourceTrackDemuxer::SeekPromise>
MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
{
- typedef TrackBuffersManager::GetSampleResult Result;
-
TimeIntervals buffered = mManager->Buffered(mType);
// Fuzz factor represents a +/- threshold. So when seeking it allows the gap
// to be twice as big as the fuzz value. We only want to allow EOS_FUZZ gap.
buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
TimeUnit seekTime = std::max(aTime - mPreRoll, TimeUnit::FromMicroseconds(0));
if (mManager->IsEnded() && seekTime >= buffered.GetEnd()) {
// We're attempting to seek past the end time. Cap seekTime so that we seek
@@ -405,37 +403,35 @@ MediaSourceTrackDemuxer::DoSeek(media::T
// 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);
MOZ_ASSERT(index != TimeIntervals::NoIndex);
seekTime = buffered[index].mStart;
}
seekTime = mManager->Seek(mType, seekTime, MediaSourceDemuxer::EOS_FUZZ);
- Result result;
+ MediaResult result = NS_OK;
RefPtr<MediaRawData> sample =
mManager->GetSample(mType,
media::TimeUnit(),
result);
- MOZ_ASSERT(result != Result::ERROR && sample);
+ MOZ_ASSERT(NS_SUCCEEDED(result) && sample);
mNextSample = Some(sample);
mReset = false;
{
MonitorAutoLock mon(mMonitor);
mNextRandomAccessPoint =
mManager->GetNextRandomAccessPoint(mType, MediaSourceDemuxer::EOS_FUZZ);
}
return SeekPromise::CreateAndResolve(seekTime, __func__);
}
RefPtr<MediaSourceTrackDemuxer::SamplesPromise>
MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples)
{
- typedef TrackBuffersManager::GetSampleResult Result;
-
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(NS_ERROR_DOM_MEDIA_END_OF_STREAM,
@@ -447,26 +443,27 @@ MediaSourceTrackDemuxer::DoGetSamples(in
}
mReset = false;
}
RefPtr<MediaRawData> sample;
if (mNextSample) {
sample = mNextSample.ref();
mNextSample.reset();
} else {
- Result result;
+ MediaResult result = NS_OK;
sample = mManager->GetSample(mType, MediaSourceDemuxer::EOS_FUZZ, result);
if (!sample) {
- if (result == Result::ERROR) {
- return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ if (result == NS_ERROR_DOM_MEDIA_END_OF_STREAM ||
+ result == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
+ return SamplesPromise::CreateAndReject(
+ (result == NS_ERROR_DOM_MEDIA_END_OF_STREAM && mManager->IsEnded())
+ ? NS_ERROR_DOM_MEDIA_END_OF_STREAM
+ : NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
}
- return SamplesPromise::CreateAndReject(
- (result == Result::EOS && mManager->IsEnded())
- ? NS_ERROR_DOM_MEDIA_END_OF_STREAM
- : NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
+ return SamplesPromise::CreateAndReject(result, __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);
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -2145,53 +2145,53 @@ TrackBuffersManager::GetSample(TrackInfo
// TODO, check that we have continuous data based on the sanitized buffered
// range instead.
return nullptr;
}
already_AddRefed<MediaRawData>
TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
const TimeUnit& aFuzz,
- GetSampleResult& aResult)
+ MediaResult& aResult)
{
MOZ_ASSERT(OnTaskQueue());
auto& trackData = GetTracksData(aTrack);
const TrackBuffer& track = GetTrackBuffer(aTrack);
- aResult = GetSampleResult::WAITING_FOR_DATA;
+ aResult = NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA;
if (!track.Length()) {
- aResult = GetSampleResult::EOS;
+ aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
return nullptr;
}
if (trackData.mNextGetSampleIndex.isNothing() &&
trackData.mNextSampleTimecode == TimeUnit()) {
// First demux, get first sample.
trackData.mNextGetSampleIndex = Some(0u);
}
if (trackData.mNextGetSampleIndex.isSome()) {
if (trackData.mNextGetSampleIndex.ref() >= track.Length()) {
- aResult = GetSampleResult::EOS;
+ aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
return nullptr;
}
const MediaRawData* sample =
GetSample(aTrack,
trackData.mNextGetSampleIndex.ref(),
trackData.mNextSampleTimecode,
trackData.mNextSampleTime,
aFuzz);
if (!sample) {
return nullptr;
}
RefPtr<MediaRawData> p = sample->Clone();
if (!p) {
- aResult = GetSampleResult::ERROR;
+ aResult = MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
return nullptr;
}
trackData.mNextGetSampleIndex.ref()++;
// Estimate decode timestamp and timestamp of the next sample.
TimeUnit nextSampleTimecode =
TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
TimeUnit nextSampleTime =
TimeUnit::FromMicroseconds(sample->GetEndTime());
@@ -2207,50 +2207,50 @@ TrackBuffersManager::GetSample(TrackInfo
TimeUnit::FromMicroseconds(nextSample->mTimecode);
trackData.mNextSampleTime =
TimeUnit::FromMicroseconds(nextSample->mTime);
} else {
// Next sample isn't available yet. Use estimates.
trackData.mNextSampleTimecode = nextSampleTimecode;
trackData.mNextSampleTime = nextSampleTime;
}
- aResult = GetSampleResult::NO_ERROR;
+ aResult = NS_OK;
return p.forget();
}
if (trackData.mNextSampleTimecode.ToMicroseconds() >
track.LastElement()->mTimecode + track.LastElement()->mDuration) {
// The next element is past our last sample. We're done.
trackData.mNextGetSampleIndex = Some(uint32_t(track.Length()));
- aResult = GetSampleResult::EOS;
+ aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
return nullptr;
}
// Our previous index has been overwritten, attempt to find the new one.
int32_t pos = FindCurrentPosition(aTrack, aFuzz);
if (pos < 0) {
MSE_DEBUG("Couldn't find sample (pts:%lld dts:%lld)",
trackData.mNextSampleTime.ToMicroseconds(),
trackData.mNextSampleTimecode.ToMicroseconds());
return nullptr;
}
const RefPtr<MediaRawData>& sample = track[pos];
RefPtr<MediaRawData> p = sample->Clone();
if (!p) {
// OOM
- aResult = GetSampleResult::ERROR;
+ aResult = MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
return nullptr;
}
trackData.mNextGetSampleIndex = Some(uint32_t(pos)+1);
trackData.mNextSampleTimecode =
TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
trackData.mNextSampleTime =
TimeUnit::FromMicroseconds(sample->GetEndTime());
- aResult = GetSampleResult::NO_ERROR;
+ aResult = NS_OK;
return p.forget();
}
int32_t
TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack,
const TimeUnit& aFuzz)
{
MOZ_ASSERT(OnTaskQueue());
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -150,27 +150,19 @@ public:
media::TimeUnit Seek(TrackInfo::TrackType aTrack,
const media::TimeUnit& aTime,
const media::TimeUnit& aFuzz);
uint32_t SkipToNextRandomAccessPoint(TrackInfo::TrackType aTrack,
const media::TimeUnit& aTimeThreadshold,
const media::TimeUnit& aFuzz,
bool& aFound);
- enum class GetSampleResult
- {
- NO_ERROR,
- ERROR,
- WAITING_FOR_DATA,
- EOS
- };
-
already_AddRefed<MediaRawData> GetSample(TrackInfo::TrackType aTrack,
const media::TimeUnit& aFuzz,
- GetSampleResult& aResult);
+ MediaResult& aResult);
int32_t FindCurrentPosition(TrackInfo::TrackType aTrack,
const media::TimeUnit& aFuzz);
media::TimeUnit GetNextRandomAccessPoint(TrackInfo::TrackType aTrack,
const media::TimeUnit& aFuzz);
void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes);
private: