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

Unified Diff: media/base/pipeline_impl.cc

Issue 2366373003: Not for submission. fastSeek prototype. (Closed)
Patch Set: 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/pipeline_impl.h ('k') | media/base/renderer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/pipeline_impl.cc
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 7eb522b67b73106d8f09fb1da642307d4fa1fcfd..488ea56c81e2d57c6572458bfe1714937be4d112 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -24,6 +24,7 @@
#include "media/base/renderer.h"
#include "media/base/renderer_client.h"
#include "media/base/serial_runner.h"
+#include "media/base/stream_position.h"
#include "media/base/text_renderer.h"
#include "media/base/text_track_config.h"
#include "media/base/timestamp_constants.h"
@@ -46,7 +47,7 @@ class PipelineImpl::RendererWrapper : public DemuxerHost,
std::unique_ptr<TextRenderer> text_renderer,
base::WeakPtr<PipelineImpl> weak_pipeline);
void Stop(const base::Closure& stop_cb);
- void Seek(base::TimeDelta time);
+ void Seek(StreamPosition position);
void Suspend();
void Resume(std::unique_ptr<Renderer> renderer, base::TimeDelta time);
void SetPlaybackRate(double playback_rate);
@@ -109,6 +110,7 @@ class PipelineImpl::RendererWrapper : public DemuxerHost,
void OnError(PipelineStatus error) final;
void OnEnded() final;
void OnStatisticsUpdate(const PipelineStatistics& stats) final;
+ void OnFirstVideoFrameTimestampKnown(base::TimeDelta timestamp) final;
void OnBufferingStateChange(BufferingState state) final;
void OnWaitingForDecryptionKey() final;
void OnVideoNaturalSizeChange(const gfx::Size& size) final;
@@ -130,7 +132,7 @@ class PipelineImpl::RendererWrapper : public DemuxerHost,
// State transition tasks.
void SetState(State next_state);
- void CompleteSeek(base::TimeDelta seek_time, PipelineStatus status);
+ void CompleteSeek(StreamPosition position, PipelineStatus status);
void CompleteSuspend(PipelineStatus status);
void InitializeDemuxer(const PipelineStatusCB& done_cb);
void InitializeRenderer(const PipelineStatusCB& done_cb);
@@ -249,9 +251,9 @@ void PipelineImpl::RendererWrapper::Start(
fns.Push(base::Bind(&RendererWrapper::InitializeRenderer, weak_this_));
// Run tasks.
- pending_callbacks_ =
- SerialRunner::Run(fns, base::Bind(&RendererWrapper::CompleteSeek,
- weak_this_, base::TimeDelta()));
+ pending_callbacks_ = SerialRunner::Run(
+ fns, base::Bind(&RendererWrapper::CompleteSeek, weak_this_,
+ StreamPosition::Precise(base::TimeDelta())));
}
void PipelineImpl::RendererWrapper::Stop(const base::Closure& stop_cb) {
@@ -290,7 +292,7 @@ void PipelineImpl::RendererWrapper::Stop(const base::Closure& stop_cb) {
media_task_runner_->PostTask(FROM_HERE, stop_cb);
}
-void PipelineImpl::RendererWrapper::Seek(base::TimeDelta time) {
+void PipelineImpl::RendererWrapper::Seek(StreamPosition position) {
DCHECK(media_task_runner_->BelongsToCurrentThread());
// Suppress seeking if we're not fully started.
@@ -301,7 +303,7 @@ void PipelineImpl::RendererWrapper::Seek(base::TimeDelta time) {
return;
}
- base::TimeDelta seek_timestamp = std::max(time, demuxer_->GetStartTime());
+ position.time = std::max(position.time, demuxer_->GetStartTime());
SetState(kSeeking);
renderer_ended_ = false;
@@ -332,12 +334,12 @@ void PipelineImpl::RendererWrapper::Seek(base::TimeDelta time) {
// Seek demuxer.
bound_fns.Push(
- base::Bind(&Demuxer::Seek, base::Unretained(demuxer_), seek_timestamp));
+ base::Bind(&Demuxer::Seek, base::Unretained(demuxer_), position.time));
// Run tasks.
pending_callbacks_ = SerialRunner::Run(
bound_fns,
- base::Bind(&RendererWrapper::CompleteSeek, weak_this_, seek_timestamp));
+ base::Bind(&RendererWrapper::CompleteSeek, weak_this_, position));
}
void PipelineImpl::RendererWrapper::Suspend() {
@@ -410,9 +412,10 @@ void PipelineImpl::RendererWrapper::Resume(std::unique_ptr<Renderer> renderer,
fns.Push(base::Bind(&RendererWrapper::InitializeRenderer, weak_this_));
+ // XXX: Revisit.
pending_callbacks_ = SerialRunner::Run(
- fns,
- base::Bind(&RendererWrapper::CompleteSeek, weak_this_, start_timestamp));
+ fns, base::Bind(&RendererWrapper::CompleteSeek, weak_this_,
+ StreamPosition::Precise(timestamp)));
}
void PipelineImpl::RendererWrapper::SetPlaybackRate(double playback_rate) {
@@ -607,7 +610,6 @@ void PipelineImpl::RendererWrapper::OnSelectedVideoTrackChanged(
void PipelineImpl::RendererWrapper::OnStatisticsUpdate(
const PipelineStatistics& stats) {
- DVLOG(3) << __func__;
DCHECK(media_task_runner_->BelongsToCurrentThread());
base::AutoLock auto_lock(shared_state_lock_);
@@ -619,6 +621,9 @@ void PipelineImpl::RendererWrapper::OnStatisticsUpdate(
shared_state_.statistics.video_memory_usage += stats.video_memory_usage;
}
+void PipelineImpl::RendererWrapper::OnFirstVideoFrameTimestampKnown(
+ base::TimeDelta timestamp) {}
+
void PipelineImpl::RendererWrapper::OnBufferingStateChange(
BufferingState state) {
DCHECK(media_task_runner_->BelongsToCurrentThread());
@@ -748,7 +753,7 @@ void PipelineImpl::RendererWrapper::SetState(State next_state) {
media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(next_state));
}
-void PipelineImpl::RendererWrapper::CompleteSeek(base::TimeDelta seek_time,
+void PipelineImpl::RendererWrapper::CompleteSeek(StreamPosition position,
PipelineStatus status) {
DCHECK(media_task_runner_->BelongsToCurrentThread());
DCHECK(state_ == kStarting || state_ == kSeeking || state_ == kResuming);
@@ -761,8 +766,9 @@ void PipelineImpl::RendererWrapper::CompleteSeek(base::TimeDelta seek_time,
return;
}
- shared_state_.renderer->StartPlayingFrom(
- std::max(seek_time, demuxer_->GetStartTime()));
+ position.time = std::max(position.time, demuxer_->GetStartTime());
+ shared_state_.renderer->StartPlayingFrom(position);
+
{
base::AutoLock auto_lock(shared_state_lock_);
shared_state_.suspend_timestamp = kNoTimestamp;
@@ -972,8 +978,9 @@ void PipelineImpl::Stop() {
weak_factory_.InvalidateWeakPtrs();
}
-void PipelineImpl::Seek(base::TimeDelta time, const PipelineStatusCB& seek_cb) {
- DVLOG(2) << __func__ << " to " << time.InMicroseconds();
+void PipelineImpl::Seek(StreamPosition position,
+ const PipelineStatusCB& seek_cb) {
+ DVLOG(2) << __func__ << "(" << ToString(position) << ")";
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!seek_cb.is_null());
@@ -986,8 +993,9 @@ void PipelineImpl::Seek(base::TimeDelta time, const PipelineStatusCB& seek_cb) {
seek_cb_ = seek_cb;
last_media_time_ = base::TimeDelta();
media_task_runner_->PostTask(
- FROM_HERE, base::Bind(&RendererWrapper::Seek,
- base::Unretained(renderer_wrapper_.get()), time));
+ FROM_HERE,
+ base::Bind(&RendererWrapper::Seek,
+ base::Unretained(renderer_wrapper_.get()), position));
}
void PipelineImpl::Suspend(const PipelineStatusCB& suspend_cb) {
@@ -1076,11 +1084,15 @@ base::TimeDelta PipelineImpl::GetMediaTime() const {
//
// It is expected that such events are transient and will be recovered as
// rendering continues over time.
+
+ // XXX: Revisit. Do we even need this logic?
+ /*
if (media_time < last_media_time_) {
DVLOG(2) << __func__ << ": actual=" << media_time
<< " clamped=" << last_media_time_;
return last_media_time_;
}
+ */
DVLOG(3) << __FUNCTION__ << ": " << media_time.InMilliseconds() << " ms";
last_media_time_ = media_time;
« no previous file with comments | « media/base/pipeline_impl.h ('k') | media/base/renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698