2015-12-02 1 views
1

Я новичок в libgphoto2 и задал некоторые вопросы о том, где находится фактическая память изображений. Кажется, что доступ к фотографиям осуществляется через объект, называемый CameraFile. Вот пример, включенный в источник, называемый sample-capture.c, который имеет функцию, называемую capture_to_memory.Как работает gp_camera_file_get?

В этой функции объект 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. Это устанавливает файлы accesstype в GP_FILE_ACCESSTYPE_FD. Когда gp_file_get_data_and_size вызывается в файле с этим accesstype, выделяется новая память и данные файла копируются в нее. Тем не менее, это считывается с диска или, по крайней мере, я предполагаю, что это означает, что FD означает Unix File Descriptor, и ему нужна фактическая строка имени файла. Означает ли это, что gp_camera_file_get считывает данные в файл на диске, если атрибут CameraFile равен GP_FILE_ACCESSTYPE_FD?

Существует функция, называемая gp_file_free. Если это файл FD, он закрывает дескриптор файла, но он не вызывает free(file->data) в любом месте, поэтому я довольно смущен ...

Что делает gp_camera_file_get? Реализация там, но это меня бросило. Действительно ли это приводит файл из памяти моей камеры в память моего компьютера и выделяет CameraFile->data в ram? Или это просто дает мне ручку тому, что хранится на моей камере?

Извините, если это не подходящее место, я просмотрел какой-то список рассылки для libgphoto2, но я не мог сказать, насколько он активен.

ответ

1

Ничего, я думаю, что нашел.

Таким образом, 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 если AccessType является GP_FILE_ACCESSTYPE_MEMORY.

Смежные вопросы