OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chromecast/media/cma/backend/alsa/audio_decoder_alsa.h" | 5 #include "chromecast/media/cma/backend/alsa/audio_decoder_alsa.h" |
6 | 6 |
7 #include <time.h> | 7 #include <time.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <limits> | 10 #include <limits> |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 return true; | 146 return true; |
147 } | 147 } |
148 | 148 |
149 bool AudioDecoderAlsa::SetPlaybackRate(float rate) { | 149 bool AudioDecoderAlsa::SetPlaybackRate(float rate) { |
150 if (std::abs(rate - 1.0) < kPlaybackRateEpsilon) { | 150 if (std::abs(rate - 1.0) < kPlaybackRateEpsilon) { |
151 // AudioRendererAlgorithm treats values close to 1 as exactly 1. | 151 // AudioRendererAlgorithm treats values close to 1 as exactly 1. |
152 rate = 1.0f; | 152 rate = 1.0f; |
153 } | 153 } |
154 LOG(INFO) << "SetPlaybackRate to " << rate; | 154 LOG(INFO) << "SetPlaybackRate to " << rate; |
155 | 155 |
156 while (!rate_shifter_info_.empty() && | 156 // Remove info for rates that have no pending output left. |
157 rate_shifter_info_.back().input_frames == 0) { | 157 while (!rate_shifter_info_.empty()) { |
158 rate_shifter_info_.pop_back(); | 158 RateShifterInfo* rate_info = &rate_shifter_info_.back(); |
| 159 int64_t possible_output_frames = rate_info->input_frames / rate_info->rate; |
| 160 DCHECK_GE(possible_output_frames, rate_info->output_frames); |
| 161 if (rate_info->output_frames == possible_output_frames) { |
| 162 rate_shifter_info_.pop_back(); |
| 163 } else { |
| 164 break; |
| 165 } |
159 } | 166 } |
| 167 |
160 rate_shifter_info_.push_back(RateShifterInfo(rate)); | 168 rate_shifter_info_.push_back(RateShifterInfo(rate)); |
161 return true; | 169 return true; |
162 } | 170 } |
163 | 171 |
164 AudioDecoderAlsa::BufferStatus AudioDecoderAlsa::PushBuffer( | 172 AudioDecoderAlsa::BufferStatus AudioDecoderAlsa::PushBuffer( |
165 CastDecoderBuffer* buffer) { | 173 CastDecoderBuffer* buffer) { |
166 TRACE_FUNCTION_ENTRY0(); | 174 TRACE_FUNCTION_ENTRY0(); |
167 DCHECK(task_runner_->BelongsToCurrentThread()); | 175 DCHECK(task_runner_->BelongsToCurrentThread()); |
168 DCHECK(buffer); | 176 DCHECK(buffer); |
169 DCHECK(!got_eos_); | 177 DCHECK(!got_eos_); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 if (decoded->end_of_stream()) { | 352 if (decoded->end_of_stream()) { |
345 got_eos_ = true; | 353 got_eos_ = true; |
346 } else { | 354 } else { |
347 int input_frames = decoded->data_size() / (kNumChannels * sizeof(float)); | 355 int input_frames = decoded->data_size() / (kNumChannels * sizeof(float)); |
348 | 356 |
349 DCHECK(!rate_shifter_info_.empty()); | 357 DCHECK(!rate_shifter_info_.empty()); |
350 RateShifterInfo* rate_info = &rate_shifter_info_.front(); | 358 RateShifterInfo* rate_info = &rate_shifter_info_.front(); |
351 // Bypass rate shifter if the rate is 1.0, and there are no frames queued | 359 // Bypass rate shifter if the rate is 1.0, and there are no frames queued |
352 // in the rate shifter. | 360 // in the rate shifter. |
353 if (rate_info->rate == 1.0 && rate_shifter_->frames_buffered() == 0 && | 361 if (rate_info->rate == 1.0 && rate_shifter_->frames_buffered() == 0 && |
354 pending_output_frames_ == kNoPendingOutput) { | 362 pending_output_frames_ == kNoPendingOutput && |
| 363 rate_shifter_info_.size() == 1) { |
355 DCHECK_EQ(rate_info->output_frames, rate_info->input_frames); | 364 DCHECK_EQ(rate_info->output_frames, rate_info->input_frames); |
356 pending_output_frames_ = input_frames; | 365 pending_output_frames_ = input_frames; |
357 if (got_eos_) { | 366 if (got_eos_) { |
358 DCHECK(!pushed_eos_); | 367 DCHECK(!pushed_eos_); |
359 pushed_eos_ = true; | 368 pushed_eos_ = true; |
360 } | 369 } |
361 mixer_input_->WritePcm(decoded); | 370 mixer_input_->WritePcm(decoded); |
362 return; | 371 return; |
363 } | 372 } |
364 | 373 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 scoped_refptr<DecoderBufferBase> output_buffer(new DecoderBufferAdapter( | 465 scoped_refptr<DecoderBufferBase> output_buffer(new DecoderBufferAdapter( |
457 new ::media::DecoderBuffer(channel_data_size * kNumChannels))); | 466 new ::media::DecoderBuffer(channel_data_size * kNumChannels))); |
458 for (int c = 0; c < kNumChannels; ++c) { | 467 for (int c = 0; c < kNumChannels; ++c) { |
459 memcpy(output_buffer->writable_data() + c * channel_data_size, | 468 memcpy(output_buffer->writable_data() + c * channel_data_size, |
460 rate_shifter_output_->channel(c), channel_data_size); | 469 rate_shifter_output_->channel(c), channel_data_size); |
461 } | 470 } |
462 pending_output_frames_ = out_frames; | 471 pending_output_frames_ = out_frames; |
463 mixer_input_->WritePcm(output_buffer); | 472 mixer_input_->WritePcm(output_buffer); |
464 | 473 |
465 if (rate_shifter_info_.size() > 1 && | 474 if (rate_shifter_info_.size() > 1 && |
466 possible_output_frames == rate_info->output_frames) { | 475 rate_info->output_frames == possible_output_frames) { |
467 double remaining_input_frames = | 476 double remaining_input_frames = |
468 rate_info->input_frames - (rate_info->output_frames * rate_info->rate); | 477 rate_info->input_frames - (rate_info->output_frames * rate_info->rate); |
469 rate_shifter_info_.pop_front(); | 478 rate_shifter_info_.pop_front(); |
470 | 479 |
471 rate_info = &rate_shifter_info_.front(); | 480 rate_info = &rate_shifter_info_.front(); |
472 LOG(INFO) << "New playback rate in effect: " << rate_info->rate; | 481 LOG(INFO) << "New playback rate in effect: " << rate_info->rate; |
473 rate_info->input_frames += remaining_input_frames; | 482 rate_info->input_frames += remaining_input_frames; |
474 DCHECK_EQ(0, rate_info->output_frames); | 483 DCHECK_EQ(0, rate_info->output_frames); |
475 | 484 |
476 // If new playback rate is 1.0, clear out 'extra' data in the rate shifter. | 485 // If new playback rate is 1.0, clear out 'extra' data in the rate shifter. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 TRACE_FUNCTION_ENTRY0(); | 536 TRACE_FUNCTION_ENTRY0(); |
528 DCHECK(task_runner_->BelongsToCurrentThread()); | 537 DCHECK(task_runner_->BelongsToCurrentThread()); |
529 if (error != MixerError::kInputIgnored) | 538 if (error != MixerError::kInputIgnored) |
530 LOG(ERROR) << "Mixer error occurred."; | 539 LOG(ERROR) << "Mixer error occurred."; |
531 mixer_error_ = true; | 540 mixer_error_ = true; |
532 delegate_->OnDecoderError(); | 541 delegate_->OnDecoderError(); |
533 } | 542 } |
534 | 543 |
535 } // namespace media | 544 } // namespace media |
536 } // namespace chromecast | 545 } // namespace chromecast |
OLD | NEW |