| 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 884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 DCHECK(thread_checker_.CalledOnValidThread()); | 895 DCHECK(thread_checker_.CalledOnValidThread()); |
| 896 DCHECK(demuxer); | 896 DCHECK(demuxer); |
| 897 DCHECK(renderer); | 897 DCHECK(renderer); |
| 898 DCHECK(client); | 898 DCHECK(client); |
| 899 DCHECK(!seek_cb.is_null()); | 899 DCHECK(!seek_cb.is_null()); |
| 900 | 900 |
| 901 DCHECK(!client_); | 901 DCHECK(!client_); |
| 902 DCHECK(seek_cb_.is_null()); | 902 DCHECK(seek_cb_.is_null()); |
| 903 client_ = client; | 903 client_ = client; |
| 904 seek_cb_ = seek_cb; | 904 seek_cb_ = seek_cb; |
| 905 last_media_time_ = base::TimeDelta(); |
| 905 | 906 |
| 906 std::unique_ptr<TextRenderer> text_renderer; | 907 std::unique_ptr<TextRenderer> text_renderer; |
| 907 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 908 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 908 switches::kEnableInbandTextTracks)) { | 909 switches::kEnableInbandTextTracks)) { |
| 909 text_renderer.reset(new TextRenderer( | 910 text_renderer.reset(new TextRenderer( |
| 910 media_task_runner_, | 911 media_task_runner_, |
| 911 BindToCurrentLoop(base::Bind(&PipelineImpl::OnAddTextTrack, | 912 BindToCurrentLoop(base::Bind(&PipelineImpl::OnAddTextTrack, |
| 912 weak_factory_.GetWeakPtr())))); | 913 weak_factory_.GetWeakPtr())))); |
| 913 } | 914 } |
| 914 | 915 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 DCHECK(thread_checker_.CalledOnValidThread()); | 977 DCHECK(thread_checker_.CalledOnValidThread()); |
| 977 DCHECK(!seek_cb.is_null()); | 978 DCHECK(!seek_cb.is_null()); |
| 978 | 979 |
| 979 if (!IsRunning()) { | 980 if (!IsRunning()) { |
| 980 DLOG(ERROR) << "Media pipeline isn't running. Ignoring Seek()."; | 981 DLOG(ERROR) << "Media pipeline isn't running. Ignoring Seek()."; |
| 981 return; | 982 return; |
| 982 } | 983 } |
| 983 | 984 |
| 984 DCHECK(seek_cb_.is_null()); | 985 DCHECK(seek_cb_.is_null()); |
| 985 seek_cb_ = seek_cb; | 986 seek_cb_ = seek_cb; |
| 987 last_media_time_ = base::TimeDelta(); |
| 986 media_task_runner_->PostTask( | 988 media_task_runner_->PostTask( |
| 987 FROM_HERE, base::Bind(&RendererWrapper::Seek, | 989 FROM_HERE, base::Bind(&RendererWrapper::Seek, |
| 988 base::Unretained(renderer_wrapper_.get()), time)); | 990 base::Unretained(renderer_wrapper_.get()), time)); |
| 989 } | 991 } |
| 990 | 992 |
| 991 void PipelineImpl::Suspend(const PipelineStatusCB& suspend_cb) { | 993 void PipelineImpl::Suspend(const PipelineStatusCB& suspend_cb) { |
| 992 DVLOG(2) << __func__; | 994 DVLOG(2) << __func__; |
| 993 DCHECK(!suspend_cb.is_null()); | 995 DCHECK(!suspend_cb.is_null()); |
| 994 | 996 |
| 995 DCHECK(IsRunning()); | 997 DCHECK(IsRunning()); |
| 996 DCHECK(suspend_cb_.is_null()); | 998 DCHECK(suspend_cb_.is_null()); |
| 997 suspend_cb_ = suspend_cb; | 999 suspend_cb_ = suspend_cb; |
| 998 | 1000 |
| 999 media_task_runner_->PostTask( | 1001 media_task_runner_->PostTask( |
| 1000 FROM_HERE, base::Bind(&RendererWrapper::Suspend, | 1002 FROM_HERE, base::Bind(&RendererWrapper::Suspend, |
| 1001 base::Unretained(renderer_wrapper_.get()))); | 1003 base::Unretained(renderer_wrapper_.get()))); |
| 1002 } | 1004 } |
| 1003 | 1005 |
| 1004 void PipelineImpl::Resume(std::unique_ptr<Renderer> renderer, | 1006 void PipelineImpl::Resume(std::unique_ptr<Renderer> renderer, |
| 1005 base::TimeDelta time, | 1007 base::TimeDelta time, |
| 1006 const PipelineStatusCB& seek_cb) { | 1008 const PipelineStatusCB& seek_cb) { |
| 1007 DVLOG(2) << __func__; | 1009 DVLOG(2) << __func__; |
| 1008 DCHECK(thread_checker_.CalledOnValidThread()); | 1010 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1009 DCHECK(renderer); | 1011 DCHECK(renderer); |
| 1010 DCHECK(!seek_cb.is_null()); | 1012 DCHECK(!seek_cb.is_null()); |
| 1011 | 1013 |
| 1012 DCHECK(IsRunning()); | 1014 DCHECK(IsRunning()); |
| 1013 DCHECK(seek_cb_.is_null()); | 1015 DCHECK(seek_cb_.is_null()); |
| 1014 seek_cb_ = seek_cb; | 1016 seek_cb_ = seek_cb; |
| 1017 last_media_time_ = base::TimeDelta(); |
| 1015 | 1018 |
| 1016 media_task_runner_->PostTask( | 1019 media_task_runner_->PostTask( |
| 1017 FROM_HERE, base::Bind(&RendererWrapper::Resume, | 1020 FROM_HERE, base::Bind(&RendererWrapper::Resume, |
| 1018 base::Unretained(renderer_wrapper_.get()), | 1021 base::Unretained(renderer_wrapper_.get()), |
| 1019 base::Passed(&renderer), time)); | 1022 base::Passed(&renderer), time)); |
| 1020 } | 1023 } |
| 1021 | 1024 |
| 1022 bool PipelineImpl::IsRunning() const { | 1025 bool PipelineImpl::IsRunning() const { |
| 1023 DCHECK(thread_checker_.CalledOnValidThread()); | 1026 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1024 return !!client_; | 1027 return !!client_; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1057 | 1060 |
| 1058 volume_ = volume; | 1061 volume_ = volume; |
| 1059 media_task_runner_->PostTask( | 1062 media_task_runner_->PostTask( |
| 1060 FROM_HERE, | 1063 FROM_HERE, |
| 1061 base::Bind(&RendererWrapper::SetVolume, | 1064 base::Bind(&RendererWrapper::SetVolume, |
| 1062 base::Unretained(renderer_wrapper_.get()), volume_)); | 1065 base::Unretained(renderer_wrapper_.get()), volume_)); |
| 1063 } | 1066 } |
| 1064 | 1067 |
| 1065 base::TimeDelta PipelineImpl::GetMediaTime() const { | 1068 base::TimeDelta PipelineImpl::GetMediaTime() const { |
| 1066 DCHECK(thread_checker_.CalledOnValidThread()); | 1069 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1067 return renderer_wrapper_->GetMediaTime(); | 1070 |
| 1071 base::TimeDelta media_time = renderer_wrapper_->GetMediaTime(); |
| 1072 |
| 1073 // Clamp current media time to the last reported value, this prevents higher |
| 1074 // level clients from seeing time go backwards based on inaccurate or spurious |
| 1075 // delay values reported to the AudioClock. |
| 1076 // |
| 1077 // It is expected that such events are transient and will be recovered as |
| 1078 // rendering continues over time. |
| 1079 if (media_time < last_media_time_) { |
| 1080 DVLOG(2) << __func__ << ": actual=" << media_time |
| 1081 << " clamped=" << last_media_time_; |
| 1082 return last_media_time_; |
| 1083 } |
| 1084 |
| 1085 DVLOG(3) << __FUNCTION__ << ": " << media_time.InMilliseconds() << " ms"; |
| 1086 last_media_time_ = media_time; |
| 1087 return last_media_time_; |
| 1068 } | 1088 } |
| 1069 | 1089 |
| 1070 Ranges<base::TimeDelta> PipelineImpl::GetBufferedTimeRanges() const { | 1090 Ranges<base::TimeDelta> PipelineImpl::GetBufferedTimeRanges() const { |
| 1071 DCHECK(thread_checker_.CalledOnValidThread()); | 1091 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1072 return renderer_wrapper_->GetBufferedTimeRanges(); | 1092 return renderer_wrapper_->GetBufferedTimeRanges(); |
| 1073 } | 1093 } |
| 1074 | 1094 |
| 1075 base::TimeDelta PipelineImpl::GetMediaDuration() const { | 1095 base::TimeDelta PipelineImpl::GetMediaDuration() const { |
| 1076 DCHECK(thread_checker_.CalledOnValidThread()); | 1096 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1077 return duration_; | 1097 return duration_; |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1233 void PipelineImpl::OnSuspendDone() { | 1253 void PipelineImpl::OnSuspendDone() { |
| 1234 DVLOG(3) << __func__; | 1254 DVLOG(3) << __func__; |
| 1235 DCHECK(thread_checker_.CalledOnValidThread()); | 1255 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1236 DCHECK(IsRunning()); | 1256 DCHECK(IsRunning()); |
| 1237 | 1257 |
| 1238 DCHECK(!suspend_cb_.is_null()); | 1258 DCHECK(!suspend_cb_.is_null()); |
| 1239 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); | 1259 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); |
| 1240 } | 1260 } |
| 1241 | 1261 |
| 1242 } // namespace media | 1262 } // namespace media |
| OLD | NEW |