Update exif module

This commit is contained in:
2023-03-26 07:41:42 +00:00
committed by GitHub
parent 7867190b23
commit c9204f4d54
5 changed files with 215 additions and 71 deletions

View File

@@ -21,6 +21,8 @@ typedef struct ExifDataRef ExifDataRef;
typedef struct ExifDataItor ExifDataItor;
/// <div rustbindgen opaque></div>
typedef struct ExifDatumRef ExifDatumRef;
/// <div rustbindgen opaque></div>
typedef struct ExifValueRef ExifValueRef;
#if defined _WIN32 && defined WIN32_DLL
#if BUILD_DLL
#define EXIF_API __declspec(dllexport)
@@ -51,15 +53,17 @@ EXIF_API int exif_get_key_default_type_id(ExifKey* key);
EXIF_API void exif_free(void* v);
EXIF_API void exif_free_key(ExifKey* key);
EXIF_API ExifValue* exif_create_value(int type_id);
EXIF_API int exif_get_value_type_id(ExifValue* value);
EXIF_API long exif_get_value_count(ExifValue* value);
EXIF_API long exif_get_value_size(ExifValue* value);
EXIF_API long exif_get_value_size_data_area(ExifValue *value);
EXIF_API int exif_value_read(ExifValue* value, const uint8_t* bytes, long len, int byte_order);
EXIF_API int exif_get_value_ok(ExifValue* value);
EXIF_API char* exif_value_to_string(ExifValue* value, size_t* len);
EXIF_API char* exif_value_to_string2(ExifValue* value, size_t* len, long i);
EXIF_API int64_t exif_value_to_int64(ExifValue* value, long i);
EXIF_API ExifValueRef* exif_value_get_ref(ExifValue* value);
EXIF_API int exif_get_value_type_id(ExifValueRef* value);
EXIF_API long exif_get_value_count(ExifValueRef* value);
EXIF_API long exif_get_value_size(ExifValueRef* value);
EXIF_API long exif_get_value_size_data_area(ExifValueRef *value);
EXIF_API int exif_value_read(ExifValueRef* value, const uint8_t* bytes, long len, int byte_order);
EXIF_API int exif_get_value_ok(ExifValueRef* value);
EXIF_API char* exif_value_to_string(ExifValueRef* value, size_t* len);
EXIF_API char* exif_value_to_string2(ExifValueRef* value, size_t* len, long i);
EXIF_API int64_t exif_value_to_int64(ExifValueRef* value, long i);
EXIF_API ExifValue* exif_value_ref_clone(ExifValueRef* value);
EXIF_API ExifData* exif_data_new();
EXIF_API int exif_data_ref_add(ExifDataRef* d, ExifKey* key, ExifValue* value);
EXIF_API int exif_data_ref_clear(ExifDataRef* d);
@@ -72,6 +76,7 @@ EXIF_API void exif_data_ref_sort_by_tag(ExifDataRef* d);
EXIF_API ExifDataItor* exif_data_ref_iter(ExifDataRef* d);
EXIF_API ExifDatumRef* exif_data_itor_next(ExifDataItor* itor);
EXIF_API char* exif_datum_key(ExifDatumRef* d);
EXIF_API ExifValueRef* exif_datum_value(ExifDatumRef *d);
EXIF_API void exif_free_value(ExifValue* value);
EXIF_API void exif_free_data(ExifData* d);
EXIF_API void exif_free_data_itor(ExifDataItor* itor);

View File

@@ -196,38 +196,44 @@ end:
return nullptr;
}
int exif_get_value_type_id(ExifValue* value) {
if (!value) return -1;
ExifValueRef* exif_value_get_ref(ExifValue* value) {
if (!value) return nullptr;
value->ref.value = value->value.get();
return &value->ref;
}
int exif_get_value_type_id(ExifValueRef* value) {
if (!value || !value->value) return -1;
return value->value->typeId();
}
long exif_get_value_count(ExifValue* value) {
if (!value) return -1;
long exif_get_value_count(ExifValueRef* value) {
if (!value || !value->value) return -1;
return value->value->count();
}
long exif_get_value_size(ExifValue* value) {
if (!value) return -1;
long exif_get_value_size(ExifValueRef* value) {
if (!value || !value->value) return -1;
return value->value->size();
}
long exif_get_value_size_data_area(ExifValue* value) {
if (!value) return -1;
long exif_get_value_size_data_area(ExifValueRef* value) {
if (!value || !value->value) return -1;
return value->value->sizeDataArea();
}
int exif_value_read(ExifValue* value, const uint8_t* bytes, long len, int byte_order) {
if (!value || !bytes) return -1;
int exif_value_read(ExifValueRef* value, const uint8_t* bytes, long len, int byte_order) {
if (!value || !bytes || !value->value) return -1;
return value->value->read(bytes, len, static_cast<Exiv2::ByteOrder>(byte_order));
}
int exif_get_value_ok(ExifValue* value) {
if (!value) return 0;
int exif_get_value_ok(ExifValueRef* value) {
if (!value || !value->value) return 0;
return value->value->ok() ? 1 : 0;
}
char* exif_value_to_string(ExifValue* value, size_t* len) {
if (!value || !len) return nullptr;
char* exif_value_to_string(ExifValueRef* value, size_t* len) {
if (!value || !len || !value->value) return nullptr;
auto s = value->value->toString();
*len = s.size();
char* tmp = nullptr;
@@ -235,8 +241,8 @@ char* exif_value_to_string(ExifValue* value, size_t* len) {
return tmp;
}
char* exif_value_to_string2(ExifValue* value, size_t* len, long i) {
if (!value || !len) return nullptr;
char* exif_value_to_string2(ExifValueRef* value, size_t* len, long i) {
if (!value || !len || !value->value) return nullptr;
auto s = value->value->toString(i);
*len = s.size();
char* tmp = nullptr;
@@ -244,11 +250,26 @@ char* exif_value_to_string2(ExifValue* value, size_t* len, long i) {
return tmp;
}
int64_t exif_value_to_int64(ExifValue* value, long i) {
if (!value) return -1;
int64_t exif_value_to_int64(ExifValueRef* value, long i) {
if (!value || !value->value) return -1;
return value->value->toInt64(i);
}
ExifValue* exif_value_ref_clone(ExifValueRef* value) {
if (!value || !value->value) return nullptr;
ExifValue* v = new ExifValue;
try {
v->value = value->value->clone();
} catch (std::exception& e) {
printf("%s\n", e.what());
goto end;
}
return v;
end:
if (v) delete v;
return nullptr;
}
ExifData* exif_data_new() {
return new ExifData;
}
@@ -299,6 +320,7 @@ long exif_data_ref_get_count(ExifDataRef* d) {
void exif_free_value(ExifValue* value) {
if (!value) return;
value->ref.value = nullptr;
delete value;
}
@@ -342,8 +364,19 @@ ExifDatumRef* exif_data_itor_next(ExifDataItor* itor) {
}
char* exif_datum_key(ExifDatumRef* d) {
if (!d->data) return nullptr;
if (!d || !d->data) return nullptr;
char* re = nullptr;
if (!string2char(d->data->key(), re)) return nullptr;
return re;
}
ExifValueRef* exif_datum_value(ExifDatumRef *d) {
if (!d || !d->data) return nullptr;
try {
d->ref.value = (Exiv2::Value*)&d->data->value();
} catch (std::exception& e) {
printf("%s\n", e.what());
return nullptr;
}
return &d->ref;
}

View File

@@ -11,20 +11,25 @@ typedef struct ExifImage {
typedef struct ExifKey {
Exiv2::ExifKey* key = nullptr;
} ExifKey;
typedef struct ExifValueRef {
Exiv2::Value* value;
} ExifValueRef;
typedef struct ExifValue {
Exiv2::Value::UniquePtr value;
ExifValueRef ref;
} ExifValue;
typedef struct ExifData {
Exiv2::ExifData data;
ExifDataRef ref;
} ExifData;
typedef struct ExifDatum {
Exiv2::Exifdatum data;
ExifDataRef ref;
} ExifDatum;
typedef struct ExifDatumRef {
Exiv2::Exifdatum* data;
ExifValueRef ref;
} ExifDatumRef;
typedef struct ExifDatum {
Exiv2::Exifdatum data;
ExifDatumRef ref;
} ExifDatum;
typedef struct ExifDataItor {
ExifDataRef ref;
ExifDatumRef ref2;