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 |