static void __attribute__ ((constructor)) initialize(void)
{
    qcopt_handle = get_qcopt_handle();

    if (!qcopt_handle) {
        ALOGE("Failed to get qcopt handle.\n");
    } else {
        /*
         * qc-opt handle obtained. Get the perflock acquire/release
         * function pointers.
         */
        perf_lock_acq = dlsym(qcopt_handle, "perf_lock_acq");
        if (!perf_lock_acq) {
            goto fail_qcopt;
        }

        perf_lock_rel = dlsym(qcopt_handle, "perf_lock_rel");
        if (!perf_lock_rel) {
            goto fail_qcopt;
        }

        // optional
        perf_lock_use_profile = dlsym(qcopt_handle, "perf_lock_use_profile");
    }

    iop_handle = get_iop_handle();

    if (!iop_handle) {
        ALOGE("Failed to get prefetcher handle.\n");
    } else {
        perf_io_prefetch_start = (int(*)(int, const char *))dlsym(
                iop_handle, "perf_io_prefetch_start");
        if (!perf_io_prefetch_start) {
            goto fail_iop;
        }

        perf_io_prefetch_stop = (int(*)())dlsym(
                iop_handle, "perf_io_prefetch_stop");
        if (!perf_io_prefetch_stop) {
            goto fail_iop;
        }
    }
    return;

fail_qcopt:
    perf_lock_acq = NULL;
    perf_lock_rel = NULL;
    if (qcopt_handle) {
        dlclose(qcopt_handle);
        qcopt_handle = NULL;
    }

fail_iop:
    perf_io_prefetch_start = NULL;
    perf_io_prefetch_stop = NULL;
    if (iop_handle) {
        dlclose(iop_handle);
        iop_handle = NULL;
    }
}
static void __attribute__ ((constructor)) initialize(void)
{
    qcopt_handle = get_qcopt_handle();

    if (!qcopt_handle) {
        ALOGE("Failed to get qcopt handle.\n");
    } else {
        /*
         * qc-opt handle obtained. Get the perflock acquire/release
         * function pointers.
         */
        perf_lock_acq = dlsym(qcopt_handle, "perf_lock_acq");

        if (!perf_lock_acq) {
            ALOGE("Unable to get perf_lock_acq function handle.\n");
        }

        perf_lock_rel = dlsym(qcopt_handle, "perf_lock_rel");

        if (!perf_lock_rel) {
            ALOGE("Unable to get perf_lock_rel function handle.\n");
        }
    }
}
static void process_video_encode_hint(void *metadata)
{
    void *handle;
    char governor[80];
    struct video_encode_metadata_t video_encode_metadata;

    if (get_scaling_governor(governor, sizeof(governor)) == -1) {
        ALOGE("Can't obtain scaling governor.");

        return;
    }

    /* Initialize encode metadata struct fields. */
    memset(&video_encode_metadata, 0, sizeof(video_encode_metadata));
    video_encode_metadata.state = -1;

    if (metadata) {
        if (parse_video_metadata((char *)metadata, &video_encode_metadata) ==
            -1) {
            ALOGE("Error occurred while parsing metadata.");
            return;
        }
    } else {
        return;
    }

    if ((handle = get_qcopt_handle())) {
        if (video_encode_metadata.state == 1) {
            if ((strlen(governor) == strlen("ondemand")) &&
                    (strncmp(governor, "ondemand", strlen("ondemand")) == 0)) {
                if (!perf_vote_ondemand_io_busy_unavailable) {
                    perf_vote_turnoff_ondemand_io_busy = dlsym(handle,
                            "perf_vote_turnoff_ondemand_io_busy");

                    if (perf_vote_turnoff_ondemand_io_busy) {
                        /* Vote to turn io_is_busy off */
                        perf_vote_turnoff_ondemand_io_busy(1);
                    } else {
                        perf_vote_ondemand_io_busy_unavailable = 1;
                        ALOGE("Can't set io_busy_status.");
                    }
                }

                if (!perf_vote_ondemand_sdf_unavailable) {
                    perf_vote_lower_ondemand_sdf = dlsym(handle,
                            "perf_vote_lower_ondemand_sdf");

                    if (perf_vote_lower_ondemand_sdf) {
                        perf_vote_lower_ondemand_sdf(1);
                    } else {
                        perf_vote_ondemand_sdf_unavailable = 1;
                        ALOGE("Can't set sampling_down_factor.");
                    }
                }
            }
        } else if (video_encode_metadata.state == 0) {
            if ((strlen(governor) == strlen("ondemand")) &&
                    (strncmp(governor, "ondemand", strlen("ondemand")) == 0)) {
                if (!perf_vote_ondemand_io_busy_unavailable) {
                    perf_vote_turnoff_ondemand_io_busy = dlsym(handle,
                            "perf_vote_turnoff_ondemand_io_busy");

                    if (perf_vote_turnoff_ondemand_io_busy) {
                        /* Remove vote to turn io_busy off. */
                        perf_vote_turnoff_ondemand_io_busy(0);
                    } else {
                        perf_vote_ondemand_io_busy_unavailable = 1;
                        ALOGE("Can't set io_busy_status.");
                    }
                }

                if (!perf_vote_ondemand_sdf_unavailable) {
                    perf_vote_lower_ondemand_sdf = dlsym(handle,
                            "perf_vote_lower_ondemand_sdf");

                    if (perf_vote_lower_ondemand_sdf) {
                        /* Remove vote to lower sampling down factor. */
                        perf_vote_lower_ondemand_sdf(0);
                    } else {
                        perf_vote_ondemand_sdf_unavailable = 1;
                        ALOGE("Can't set sampling_down_factor.");
                    }
                }
            }
        }
    }
}