Exemplo n.º 1
0
RefPtr<MediaSourceTrackDemuxer::SeekPromise>
MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
{
  TimeIntervals buffered = mManager->Buffered(mType);
  buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ);

  if (!buffered.Contains(aTime)) {
    // We don't have the data to seek to.
    return SeekPromise::CreateAndReject(DemuxerFailureReason::WAITING_FOR_DATA,
                                        __func__);
  }
  TimeUnit seekTime =
    mManager->Seek(mType, aTime, MediaSourceDemuxer::EOS_FUZZ);
  bool error;
  RefPtr<MediaRawData> sample =
    mManager->GetSample(mType,
                        media::TimeUnit(),
                        error);
  MOZ_ASSERT(!error && sample);
  mNextSample = Some(sample);
  mReset = false;
  {
    MonitorAutoLock mon(mMonitor);
    mNextRandomAccessPoint = mManager->GetNextRandomAccessPoint(mType);
  }
  return SeekPromise::CreateAndResolve(seekTime, __func__);
}
Exemplo n.º 2
0
RefPtr<MediaSourceTrackDemuxer::SeekPromise>
MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
{
  TimeIntervals buffered = mManager->Buffered(mType);
  buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ);
  TimeUnit seekTime = std::max(aTime - mPreRoll, TimeUnit::FromMicroseconds(0));

  if (!buffered.Contains(seekTime)) {
    if (!buffered.Contains(aTime)) {
      // We don't have the data to seek to.
      return SeekPromise::CreateAndReject(
        mManager->IsEnded() ? DemuxerFailureReason::END_OF_STREAM :
                              DemuxerFailureReason::WAITING_FOR_DATA, __func__);
    }
    // Theorically 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);
    MOZ_ASSERT(index != TimeIntervals::NoIndex);
    seekTime = buffered[index].mStart;
  }
  seekTime = mManager->Seek(mType, seekTime, MediaSourceDemuxer::EOS_FUZZ);
  bool error;
  RefPtr<MediaRawData> sample =
    mManager->GetSample(mType,
                        media::TimeUnit(),
                        error);
  MOZ_ASSERT(!error && sample);
  mNextSample = Some(sample);
  mReset = false;
  {
    MonitorAutoLock mon(mMonitor);
    mNextRandomAccessPoint =
      mManager->GetNextRandomAccessPoint(mType, MediaSourceDemuxer::EOS_FUZZ);
  }
  return SeekPromise::CreateAndResolve(seekTime, __func__);
}
Exemplo n.º 3
0
nsRefPtr<MediaSourceTrackDemuxer::SeekPromise>
MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
{
  TimeIntervals buffered = mManager->Buffered(mType);
  buffered.SetFuzz(TimeUnit::FromMicroseconds(EOS_FUZZ_US));

  if (!buffered.Contains(aTime)) {
    // We don't have the data to seek to.
    return SeekPromise::CreateAndReject(DemuxerFailureReason::WAITING_FOR_DATA,
                                        __func__);
  }
  TimeUnit seekTime =
    mManager->Seek(mType, aTime, TimeUnit::FromMicroseconds(EOS_FUZZ_US));
  {
    MonitorAutoLock mon(mMonitor);
    mNextRandomAccessPoint = mManager->GetNextRandomAccessPoint(mType);
  }
  return SeekPromise::CreateAndResolve(seekTime, __func__);
}
Exemplo n.º 4
0
RefPtr<MediaSourceTrackDemuxer::SamplesPromise>
MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples)
{
  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);

    if (!buffered.Contains(TimeUnit::FromMicroseconds(0))) {
      return SamplesPromise::CreateAndReject(
        mManager->IsEnded() ? DemuxerFailureReason::END_OF_STREAM :
                              DemuxerFailureReason::WAITING_FOR_DATA, __func__);
    }
    mReset = false;
  }
  bool error = false;
  RefPtr<MediaRawData> sample;
  if (mNextSample) {
    sample = mNextSample.ref();
    mNextSample.reset();
  } else {
    sample = mManager->GetSample(mType, MediaSourceDemuxer::EOS_FUZZ, error);
    if (!sample) {
      if (error) {
        return SamplesPromise::CreateAndReject(DemuxerFailureReason::DEMUXER_ERROR, __func__);
      }
      return SamplesPromise::CreateAndReject(
        mManager->IsEnded() ? DemuxerFailureReason::END_OF_STREAM :
                              DemuxerFailureReason::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);
  }
  return SamplesPromise::CreateAndResolve(samples, __func__);
}
Exemplo n.º 5
0
RefPtr<MediaSourceTrackDemuxer::SkipAccessPointPromise>
MediaSourceTrackDemuxer::DoSkipToNextRandomAccessPoint(media::TimeUnit aTimeThreadshold)
{
  uint32_t parsed = 0;
  // Ensure that the data we are about to skip to is still available.
  TimeIntervals buffered = mManager->Buffered(mType);
  buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ);
  if (buffered.Contains(aTimeThreadshold)) {
    bool found;
    parsed = mManager->SkipToNextRandomAccessPoint(mType,
                                                   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);
  return SkipAccessPointPromise::CreateAndReject(holder, __func__);
}