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."); } } } } } }