| Index: media/filters/ffmpeg_demuxer.cc
|
| diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
|
| index dd80dfccfbd0bab8a83371d31e92141ee18c4279..249f97a0c731cb5a627696d2df6f1b886ae76a6a 100644
|
| --- a/media/filters/ffmpeg_demuxer.cc
|
| +++ b/media/filters/ffmpeg_demuxer.cc
|
| @@ -566,6 +566,10 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) {
|
| last_packet_timestamp_ = buffer->timestamp();
|
| last_packet_duration_ = buffer->duration();
|
|
|
| + const base::TimeDelta new_duration = last_packet_timestamp_;
|
| + if (new_duration > duration_ || duration_ == kNoTimestamp)
|
| + duration_ = new_duration;
|
| +
|
| buffer_queue_.Push(buffer);
|
| SatisfyPendingRead();
|
| }
|
| @@ -753,10 +757,6 @@ void FFmpegDemuxerStream::SetLiveness(Liveness liveness) {
|
| liveness_ = liveness;
|
| }
|
|
|
| -base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const {
|
| - return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts);
|
| -}
|
| -
|
| Ranges<base::TimeDelta> FFmpegDemuxerStream::GetBufferedRanges() const {
|
| return buffered_ranges_;
|
| }
|
| @@ -1445,6 +1445,7 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb,
|
| // Good to go: set the duration and bitrate and notify we're done
|
| // initializing.
|
| host_->SetDuration(max_duration);
|
| + duration_ = max_duration;
|
| duration_known_ = (max_duration != kInfiniteDuration);
|
|
|
| int64_t filesize_in_bytes = 0;
|
| @@ -1706,25 +1707,23 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) {
|
| if (result < 0 || IsMaxMemoryUsageReached()) {
|
| DVLOG(1) << __func__ << " result=" << result
|
| << " IsMaxMemoryUsageReached=" << IsMaxMemoryUsageReached();
|
| - // Update the duration based on the highest elapsed time across all streams
|
| - // if it was previously unknown.
|
| - if (!duration_known_) {
|
| - base::TimeDelta max_duration;
|
| -
|
| - for (const auto& stream : streams_) {
|
| - if (!stream)
|
| - continue;
|
| + // Update the duration based on the highest elapsed time across all streams.
|
| + base::TimeDelta max_duration;
|
| + for (const auto& stream : streams_) {
|
| + if (!stream)
|
| + continue;
|
|
|
| - base::TimeDelta duration = stream->GetElapsedTime();
|
| - if (duration != kNoTimestamp && duration > max_duration)
|
| - max_duration = duration;
|
| - }
|
| + base::TimeDelta duration = stream->duration();
|
| + if (duration != kNoTimestamp && duration > max_duration)
|
| + max_duration = duration;
|
| + }
|
|
|
| - if (max_duration > base::TimeDelta()) {
|
| - host_->SetDuration(max_duration);
|
| - duration_known_ = true;
|
| - }
|
| + if (duration_ == kInfiniteDuration || max_duration > duration_) {
|
| + host_->SetDuration(max_duration);
|
| + duration_known_ = true;
|
| + duration_ = max_duration;
|
| }
|
| +
|
| // If we have reached the end of stream, tell the downstream filters about
|
| // the event.
|
| StreamHasEnded();
|
| @@ -1753,6 +1752,15 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) {
|
| FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index].get();
|
| if (demuxer_stream->enabled())
|
| demuxer_stream->EnqueuePacket(std::move(packet));
|
| +
|
| + // If duration estimate was incorrect, update it and tell higher layers.
|
| + if (duration_known_) {
|
| + const base::TimeDelta duration = demuxer_stream->duration();
|
| + if (duration != kNoTimestamp && duration > duration_) {
|
| + duration_ = duration;
|
| + host_->SetDuration(duration_);
|
| + }
|
| + }
|
| }
|
|
|
| // Keep reading until we've reached capacity.
|
|
|