You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.6 KiB
98 lines
3.6 KiB
#!/usr/bin/env python3
|
|
|
|
from ctypes import *
|
|
from sys import platform, exit
|
|
|
|
large_image1_path = "../test_images/sample_01_large.jpg".encode(encoding="utf-8")
|
|
medium_image1_path = "../test_images/sample_01_medium.jpg".encode(encoding="utf-8")
|
|
small_image1_path = "../test_images/sample_01_small.jpg".encode(encoding="utf-8")
|
|
|
|
large_image2_path = "../test_images/sample_02_large.jpg".encode(encoding="utf-8")
|
|
medium_image2_path = "../test_images/sample_02_medium.jpg".encode(encoding="utf-8")
|
|
small_image2_path = "../test_images/sample_02_small.jpg".encode(encoding="utf-8")
|
|
|
|
large_image3_path = "../test_images/sample_03_large.jpg".encode(encoding="utf-8")
|
|
medium_image3_path = "../test_images/sample_03_medium.jpg".encode(encoding="utf-8")
|
|
small_image3_path = "../test_images/sample_03_small.jpg".encode(encoding="utf-8")
|
|
|
|
large_image4_path = "../test_images/sample_04_large.jpg".encode(encoding="utf-8")
|
|
medium_image4_path = "../test_images/sample_04_medium.jpg".encode(encoding="utf-8")
|
|
small_image4_path = "../test_images/sample_04_small.jpg".encode(encoding="utf-8")
|
|
|
|
test_images = [
|
|
large_image1_path, medium_image1_path, small_image1_path,
|
|
large_image2_path, medium_image2_path, small_image2_path,
|
|
large_image3_path, medium_image3_path, small_image3_path,
|
|
large_image4_path, medium_image4_path, small_image4_path
|
|
]
|
|
|
|
|
|
def unsigned64(number):
|
|
return (number & 0xfffffffffffffffff)
|
|
|
|
|
|
print("starting ffi test")
|
|
|
|
# Load the shared library
|
|
lib = None
|
|
if platform == 'win32':
|
|
lib = cdll.pihash
|
|
elif platform == 'darwin':
|
|
lib = cdll.LoadLibrary("libpihash.dylib")
|
|
elif platform == 'linux' or platform == 'linux2':
|
|
lib = cdll.LoadLibrary("libpihash.so")
|
|
else:
|
|
print('Unrecognized platform ', platform)
|
|
exit(-1)
|
|
|
|
|
|
class PIHashes(Structure):
|
|
_fields_ = [
|
|
("ahash", c_ulonglong),
|
|
("dhash", c_ulonglong),
|
|
("phash", c_ulonglong)]
|
|
|
|
|
|
# Setting the ctypes return type references for the foreign functions
|
|
# returns a pointer to the library that we'll need to pass to all function calls
|
|
lib.ext_init.restype = c_void_p
|
|
lib.ext_init.argtypes = [c_char_p]
|
|
# Returns a longlong hash, takes a pointer and a string
|
|
lib.ext_get_ahash.restype = c_ulonglong
|
|
lib.ext_get_ahash.argtypes = [c_void_p, c_char_p]
|
|
lib.ext_get_dhash.restype = c_ulonglong
|
|
lib.ext_get_dhash.argtypes = [c_void_p, c_char_p]
|
|
lib.ext_get_phash.restype = c_ulonglong
|
|
lib.ext_get_phash.argtypes = [c_void_p, c_char_p]
|
|
lib.ext_get_pihashes.restype = c_void_p
|
|
lib.ext_get_pihashes.argtypes = [c_void_p, c_char_p]
|
|
lib.ext_free_pihashes.argtypes = [c_void_p]
|
|
# Takes a pointer and frees the struct at that memory location
|
|
lib.ext_free.argtypes = [c_void_p]
|
|
|
|
# initialize the library
|
|
lib_struct = lib.ext_init("./.hash_cache".encode('utf-8'))
|
|
|
|
# print("Pointer to lib_struct: ", lib_struct)
|
|
|
|
# Print the path and the bytes as hex for debugging
|
|
# print(large_image_path)
|
|
# print('\\x'+'\\x'.join('{:02x}'.format(x) for x in large_image_path))
|
|
|
|
for image in test_images:
|
|
print("Requesting hashes for: %s" % image)
|
|
phashes = lib.ext_get_pihashes(lib_struct, image)
|
|
pihashes = PIHashes.from_address(phashes)
|
|
lib.ext_free_pihashes(phashes)
|
|
print("ahash: %i" % unsigned64(pihashes.ahash))
|
|
print("dhash: %i" % unsigned64(pihashes.dhash))
|
|
print("phash: %i" % unsigned64(pihashes.phash))
|
|
# print("ahash: %i"% unsigned64(lib.ext_get_ahash(lib_struct, image)))
|
|
# print("dhash: %i"% unsigned64(lib.ext_get_dhash(lib_struct, image)))
|
|
# print("phash: %i"% unsigned64(lib.ext_get_phash(lib_struct, image)))
|
|
|
|
# Do cleanup
|
|
# Makes sure that the heap is cleaned up
|
|
lib.ext_free(lib_struct)
|
|
|
|
print("ffi test finished")
|