Allow to specify list of supported input configurations.
... and populate corresponding metadata entries / perform
validation based on these.
Bug: 301023410
Test: atest virtual_camera_tests
Change-Id: I66f3cf2b013d5845b6fa7429294a1ed2157318f8
diff --git a/services/camera/virtualcamera/util/Util.cc b/services/camera/virtualcamera/util/Util.cc
index 78236a4..11dc3a6 100644
--- a/services/camera/virtualcamera/util/Util.cc
+++ b/services/camera/virtualcamera/util/Util.cc
@@ -18,10 +18,19 @@
#include <unistd.h>
+#include "jpeglib.h"
+
namespace android {
namespace companion {
namespace virtualcamera {
+// Lower bound for maximal supported texture size is at least 2048x2048
+// but on most platforms will be more.
+// TODO(b/301023410) - Query actual max texture size.
+constexpr int kMaxTextureSize = 2048;
+constexpr int kLibJpegDctSize = DCTSIZE;
+
+using ::aidl::android::companion::virtualcamera::Format;
using ::aidl::android::hardware::common::NativeHandle;
sp<Fence> importFence(const NativeHandle& aidlHandle) {
@@ -32,6 +41,29 @@
return sp<Fence>::make(::dup(aidlHandle.fds[0].get()));
}
+// Returns true if specified format is supported for virtual camera input.
+bool isFormatSupportedForInput(const int width, const int height,
+ const Format format) {
+ if (format != Format::YUV_420_888) {
+ // For now only YUV_420_888 is supported for input.
+ return false;
+ }
+
+ if (width <= 0 || height <= 0 || width > kMaxTextureSize ||
+ height > kMaxTextureSize) {
+ return false;
+ }
+
+ if (width % kLibJpegDctSize != 0 || height % kLibJpegDctSize != 0) {
+ // Input dimension needs to be multiple of libjpeg DCT size.
+ // TODO(b/301023410) This restriction can be removed once we add support for
+ // unaligned jpeg compression.
+ return false;
+ }
+
+ return true;
+}
+
} // namespace virtualcamera
} // namespace companion
} // namespace android
diff --git a/services/camera/virtualcamera/util/Util.h b/services/camera/virtualcamera/util/Util.h
index 1a0a458..b778321 100644
--- a/services/camera/virtualcamera/util/Util.h
+++ b/services/camera/virtualcamera/util/Util.h
@@ -19,6 +19,7 @@
#include <cstdint>
+#include "aidl/android/companion/virtualcamera/Format.h"
#include "aidl/android/hardware/camera/common/Status.h"
#include "aidl/android/hardware/camera/device/StreamBuffer.h"
#include "android/binder_auto_utils.h"
@@ -42,6 +43,11 @@
sp<Fence> importFence(
const ::aidl::android::hardware::common::NativeHandle& handle);
+// Returns true if specified format is supported for virtual camera input.
+bool isFormatSupportedForInput(
+ int width, int height,
+ ::aidl::android::companion::virtualcamera::Format format);
+
} // namespace virtualcamera
} // namespace companion
} // namespace android