Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: media/base/pipeline_impl.cc

Issue 2239243002: Interpolate media time for mojo rendering pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: moves media-time clamping to PipelineImpl Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/base/pipeline_impl.h ('k') | media/base/pipeline_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/base/pipeline_impl.h ('k') | media/base/pipeline_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698