1

我是 libgphoto2 的新手,对实际图像内存的位置有一些疑问。似乎照片是通过一个名为 a 的对象访问的CameraFile。源代码中包含一个名为 sample-capture.c 的示例,该示例具有一个名为 的函数capture_to_memory

在该函数中,使用创建和初始化 CameraFile 对象gp_file_new。的实现gp_file_new创建了一个CameraFile访问类型成员设置为 的对象GP_FILE_ACCESSTYPE_MEMORY

CameraFile然后将该对象传递给,我gp_camera_file_get不太清楚这个函数中发生了什么。

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

有一个函数叫做gp_file_free. 如果它是一个 FD 文件,它会关闭文件句柄,但它不会free(file->data)在任何地方调用,所以我很困惑......

做什么gp_camera_file_get?实现就在那里,但它有点让我失望。它实际上是否将文件从我的相机内存带到我的计算机内存并CameraFile->data在内存中分配?还是它只是让我处理存储在相机上的东西?

抱歉,如果问错了地方,我确实看到了 libgphoto2 的某种邮件列表,但我不知道它有多活跃。

4

1 回答 1

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最终调用mallocifGP_FILE_ACCESSTYPE_MEMORY是目标文件的访问类型,如果访问类型是 . 则写入磁盘GP_FILE_ACCESSTYPE_FD

然后,调用gp_file_freecalls gp_file_cleanfree如果 accesstype 是GP_FILE_ACCESSTYPE_MEMORY

于 2015-12-02T20:16:09.643 回答