summaryrefslogtreecommitdiffstats
path: root/chromium/base/android/android_image_reader_compat.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/android/android_image_reader_compat.cc')
-rw-r--r--chromium/base/android/android_image_reader_compat.cc166
1 files changed, 166 insertions, 0 deletions
diff --git a/chromium/base/android/android_image_reader_compat.cc b/chromium/base/android/android_image_reader_compat.cc
new file mode 100644
index 00000000000..d26f7e8a195
--- /dev/null
+++ b/chromium/base/android/android_image_reader_compat.cc
@@ -0,0 +1,166 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/android_image_reader_compat.h"
+
+#include <dlfcn.h>
+
+#include "base/android/build_info.h"
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "base/strings/string_util.h"
+
+#define LOAD_FUNCTION(lib, func) \
+ do { \
+ func##_ = reinterpret_cast<p##func>(dlsym(lib, #func)); \
+ if (!func##_) { \
+ DLOG(ERROR) << "Unable to load function " << #func; \
+ return false; \
+ } \
+ } while (0)
+
+namespace base {
+namespace android {
+
+AndroidImageReader& AndroidImageReader::GetInstance() {
+ // C++11 static local variable initialization is
+ // thread-safe.
+ static AndroidImageReader instance;
+ return instance;
+}
+
+bool AndroidImageReader::IsSupported() {
+ return is_supported_;
+}
+
+AndroidImageReader::AndroidImageReader() : is_supported_(LoadFunctions()) {}
+
+bool AndroidImageReader::LoadFunctions() {
+ // If the Chromium build requires __ANDROID_API__ >= 26 at some
+ // point in the future, we could directly use the global functions instead of
+ // dynamic loading. However, since this would be incompatible with pre-Oreo
+ // devices, this is unlikely to happen in the foreseeable future, so we use
+ // dynamic loading.
+
+ // Functions are not present for android version older than OREO.
+ // Currently we want to enable AImageReader only for android P+ devices.
+ if (base::android::BuildInfo::GetInstance()->sdk_int() <
+ base::android::SDK_VERSION_P) {
+ return false;
+ }
+
+ void* libmediandk = dlopen("libmediandk.so", RTLD_NOW);
+ if (libmediandk == nullptr) {
+ LOG(ERROR) << "Couldnt open libmediandk.so";
+ return false;
+ }
+
+ LOAD_FUNCTION(libmediandk, AImage_delete);
+ LOAD_FUNCTION(libmediandk, AImage_deleteAsync);
+ LOAD_FUNCTION(libmediandk, AImage_getHardwareBuffer);
+ LOAD_FUNCTION(libmediandk, AImage_getWidth);
+ LOAD_FUNCTION(libmediandk, AImage_getHeight);
+ LOAD_FUNCTION(libmediandk, AImage_getCropRect);
+ LOAD_FUNCTION(libmediandk, AImageReader_newWithUsage);
+ LOAD_FUNCTION(libmediandk, AImageReader_setImageListener);
+ LOAD_FUNCTION(libmediandk, AImageReader_delete);
+ LOAD_FUNCTION(libmediandk, AImageReader_getFormat);
+ LOAD_FUNCTION(libmediandk, AImageReader_getWindow);
+ LOAD_FUNCTION(libmediandk, AImageReader_acquireLatestImageAsync);
+ LOAD_FUNCTION(libmediandk, AImageReader_acquireNextImageAsync);
+
+ void* libandroid = dlopen("libandroid.so", RTLD_NOW);
+ if (libandroid == nullptr) {
+ LOG(ERROR) << "Couldnt open libandroid.so";
+ return false;
+ }
+
+ LOAD_FUNCTION(libandroid, ANativeWindow_toSurface);
+
+ return true;
+}
+
+void AndroidImageReader::AImage_delete(AImage* image) {
+ AImage_delete_(image);
+}
+
+void AndroidImageReader::AImage_deleteAsync(AImage* image, int releaseFenceFd) {
+ AImage_deleteAsync_(image, releaseFenceFd);
+}
+
+media_status_t AndroidImageReader::AImage_getHardwareBuffer(
+ const AImage* image,
+ AHardwareBuffer** buffer) {
+ return AImage_getHardwareBuffer_(image, buffer);
+}
+
+media_status_t AndroidImageReader::AImage_getWidth(const AImage* image,
+ int32_t* width) {
+ return AImage_getWidth_(image, width);
+}
+
+media_status_t AndroidImageReader::AImage_getHeight(const AImage* image,
+ int32_t* height) {
+ return AImage_getHeight_(image, height);
+}
+
+media_status_t AndroidImageReader::AImage_getCropRect(const AImage* image,
+ AImageCropRect* rect) {
+ return AImage_getCropRect_(image, rect);
+}
+
+media_status_t AndroidImageReader::AImageReader_newWithUsage(
+ int32_t width,
+ int32_t height,
+ int32_t format,
+ uint64_t usage,
+ int32_t maxImages,
+ AImageReader** reader) {
+ return AImageReader_newWithUsage_(width, height, format, usage, maxImages,
+ reader);
+}
+
+media_status_t AndroidImageReader::AImageReader_setImageListener(
+ AImageReader* reader,
+ AImageReader_ImageListener* listener) {
+ return AImageReader_setImageListener_(reader, listener);
+}
+
+void AndroidImageReader::AImageReader_delete(AImageReader* reader) {
+ AImageReader_delete_(reader);
+}
+
+media_status_t AndroidImageReader::AImageReader_getFormat(
+ const AImageReader* reader,
+ int32_t* format) {
+ return AImageReader_getFormat_(reader, format);
+}
+
+media_status_t AndroidImageReader::AImageReader_getWindow(
+ AImageReader* reader,
+ ANativeWindow** window) {
+ return AImageReader_getWindow_(reader, window);
+}
+
+media_status_t AndroidImageReader::AImageReader_acquireLatestImageAsync(
+ AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd) {
+ return AImageReader_acquireLatestImageAsync_(reader, image, acquireFenceFd);
+}
+
+media_status_t AndroidImageReader::AImageReader_acquireNextImageAsync(
+ AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd) {
+ return AImageReader_acquireNextImageAsync_(reader, image, acquireFenceFd);
+}
+
+jobject AndroidImageReader::ANativeWindow_toSurface(JNIEnv* env,
+ ANativeWindow* window) {
+ return ANativeWindow_toSurface_(env, window);
+}
+
+} // namespace android
+} // namespace base