| OLD | NEW |
| 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 805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 const PipelineStatusCB& done_cb) { | 816 const PipelineStatusCB& done_cb) { |
| 817 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 817 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 818 | 818 |
| 819 demuxer_->Initialize(this, done_cb, !!text_renderer_); | 819 demuxer_->Initialize(this, done_cb, !!text_renderer_); |
| 820 } | 820 } |
| 821 | 821 |
| 822 void PipelineImpl::RendererWrapper::InitializeRenderer( | 822 void PipelineImpl::RendererWrapper::InitializeRenderer( |
| 823 const PipelineStatusCB& done_cb) { | 823 const PipelineStatusCB& done_cb) { |
| 824 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 824 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 825 | 825 |
| 826 if (!demuxer_->GetStream(DemuxerStream::AUDIO) && | 826 switch (demuxer_->GetType()) { |
| 827 !demuxer_->GetStream(DemuxerStream::VIDEO)) { | 827 case DemuxerStreamProvider::Type::STREAM: |
| 828 done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER); | 828 if (!demuxer_->GetStream(DemuxerStream::AUDIO) && |
| 829 return; | 829 !demuxer_->GetStream(DemuxerStream::VIDEO)) { |
| 830 done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER); |
| 831 return; |
| 832 } |
| 833 break; |
| 834 |
| 835 case DemuxerStreamProvider::Type::URL: |
| 836 // N.B: Empty GURL are not valid. |
| 837 if (!demuxer_->GetUrl().is_valid()) { |
| 838 done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER); |
| 839 return; |
| 840 } |
| 841 break; |
| 830 } | 842 } |
| 831 | 843 |
| 832 if (cdm_context_) | 844 if (cdm_context_) |
| 833 shared_state_.renderer->SetCdm(cdm_context_, | 845 shared_state_.renderer->SetCdm(cdm_context_, |
| 834 base::Bind(&IgnoreCdmAttached)); | 846 base::Bind(&IgnoreCdmAttached)); |
| 835 | 847 |
| 836 shared_state_.renderer->Initialize(demuxer_, this, done_cb); | 848 shared_state_.renderer->Initialize(demuxer_, this, done_cb); |
| 837 } | 849 } |
| 838 | 850 |
| 839 void PipelineImpl::RendererWrapper::DestroyRenderer() { | 851 void PipelineImpl::RendererWrapper::DestroyRenderer() { |
| 840 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 852 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 841 | 853 |
| 842 // Destroy the renderer outside the lock scope to avoid holding the lock | 854 // Destroy the renderer outside the lock scope to avoid holding the lock |
| 843 // while renderer is being destroyed (in case Renderer destructor is costly). | 855 // while renderer is being destroyed (in case Renderer destructor is costly). |
| 844 std::unique_ptr<Renderer> renderer; | 856 std::unique_ptr<Renderer> renderer; |
| 845 { | 857 { |
| 846 base::AutoLock auto_lock(shared_state_lock_); | 858 base::AutoLock auto_lock(shared_state_lock_); |
| 847 renderer.swap(shared_state_.renderer); | 859 renderer.swap(shared_state_.renderer); |
| 848 } | 860 } |
| 849 } | 861 } |
| 850 | 862 |
| 851 void PipelineImpl::RendererWrapper::ReportMetadata() { | 863 void PipelineImpl::RendererWrapper::ReportMetadata() { |
| 852 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 864 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 853 | 865 |
| 854 PipelineMetadata metadata; | 866 PipelineMetadata metadata; |
| 855 metadata.timeline_offset = demuxer_->GetTimelineOffset(); | 867 DemuxerStream* stream; |
| 856 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 868 |
| 857 if (stream) { | 869 switch (demuxer_->GetType()) { |
| 858 metadata.has_video = true; | 870 case DemuxerStreamProvider::Type::STREAM: |
| 859 metadata.natural_size = stream->video_decoder_config().natural_size(); | 871 metadata.timeline_offset = demuxer_->GetTimelineOffset(); |
| 860 metadata.video_rotation = stream->video_rotation(); | 872 stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 861 } | 873 if (stream) { |
| 862 if (demuxer_->GetStream(DemuxerStream::AUDIO)) { | 874 metadata.has_video = true; |
| 863 metadata.has_audio = true; | 875 metadata.natural_size = stream->video_decoder_config().natural_size(); |
| 876 metadata.video_rotation = stream->video_rotation(); |
| 877 } |
| 878 if (demuxer_->GetStream(DemuxerStream::AUDIO)) { |
| 879 metadata.has_audio = true; |
| 880 } |
| 881 break; |
| 882 |
| 883 case DemuxerStreamProvider::Type::URL: |
| 884 // We don't know if the MediaPlayerRender has Audio/Video until we start |
| 885 // playing. Conservatively assume that they do. |
| 886 metadata.has_video = true; |
| 887 metadata.has_audio = true; |
| 888 break; |
| 864 } | 889 } |
| 865 | 890 |
| 866 main_task_runner_->PostTask(FROM_HERE, base::Bind(&PipelineImpl::OnMetadata, | 891 main_task_runner_->PostTask(FROM_HERE, base::Bind(&PipelineImpl::OnMetadata, |
| 867 weak_pipeline_, metadata)); | 892 weak_pipeline_, metadata)); |
| 868 } | 893 } |
| 869 | 894 |
| 870 PipelineImpl::PipelineImpl( | 895 PipelineImpl::PipelineImpl( |
| 871 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 896 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
| 872 MediaLog* media_log) | 897 MediaLog* media_log) |
| 873 : media_task_runner_(media_task_runner), | 898 : media_task_runner_(media_task_runner), |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1258 void PipelineImpl::OnSuspendDone() { | 1283 void PipelineImpl::OnSuspendDone() { |
| 1259 DVLOG(3) << __func__; | 1284 DVLOG(3) << __func__; |
| 1260 DCHECK(thread_checker_.CalledOnValidThread()); | 1285 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1261 DCHECK(IsRunning()); | 1286 DCHECK(IsRunning()); |
| 1262 | 1287 |
| 1263 DCHECK(!suspend_cb_.is_null()); | 1288 DCHECK(!suspend_cb_.is_null()); |
| 1264 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); | 1289 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); |
| 1265 } | 1290 } |
| 1266 | 1291 |
| 1267 } // namespace media | 1292 } // namespace media |
| OLD | NEW |