Я новичок в libgphoto2 и у меня были некоторые вопросы о том, где находится фактическая память изображений. Похоже, что фотографии доступны через объект, называемый CameraFile
, Есть пример, включенный в источник с именем sample-capture.c, который имеет функцию с именем capture_to_memory
,
В этой функции объект CameraFile создается и инициализируется с использованием gp_file_new
, Реализация gp_file_new
создает CameraFile
объект, член accesstype которого установлен в GP_FILE_ACCESSTYPE_MEMORY
,
Тот CameraFile
Затем объект передается gp_camera_file_get
и мне не очень понятно, что происходит в этой функции.
После звонка gp_camera_file_get
файл отправлен gp_file_get_data_and_size
, Глядя на реализацию этой функции, и учитывая, что файлы accesstype GP_FILE_ACCESSTYPE_MEMORY
, gp_file_get_data_and_size
функция не будет выделять какую-либо память и вместо этого просто назначит указатель на элемент данных CameraFile (то же самое с размером).
Так где же память, на которую указывает этот указатель? Это на реальной камере? Или это где-то в моей памяти? Я просто пытаюсь избежать как можно большего количества операций с памятью. Я нашел хороший пост в блоге
http://sepharads.blogspot.com/2011/11/camera-tethered-capturing-using.html?m=1
где CameraFile
объект создается через gp_file_new_from_fd
, Это устанавливает доступ к файлам GP_FILE_ACCESSTYPE_FD
, когда gp_file_get_data_and_size
вызывается для файла с этим accesstype, выделяется новая память и данные файла копируются в него. Тем не менее, это чтение с диска, или, по крайней мере, я предполагаю, что это так, поскольку FD означает дескриптор файла Unix, и ему нужна фактическая строка имени файла. Означает ли это, что gp_camera_file_get
считывает данные в файл на диске, если AcceSpepe CameraFile GP_FILE_ACCESSTYPE_FD
?
Есть функция под названием gp_file_free
, Если это файл FD, он закрывает дескриптор файла, но не вызывает free(file->data)
где угодно, так что я в замешательстве …
Что значит gp_camera_file_get
делать? Реализация есть, но это как-то меня бросило. Действительно ли он переносит файл из памяти моей камеры в память моего компьютера и выделяет CameraFile->data
в баран? Или это просто дает мне справку с чем-то, хранящимся на моей камере?
Извините, если это неправильное место, чтобы спросить, я видел какой-то список рассылки для libgphoto2, но я не мог сказать, насколько это было активно.
Неважно, я думаю, что нашел это.
Так gp_camera_file_get
в итоге звонит gp_filesystem_get_file
, который вызывает gp_filesystem_get_file_impl
, Эта функция смотрит на CameraFileType
и если это GP_FILE_TYPE_NORMAL
(что это, в моем случае), это вызывает gp_file_copy
с экземпляром CameraFileSystemFile в качестве источника.
gp_file_copy
в итоге звонит malloc
если GP_FILE_ACCESSTYPE_MEMORY
является accesstype файла назначения и записывает на диск, если accesstype GP_FILE_ACCESSTYPE_FD
,
Затем вызов gp_file_free
звонки gp_file_clean
, который вызывает free
если доступный GP_FILE_ACCESSTYPE_MEMORY
,
Других решений пока нет …