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

Unified Diff: chromecast/media/cma/backend/multizone_backend_unittest.cc

Issue 2557513002: [Chromecast] Add support for different playback rates to ALSA backend (Closed)
Patch Set: use CreateEmptyBuffer Created 4 years 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
Index: chromecast/media/cma/backend/multizone_backend_unittest.cc
diff --git a/chromecast/media/cma/backend/multizone_backend_unittest.cc b/chromecast/media/cma/backend/multizone_backend_unittest.cc
index 3c80c13ec51dd585202a1441fe1e19a58d12e39f..7855798b87e6adb8df46ae92edbc21e63f64775f 100644
--- a/chromecast/media/cma/backend/multizone_backend_unittest.cc
+++ b/chromecast/media/cma/backend/multizone_backend_unittest.cc
@@ -55,7 +55,7 @@ class BufferFeeder : public MediaPipelineBackend::Decoder::Delegate {
const base::Closure& eos_cb);
~BufferFeeder() override {}
- void Initialize();
+ void Initialize(float playback_rate);
void Start();
void Stop();
@@ -102,6 +102,8 @@ class BufferFeeder : public MediaPipelineBackend::Decoder::Delegate {
const AudioConfig config_;
const bool effects_only_;
const base::Closure eos_cb_;
+ double original_playback_rate_;
+ double playback_rate_;
int64_t max_rendering_delay_error_us_;
int64_t max_positive_rendering_delay_error_us_;
int64_t max_negative_rendering_delay_error_us_;
@@ -123,7 +125,10 @@ class BufferFeeder : public MediaPipelineBackend::Decoder::Delegate {
} // namespace
-class MultizoneBackendTest : public testing::TestWithParam<int> {
+using TestParams = std::tr1::tuple<int, // sample rate
+ float>; // playback rate
+
+class MultizoneBackendTest : public testing::TestWithParam<TestParams> {
public:
MultizoneBackendTest();
~MultizoneBackendTest() override;
@@ -142,7 +147,7 @@ class MultizoneBackendTest : public testing::TestWithParam<int> {
void AddEffectsStreams();
- void Initialize(int sample_rate);
+ void Initialize(int sample_rate, float playback_rate);
void Start();
void OnEndOfStream();
@@ -161,6 +166,8 @@ BufferFeeder::BufferFeeder(const AudioConfig& config,
: config_(config),
effects_only_(effects_only),
eos_cb_(eos_cb),
+ original_playback_rate_(1.0),
+ playback_rate_(1.0),
max_rendering_delay_error_us_(0),
max_positive_rendering_delay_error_us_(0),
max_negative_rendering_delay_error_us_(0),
@@ -176,7 +183,8 @@ BufferFeeder::BufferFeeder(const AudioConfig& config,
CHECK(!eos_cb_.is_null());
}
-void BufferFeeder::Initialize() {
+void BufferFeeder::Initialize(float playback_rate) {
+ original_playback_rate_ = playback_rate_ = playback_rate;
MediaPipelineDeviceParams params(
MediaPipelineDeviceParams::kModeIgnorePts,
effects_only_ ? MediaPipelineDeviceParams::kAudioStreamSoundEffects
@@ -191,6 +199,7 @@ void BufferFeeder::Initialize() {
decoder_->SetDelegate(this);
ASSERT_TRUE(backend_->Initialize());
+ ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate));
}
void BufferFeeder::Start() {
@@ -201,7 +210,7 @@ void BufferFeeder::Start() {
void BufferFeeder::Stop() {
feeding_completed_ = true;
- ASSERT_TRUE(backend_->Stop());
+ backend_->Stop();
}
void BufferFeeder::FeedBuffer() {
@@ -209,17 +218,28 @@ void BufferFeeder::FeedBuffer() {
if (feeding_completed_)
return;
+ if (!effects_only_ && pushed_us_ >= push_limit_us_ / 2 &&
+ playback_rate_ == original_playback_rate_) {
+ if (original_playback_rate_ < 1.0) {
+ playback_rate_ = original_playback_rate_ * 2;
+ ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate_));
+ } else {
+ playback_rate_ = original_playback_rate_ / 2;
+ ASSERT_TRUE(backend_->SetPlaybackRate(playback_rate_));
+ }
+ }
+
if (!effects_only_ && pushed_us_ >= push_limit_us_) {
pending_buffer_ = new media::DecoderBufferAdapter(
::media::DecoderBuffer::CreateEOSBuffer());
feeding_completed_ = true;
last_push_length_us_ = 0;
} else {
- int size_bytes = (rand() % 128 + 16) * 16;
+ int size_bytes = (rand() % 96 + 32) * 16;
int num_samples =
size_bytes / (config_.bytes_per_channel * config_.channel_number);
- last_push_length_us_ =
- num_samples * kMicrosecondsPerSecond / config_.samples_per_second;
+ last_push_length_us_ = num_samples * kMicrosecondsPerSecond /
+ (config_.samples_per_second * playback_rate_);
scoped_refptr<::media::DecoderBuffer> silence_buffer(
new ::media::DecoderBuffer(size_bytes));
memset(silence_buffer->writable_data(), 0, silence_buffer->data_size());
@@ -242,9 +262,9 @@ void BufferFeeder::OnEndOfStream() {
void BufferFeeder::OnPushBufferComplete(BufferStatus status) {
DCHECK(thread_checker_.CalledOnValidThread());
pending_buffer_ = nullptr;
- ASSERT_NE(status, MediaPipelineBackend::kBufferFailed);
if (!effects_only_) {
+ ASSERT_NE(status, MediaPipelineBackend::kBufferFailed);
MediaPipelineBackend::AudioDecoder::RenderingDelay delay =
decoder_->GetRenderingDelay();
@@ -259,6 +279,7 @@ void BufferFeeder::OnPushBufferComplete(BufferStatus status) {
delay.timestamp_microseconds + delay.delay_microseconds;
int64_t error = next_push_playback_timestamp_ -
expected_next_push_playback_timestamp;
+
max_rendering_delay_error_us_ =
std::max(max_rendering_delay_error_us_, std::abs(error));
total_rendering_delay_error_us_ += std::abs(error);
@@ -288,7 +309,7 @@ MultizoneBackendTest::MultizoneBackendTest() {}
MultizoneBackendTest::~MultizoneBackendTest() {}
-void MultizoneBackendTest::Initialize(int sample_rate) {
+void MultizoneBackendTest::Initialize(int sample_rate, float playback_rate) {
AudioConfig config;
config.codec = kCodecPCM;
config.sample_format = kSampleFormatS32;
@@ -300,7 +321,7 @@ void MultizoneBackendTest::Initialize(int sample_rate) {
new BufferFeeder(config, false /* effects_only */,
base::Bind(&MultizoneBackendTest::OnEndOfStream,
base::Unretained(this))));
- audio_feeder_->Initialize();
+ audio_feeder_->Initialize(playback_rate);
}
void MultizoneBackendTest::AddEffectsStreams() {
@@ -314,7 +335,7 @@ void MultizoneBackendTest::AddEffectsStreams() {
for (int i = 0; i < kNumEffectsStreams; ++i) {
std::unique_ptr<BufferFeeder> feeder(new BufferFeeder(
effects_config, true /* effects_only */, base::Bind(&IgnoreEos)));
- feeder->Initialize();
+ feeder->Initialize(1.0f);
effects_feeders_.push_back(std::move(feeder));
}
}
@@ -345,28 +366,35 @@ void MultizoneBackendTest::OnEndOfStream() {
TEST_P(MultizoneBackendTest, RenderingDelay) {
std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
+ const TestParams& params = GetParam();
+ int sample_rate = testing::get<0>(params);
+ float playback_rate = testing::get<1>(params);
- Initialize(GetParam());
+ Initialize(sample_rate, playback_rate);
AddEffectsStreams();
Start();
base::RunLoop().Run();
}
-INSTANTIATE_TEST_CASE_P(Required,
- MultizoneBackendTest,
- ::testing::Values(8000,
- 11025,
- 12000,
- 16000,
- 22050,
- 24000,
- 32000,
- 44100,
- 48000));
-
-INSTANTIATE_TEST_CASE_P(Optional,
- MultizoneBackendTest,
- ::testing::Values(64000, 88200, 96000));
+INSTANTIATE_TEST_CASE_P(
+ Required,
+ MultizoneBackendTest,
+ testing::Combine(::testing::Values(8000,
+ 11025,
+ 12000,
+ 16000,
+ 22050,
+ 24000,
+ 32000,
+ 44100,
+ 48000),
+ ::testing::Values(0.5f, 0.99f, 1.0f, 1.01f, 2.0f)));
+
+INSTANTIATE_TEST_CASE_P(
+ Optional,
+ MultizoneBackendTest,
+ testing::Combine(::testing::Values(64000, 88200, 96000),
+ ::testing::Values(0.5f, 0.99f, 1.0f, 1.01f, 2.0f)));
} // namespace media
} // namespace chromecast

Powered by Google App Engine
This is Rietveld 408576698