C++ gp\u摄像机\u文件\u如何工作?
我是libgphoto2新手,对实际图像内存的位置有一些疑问。照片似乎是通过一个名为C++ gp\u摄像机\u文件\u如何工作?,c++,c,memory,libgphoto2,C++,C,Memory,Libgphoto2,我是libgphoto2新手,对实际图像内存的位置有一些疑问。照片似乎是通过一个名为CameraFile的对象访问的。源代码中有一个名为sample capture.c的示例,它有一个名为capture\u to\u memory的函数 在该函数中,使用gp\u file\u new创建并初始化CameraFile对象。gp\u file\u new的实现创建了一个CameraFile对象,其accesstype成员设置为gp\u file\u accesstype\u MEMORY 然后,该C
CameraFile
的对象访问的。源代码中有一个名为sample capture.c的示例,它有一个名为capture\u to\u memory
的函数
在该函数中,使用gp\u file\u new
创建并初始化CameraFile对象。gp\u file\u new
的实现创建了一个CameraFile
对象,其accesstype成员设置为gp\u file\u accesstype\u MEMORY
然后,该CameraFile
对象被传递到gp\u camera\u file\u get
,我不太清楚这个函数中发生了什么
调用gp\u-camera\u-file\u-get
后,文件将被发送到gp\u-file\u-get\u-data\u和\u-size
。查看该函数的实现,如果files accesstype是GP\u FILE\u accesstype\u MEMORY
,那么GP\u FILE\u get\u data\u和\u size
函数将不会分配任何内存,而只是将指针分配给CameraFile的数据成员(与size相同)
那么这个指针指向的内存在哪里呢?它在真实的摄像机上吗?还是在我的公羊里?我只是尽量避免内存操作。我发现了一篇很好的博客文章
其中,CameraFile
对象是通过gp\u file\u new\u从\u fd
创建的。这将文件访问类型设置为GP\u FILE\u accesstype\u FD
。当对具有此访问类型的文件调用gp\u file\u get\u data\u和\u size
时,将分配新内存并将文件的数据复制到其中。然而,这是从磁盘读取的,或者至少我认为是因为FD表示Unix文件描述符,并且它需要实际的文件名字符串。这是否意味着如果摄像头文件的accestype为gp\u文件访问类型\u FD
,则gp\u摄像头\u文件\u get
会将数据读取到磁盘上的文件中
有一个函数叫做gp\u file\u free
。如果它是一个FD文件,它会关闭文件句柄,但它不会在任何地方调用free(file->data)
,所以我很困惑
gp\u摄像头\u文件\u get
做什么?实现就在那里,但它让我有点不知所措。它是否真的将文件从我相机的内存带到我电脑的内存,并在ram中分配CameraFile->data
?或者它只是给了我一个存储在我相机上的东西的手柄
抱歉,如果问错地方了,我确实看到了libgphoto2的邮件列表,但我不知道它有多活跃 没关系,我想我找到了 因此,
gp\u-camera\u-file\u-get
最终调用了gp\u-filesystem\u-get\u-file
,它调用了gp\u-filesystem\u-get\u-file\u-impl
。该函数查看CameraFileType
,如果它是GP\u FILE\u TYPE\u NORMAL
(在我的例子中就是这样),它将调用GP\u FILE\u copy
,并将CameraFileSystemFile的实例作为源
gp\u file\u copy
如果gp\u file\u ACCESSTYPE\u MEMORY
是目标文件的访问类型,则调用malloc
,如果访问类型是gp\u file\u ACCESSTYPE\u FD
,则写入磁盘
然后,调用gp\u file\u free
调用gp\u file\u clean
,如果accesstype是gp\u file\u accesstype\u MEMORY
,则调用free