Когда 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)