Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index 227cd6aad27c5198bcab5d4d4341301d43397af2..00bf9109d2708fa2a42c7ee043fbac9f23395cf9 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -93,6 +93,7 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer, |
task_runner_(base::MessageLoopProxy::current()), |
stream_(stream), |
type_(UNKNOWN), |
+ liveness_(LIVENESS_UNKNOWN), |
end_of_stream_(false), |
last_packet_timestamp_(kNoTimestamp()), |
last_packet_duration_(kNoTimestamp()), |
@@ -168,6 +169,12 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer, |
} |
} |
+FFmpegDemuxerStream::~FFmpegDemuxerStream() { |
+ DCHECK(!demuxer_); |
+ DCHECK(read_cb_.is_null()); |
+ DCHECK(buffer_queue_.IsEmpty()); |
+} |
+ |
void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -403,11 +410,16 @@ void FFmpegDemuxerStream::Stop() { |
end_of_stream_ = true; |
} |
-DemuxerStream::Type FFmpegDemuxerStream::type() { |
+DemuxerStream::Type FFmpegDemuxerStream::type() const { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
return type_; |
} |
+DemuxerStream::Liveness FFmpegDemuxerStream::liveness() const { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ return liveness_; |
+} |
+ |
void FFmpegDemuxerStream::Read(const ReadCB& read_cb) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
CHECK(read_cb_.is_null()) << "Overlapping reads are not supported"; |
@@ -473,10 +485,10 @@ VideoRotation FFmpegDemuxerStream::video_rotation() { |
return video_rotation_; |
} |
-FFmpegDemuxerStream::~FFmpegDemuxerStream() { |
- DCHECK(!demuxer_); |
- DCHECK(read_cb_.is_null()); |
- DCHECK(buffer_queue_.IsEmpty()); |
+void FFmpegDemuxerStream::SetLiveness(Liveness liveness) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ DCHECK_EQ(liveness_, LIVENESS_UNKNOWN); |
+ liveness_ = liveness; |
} |
base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { |
@@ -571,7 +583,6 @@ FFmpegDemuxer::FFmpegDemuxer( |
start_time_(kNoTimestamp()), |
preferred_stream_for_seeking_(-1, kNoTimestamp()), |
fallback_stream_for_seeking_(-1, kNoTimestamp()), |
- liveness_(LIVENESS_UNKNOWN), |
text_enabled_(false), |
duration_known_(false), |
need_key_cb_(need_key_cb), |
@@ -711,11 +722,6 @@ base::TimeDelta FFmpegDemuxer::GetStartTime() const { |
return std::max(start_time_, base::TimeDelta()); |
} |
-Demuxer::Liveness FFmpegDemuxer::GetLiveness() const { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- return liveness_; |
-} |
- |
void FFmpegDemuxer::AddTextStreams() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -988,11 +994,11 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb, |
timeline_offset_ += start_time_; |
if (max_duration == kInfiniteDuration() && !timeline_offset_.is_null()) { |
- liveness_ = LIVENESS_LIVE; |
+ SetLiveness(DemuxerStream::LIVENESS_LIVE); |
} else if (max_duration != kInfiniteDuration()) { |
- liveness_ = LIVENESS_RECORDED; |
+ SetLiveness(DemuxerStream::LIVENESS_RECORDED); |
} else { |
- liveness_ = LIVENESS_UNKNOWN; |
+ SetLiveness(DemuxerStream::LIVENESS_UNKNOWN); |
} |
// Good to go: set the duration and bitrate and notify we're done |
@@ -1275,4 +1281,12 @@ void FFmpegDemuxer::OnDataSourceError() { |
host_->OnDemuxerError(PIPELINE_ERROR_READ); |
} |
+void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ for (const auto& stream : streams_) { // |stream| is a ref to a pointer. |
+ if (stream) |
+ stream->SetLiveness(liveness); |
+ } |
+} |
+ |
} // namespace media |