| /* |
| * xcam_thread.h - xcam basic thread |
| * |
| * Copyright (c) 2014 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| |
| #include "xcam_cpf_reader.h" |
| |
| #include <string.h> |
| #include <stdlib.h> |
| #include "libtbd.h" |
| |
| #undef XCAM_FAIL_RETURN_VAL |
| #define XCAM_FAIL_RETURN_VAL(exp, ret) \ |
| if (!(exp)) { \ |
| XCAM_LOG_WARNING ("XCAM_FAIL_RETURN_VAL %s", #exp); \ |
| return ret; \ |
| } |
| |
| #undef XCAM_FAIL_RETURN |
| #define XCAM_FAIL_RETURN(exp) \ |
| if (!(exp)) { \ |
| XCAM_LOG_WARNING ("XCAM_FAIL_RETURN %s", #exp); \ |
| return ; \ |
| } |
| |
| void *xcam_new0(size_t size) |
| { |
| void *buf = malloc (size); |
| memset (buf, 0, size); |
| return buf; |
| } |
| |
| XCamCpfBlob * xcam_cpf_blob_new () |
| { |
| return (XCamCpfBlob*) xcam_new0 (sizeof(XCamCpfBlob)); |
| } |
| |
| void xcam_cpf_blob_free (XCamCpfBlob *blob) |
| { |
| XCAM_FAIL_RETURN (blob); |
| |
| if (blob->data) |
| xcam_free (blob->data); |
| |
| xcam_free (blob); |
| } |
| |
| static int32_t |
| read_cpf_file (const char *cpf_file, uint8_t **buf) |
| { |
| int32_t size = 0; |
| FILE *fp = fopen (cpf_file, "rb"); |
| XCAM_FAIL_RETURN_VAL (fp, -1); |
| |
| *buf = NULL; |
| |
| if (fseek (fp, 0, SEEK_END) < 0) |
| goto read_error; |
| if ((size = ftell (fp)) <= 0) |
| goto read_error; |
| if (fseek( fp, 0, SEEK_SET) < 0) |
| goto read_error; |
| |
| *buf = (uint8_t*) xcam_new0 (size); |
| XCAM_ASSERT (*buf); |
| if (fread (*buf, 1, size, fp) != (size_t) size) |
| goto read_error; |
| |
| fclose (fp); |
| return size; |
| |
| read_error: |
| XCAM_LOG_ERROR ("read cpf(%s) failed", cpf_file); |
| fclose (fp); |
| if (*buf) { |
| xcam_free (*buf); |
| *buf = NULL; |
| } |
| return -1; |
| |
| } |
| |
| boolean |
| xcam_cpf_read (const char *cpf_file, XCamCpfBlob *aiq_cpf, XCamCpfBlob *hal_cpf) |
| { |
| uint8_t *cpf_buf; |
| int32_t cpf_size; |
| |
| uint8_t *blob; |
| uint32_t blob_size; |
| |
| XCAM_FAIL_RETURN_VAL (cpf_file, FALSE); |
| XCAM_FAIL_RETURN_VAL (aiq_cpf, FALSE); |
| |
| /* read cpf */ |
| if ((cpf_size = read_cpf_file(cpf_file, &cpf_buf)) <= 0) { |
| XCAM_LOG_ERROR ("read cpf_file(%s) failed.", cpf_file); |
| return FALSE; |
| } |
| |
| /* check sum */ |
| if (tbd_validate (cpf_buf, cpf_size, tbd_tag_cpff) != tbd_err_none) { |
| XCAM_LOG_ERROR ("tbd validate cpf file(%s) failed.", cpf_file); |
| goto free_buf; |
| } |
| |
| /* fetch AIQ */ |
| if ( (tbd_get_record (cpf_buf, tbd_class_aiq, tbd_format_any, |
| (void**)&blob, &blob_size) != tbd_err_none) || |
| !blob || blob_size <= 0) { |
| XCAM_LOG_ERROR ("CPF parse AIQ record failed."); |
| goto free_buf; |
| } |
| aiq_cpf->data = (uint8_t*) malloc (blob_size); |
| XCAM_ASSERT (aiq_cpf->data); |
| aiq_cpf->size = blob_size; |
| memcpy (aiq_cpf->data, blob, blob_size); |
| |
| |
| #if 0 //DRV not necessary |
| /* fetch DRV */ |
| if (tbd_get_record (cpf_buf, tbd_class_drv, tbd_format_any, |
| &drv_blob.data, &drv_blob.size) != tbd_err_none) { |
| XCAM_LOG_ERROR ("CPF parse DRV record failed."); |
| return FALSE; |
| } |
| #endif |
| |
| |
| /* fetch HAL */ |
| if (hal_cpf) { |
| if (tbd_get_record (cpf_buf, tbd_class_hal, tbd_format_any, |
| (void**)&blob, &blob_size) != tbd_err_none) { |
| XCAM_LOG_WARNING ("CPF doesn't have HAL record."); |
| // ignore HAL, not necessary |
| } else if (blob && blob_size > 0) { |
| hal_cpf->data = (uint8_t*) malloc (blob_size); |
| XCAM_ASSERT (hal_cpf->data); |
| hal_cpf->size = blob_size; |
| memcpy (hal_cpf->data, blob, blob_size); |
| } |
| } |
| |
| xcam_free (cpf_buf); |
| return TRUE; |
| |
| free_buf: |
| xcam_free (cpf_buf); |
| return FALSE; |
| |
| } |