Index: media/capture/video/video_capture_device_unittest.cc |
diff --git a/media/capture/video/video_capture_device_unittest.cc b/media/capture/video/video_capture_device_unittest.cc |
index a684a3b7e5b3e8c5bcee5af06b32e0fe8823709f..8e59a526d9251d0e73539d99deb4dab848062eb7 100644 |
--- a/media/capture/video/video_capture_device_unittest.cc |
+++ b/media/capture/video/video_capture_device_unittest.cc |
@@ -39,6 +39,7 @@ |
#if defined(OS_ANDROID) |
#include "base/android/jni_android.h" |
#include "media/capture/video/android/video_capture_device_android.h" |
+#include "media/capture/video/android/video_capture_device_factory_android.h" |
#endif |
#if defined(OS_MACOSX) |
@@ -52,14 +53,8 @@ |
#define MAYBE_CaptureMjpeg CaptureMjpeg |
#define MAYBE_TakePhoto DISABLED_TakePhoto |
#elif defined(OS_ANDROID) |
-// TODO(wjia): enable those tests on Android. |
-// On Android, native camera (JAVA) delivers frames on UI thread which is the |
-// main thread for tests. This results in no frame received by |
-// VideoCaptureAndroid. |
-#define MAYBE_AllocateBadSize DISABLED_AllocateBadSize |
-#define DeAllocateCameraWhileRunning DISABLED_DeAllocateCameraWhileRunning |
-#define DeAllocateCameraWhileRunning DISABLED_DeAllocateCameraWhileRunning |
-#define MAYBE_CaptureMjpeg DISABLED_CaptureMjpeg |
+#define MAYBE_AllocateBadSize AllocateBadSize |
+#define MAYBE_CaptureMjpeg CaptureMjpeg |
#define MAYBE_TakePhoto DISABLED_TakePhoto |
#elif defined(OS_LINUX) |
// AllocateBadSize will hang when a real camera is attached and if more than one |
@@ -104,7 +99,7 @@ class MockVideoCaptureClient : public VideoCaptureDevice::Client { |
base::TimeTicks reference_time, |
base::TimeDelta timestamp) override { |
ASSERT_GT(length, 0); |
- ASSERT_TRUE(data != NULL); |
+ ASSERT_TRUE(!!data); |
jbudorick
2016/09/01 18:46:41
nit: what's with this change? !! appears to be ver
mcasas
2016/09/01 20:52:37
Yeah, my bad; this comes from msvc compiler
having
|
main_thread_->PostTask(FROM_HERE, base::Bind(frame_cb_, format)); |
} |
@@ -168,12 +163,12 @@ class MockImageCaptureClient : public base::RefCounted<MockImageCaptureClient> { |
class DeviceEnumerationListener |
: public base::RefCounted<DeviceEnumerationListener> { |
public: |
- MOCK_METHOD1(OnEnumerateDeviceDescriptorsCallbackPtr, |
+ MOCK_METHOD1(DoOnEnumerateDeviceDescriptors, |
void(VideoCaptureDeviceDescriptors* device_descriptors)); |
// GMock doesn't support move-only arguments, so we use this forward method. |
- void OnEnumerateDeviceDescriptorsCallback( |
+ void OnEnumerateDeviceDescriptors( |
std::unique_ptr<VideoCaptureDeviceDescriptors> device_descriptors) { |
- OnEnumerateDeviceDescriptorsCallbackPtr(device_descriptors.release()); |
+ DoOnEnumerateDeviceDescriptors(device_descriptors.release()); |
} |
private: |
@@ -201,6 +196,10 @@ class VideoCaptureDeviceTest : public testing::TestWithParam<gfx::Size> { |
#if defined(OS_ANDROID) |
VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice( |
base::android::AttachCurrentThread()); |
+ |
+ static_cast<VideoCaptureDeviceFactoryAndroid*>( |
+ video_capture_device_factory_.get()) |
+ ->ConfigureForTesting(); |
#endif |
#if defined(OS_MACOSX) |
AVFoundationGlue::InitializeAVFoundation(); |
@@ -226,17 +225,35 @@ class VideoCaptureDeviceTest : public testing::TestWithParam<gfx::Size> { |
run_loop_->Run(); |
} |
- std::unique_ptr<VideoCaptureDeviceDescriptors> EnumerateDeviceDescriptors() { |
- VideoCaptureDeviceDescriptors* device_descriptors; |
+ bool EnumerateDeviceDescriptors() { |
jbudorick
2016/09/01 18:46:41
Why did you switch this to return a bool rather th
mcasas
2016/09/01 20:52:37
It didn't make a lot of sense to have a member
me
|
+ VideoCaptureDeviceDescriptors* descriptors = nullptr; |
EXPECT_CALL(*device_enumeration_listener_.get(), |
- OnEnumerateDeviceDescriptorsCallbackPtr(_)) |
- .WillOnce(SaveArg<0>(&device_descriptors)); |
+ DoOnEnumerateDeviceDescriptors(_)) |
+ .WillOnce(SaveArg<0>(&descriptors)); |
- video_capture_device_factory_->EnumerateDeviceDescriptors(base::Bind( |
- &DeviceEnumerationListener::OnEnumerateDeviceDescriptorsCallback, |
- device_enumeration_listener_)); |
+ video_capture_device_factory_->EnumerateDeviceDescriptors( |
+ base::Bind(&DeviceEnumerationListener::OnEnumerateDeviceDescriptors, |
+ device_enumeration_listener_)); |
base::RunLoop().RunUntilIdle(); |
- return std::unique_ptr<VideoCaptureDeviceDescriptors>(device_descriptors); |
+ |
+ if (!descriptors || descriptors->empty()) |
+ return false; |
+ device_descriptors_.reset(descriptors); |
+ |
+#if defined(OS_ANDROID) |
+ // Android deprecated/legacy devices capture on a single thread, which is |
+ // occupied by the tests, so nothing gets actually delivered. |
+ // TODO(mcasas): use those devices' test mode to deliver frames in a |
+ // background thread, https://crbug.com/626857 |
+ for (const auto& descriptor : *descriptors) { |
+ if (VideoCaptureDeviceFactoryAndroid::IsLegacyOrDeprecatedDevice( |
+ descriptor.device_id)) { |
+ return false; |
+ } |
+ } |
+#endif |
+ |
+ return true; |
} |
const VideoCaptureFormat& last_format() const { return last_format_; } |
@@ -244,25 +261,22 @@ class VideoCaptureDeviceTest : public testing::TestWithParam<gfx::Size> { |
std::unique_ptr<VideoCaptureDeviceDescriptor> |
GetFirstDeviceDescriptorSupportingPixelFormat( |
const VideoPixelFormat& pixel_format) { |
- device_descriptors_ = EnumerateDeviceDescriptors(); |
- if (device_descriptors_->empty()) { |
- DVLOG(1) << "No camera available."; |
+ if (!EnumerateDeviceDescriptors() || device_descriptors_->empty()) |
return std::unique_ptr<VideoCaptureDeviceDescriptor>(); |
- } |
- for (const auto& descriptors_iterator : *device_descriptors_) { |
+ |
+ for (const auto& descriptor : *device_descriptors_) { |
VideoCaptureFormats supported_formats; |
- video_capture_device_factory_->GetSupportedFormats(descriptors_iterator, |
+ video_capture_device_factory_->GetSupportedFormats(descriptor, |
&supported_formats); |
for (const auto& formats_iterator : supported_formats) { |
if (formats_iterator.pixel_format == pixel_format) { |
return std::unique_ptr<VideoCaptureDeviceDescriptor>( |
- new VideoCaptureDeviceDescriptor(descriptors_iterator)); |
+ new VideoCaptureDeviceDescriptor(descriptor)); |
} |
} |
} |
DVLOG_IF(1, pixel_format != PIXEL_FORMAT_MAX) |
- << "No camera can capture the" |
- << " format: " << VideoPixelFormatToString(pixel_format); |
+ << VideoPixelFormatToString(pixel_format); |
return std::unique_ptr<VideoCaptureDeviceDescriptor>(); |
} |
@@ -301,7 +315,7 @@ class VideoCaptureDeviceTest : public testing::TestWithParam<gfx::Size> { |
#else |
#define MAYBE_OpenInvalidDevice OpenInvalidDevice |
#endif |
- |
+// Tries to allocate an invalid device and verifies it doesn't work. |
TEST_F(VideoCaptureDeviceTest, MAYBE_OpenInvalidDevice) { |
VideoCaptureDeviceDescriptor invalid_descriptor; |
invalid_descriptor.device_id = "jibberish"; |
@@ -318,7 +332,7 @@ TEST_F(VideoCaptureDeviceTest, MAYBE_OpenInvalidDevice) { |
video_capture_device_factory_->CreateDevice(invalid_descriptor); |
#if !defined(OS_MACOSX) |
- EXPECT_TRUE(device == NULL); |
+ EXPECT_FALSE(device); |
#else |
// The presence of the actual device is only checked on AllocateAndStart() |
// and not on creation. |
@@ -333,12 +347,10 @@ TEST_F(VideoCaptureDeviceTest, MAYBE_OpenInvalidDevice) { |
#endif |
} |
+// Allocates the first enumerated device, and expects a frame. |
TEST_P(VideoCaptureDeviceTest, CaptureWithSize) { |
- device_descriptors_ = EnumerateDeviceDescriptors(); |
- if (device_descriptors_->empty()) { |
- VLOG(1) << "No camera available. Exiting test."; |
+ if (!EnumerateDeviceDescriptors() || device_descriptors_->empty()) |
return; |
- } |
const gfx::Size& size = GetParam(); |
if (!IsCaptureSizeSupported(device_descriptors_->front(), size)) |
@@ -350,7 +362,6 @@ TEST_P(VideoCaptureDeviceTest, CaptureWithSize) { |
video_capture_device_factory_->CreateDevice( |
device_descriptors_->front())); |
ASSERT_TRUE(device); |
- DVLOG(1) << device_descriptors_->front().device_id; |
EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(0); |
@@ -359,29 +370,29 @@ TEST_P(VideoCaptureDeviceTest, CaptureWithSize) { |
capture_params.requested_format.frame_rate = 30.0f; |
capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; |
device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
- // Get captured video frames. |
+ |
WaitForCapturedFrame(); |
EXPECT_EQ(last_format().frame_size.width(), width); |
EXPECT_EQ(last_format().frame_size.height(), height); |
if (last_format().pixel_format != PIXEL_FORMAT_MJPEG) |
EXPECT_EQ(size.GetArea(), last_format().frame_size.GetArea()); |
+ EXPECT_EQ(last_format().frame_rate, 30); |
device->StopAndDeAllocate(); |
} |
-#if !defined(OS_ANDROID) |
const gfx::Size kCaptureSizes[] = {gfx::Size(640, 480), gfx::Size(1280, 720)}; |
INSTANTIATE_TEST_CASE_P(VideoCaptureDeviceTests, |
VideoCaptureDeviceTest, |
testing::ValuesIn(kCaptureSizes)); |
-#endif |
+// Allocates a device with an uncommon resolution and verifies frames are |
+// captured |
+// in a close, much more typical one. |
TEST_F(VideoCaptureDeviceTest, MAYBE_AllocateBadSize) { |
- device_descriptors_ = EnumerateDeviceDescriptors(); |
- if (device_descriptors_->empty()) { |
- VLOG(1) << "No camera available. Exiting test."; |
+ if (!EnumerateDeviceDescriptors() || device_descriptors_->empty()) |
return; |
- } |
+ |
std::unique_ptr<VideoCaptureDevice> device( |
video_capture_device_factory_->CreateDevice( |
device_descriptors_->front())); |
@@ -403,13 +414,10 @@ TEST_F(VideoCaptureDeviceTest, MAYBE_AllocateBadSize) { |
EXPECT_EQ(input_size.GetArea(), last_format().frame_size.GetArea()); |
} |
-// Cause hangs on Windows, Linux. Fails Android. http://crbug.com/417824 |
+// Cause hangs on Windows, Linux. Fails Android. https://crbug.com/417824 |
TEST_F(VideoCaptureDeviceTest, DISABLED_ReAllocateCamera) { |
- device_descriptors_ = EnumerateDeviceDescriptors(); |
- if (device_descriptors_->empty()) { |
- VLOG(1) << "No camera available. Exiting test."; |
+ if (!EnumerateDeviceDescriptors() || device_descriptors_->empty()) |
return; |
- } |
// First, do a number of very fast device start/stops. |
for (int i = 0; i <= 5; i++) { |
@@ -418,11 +426,11 @@ TEST_F(VideoCaptureDeviceTest, DISABLED_ReAllocateCamera) { |
video_capture_device_factory_->CreateDevice( |
device_descriptors_->front())); |
gfx::Size resolution; |
- if (i % 2) { |
+ if (i % 2) |
resolution = gfx::Size(640, 480); |
- } else { |
+ else |
resolution = gfx::Size(1280, 1024); |
- } |
+ |
VideoCaptureParams capture_params; |
capture_params.requested_format.frame_size = resolution; |
capture_params.requested_format.frame_rate = 30; |
@@ -450,45 +458,19 @@ TEST_F(VideoCaptureDeviceTest, DISABLED_ReAllocateCamera) { |
EXPECT_EQ(last_format().frame_size.height(), 240); |
} |
-TEST_F(VideoCaptureDeviceTest, DeAllocateCameraWhileRunning) { |
jbudorick
2016/09/01 18:46:41
?
mcasas
2016/09/01 20:52:37
Like it says in the CL description...
"Removes De
|
- device_descriptors_ = EnumerateDeviceDescriptors(); |
- if (device_descriptors_->empty()) { |
- VLOG(1) << "No camera available. Exiting test."; |
- return; |
- } |
- std::unique_ptr<VideoCaptureDevice> device( |
- video_capture_device_factory_->CreateDevice( |
- device_descriptors_->front())); |
- ASSERT_TRUE(device); |
- |
- EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(0); |
- |
- VideoCaptureParams capture_params; |
- capture_params.requested_format.frame_size.SetSize(640, 480); |
- capture_params.requested_format.frame_rate = 30; |
- capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; |
- device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
- // Get captured video frames. |
- WaitForCapturedFrame(); |
- EXPECT_EQ(last_format().frame_size.width(), 640); |
- EXPECT_EQ(last_format().frame_size.height(), 480); |
- EXPECT_EQ(last_format().frame_rate, 30); |
- device->StopAndDeAllocate(); |
-} |
- |
-// Start the camera in 720p to capture MJPEG instead of a raw format. |
+// Starts the camera in 720p to try and capture MJPEG format. |
TEST_F(VideoCaptureDeviceTest, MAYBE_CaptureMjpeg) { |
std::unique_ptr<VideoCaptureDeviceDescriptor> device_descriptor = |
GetFirstDeviceDescriptorSupportingPixelFormat(PIXEL_FORMAT_MJPEG); |
if (!device_descriptor) { |
- VLOG(1) << "No camera supports MJPEG format. Exiting test."; |
+ DVLOG(1) << "No camera supports MJPEG format. Exiting test."; |
return; |
} |
#if defined(OS_WIN) |
base::win::Version version = base::win::GetVersion(); |
- VLOG(1) << "Windows version: " << (int)version; |
if (version >= base::win::VERSION_WIN10) { |
- VLOG(1) << "Skipped on Win10: http://crbug.com/570604."; |
+ VLOG(1) << "Skipped on Win10: http://crbug.com/570604, current: " |
+ << static_cast<int>(version); |
return; |
} |
#endif |
@@ -503,7 +485,7 @@ TEST_F(VideoCaptureDeviceTest, MAYBE_CaptureMjpeg) { |
capture_params.requested_format.frame_rate = 30; |
capture_params.requested_format.pixel_format = PIXEL_FORMAT_MJPEG; |
device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
- // Get captured video frames. |
+ |
WaitForCapturedFrame(); |
// Verify we get MJPEG from the device. Not all devices can capture 1280x720 |
// @ 30 fps, so we don't care about the exact resolution we get. |
@@ -513,7 +495,7 @@ TEST_F(VideoCaptureDeviceTest, MAYBE_CaptureMjpeg) { |
device->StopAndDeAllocate(); |
} |
-TEST_F(VideoCaptureDeviceTest, GetDeviceSupportedFormats) { |
+TEST_F(VideoCaptureDeviceTest, NoCameraSupportsPixelFormatMax) { |
// Use PIXEL_FORMAT_MAX to iterate all device names for testing |
// GetDeviceSupportedFormats(). |
std::unique_ptr<VideoCaptureDeviceDescriptor> device_descriptor = |
@@ -523,13 +505,11 @@ TEST_F(VideoCaptureDeviceTest, GetDeviceSupportedFormats) { |
ASSERT_FALSE(device_descriptor); |
} |
-// Start the camera and take a photo. |
+// Starts the camera and take a photo. |
TEST_F(VideoCaptureDeviceTest, MAYBE_TakePhoto) { |
- device_descriptors_ = EnumerateDeviceDescriptors(); |
- if (device_descriptors_->empty()) { |
- VLOG(1) << "No camera available. Exiting test."; |
+ if (!EnumerateDeviceDescriptors() || device_descriptors_->empty()) |
return; |
- } |
+ |
std::unique_ptr<VideoCaptureDevice> device( |
video_capture_device_factory_->CreateDevice( |
device_descriptors_->front())); |