Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: media/base/pipeline_impl.cc

Issue 2272293002: Introducing DemuxerHost::OnMetadata. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/base/mock_demuxer_host.h ('k') | media/filters/chunk_demuxer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/base/pipeline_impl.h" 5 #include "media/base/pipeline_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 91
92 // Accumulated statistics reported by the renderer. 92 // Accumulated statistics reported by the renderer.
93 PipelineStatistics statistics; 93 PipelineStatistics statistics;
94 94
95 // The media timestamp to return while the pipeline is suspended. 95 // The media timestamp to return while the pipeline is suspended.
96 // Otherwise set to kNoTimestamp. 96 // Otherwise set to kNoTimestamp.
97 base::TimeDelta suspend_timestamp = kNoTimestamp; 97 base::TimeDelta suspend_timestamp = kNoTimestamp;
98 }; 98 };
99 99
100 // DemuxerHost implementaion. 100 // DemuxerHost implementaion.
101 void OnMetadata(PipelineMetadata metadata) final;
101 void OnBufferedTimeRangesChanged(const Ranges<base::TimeDelta>& ranges) final; 102 void OnBufferedTimeRangesChanged(const Ranges<base::TimeDelta>& ranges) final;
102 void SetDuration(base::TimeDelta duration) final; 103 void SetDuration(base::TimeDelta duration) final;
103 void OnDemuxerError(PipelineStatus error) final; 104 void OnDemuxerError(PipelineStatus error) final;
104 void AddTextStream(DemuxerStream* text_stream, 105 void AddTextStream(DemuxerStream* text_stream,
105 const TextTrackConfig& config) final; 106 const TextTrackConfig& config) final;
106 void RemoveTextStream(DemuxerStream* text_stream) final; 107 void RemoveTextStream(DemuxerStream* text_stream) final;
107 108
108 // RendererClient implementation. 109 // RendererClient implementation.
109 void OnError(PipelineStatus error) final; 110 void OnError(PipelineStatus error) final;
110 void OnEnded() final; 111 void OnEnded() final;
(...skipping 17 matching lines...) Expand all
128 bool success); 129 bool success);
129 void CheckPlaybackEnded(); 130 void CheckPlaybackEnded();
130 131
131 // State transition tasks. 132 // State transition tasks.
132 void SetState(State next_state); 133 void SetState(State next_state);
133 void CompleteSeek(base::TimeDelta seek_time, PipelineStatus status); 134 void CompleteSeek(base::TimeDelta seek_time, PipelineStatus status);
134 void CompleteSuspend(PipelineStatus status); 135 void CompleteSuspend(PipelineStatus status);
135 void InitializeDemuxer(const PipelineStatusCB& done_cb); 136 void InitializeDemuxer(const PipelineStatusCB& done_cb);
136 void InitializeRenderer(const PipelineStatusCB& done_cb); 137 void InitializeRenderer(const PipelineStatusCB& done_cb);
137 void DestroyRenderer(); 138 void DestroyRenderer();
138 void ReportMetadata();
139 139
140 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; 140 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
141 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; 141 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
142 const scoped_refptr<MediaLog> media_log_; 142 const scoped_refptr<MediaLog> media_log_;
143 143
144 base::WeakPtr<PipelineImpl> weak_pipeline_; 144 base::WeakPtr<PipelineImpl> weak_pipeline_;
145 Demuxer* demuxer_; 145 Demuxer* demuxer_;
146 std::unique_ptr<TextRenderer> text_renderer_; 146 std::unique_ptr<TextRenderer> text_renderer_;
147 double playback_rate_; 147 double playback_rate_;
148 float volume_; 148 float volume_;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 } 234 }
235 weak_pipeline_ = weak_pipeline; 235 weak_pipeline_ = weak_pipeline;
236 236
237 // Queue asynchronous actions required to start. 237 // Queue asynchronous actions required to start.
238 DCHECK(!pending_callbacks_); 238 DCHECK(!pending_callbacks_);
239 SerialRunner::Queue fns; 239 SerialRunner::Queue fns;
240 240
241 // Initialize demuxer. 241 // Initialize demuxer.
242 fns.Push(base::Bind(&RendererWrapper::InitializeDemuxer, weak_this_)); 242 fns.Push(base::Bind(&RendererWrapper::InitializeDemuxer, weak_this_));
243 243
244 // Once the demuxer is initialized successfully, media metadata must be
245 // available - report the metadata to client.
246 fns.Push(base::Bind(&RendererWrapper::ReportMetadata, weak_this_));
247
248 // Initialize renderer. 244 // Initialize renderer.
249 fns.Push(base::Bind(&RendererWrapper::InitializeRenderer, weak_this_)); 245 fns.Push(base::Bind(&RendererWrapper::InitializeRenderer, weak_this_));
250 246
251 // Run tasks. 247 // Run tasks.
252 pending_callbacks_ = 248 pending_callbacks_ =
253 SerialRunner::Run(fns, base::Bind(&RendererWrapper::CompleteSeek, 249 SerialRunner::Run(fns, base::Bind(&RendererWrapper::CompleteSeek,
254 weak_this_, base::TimeDelta())); 250 weak_this_, base::TimeDelta()));
255 } 251 }
256 252
257 void PipelineImpl::RendererWrapper::Stop(const base::Closure& stop_cb) { 253 void PipelineImpl::RendererWrapper::Stop(const base::Closure& stop_cb) {
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 cdm_context_ = cdm_context; 475 cdm_context_ = cdm_context;
480 cdm_attached_cb.Run(true); 476 cdm_attached_cb.Run(true);
481 return; 477 return;
482 } 478 }
483 479
484 shared_state_.renderer->SetCdm( 480 shared_state_.renderer->SetCdm(
485 cdm_context, base::Bind(&RendererWrapper::OnCdmAttached, weak_this_, 481 cdm_context, base::Bind(&RendererWrapper::OnCdmAttached, weak_this_,
486 cdm_attached_cb, cdm_context)); 482 cdm_attached_cb, cdm_context));
487 } 483 }
488 484
485 void PipelineImpl::RendererWrapper::OnMetadata(PipelineMetadata metadata) {
486 main_task_runner_->PostTask(FROM_HERE, base::Bind(&PipelineImpl::OnMetadata,
487 weak_pipeline_, metadata));
488 }
489
489 void PipelineImpl::RendererWrapper::OnBufferedTimeRangesChanged( 490 void PipelineImpl::RendererWrapper::OnBufferedTimeRangesChanged(
490 const Ranges<base::TimeDelta>& ranges) { 491 const Ranges<base::TimeDelta>& ranges) {
491 // TODO(alokp): Add thread DCHECK after ensuring that all Demuxer 492 // TODO(alokp): Add thread DCHECK after ensuring that all Demuxer
492 // implementations call DemuxerHost on the media thread. 493 // implementations call DemuxerHost on the media thread.
493 base::AutoLock auto_lock(shared_state_lock_); 494 base::AutoLock auto_lock(shared_state_lock_);
494 shared_state_.did_loading_progress = true; 495 shared_state_.did_loading_progress = true;
495 shared_state_.buffered_time_ranges = ranges; 496 shared_state_.buffered_time_ranges = ranges;
496 } 497 }
497 498
498 void PipelineImpl::RendererWrapper::SetDuration(base::TimeDelta duration) { 499 void PipelineImpl::RendererWrapper::SetDuration(base::TimeDelta duration) {
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 839
839 // Destroy the renderer outside the lock scope to avoid holding the lock 840 // Destroy the renderer outside the lock scope to avoid holding the lock
840 // while renderer is being destroyed (in case Renderer destructor is costly). 841 // while renderer is being destroyed (in case Renderer destructor is costly).
841 std::unique_ptr<Renderer> renderer; 842 std::unique_ptr<Renderer> renderer;
842 { 843 {
843 base::AutoLock auto_lock(shared_state_lock_); 844 base::AutoLock auto_lock(shared_state_lock_);
844 renderer.swap(shared_state_.renderer); 845 renderer.swap(shared_state_.renderer);
845 } 846 }
846 } 847 }
847 848
848 void PipelineImpl::RendererWrapper::ReportMetadata() {
849 DCHECK(media_task_runner_->BelongsToCurrentThread());
850
851 PipelineMetadata metadata;
852 metadata.timeline_offset = demuxer_->GetTimelineOffset();
853 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
854 if (stream) {
855 metadata.has_video = true;
856 metadata.natural_size = stream->video_decoder_config().natural_size();
857 metadata.video_rotation = stream->video_rotation();
858 }
859 if (demuxer_->GetStream(DemuxerStream::AUDIO)) {
860 metadata.has_audio = true;
861 }
862
863 main_task_runner_->PostTask(FROM_HERE, base::Bind(&PipelineImpl::OnMetadata,
864 weak_pipeline_, metadata));
865 }
866
867 PipelineImpl::PipelineImpl( 849 PipelineImpl::PipelineImpl(
868 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, 850 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
869 MediaLog* media_log) 851 MediaLog* media_log)
870 : media_task_runner_(media_task_runner), 852 : media_task_runner_(media_task_runner),
871 media_log_(media_log), 853 media_log_(media_log),
872 client_(nullptr), 854 client_(nullptr),
873 playback_rate_(kDefaultPlaybackRate), 855 playback_rate_(kDefaultPlaybackRate),
874 volume_(kDefaultVolume), 856 volume_(kDefaultVolume),
875 weak_factory_(this) { 857 weak_factory_(this) {
876 DVLOG(2) << __func__; 858 DVLOG(2) << __func__;
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 void PipelineImpl::OnSuspendDone() { 1217 void PipelineImpl::OnSuspendDone() {
1236 DVLOG(3) << __func__; 1218 DVLOG(3) << __func__;
1237 DCHECK(thread_checker_.CalledOnValidThread()); 1219 DCHECK(thread_checker_.CalledOnValidThread());
1238 DCHECK(IsRunning()); 1220 DCHECK(IsRunning());
1239 1221
1240 DCHECK(!suspend_cb_.is_null()); 1222 DCHECK(!suspend_cb_.is_null());
1241 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); 1223 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK);
1242 } 1224 }
1243 1225
1244 } // namespace media 1226 } // namespace media
OLDNEW
« no previous file with comments | « media/base/mock_demuxer_host.h ('k') | media/filters/chunk_demuxer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698