Chromium Code Reviews| 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 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 951 DCHECK(demuxer); | 951 DCHECK(demuxer); |
| 952 DCHECK(renderer); | 952 DCHECK(renderer); |
| 953 DCHECK(client); | 953 DCHECK(client); |
| 954 DCHECK(!seek_cb.is_null()); | 954 DCHECK(!seek_cb.is_null()); |
| 955 | 955 |
| 956 DCHECK(!client_); | 956 DCHECK(!client_); |
| 957 DCHECK(seek_cb_.is_null()); | 957 DCHECK(seek_cb_.is_null()); |
| 958 client_ = client; | 958 client_ = client; |
| 959 seek_cb_ = seek_cb; | 959 seek_cb_ = seek_cb; |
| 960 last_media_time_ = base::TimeDelta(); | 960 last_media_time_ = base::TimeDelta(); |
| 961 seek_time_ = kNoTimestamp; | |
| 961 | 962 |
| 962 std::unique_ptr<TextRenderer> text_renderer; | 963 std::unique_ptr<TextRenderer> text_renderer; |
| 963 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 964 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 964 switches::kEnableInbandTextTracks)) { | 965 switches::kEnableInbandTextTracks)) { |
| 965 text_renderer.reset(new TextRenderer( | 966 text_renderer.reset(new TextRenderer( |
| 966 media_task_runner_, | 967 media_task_runner_, |
| 967 BindToCurrentLoop(base::Bind(&PipelineImpl::OnAddTextTrack, | 968 BindToCurrentLoop(base::Bind(&PipelineImpl::OnAddTextTrack, |
| 968 weak_factory_.GetWeakPtr())))); | 969 weak_factory_.GetWeakPtr())))); |
| 969 } | 970 } |
| 970 | 971 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1032 DCHECK(thread_checker_.CalledOnValidThread()); | 1033 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1033 DCHECK(!seek_cb.is_null()); | 1034 DCHECK(!seek_cb.is_null()); |
| 1034 | 1035 |
| 1035 if (!IsRunning()) { | 1036 if (!IsRunning()) { |
| 1036 DLOG(ERROR) << "Media pipeline isn't running. Ignoring Seek()."; | 1037 DLOG(ERROR) << "Media pipeline isn't running. Ignoring Seek()."; |
| 1037 return; | 1038 return; |
| 1038 } | 1039 } |
| 1039 | 1040 |
| 1040 DCHECK(seek_cb_.is_null()); | 1041 DCHECK(seek_cb_.is_null()); |
| 1041 seek_cb_ = seek_cb; | 1042 seek_cb_ = seek_cb; |
| 1043 seek_time_ = time; | |
| 1042 last_media_time_ = base::TimeDelta(); | 1044 last_media_time_ = base::TimeDelta(); |
| 1043 media_task_runner_->PostTask( | 1045 media_task_runner_->PostTask( |
| 1044 FROM_HERE, base::Bind(&RendererWrapper::Seek, | 1046 FROM_HERE, base::Bind(&RendererWrapper::Seek, |
| 1045 base::Unretained(renderer_wrapper_.get()), time)); | 1047 base::Unretained(renderer_wrapper_.get()), time)); |
| 1046 } | 1048 } |
| 1047 | 1049 |
| 1048 void PipelineImpl::Suspend(const PipelineStatusCB& suspend_cb) { | 1050 void PipelineImpl::Suspend(const PipelineStatusCB& suspend_cb) { |
| 1049 DVLOG(2) << __func__; | 1051 DVLOG(2) << __func__; |
| 1050 DCHECK(!suspend_cb.is_null()); | 1052 DCHECK(!suspend_cb.is_null()); |
| 1051 | 1053 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1062 base::TimeDelta time, | 1064 base::TimeDelta time, |
| 1063 const PipelineStatusCB& seek_cb) { | 1065 const PipelineStatusCB& seek_cb) { |
| 1064 DVLOG(2) << __func__; | 1066 DVLOG(2) << __func__; |
| 1065 DCHECK(thread_checker_.CalledOnValidThread()); | 1067 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1066 DCHECK(renderer); | 1068 DCHECK(renderer); |
| 1067 DCHECK(!seek_cb.is_null()); | 1069 DCHECK(!seek_cb.is_null()); |
| 1068 | 1070 |
| 1069 DCHECK(IsRunning()); | 1071 DCHECK(IsRunning()); |
| 1070 DCHECK(seek_cb_.is_null()); | 1072 DCHECK(seek_cb_.is_null()); |
| 1071 seek_cb_ = seek_cb; | 1073 seek_cb_ = seek_cb; |
| 1074 seek_time_ = time; | |
| 1072 last_media_time_ = base::TimeDelta(); | 1075 last_media_time_ = base::TimeDelta(); |
| 1073 | 1076 |
| 1074 media_task_runner_->PostTask( | 1077 media_task_runner_->PostTask( |
| 1075 FROM_HERE, base::Bind(&RendererWrapper::Resume, | 1078 FROM_HERE, base::Bind(&RendererWrapper::Resume, |
| 1076 base::Unretained(renderer_wrapper_.get()), | 1079 base::Unretained(renderer_wrapper_.get()), |
| 1077 base::Passed(&renderer), time)); | 1080 base::Passed(&renderer), time)); |
| 1078 } | 1081 } |
| 1079 | 1082 |
| 1080 bool PipelineImpl::IsRunning() const { | 1083 bool PipelineImpl::IsRunning() const { |
| 1081 DCHECK(thread_checker_.CalledOnValidThread()); | 1084 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1116 volume_ = volume; | 1119 volume_ = volume; |
| 1117 media_task_runner_->PostTask( | 1120 media_task_runner_->PostTask( |
| 1118 FROM_HERE, | 1121 FROM_HERE, |
| 1119 base::Bind(&RendererWrapper::SetVolume, | 1122 base::Bind(&RendererWrapper::SetVolume, |
| 1120 base::Unretained(renderer_wrapper_.get()), volume_)); | 1123 base::Unretained(renderer_wrapper_.get()), volume_)); |
| 1121 } | 1124 } |
| 1122 | 1125 |
| 1123 base::TimeDelta PipelineImpl::GetMediaTime() const { | 1126 base::TimeDelta PipelineImpl::GetMediaTime() const { |
| 1124 DCHECK(thread_checker_.CalledOnValidThread()); | 1127 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1125 | 1128 |
| 1126 base::TimeDelta media_time = renderer_wrapper_->GetMediaTime(); | 1129 // Don't trust renderer time during a pending seek. Renderer may return |
| 1130 // pre-seek time which may corrupt |last_media_time_| used for clamping. | |
| 1131 base::TimeDelta media_time = seek_time_ != kNoTimestamp | |
| 1132 ? seek_time_ | |
| 1133 : renderer_wrapper_->GetMediaTime(); | |
| 1127 | 1134 |
| 1128 // Clamp current media time to the last reported value, this prevents higher | 1135 // Clamp current media time to the last reported value, this prevents higher |
| 1129 // level clients from seeing time go backwards based on inaccurate or spurious | 1136 // level clients from seeing time go backwards based on inaccurate or spurious |
| 1130 // delay values reported to the AudioClock. | 1137 // delay values reported to the AudioClock. |
| 1131 // | 1138 // |
| 1132 // It is expected that such events are transient and will be recovered as | 1139 // It is expected that such events are transient and will be recovered as |
| 1133 // rendering continues over time. | 1140 // rendering continues over time. |
| 1134 if (media_time < last_media_time_) { | 1141 if (media_time < last_media_time_) { |
| 1135 DVLOG(2) << __func__ << ": actual=" << media_time | 1142 DVLOG(2) << __func__ << ": actual=" << media_time |
| 1136 << " clamped=" << last_media_time_; | 1143 << " clamped=" << last_media_time_; |
| 1137 return last_media_time_; | 1144 return last_media_time_; |
| 1138 } | 1145 } |
| 1139 | 1146 |
| 1140 DVLOG(3) << __func__ << ": " << media_time.InMilliseconds() << " ms"; | 1147 DVLOG(3) << __func__ << ": " << media_time.InMilliseconds() << " ms"; |
|
sandersd (OOO until July 31)
2017/01/04 21:49:26
Probably best to not set this until the seek compl
chcunningham
2017/01/04 22:33:47
Done.
| |
| 1141 last_media_time_ = media_time; | 1148 last_media_time_ = media_time; |
| 1142 return last_media_time_; | 1149 return last_media_time_; |
| 1143 } | 1150 } |
| 1144 | 1151 |
| 1145 Ranges<base::TimeDelta> PipelineImpl::GetBufferedTimeRanges() const { | 1152 Ranges<base::TimeDelta> PipelineImpl::GetBufferedTimeRanges() const { |
| 1146 DCHECK(thread_checker_.CalledOnValidThread()); | 1153 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1147 return renderer_wrapper_->GetBufferedTimeRanges(); | 1154 return renderer_wrapper_->GetBufferedTimeRanges(); |
| 1148 } | 1155 } |
| 1149 | 1156 |
| 1150 base::TimeDelta PipelineImpl::GetMediaDuration() const { | 1157 base::TimeDelta PipelineImpl::GetMediaDuration() const { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1294 | 1301 |
| 1295 DCHECK(client_); | 1302 DCHECK(client_); |
| 1296 client_->OnVideoOpacityChange(opaque); | 1303 client_->OnVideoOpacityChange(opaque); |
| 1297 } | 1304 } |
| 1298 | 1305 |
| 1299 void PipelineImpl::OnSeekDone() { | 1306 void PipelineImpl::OnSeekDone() { |
| 1300 DVLOG(3) << __func__; | 1307 DVLOG(3) << __func__; |
| 1301 DCHECK(thread_checker_.CalledOnValidThread()); | 1308 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1302 DCHECK(IsRunning()); | 1309 DCHECK(IsRunning()); |
| 1303 | 1310 |
| 1311 seek_time_ = kNoTimestamp; | |
| 1312 | |
| 1304 DCHECK(!seek_cb_.is_null()); | 1313 DCHECK(!seek_cb_.is_null()); |
| 1305 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 1314 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| 1306 } | 1315 } |
| 1307 | 1316 |
| 1308 void PipelineImpl::OnSuspendDone() { | 1317 void PipelineImpl::OnSuspendDone() { |
| 1309 DVLOG(3) << __func__; | 1318 DVLOG(3) << __func__; |
| 1310 DCHECK(thread_checker_.CalledOnValidThread()); | 1319 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1311 DCHECK(IsRunning()); | 1320 DCHECK(IsRunning()); |
| 1312 | 1321 |
| 1313 DCHECK(!suspend_cb_.is_null()); | 1322 DCHECK(!suspend_cb_.is_null()); |
| 1314 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); | 1323 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); |
| 1315 } | 1324 } |
| 1316 | 1325 |
| 1317 } // namespace media | 1326 } // namespace media |
| OLD | NEW |