Index: media/capture/video/fake_video_capture_device.cc |
diff --git a/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc |
index 333bca72ba09e6691058f4fcffa8a795adfc8962..d1e6ed2cded79889c7ece8452afec4eb9a029407 100644 |
--- a/media/capture/video/fake_video_capture_device.cc |
+++ b/media/capture/video/fake_video_capture_device.cc |
@@ -28,11 +28,36 @@ namespace media { |
static const float kPacmanAngularVelocity = 600; |
// Beep every 500 ms. |
static const int kBeepInterval = 500; |
+// Gradient travels from bottom to top in 5 seconds. |
+static const float kGradientFrequency = 1.f / 5; |
static const uint32_t kMinZoom = 100; |
static const uint32_t kMaxZoom = 400; |
static const uint32_t kZoomStep = 1; |
+// Starting from top left, -45 deg gradient. |
+void Draw16BitGradient(uint8_t* const pixels, |
+ base::TimeDelta elapsed_time, |
+ const gfx::Size& frame_size) { |
+ uint16_t* data = reinterpret_cast<uint16_t*>(pixels); |
+ // We calculate the color difference to the neighbour on the right or bellow, |
+ // so that value change from top left to bottom right is 65535 (pixel values |
+ // are wrapped arounf uint16_t). |
+ const float color_step = |
+ 65535 / static_cast<float>(frame_size.width() + frame_size.height()); |
+ float start = |
+ fmod(65536 * elapsed_time.InSecondsF() * kGradientFrequency, 65536); |
+ for (int j = 0; j < frame_size.height(); ++j) { |
+ float value = start; |
+ uint16_t* row = data + j * (frame_size.width()); |
+ for (int i = 0; i < frame_size.width(); ++i) { |
+ *row++ = static_cast<unsigned>(value) & 0xFFFF; |
+ value += color_step; |
+ } |
+ start += color_step; |
+ } |
+} |
+ |
void DrawPacman(bool use_argb, |
uint8_t* const data, |
base::TimeDelta elapsed_time, |
@@ -114,9 +139,11 @@ void DoTakeFakePhoto(VideoCaptureDevice::TakePhotoCallback callback, |
} |
FakeVideoCaptureDevice::FakeVideoCaptureDevice(BufferOwnership buffer_ownership, |
- float fake_capture_rate) |
+ float fake_capture_rate, |
+ VideoPixelFormat pixel_format) |
: buffer_ownership_(buffer_ownership), |
fake_capture_rate_(fake_capture_rate), |
+ pixel_format_(pixel_format), |
current_zoom_(kMinZoom), |
weak_factory_(this) {} |
@@ -141,22 +168,25 @@ void FakeVideoCaptureDevice::AllocateAndStart( |
capture_format_.frame_size.SetSize(1280, 720); |
else if (params.requested_format.frame_size.width() > 320) |
capture_format_.frame_size.SetSize(640, 480); |
- else |
+ else if (params.requested_format.frame_size.width() > 96) |
capture_format_.frame_size.SetSize(320, 240); |
+ else |
+ capture_format_.frame_size.SetSize(96, 96); |
+ capture_format_.pixel_format = pixel_format_; |
if (buffer_ownership_ == BufferOwnership::CLIENT_BUFFERS) { |
capture_format_.pixel_storage = PIXEL_STORAGE_CPU; |
capture_format_.pixel_format = PIXEL_FORMAT_ARGB; |
DVLOG(1) << "starting with client argb buffers"; |
} else if (buffer_ownership_ == BufferOwnership::OWN_BUFFERS) { |
capture_format_.pixel_storage = PIXEL_STORAGE_CPU; |
- capture_format_.pixel_format = PIXEL_FORMAT_I420; |
- DVLOG(1) << "starting with own I420 buffers"; |
+ DVLOG(1) << "starting with own" << VideoPixelFormatToString(pixel_format_) |
+ << "buffers"; |
} |
- if (capture_format_.pixel_format == PIXEL_FORMAT_I420) { |
+ if (buffer_ownership_ != BufferOwnership::CLIENT_BUFFERS) { |
fake_frame_.reset(new uint8_t[VideoFrame::AllocationSize( |
- PIXEL_FORMAT_I420, capture_format_.frame_size)]); |
+ pixel_format_, capture_format_.frame_size)]); |
} |
beep_time_ = base::TimeDelta(); |
@@ -235,11 +265,15 @@ void FakeVideoCaptureDevice::CaptureUsingOwnBuffers( |
base::TimeTicks expected_execution_time) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
const size_t frame_size = capture_format_.ImageAllocationSize(); |
- memset(fake_frame_.get(), 0, frame_size); |
- |
- DrawPacman(false /* use_argb */, fake_frame_.get(), elapsed_time_, |
- fake_capture_rate_, capture_format_.frame_size, current_zoom_); |
+ if (capture_format_.pixel_format == media::PIXEL_FORMAT_Y16) { |
+ Draw16BitGradient(fake_frame_.get(), elapsed_time_, |
+ capture_format_.frame_size); |
+ } else { |
+ memset(fake_frame_.get(), 0, frame_size); |
+ DrawPacman(false /* use_argb */, fake_frame_.get(), elapsed_time_, |
+ fake_capture_rate_, capture_format_.frame_size, current_zoom_); |
+ } |
// Give the captured frame to the client. |
base::TimeTicks now = base::TimeTicks::Now(); |
if (first_ref_time_.is_null()) |
@@ -264,12 +298,17 @@ void FakeVideoCaptureDevice::CaptureUsingClientBuffers( |
DLOG_IF(ERROR, !capture_buffer) << "Couldn't allocate Capture Buffer"; |
DCHECK(capture_buffer->data()) << "Buffer has NO backing memory"; |
- DCHECK_EQ(PIXEL_STORAGE_CPU, capture_format_.pixel_storage); |
- DCHECK_EQ(PIXEL_FORMAT_ARGB, capture_format_.pixel_format); |
- uint8_t* data_ptr = static_cast<uint8_t*>(capture_buffer->data()); |
- memset(data_ptr, 0, capture_buffer->mapped_size()); |
- DrawPacman(true /* use_argb */, data_ptr, elapsed_time_, fake_capture_rate_, |
- capture_format_.frame_size, current_zoom_); |
+ if (capture_format_.pixel_format == media::PIXEL_FORMAT_Y16) { |
+ Draw16BitGradient(static_cast<uint8_t*>(capture_buffer->data()), |
+ elapsed_time_, capture_format_.frame_size); |
+ } else { |
+ DCHECK_EQ(PIXEL_STORAGE_CPU, capture_format_.pixel_storage); |
+ DCHECK_EQ(PIXEL_FORMAT_ARGB, capture_format_.pixel_format); |
+ uint8_t* data_ptr = static_cast<uint8_t*>(capture_buffer->data()); |
+ memset(data_ptr, 0, capture_buffer->mapped_size()); |
+ DrawPacman(true /* use_argb */, data_ptr, elapsed_time_, fake_capture_rate_, |
+ capture_format_.frame_size, current_zoom_); |
+ } |
// Give the captured frame to the client. |
base::TimeTicks now = base::TimeTicks::Now(); |