already_AddRefed<SourceBufferDecoder> MediaSourceReader::FirstDecoder(MediaData::Type aType) { ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); TrackBuffer* trackBuffer = aType == MediaData::AUDIO_DATA ? mAudioTrack : mVideoTrack; MOZ_ASSERT(trackBuffer); const nsTArray<nsRefPtr<SourceBufferDecoder>>& decoders = trackBuffer->Decoders(); if (decoders.IsEmpty()) { return nullptr; } nsRefPtr<SourceBufferDecoder> firstDecoder; media::TimeUnit lowestStartTime{media::TimeUnit::FromInfinity()}; for (uint32_t i = 0; i < decoders.Length(); ++i) { media::TimeIntervals r = decoders[i]->GetBuffered(); if (!r.Length()) { continue; } media::TimeUnit start = r.GetStart(); if (start < lowestStartTime) { firstDecoder = decoders[i]; lowestStartTime = start; } } return firstDecoder.forget(); }
bool MediaSourceReader::HaveData(int64_t aTarget, MediaData::Type aType) { TrackBuffer* trackBuffer = aType == MediaData::AUDIO_DATA ? mAudioTrack : mVideoTrack; MOZ_ASSERT(trackBuffer); nsRefPtr<SourceBufferDecoder> decoder = SelectDecoder(aTarget, EOS_FUZZ_US, trackBuffer->Decoders()); return !!decoder; }