Bug 1299072: P14. Use MediaResult between TrackBuffersManager and MediaSourceDemuxer. r=gerald

MozReview-Commit-ID: 99EopLYqjWh

--HG--
extra : rebase_source : a5c54de401dc0ef3d20b3c35a724666c152d6c0d
This commit is contained in:
Jean-Yves Avenard 2016-09-12 15:44:31 +10:00
Родитель 57a4871bb2
Коммит 5b7653c571
3 изменённых файлов: 20 добавлений и 31 удалений

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

@ -379,8 +379,6 @@ MediaSourceTrackDemuxer::BreakCycles()
RefPtr<MediaSourceTrackDemuxer::SeekPromise> RefPtr<MediaSourceTrackDemuxer::SeekPromise>
MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime) MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
{ {
typedef TrackBuffersManager::GetSampleResult Result;
TimeIntervals buffered = mManager->Buffered(mType); TimeIntervals buffered = mManager->Buffered(mType);
// Fuzz factor represents a +/- threshold. So when seeking it allows the gap // 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. // to be twice as big as the fuzz value. We only want to allow EOS_FUZZ gap.
@ -410,12 +408,12 @@ MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
seekTime = buffered[index].mStart; seekTime = buffered[index].mStart;
} }
seekTime = mManager->Seek(mType, seekTime, MediaSourceDemuxer::EOS_FUZZ); seekTime = mManager->Seek(mType, seekTime, MediaSourceDemuxer::EOS_FUZZ);
Result result; MediaResult result = NS_OK;
RefPtr<MediaRawData> sample = RefPtr<MediaRawData> sample =
mManager->GetSample(mType, mManager->GetSample(mType,
media::TimeUnit(), media::TimeUnit(),
result); result);
MOZ_ASSERT(result != Result::ERROR && sample); MOZ_ASSERT(NS_SUCCEEDED(result) && sample);
mNextSample = Some(sample); mNextSample = Some(sample);
mReset = false; mReset = false;
{ {
@ -429,8 +427,6 @@ MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
RefPtr<MediaSourceTrackDemuxer::SamplesPromise> RefPtr<MediaSourceTrackDemuxer::SamplesPromise>
MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples) MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples)
{ {
typedef TrackBuffersManager::GetSampleResult Result;
if (mReset) { if (mReset) {
// If a seek (or reset) was recently performed, we ensure that the data // If a seek (or reset) was recently performed, we ensure that the data
// we are about to retrieve is still available. // we are about to retrieve is still available.
@ -452,16 +448,17 @@ MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples)
sample = mNextSample.ref(); sample = mNextSample.ref();
mNextSample.reset(); mNextSample.reset();
} else { } else {
Result result; MediaResult result = NS_OK;
sample = mManager->GetSample(mType, MediaSourceDemuxer::EOS_FUZZ, result); sample = mManager->GetSample(mType, MediaSourceDemuxer::EOS_FUZZ, result);
if (!sample) { if (!sample) {
if (result == Result::ERROR) { if (result == NS_ERROR_DOM_MEDIA_END_OF_STREAM ||
return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__); 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( return SamplesPromise::CreateAndReject(result, __func__);
(result == Result::EOS && mManager->IsEnded())
? NS_ERROR_DOM_MEDIA_END_OF_STREAM
: NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
} }
} }
RefPtr<SamplesHolder> samples = new SamplesHolder; RefPtr<SamplesHolder> samples = new SamplesHolder;

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

@ -2150,16 +2150,16 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
already_AddRefed<MediaRawData> already_AddRefed<MediaRawData>
TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack, TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
const TimeUnit& aFuzz, const TimeUnit& aFuzz,
GetSampleResult& aResult) MediaResult& aResult)
{ {
MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(OnTaskQueue());
auto& trackData = GetTracksData(aTrack); auto& trackData = GetTracksData(aTrack);
const TrackBuffer& track = GetTrackBuffer(aTrack); const TrackBuffer& track = GetTrackBuffer(aTrack);
aResult = GetSampleResult::WAITING_FOR_DATA; aResult = NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA;
if (!track.Length()) { if (!track.Length()) {
aResult = GetSampleResult::EOS; aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
return nullptr; return nullptr;
} }
@ -2171,7 +2171,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
if (trackData.mNextGetSampleIndex.isSome()) { if (trackData.mNextGetSampleIndex.isSome()) {
if (trackData.mNextGetSampleIndex.ref() >= track.Length()) { if (trackData.mNextGetSampleIndex.ref() >= track.Length()) {
aResult = GetSampleResult::EOS; aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
return nullptr; return nullptr;
} }
const MediaRawData* sample = const MediaRawData* sample =
@ -2186,7 +2186,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
RefPtr<MediaRawData> p = sample->Clone(); RefPtr<MediaRawData> p = sample->Clone();
if (!p) { if (!p) {
aResult = GetSampleResult::ERROR; aResult = MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
return nullptr; return nullptr;
} }
trackData.mNextGetSampleIndex.ref()++; trackData.mNextGetSampleIndex.ref()++;
@ -2212,7 +2212,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
trackData.mNextSampleTimecode = nextSampleTimecode; trackData.mNextSampleTimecode = nextSampleTimecode;
trackData.mNextSampleTime = nextSampleTime; trackData.mNextSampleTime = nextSampleTime;
} }
aResult = GetSampleResult::NO_ERROR; aResult = NS_OK;
return p.forget(); return p.forget();
} }
@ -2220,7 +2220,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
track.LastElement()->mTimecode + track.LastElement()->mDuration) { track.LastElement()->mTimecode + track.LastElement()->mDuration) {
// The next element is past our last sample. We're done. // The next element is past our last sample. We're done.
trackData.mNextGetSampleIndex = Some(uint32_t(track.Length())); trackData.mNextGetSampleIndex = Some(uint32_t(track.Length()));
aResult = GetSampleResult::EOS; aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
return nullptr; return nullptr;
} }
@ -2237,7 +2237,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
RefPtr<MediaRawData> p = sample->Clone(); RefPtr<MediaRawData> p = sample->Clone();
if (!p) { if (!p) {
// OOM // OOM
aResult = GetSampleResult::ERROR; aResult = MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
return nullptr; return nullptr;
} }
trackData.mNextGetSampleIndex = Some(uint32_t(pos)+1); trackData.mNextGetSampleIndex = Some(uint32_t(pos)+1);
@ -2245,7 +2245,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration); TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
trackData.mNextSampleTime = trackData.mNextSampleTime =
TimeUnit::FromMicroseconds(sample->GetEndTime()); TimeUnit::FromMicroseconds(sample->GetEndTime());
aResult = GetSampleResult::NO_ERROR; aResult = NS_OK;
return p.forget(); return p.forget();
} }

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

@ -155,17 +155,9 @@ public:
const media::TimeUnit& aFuzz, const media::TimeUnit& aFuzz,
bool& aFound); bool& aFound);
enum class GetSampleResult
{
NO_ERROR,
ERROR,
WAITING_FOR_DATA,
EOS
};
already_AddRefed<MediaRawData> GetSample(TrackInfo::TrackType aTrack, already_AddRefed<MediaRawData> GetSample(TrackInfo::TrackType aTrack,
const media::TimeUnit& aFuzz, const media::TimeUnit& aFuzz,
GetSampleResult& aResult); MediaResult& aResult);
int32_t FindCurrentPosition(TrackInfo::TrackType aTrack, int32_t FindCurrentPosition(TrackInfo::TrackType aTrack,
const media::TimeUnit& aFuzz); const media::TimeUnit& aFuzz);
media::TimeUnit GetNextRandomAccessPoint(TrackInfo::TrackType aTrack, media::TimeUnit GetNextRandomAccessPoint(TrackInfo::TrackType aTrack,