#include "content/browser/media/capture/desktop_capture_device.h"
+#include <string>
+
#include "base/basictypes.h"
-#include "base/sequenced_task_runner.h"
#include "base/synchronization/waitable_event.h"
#include "base/test/test_timeouts.h"
-#include "base/threading/sequenced_worker_pool.h"
#include "base/time/time.h"
+#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
class InvertedDesktopFrame : public webrtc::DesktopFrame {
public:
// Takes ownership of |frame|.
- InvertedDesktopFrame(webrtc::DesktopFrame* frame)
+ explicit InvertedDesktopFrame(webrtc::DesktopFrame* frame)
: webrtc::DesktopFrame(
- frame->size(), -frame->stride(),
+ frame->size(),
+ -frame->stride(),
frame->data() + (frame->size().height() - 1) * frame->stride(),
frame->shared_memory()),
original_frame_(frame) {
bool generate_inverted_frames_;
};
+} // namespace
+
class DesktopCaptureDeviceTest : public testing::Test {
public:
- virtual void SetUp() OVERRIDE {
- worker_pool_ = new base::SequencedWorkerPool(3, "TestCaptureThread");
+ void CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer> capturer) {
+ capture_device_.reset(
+ new DesktopCaptureDevice(capturer.Pass(), DesktopMediaID::TYPE_SCREEN));
}
protected:
- scoped_refptr<base::SequencedWorkerPool> worker_pool_;
+ scoped_ptr<DesktopCaptureDevice> capture_device_;
};
-} // namespace
-
// There is currently no screen capturer implementation for ozone. So disable
// the test that uses a real screen-capturer instead of FakeScreenCapturer.
// http://crbug.com/260318
TEST_F(DesktopCaptureDeviceTest, MAYBE_Capture) {
scoped_ptr<webrtc::DesktopCapturer> capturer(
webrtc::ScreenCapturer::Create());
- DesktopCaptureDevice capture_device(
- worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
- capturer.Pass());
+ CreateScreenCaptureDevice(capturer.Pass());
+
media::VideoCaptureFormat format;
base::WaitableEvent done_event(false, false);
int frame_size;
capture_params.requested_format.frame_size.SetSize(640, 480);
capture_params.requested_format.frame_rate = kFrameRate;
capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
- capture_params.allow_resolution_change = false;
- capture_device.AllocateAndStart(
+ capture_device_->AllocateAndStart(
capture_params, client.PassAs<media::VideoCaptureDevice::Client>());
EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
- capture_device.StopAndDeAllocate();
+ capture_device_->StopAndDeAllocate();
EXPECT_GT(format.frame_size.width(), 0);
EXPECT_GT(format.frame_size.height(), 0);
EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format);
EXPECT_EQ(format.frame_size.GetArea() * 4, frame_size);
- worker_pool_->FlushForTesting();
}
// Test that screen capturer behaves correctly if the source frame size changes
TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
- DesktopCaptureDevice capture_device(
- worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
- scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
+ CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
media::VideoCaptureFormat format;
base::WaitableEvent done_event(false, false);
kTestFrameHeight1);
capture_params.requested_format.frame_rate = kFrameRate;
capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
- capture_params.allow_resolution_change = false;
- capture_device.AllocateAndStart(
+ capture_device_->AllocateAndStart(
capture_params, client.PassAs<media::VideoCaptureDevice::Client>());
// Capture at least two frames, to ensure that the source frame size has
done_event.Reset();
EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
- capture_device.StopAndDeAllocate();
+ capture_device_->StopAndDeAllocate();
EXPECT_EQ(kTestFrameWidth1, format.frame_size.width());
EXPECT_EQ(kTestFrameHeight1, format.frame_size.height());
EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format);
EXPECT_EQ(format.frame_size.GetArea() * 4, frame_size);
- worker_pool_->FlushForTesting();
}
// Test that screen capturer behaves correctly if the source frame size changes
TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) {
FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
- DesktopCaptureDevice capture_device(
- worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
- scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
+ CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
media::VideoCaptureFormat format;
base::WaitableEvent done_event(false, false);
kTestFrameHeight2);
capture_params.requested_format.frame_rate = kFrameRate;
capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
- capture_params.allow_resolution_change = false;
- capture_device.AllocateAndStart(
+ capture_device_->AllocateAndStart(
capture_params, client.PassAs<media::VideoCaptureDevice::Client>());
// Capture at least three frames, to ensure that the source frame size has
done_event.Reset();
EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
- capture_device.StopAndDeAllocate();
+ capture_device_->StopAndDeAllocate();
EXPECT_EQ(kTestFrameWidth1, format.frame_size.width());
EXPECT_EQ(kTestFrameHeight1, format.frame_size.height());
EXPECT_EQ(kFrameRate, format.frame_rate);
EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format);
- worker_pool_->FlushForTesting();
}
} // namespace content