Chromium Code Reviews| 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 2742c05547c5fce34f53fa5ecb987a9c9980cd9e..f17a053f8dfaa23cbae74ae61373d62f6a3e5cb7 100644 |
| --- a/media/cast/test/fake_media_source.cc |
| +++ b/media/cast/test/fake_media_source.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/files/memory_mapped_file.h" |
| #include "base/files/scoped_file.h" |
| #include "base/logging.h" |
| +#include "base/rand_util.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "media/audio/audio_parameters.h" |
| #include "media/base/audio_buffer.h" |
| @@ -32,11 +33,20 @@ namespace { |
| static const int kAudioChannels = 2; |
| static const int kAudioSamplingFrequency = 48000; |
| -static const int kSoundFrequency = 1234; // Frequency of sinusoid wave. |
| -static const float kSoundVolume = 0.5f; |
| +static const int kSoundFrequency = 440; // Frequency of sinusoid wave. |
|
hubbe
2015/01/31 00:55:51
Why change this?
miu
2015/01/31 04:53:04
It hurt my ears. ;-) The new values: 10% volume
|
| +static const float kSoundVolume = 0.10f; |
| static const int kAudioFrameMs = 10; // Each audio frame is exactly 10ms. |
| static const int kAudioPacketsPerSecond = 1000 / kAudioFrameMs; |
| +// Bounds for variable frame size mode. |
| +static const int kMinFakeFrameWidth = 60; |
| +static const int kMinFakeFrameHeight = 34; |
| +static const int kStartingFakeFrameWidth = 854; |
| +static const int kStartingFakeFrameHeight = 480; |
| +static const int kMaxFakeFrameWidth = 1280; |
| +static const int kMaxFakeFrameHeight = 720; |
| +static const int kMaxFrameSizeChangeMillis = 5000; |
| + |
| void AVFreeFrame(AVFrame* frame) { |
| av_frame_free(&frame); |
| } |
| @@ -63,7 +73,8 @@ FakeMediaSource::FakeMediaSource( |
| bool keep_frames) |
| : task_runner_(task_runner), |
| video_config_(video_config), |
| - keep_frames_(keep_frames), |
| + keep_frames_(keep_frames), |
| + variable_frame_size_mode_(false), |
| synthetic_count_(0), |
| clock_(clock), |
| audio_frame_count_(0), |
| @@ -189,6 +200,10 @@ void FakeMediaSource::SetSourceFile(const base::FilePath& video_file, |
| Rewind(); |
| } |
| +void FakeMediaSource::SetVariableFrameSizeMode(bool enabled) { |
| + variable_frame_size_mode_ = enabled; |
| +} |
| + |
| void FakeMediaSource::Start(scoped_refptr<AudioFrameInput> audio_frame_input, |
| scoped_refptr<VideoFrameInput> video_frame_input) { |
| audio_frame_input_ = audio_frame_input; |
| @@ -207,9 +222,8 @@ void FakeMediaSource::Start(scoped_refptr<AudioFrameInput> audio_frame_input, |
| // Send fake patterns. |
| task_runner_->PostTask( |
| FROM_HERE, |
| - base::Bind( |
| - &FakeMediaSource::SendNextFakeFrame, |
| - base::Unretained(this))); |
| + base::Bind(&FakeMediaSource::SendNextFakeFrame, |
| + weak_factory_.GetWeakPtr())); |
| return; |
| } |
| @@ -228,18 +242,16 @@ void FakeMediaSource::Start(scoped_refptr<AudioFrameInput> audio_frame_input, |
| static_cast<double>(audio_params_.sample_rate()) / |
| kAudioSamplingFrequency, |
| audio_params_.frames_per_buffer(), |
| - base::Bind(&FakeMediaSource::ProvideData, base::Unretained(this)))); |
| + base::Bind(&FakeMediaSource::ProvideData, weak_factory_.GetWeakPtr()))); |
| task_runner_->PostTask( |
| FROM_HERE, |
| - base::Bind( |
| - &FakeMediaSource::SendNextFrame, |
| - base::Unretained(this))); |
| + base::Bind(&FakeMediaSource::SendNextFrame, weak_factory_.GetWeakPtr())); |
| } |
| void FakeMediaSource::SendNextFakeFrame() { |
| - gfx::Size size(video_config_.width, video_config_.height); |
| + UpdateNextFrameSize(); |
| scoped_refptr<VideoFrame> video_frame = |
| - VideoFrame::CreateBlackFrame(size); |
| + VideoFrame::CreateBlackFrame(current_frame_size_); |
| PopulateVideoFrame(video_frame.get(), synthetic_count_); |
| ++synthetic_count_; |
| @@ -288,6 +300,32 @@ void FakeMediaSource::SendNextFakeFrame() { |
| video_time - elapsed_time); |
| } |
| +void FakeMediaSource::UpdateNextFrameSize() { |
| + if (variable_frame_size_mode_) { |
| + bool update_size_change_time = false; |
| + if (current_frame_size_.IsEmpty()) { |
| + current_frame_size_ = gfx::Size(kStartingFakeFrameWidth, |
| + kStartingFakeFrameHeight); |
| + update_size_change_time = true; |
| + } else if (clock_->NowTicks() >= next_frame_size_change_time_) { |
| + current_frame_size_ = gfx::Size( |
| + base::RandInt(kMinFakeFrameWidth, kMaxFakeFrameWidth), |
| + base::RandInt(kMinFakeFrameHeight, kMaxFakeFrameHeight)); |
| + update_size_change_time = true; |
| + } |
| + |
| + if (update_size_change_time) { |
| + next_frame_size_change_time_ = clock_->NowTicks() + |
| + base::TimeDelta::FromMillisecondsD( |
| + base::RandDouble() * kMaxFrameSizeChangeMillis); |
| + } |
| + } else { |
| + current_frame_size_ = gfx::Size(kStartingFakeFrameWidth, |
| + kStartingFakeFrameHeight); |
| + next_frame_size_change_time_ = base::TimeTicks(); |
| + } |
| +} |
| + |
| bool FakeMediaSource::SendNextTranscodedVideo(base::TimeDelta elapsed_time) { |
| if (!is_transcoding_video()) |
| return false; |
| @@ -296,33 +334,13 @@ bool FakeMediaSource::SendNextTranscodedVideo(base::TimeDelta elapsed_time) { |
| if (video_frame_queue_.empty()) |
| return false; |
| - scoped_refptr<VideoFrame> decoded_frame = |
| - video_frame_queue_.front(); |
| - if (elapsed_time < decoded_frame->timestamp()) |
| + const scoped_refptr<VideoFrame> video_frame = video_frame_queue_.front(); |
| + if (elapsed_time < video_frame->timestamp()) |
| return false; |
| - |
| - gfx::Size size(video_config_.width, video_config_.height); |
| - scoped_refptr<VideoFrame> video_frame = |
| - VideoFrame::CreateBlackFrame(size); |
| video_frame_queue_.pop(); |
| - media::CopyPlane(VideoFrame::kYPlane, |
| - decoded_frame->data(VideoFrame::kYPlane), |
| - decoded_frame->stride(VideoFrame::kYPlane), |
| - decoded_frame->rows(VideoFrame::kYPlane), |
| - video_frame.get()); |
| - media::CopyPlane(VideoFrame::kUPlane, |
| - decoded_frame->data(VideoFrame::kUPlane), |
| - decoded_frame->stride(VideoFrame::kUPlane), |
| - decoded_frame->rows(VideoFrame::kUPlane), |
| - video_frame.get()); |
| - media::CopyPlane(VideoFrame::kVPlane, |
| - decoded_frame->data(VideoFrame::kVPlane), |
| - decoded_frame->stride(VideoFrame::kVPlane), |
| - decoded_frame->rows(VideoFrame::kVPlane), |
| - video_frame.get()); |
| // Use the timestamp from the file if we're transcoding. |
| - video_frame->set_timestamp(ScaleTimestamp(decoded_frame->timestamp())); |
| + video_frame->set_timestamp(ScaleTimestamp(video_frame->timestamp())); |
| if (keep_frames_) |
| inserted_video_frame_queue_.push(video_frame); |
| video_frame_input_->InsertRawVideoFrame( |
| @@ -373,9 +391,7 @@ void FakeMediaSource::SendNextFrame() { |
| // Send next send. |
| task_runner_->PostDelayedTask( |
| FROM_HERE, |
| - base::Bind( |
| - &FakeMediaSource::SendNextFrame, |
| - base::Unretained(this)), |
| + base::Bind(&FakeMediaSource::SendNextFrame, weak_factory_.GetWeakPtr()), |
| base::TimeDelta::FromMilliseconds(kAudioFrameMs)); |
| } |