I420ColorConverter::I420ColorConverter() {
    // Open the shared library
    mHandle = dlopen("libI420colorconvert.so", RTLD_NOW);

    if (mHandle == NULL) {
        ALOGW("I420ColorConverter: cannot load libI420colorconvert.so");
        return;
    }

    // Find the entry point
    void (*getI420ColorConverter)(I420ColorConverter *converter) =
        (void (*)(I420ColorConverter*)) dlsym(mHandle, "getI420ColorConverter");

    if (getI420ColorConverter == NULL) {
        ALOGW("I420ColorConverter: cannot load getI420ColorConverter");
        dlclose(mHandle);
        mHandle = NULL;
        return;
    }

    // Fill the function pointers.
    getI420ColorConverter(this);

    ALOGI("I420ColorConverter: libI420colorconvert.so loaded");
}
Ejemplo n.º 2
0
// Prerequisite: a writer-lock should be held
bool
I420ColorConverterHelper::loadLocked()
{
  if (loadedLocked()) {
    return true;
  }
  unloadLocked();

  // Open the shared library
  mHandle = dlopen("libI420colorconvert.so", RTLD_NOW);
  if (mHandle == nullptr) {
    LOG("libI420colorconvert.so not found");
    return false;
  }

  // Find the entry point
  // Pointer to function with signature
  // void getI420ColorConverter(II420ColorConverter *converter)
  typedef int (* getConverterFn)(II420ColorConverter *converter);
  getConverterFn getI420ColorConverter =
      (getConverterFn) dlsym(mHandle, "getI420ColorConverter");
  if (getI420ColorConverter == nullptr) {
    LOG("Cannot load getI420ColorConverter from libI420colorconvert.so");
    unloadLocked();
    return false;
  }

  // Fill the function pointers.
  getI420ColorConverter(&mConverter);
  if (mConverter.getDecoderOutputFormat == nullptr ||
      mConverter.convertDecoderOutputToI420 == nullptr ||
      mConverter.getEncoderInputFormat == nullptr ||
      mConverter.convertI420ToEncoderInput == nullptr ||
      mConverter.getEncoderInputBufferInfo == nullptr) {
    LOG("Failed to initialize I420 color converter");
    unloadLocked();
    return false;
  }

  return true;
}