Когда exif_data_save_data add адрес ошибки в libexif memcpy

Когда exif_data_save_data add адрес ошибки в libexif memcpy, журнал ошибок и код следующим образом, пожалуйста, помогите мне. Я хочу записать некоторую информацию exif в jpeg, и я записываю некоторую информацию exif в начало файла jpeg buffer.but иногда появляются такие ошибка.

Мой код выглядит следующим образом:

int ReadFileToStringLeft(const string &filename, string *data,
                        const android::CameraMetadata& cameraMetadata,
                        const uint32_t width, const uint32_t height) {
    QMMF_INFO("%s:%s: Enter", TAG, __func__);
    FILE* file_descriptor = fopen(filename.c_str(), "r");
    if (!file_descriptor) {
        QMMF_ERROR("%s:%s: Open error", TAG, __func__);
        return -1;
    }

    //init exif info data structure
    unsigned char *exif_data;
    unsigned int exif_data_len;
    ExifEntry *entry;
    ExifData *exif = exif_data_new();
    if (!exif) {
        QMMF_ERROR("%s:%s: Out of memory\n", TAG, __func__);
        return 2;
    }

    /* Set the image options */
    exif_data_set_option(exif, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
    exif_data_set_data_type(exif, EXIF_DATA_TYPE_COMPRESSED);
    exif_data_set_byte_order(exif, FILE_BYTE_ORDER);

    /* Create the mandatory EXIF fields with default data */
    exif_data_fix(exif);
     //add exif infos
    ExifRational r;
    ExifSRational sr;

    int32_t ae_exposure = 0;
    if (cameraMetadata.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
       ae_exposure =
          cameraMetadata.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
    }
    entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_BRIGHTNESS_VALUE,
                                      exif_format_get_size(EXIF_FORMAT_SRATIONAL));
    entry->format = EXIF_FORMAT_SRATIONAL;
    sr.numerator = (ExifSLong) (ae_exposure * 1000);
    sr.denominator = (ExifSLong) 1000;
    exif_set_srational(entry->data, FILE_BYTE_ORDER, sr);

    int64_t exposure_time = 0;
    if (cameraMetadata.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
      exposure_time =
         cameraMetadata.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
    }
    entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME,
                    exif_format_get_size(EXIF_FORMAT_RATIONAL));
    entry->format = EXIF_FORMAT_RATIONAL;
    r.numerator = (ExifLong) exposure_time;
    r.denominator = (ExifLong) (1000*1000*1000);
    exif_set_rational(entry->data, FILE_BYTE_ORDER, r);

    int32_t PhotographicSensitivity = 0;
    if (cameraMetadata.exists(ANDROID_SENSOR_SENSITIVITY)) {
         PhotographicSensitivity =
             cameraMetadata.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
     }
    entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS,
                        exif_format_get_size(EXIF_FORMAT_SHORT));
    entry->format = EXIF_FORMAT_SHORT;
    exif_set_short(entry->data, FILE_BYTE_ORDER, PhotographicSensitivity);

     float focal_length = 0;
     if (cameraMetadata.exists(ANDROID_LENS_FOCAL_LENGTH)) {
         focal_length = cameraMetadata.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
     }
     entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH,
                         exif_format_get_size(EXIF_FORMAT_RATIONAL));
     entry->format = EXIF_FORMAT_RATIONAL;
     r.numerator = (ExifLong) (focal_length * 1000);
     r.denominator = (ExifLong) 1000;
     exif_set_rational(entry->data, FILE_BYTE_ORDER, r);

     float apex_value=0;
      if (cameraMetadata.exists(ANDROID_LENS_APERTURE)) {
         float aperture = cameraMetadata.find(ANDROID_LENS_APERTURE).data.f[0];
         apex_value = 2 * log2(aperture);
       }
      entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_APERTURE_VALUE,
                               exif_format_get_size(EXIF_FORMAT_RATIONAL));
       entry->format = EXIF_FORMAT_RATIONAL;
       r.numerator = (ExifLong) (apex_value * 1000);
       r.denominator = (ExifLong) 1000;
       exif_set_rational(entry->data, FILE_BYTE_ORDER, r);

       uint8_t aeMode=0;
      if (cameraMetadata.exists(ANDROID_CONTROL_AE_MODE)) {
          uint8_t ae_mode = cameraMetadata.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
          if (ae_mode == ANDROID_CONTROL_AE_MODE_ON) {
            aeMode = 0;
          } else {
            aeMode = 1;
          }
        }
      entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE,
                              exif_format_get_size(EXIF_FORMAT_SHORT));
      entry->format = EXIF_FORMAT_SHORT;
      exif_set_short(entry->data, FILE_BYTE_ORDER, aeMode);

      uint8_t awbMode=0;
      if (cameraMetadata.exists(ANDROID_CONTROL_AWB_MODE)) {
          uint8_t awb_mode = cameraMetadata.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
          if (awb_mode == ANDROID_CONTROL_AWB_MODE_AUTO) {
            awbMode = 0;
          } else {
            awbMode = 1;
          }
        }
      entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_WHITE_BALANCE,
                                      exif_format_get_size(EXIF_FORMAT_SHORT));
      entry->format = EXIF_FORMAT_SHORT;
      exif_set_short(entry->data, FILE_BYTE_ORDER, awbMode);

      char manufacturer[PROPERTY_VALUE_MAX];
      property_get("ro.product.manufacturer", manufacturer, MAKE);
      entry = create_tag(exif, EXIF_IFD_0, EXIF_TAG_MAKE,
                    strlen(manufacturer));
      entry->format = EXIF_FORMAT_ASCII;
      memcpy(entry->data, manufacturer, strlen(manufacturer));

      char model[PROPERTY_VALUE_MAX];
      property_get("ro.product.model", model, MAKE);
      entry = create_tag(exif, EXIF_IFD_0, EXIF_TAG_MODEL,
                          strlen(model));
      entry->format = EXIF_FORMAT_ASCII;
      memcpy(entry->data, model, strlen(model));

      char date[80];
      time_t now = time(NULL);
      strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&now));
      entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL,
                                strlen(date));
      entry->format = EXIF_FORMAT_ASCII;
      memcpy(entry->data, date, strlen(date));
      entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_DIGITIZED,
                                      strlen(date));
        entry->format = EXIF_FORMAT_ASCII;
        memcpy(entry->data, date, strlen(date));

       entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_COLOR_SPACE);
        exif_set_short(entry->data, FILE_BYTE_ORDER, 1);

      entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_PIXEL_X_DIMENSION);
        exif_set_long(entry->data, FILE_BYTE_ORDER, width);

        entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_PIXEL_Y_DIMENSION);
        exif_set_long(entry->data, FILE_BYTE_ORDER, height);

      entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_FLASH,
                                             exif_format_get_size(EXIF_FORMAT_SHORT));
      entry->format = EXIF_FORMAT_SHORT;
      exif_set_short(entry->data, FILE_BYTE_ORDER, 0);

    entry = create_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_SHUTTER_SPEED_VALUE,
                                            exif_format_get_size(EXIF_FORMAT_SRATIONAL));
    entry->format = EXIF_FORMAT_SRATIONAL;
    sr.numerator = (ExifSLong) (0 * 1000);
    sr.denominator = (ExifSLong) 1000;
    exif_set_srational(entry->data, FILE_BYTE_ORDER, sr);

    entry = create_tag(exif, EXIF_IFD_INTEROPERABILITY, EXIF_TAG_INTEROPERABILITY_INDEX,
                             sizeof(INTEROPERABILITY_VERSION)-1);
    entry->format = EXIF_FORMAT_ASCII;
    memcpy(entry->data, INTEROPERABILITY_VERSION, sizeof(INTEROPERABILITY_VERSION)-1);

    entry = create_tag(exif, EXIF_IFD_INTEROPERABILITY, EXIF_TAG_INTEROPERABILITY_VERSION,
                                 inter_version_len);
    memcpy(entry->data, inter_version, inter_version_len);

    exif_data_save_data(exif, &exif_data, &exif_data_len);

    int total_size= exif_header_len +exif_data_len + 2 * sizeof(char);
    unsigned char *exif_data_tmp =(unsigned char *)malloc(total_size);
    memset(exif_data_tmp,0,total_size);

    int ptr=0;
    memcpy(exif_data_tmp+ptr, exif_header, exif_header_len);
    ptr+=exif_header_len;

    unsigned char *size_ptr;
    unsigned char size1=(unsigned char)((exif_data_len+2) >> 8);
    size_ptr=&size1;
    memcpy(exif_data_tmp+ptr, size_ptr, sizeof(char));
    ptr+=sizeof(char);

    unsigned char size2=(unsigned char)((exif_data_len+2) & 0xff);
    size_ptr=&size2;
    memcpy(exif_data_tmp+ptr, size_ptr, sizeof(char));
    ptr+=sizeof(char);

    memcpy(exif_data_tmp+ptr, exif_data, exif_data_len);
    ptr+=exif_data_len;

    // Resize the input buffer appropriately.
    fseek(file_descriptor, 0L, SEEK_END);
    int num_bytes = ftell(file_descriptor)-image_data_offset;
    data->resize(num_bytes+total_size);

    //copy exif_data to data string
    memcpy(&((*data)[0]), exif_data_tmp, total_size);

    // Read the data.
    fseek(file_descriptor, image_data_offset, SEEK_SET);

    int num_read = fread(&((*data)[total_size]),
                       sizeof((*data)[0]),
                       num_bytes,
                       file_descriptor);

    if (num_read != num_bytes) {
        QMMF_ERROR("%s:%s: Read error", TAG, __func__);
    }

    fclose(file_descriptor);
    free(exif_data_tmp);
    exif_data_tmp = NULL;
    free(exif_data);
    exif_data_unref(exif);
    exif_entry_unref(entry);
    QMMF_INFO("%s:%s: Exit.", TAG, __func__);
    return 0;
}

Журнал таков, почему ошибка addr?

--------- beginning of crash
01-18 09:38:04.366  2165  3510 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xc9300000 in tid 3510 (Binder:2165_4)
01-18 09:38:04.600  1015  1015 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-18 09:38:04.600  1015  1015 F DEBUG   : Build fingerprint: 'Android/msm8953_64/msm8953_64:7.1.1/NMF26X/VR4501F_S100084_171122:userdebug/test-keys'
01-18 09:38:04.600  1015  1015 F DEBUG   : Revision: '0'
01-18 09:38:04.600  1015  1015 F DEBUG   : ABI: 'arm'
01-18 09:38:04.600  1015  1015 F DEBUG   : pid: 2165, tid: 3510, name: Binder:2165_4  >>> com.google.vr <<<
01-18 09:38:04.600  1015  1015 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc9300000
01-18 09:38:04.600  1015  1015 F DEBUG   :     r0 d4822fd0  r1 c92ffff2  r2 00000016  r3 0000000a
01-18 09:38:04.600  1015  1015 F DEBUG   :     r4 c5a46230  r5 c92f1500  r6 c84ff144  r7 c84ff144
01-18 09:38:04.600  1015  1015 F DEBUG   :     r8 00000040  r9 00000220  sl 0000010a  fp 0000000a
01-18 09:38:04.600  1015  1015 F DEBUG   :     ip 40000000  sp c84fefd8  lr 00000008  pc f4cb47c4  cpsr 20030010
01-18 09:38:04.617  1015  1015 F DEBUG   :
01-18 09:38:04.617  1015  1015 F DEBUG   : backtrace:
01-18 09:38:04.618  1015  1015 F DEBUG   :     #00 pc 000177c4  /system/lib/libc.so (memcpy+152)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #01 pc 000087b7  /system/lib/libexif.so
01-18 09:38:04.618  1015  1015 F DEBUG   :     #02 pc 000088af  /system/lib/libexif.so
01-18 09:38:04.618  1015  1015 F DEBUG   :     #03 pc 00008547  /system/lib/libexif.so (exif_data_save_data+142)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #04 pc 0000fa03  /system/lib/libqmmf_capture_image.so (_Z20ReadFileToStringLeftRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPS5_RKN7android14CameraMetadataEjj+1230)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #05 pc 0000ffcd  /system/lib/libqmmf_capture_image.so (_Z17PostProcessImagesjN4qmmf16BufferDescriptorENS_8recorder8MetaDataEN7android7String8ERKNSt3__18functionIFvjS0_EEERKNS3_14CameraMetadataE+500)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #06 pc 00014015  /system/lib/libqmmf_camera.so (_ZN7goertek6camera8VRCamera15CaptureCallbackEN7android7String8EjjN4qmmf16BufferDescriptorENS4_8recorder8MetaDataE+224)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #07 pc 00015035  /system/lib/libqmmf_camera.so
01-18 09:38:04.618  1015  1015 F DEBUG   :     #08 pc 00016d87  /system/lib/libqmmf_recorder_client.so (_ZN4qmmf8recorder14RecorderClient18NotifySnapshotDataEjjRNS0_8BnBufferERNS0_8MetaDataE+430)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #09 pc 000182eb  /system/lib/libqmmf_recorder_client.so (_ZN4qmmf8recorder25BnRecorderServiceCallback10onTransactEjRKN7android6ParcelEPS3_j+210)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #10 pc 000186e3  /system/lib/libqmmf_recorder_client.so (_ZThn4_N4qmmf8recorder25BnRecorderServiceCallback10onTransactEjRKN7android6ParcelEPS3_j+6)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #11 pc 000359c3  /system/lib/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+70)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #12 pc 0003d1bb  /system/lib/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+702)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #13 pc 0003ce07  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+114)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #14 pc 0003d31b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #15 pc 0004f8d5  /system/lib/libbinder.so
01-18 09:38:04.618  1015  1015 F DEBUG   :     #16 pc 0000e345  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #17 pc 00066e0d  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+80)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #18 pc 00046fe3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
01-18 09:38:04.618  1015  1015 F DEBUG   :     #19 pc 00019ced  /system/lib/libc.so (__start_thread+6)

0 ответов

Другие вопросы по тегам