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 |