我是libgphoto2的新手,并对实际图像内存的位置有疑问。看来照片是通过称为CameraFile的对象访问的。源文件中包含一个名为sample-capture.c的示例,该示例具有一个名为capture_to_memory的函数。

在该函数中,使用gp_file_new创建并初始化CameraFile对象。 gp_file_new的实现创建一个CameraFile对象,其accesstype成员设置为GP_FILE_ACCESSTYPE_MEMORY

然后将该CameraFile对象传递给gp_camera_file_get,我不清楚该函数会发生什么。

调用gp_camera_file_get之后,文件将发送到gp_file_get_data_and_size。查看该函数的实现,并假设文件访问类型为GP_FILE_ACCESSTYPE_MEMORYgp_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时,将分配新的内存,并将文件的数据复制到其中。但是,这是从磁盘读取的,或者至少我认为是因为FD表示Unix File Descriptor,并且它需要一个实际的文件名字符串。如果CameraFile的访问类型为gp_camera_file_get,这是否意味着GP_FILE_ACCESSTYPE_FD将数据读取到磁盘上的文件中?

有一个名为gp_file_free的函数。如果它是FD文件,则会关闭文件句柄,但不会在任何地方调用free(file->data),所以我很困惑...
gp_camera_file_get是做什么的?那里有实现,但是有点让我失望。它实际上会将文件从相机的内存带到计算机的内存,并在ram中分配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最终会调用GP_FILE_ACCESSTYPE_FD;如果访问类型是gp_file_free,则gp_file_clean会写入磁盘。

然后,对free的调用将调用GP_FILE_ACCESSTYPE_MEMORY,如果访问类型为ojit_code,则将调用ojit_code。

关于c++ - gp_camera_file_get如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34050599/

10-10 17:47