blob: e23a1b1d270e31fdef30cfaa81a0286e0e0a4eac [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/media/cma/backend/media_pipeline_backend_default.h"
#include <algorithm>
#include <limits>
#include "chromecast/media/cma/backend/audio_decoder_default.h"
#include "chromecast/media/cma/backend/video_decoder_default.h"
#include "chromecast/public/media/cast_decoder_buffer.h"
namespace chromecast {
namespace media {
MediaPipelineBackendDefault::MediaPipelineBackendDefault()
: start_pts_(std::numeric_limits<int64_t>::min()),
running_(false),
rate_(1.0f) {}
MediaPipelineBackendDefault::~MediaPipelineBackendDefault() {
}
MediaPipelineBackend::AudioDecoder*
MediaPipelineBackendDefault::CreateAudioDecoder() {
DCHECK(!audio_decoder_);
audio_decoder_.reset(new AudioDecoderDefault());
return audio_decoder_.get();
}
MediaPipelineBackend::VideoDecoder*
MediaPipelineBackendDefault::CreateVideoDecoder() {
DCHECK(!video_decoder_);
video_decoder_.reset(new VideoDecoderDefault());
return video_decoder_.get();
}
bool MediaPipelineBackendDefault::Initialize() {
return true;
}
bool MediaPipelineBackendDefault::Start(int64_t start_pts) {
DCHECK(!running_);
start_pts_ = start_pts;
start_clock_ = base::TimeTicks::Now();
running_ = true;
return true;
}
bool MediaPipelineBackendDefault::Stop() {
start_pts_ = GetCurrentPts();
running_ = false;
return true;
}
bool MediaPipelineBackendDefault::Pause() {
DCHECK(running_);
start_pts_ = GetCurrentPts();
running_ = false;
return true;
}
bool MediaPipelineBackendDefault::Resume() {
DCHECK(!running_);
running_ = true;
start_clock_ = base::TimeTicks::Now();
return true;
}
int64_t MediaPipelineBackendDefault::GetCurrentPts() {
if (!running_)
return start_pts_;
if (audio_decoder_ &&
audio_decoder_->last_push_pts() != std::numeric_limits<int64_t>::min()) {
start_pts_ = std::min(start_pts_, audio_decoder_->last_push_pts());
}
if (video_decoder_ &&
video_decoder_->last_push_pts() != std::numeric_limits<int64_t>::min()) {
start_pts_ = std::min(start_pts_, video_decoder_->last_push_pts());
}
base::TimeTicks now = base::TimeTicks::Now();
base::TimeDelta interpolated_media_time =
base::TimeDelta::FromMicroseconds(start_pts_) +
(now - start_clock_) * rate_;
return interpolated_media_time.InMicroseconds();
}
bool MediaPipelineBackendDefault::SetPlaybackRate(float rate) {
DCHECK_GT(rate, 0.0f);
start_pts_ = GetCurrentPts();
start_clock_ = base::TimeTicks::Now();
rate_ = rate;
return true;
}
} // namespace media
} // namespace chromecast