| Index: media/cast/test/fake_media_source.cc
|
| diff --git a/media/cast/test/fake_media_source.cc b/media/cast/test/fake_media_source.cc
|
| index f17a053f8dfaa23cbae74ae61373d62f6a3e5cb7..061478d37fc504e25dc8d3ad6e9ea8a938540c83 100644
|
| --- a/media/cast/test/fake_media_source.cc
|
| +++ b/media/cast/test/fake_media_source.cc
|
| @@ -15,7 +15,6 @@
|
| #include "media/base/audio_fifo.h"
|
| #include "media/base/audio_timestamp_helper.h"
|
| #include "media/base/media.h"
|
| -#include "media/base/multi_channel_resampler.h"
|
| #include "media/base/video_frame.h"
|
| #include "media/base/video_util.h"
|
| #include "media/cast/cast_sender.h"
|
| @@ -31,8 +30,6 @@
|
|
|
| namespace {
|
|
|
| -static const int kAudioChannels = 2;
|
| -static const int kAudioSamplingFrequency = 48000;
|
| static const int kSoundFrequency = 440; // Frequency of sinusoid wave.
|
| static const float kSoundVolume = 0.10f;
|
| static const int kAudioFrameMs = 10; // Each audio frame is exactly 10ms.
|
| @@ -69,9 +66,15 @@ namespace cast {
|
| FakeMediaSource::FakeMediaSource(
|
| scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| base::TickClock* clock,
|
| + const AudioSenderConfig& audio_config,
|
| const VideoSenderConfig& video_config,
|
| bool keep_frames)
|
| : task_runner_(task_runner),
|
| + output_audio_params_(AudioParameters::AUDIO_PCM_LINEAR,
|
| + media::GuessChannelLayout(audio_config.channels),
|
| + audio_config.frequency,
|
| + 32,
|
| + audio_config.frequency / kAudioPacketsPerSecond),
|
| video_config_(video_config),
|
| keep_frames_(keep_frames),
|
| variable_frame_size_mode_(false),
|
| @@ -88,8 +91,9 @@ FakeMediaSource::FakeMediaSource(
|
| video_first_pts_(0),
|
| video_first_pts_set_(false),
|
| weak_factory_(this) {
|
| - audio_bus_factory_.reset(new TestAudioBusFactory(kAudioChannels,
|
| - kAudioSamplingFrequency,
|
| + CHECK(output_audio_params_.IsValid());
|
| + audio_bus_factory_.reset(new TestAudioBusFactory(audio_config.channels,
|
| + audio_config.frequency,
|
| kSoundFrequency,
|
| kSoundVolume));
|
| }
|
| @@ -161,13 +165,14 @@ void FakeMediaSource::SetSourceFile(const base::FilePath& video_file,
|
| LOG(WARNING) << "Found multiple audio streams.";
|
| }
|
| audio_stream_index_ = static_cast<int>(i);
|
| - audio_params_.Reset(
|
| + source_audio_params_.Reset(
|
| AudioParameters::AUDIO_PCM_LINEAR,
|
| layout,
|
| av_codec_context->channels,
|
| av_codec_context->sample_rate,
|
| 8 * av_get_bytes_per_sample(av_codec_context->sample_fmt),
|
| av_codec_context->sample_rate / kAudioPacketsPerSecond);
|
| + CHECK(source_audio_params_.IsValid());
|
| LOG(INFO) << "Source file has audio.";
|
| } else if (av_codec->type == AVMEDIA_TYPE_VIDEO) {
|
| VideoFrame::Format format =
|
| @@ -228,21 +233,18 @@ void FakeMediaSource::Start(scoped_refptr<AudioFrameInput> audio_frame_input,
|
| }
|
|
|
| // Send transcoding streams.
|
| - audio_algo_.Initialize(audio_params_);
|
| + audio_algo_.Initialize(source_audio_params_);
|
| audio_algo_.FlushBuffers();
|
| - audio_fifo_input_bus_ =
|
| - AudioBus::Create(
|
| - audio_params_.channels(), audio_params_.frames_per_buffer());
|
| + audio_fifo_input_bus_ = AudioBus::Create(
|
| + source_audio_params_.channels(),
|
| + source_audio_params_.frames_per_buffer());
|
| // Audio FIFO can carry all data fron AudioRendererAlgorithm.
|
| audio_fifo_.reset(
|
| - new AudioFifo(audio_params_.channels(),
|
| + new AudioFifo(source_audio_params_.channels(),
|
| audio_algo_.QueueCapacity()));
|
| - audio_resampler_.reset(new media::MultiChannelResampler(
|
| - audio_params_.channels(),
|
| - static_cast<double>(audio_params_.sample_rate()) /
|
| - kAudioSamplingFrequency,
|
| - audio_params_.frames_per_buffer(),
|
| - base::Bind(&FakeMediaSource::ProvideData, weak_factory_.GetWeakPtr())));
|
| + audio_converter_.reset(new media::AudioConverter(
|
| + source_audio_params_, output_audio_params_, true));
|
| + audio_converter_->AddInput(this);
|
| task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&FakeMediaSource::SendNextFrame, weak_factory_.GetWeakPtr()));
|
| @@ -462,7 +464,7 @@ void FakeMediaSource::DecodeAudio(ScopedAVPacket packet) {
|
| // Not the frequency of the source file. This is because we
|
| // increment the frame count by samples we sent.
|
| audio_sent_ts_.reset(
|
| - new AudioTimestampHelper(kAudioSamplingFrequency));
|
| + new AudioTimestampHelper(output_audio_params_.sample_rate()));
|
| // For some files this is an invalid value.
|
| base::TimeDelta base_ts;
|
| audio_sent_ts_->SetBaseTimestamp(base_ts);
|
| @@ -506,16 +508,15 @@ void FakeMediaSource::DecodeAudio(ScopedAVPacket packet) {
|
|
|
| // Make sure there's enough data to resample audio.
|
| if (audio_fifo_->frames() <
|
| - 2 * audio_params_.sample_rate() / kAudioPacketsPerSecond) {
|
| + 2 * source_audio_params_.sample_rate() / kAudioPacketsPerSecond) {
|
| continue;
|
| }
|
|
|
| scoped_ptr<media::AudioBus> resampled_bus(
|
| media::AudioBus::Create(
|
| - audio_params_.channels(),
|
| - kAudioSamplingFrequency / kAudioPacketsPerSecond));
|
| - audio_resampler_->Resample(resampled_bus->frames(),
|
| - resampled_bus.get());
|
| + output_audio_params_.channels(),
|
| + output_audio_params_.sample_rate() / kAudioPacketsPerSecond));
|
| + audio_converter_->Convert(resampled_bus.get());
|
| audio_bus_queue_.push(resampled_bus.release());
|
| }
|
| }
|
| @@ -588,13 +589,15 @@ void FakeMediaSource::Decode(bool decode_audio) {
|
| }
|
| }
|
|
|
| -void FakeMediaSource::ProvideData(int frame_delay,
|
| - media::AudioBus* output_bus) {
|
| +double FakeMediaSource::ProvideInput(media::AudioBus* output_bus,
|
| + base::TimeDelta buffer_delay) {
|
| if (audio_fifo_->frames() >= output_bus->frames()) {
|
| audio_fifo_->Consume(output_bus, 0, output_bus->frames());
|
| + return 1.0;
|
| } else {
|
| LOG(WARNING) << "Not enough audio data for resampling.";
|
| output_bus->Zero();
|
| + return 0.0;
|
| }
|
| }
|
|
|
|
|