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