// Copyright 2018 The Chromium Authors. All rights reserved.
// 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 "starboard/types.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 {

bool AndroidImageReader::disable_support_ = false;

AndroidImageReader& AndroidImageReader::GetInstance() {
  // C++11 static local variable initialization is
  // thread-safe.
  static base::NoDestructor<AndroidImageReader> instance;
  return *instance;
}

void AndroidImageReader::DisableSupport() {
  disable_support_ = true;
}

bool AndroidImageReader::IsSupported() {
  return !disable_support_ && 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
  if (base::android::BuildInfo::GetInstance()->sdk_int() <
      base::android::SDK_VERSION_OREO) {
    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, AImageReader_newWithUsage);
  LOAD_FUNCTION(libmediandk, AImageReader_setImageListener);
  LOAD_FUNCTION(libmediandk, AImageReader_delete);
  LOAD_FUNCTION(libmediandk, AImageReader_getWindow);
  LOAD_FUNCTION(libmediandk, AImageReader_acquireLatestImageAsync);

  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::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_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);
}

jobject AndroidImageReader::ANativeWindow_toSurface(JNIEnv* env,
                                                    ANativeWindow* window) {
  return ANativeWindow_toSurface_(env, window);
}

}  // namespace android
}  // namespace base
