2015-12-02 86 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

CameraFileCameraFile然後傳遞給gp_camera_file_get,我不清楚在這個函數中會發生什麼。

打電話給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

其中通過gp_file_new_from_fd創建CameraFile對象。這將文件accesstype設置爲GP_FILE_ACCESSTYPE_FD。當使用此accesstype在文件上調用gp_file_get_data_and_size時,會分配新內存並將文件的數據複製到其中。但是,這是從磁盤讀取的,或者至少我認爲這是因爲FD意味着Unix文件描述符,並且它需要一個實際的文件名字符串。這是否意味着如果CameraFile的accestype爲GP_FILE_ACCESSTYPE_FDgp_camera_file_get將數據讀入磁盤上的文件?

有一個函數叫做gp_file_free。如果它是一個FD文件,它會關閉文件句柄,但它不會在任何地方調用free(file->data),所以我很困惑...

gp_camera_file_get是做什麼用的?實施在那裏,但它有點扔我。它實際上是否將我的相機內存中的文件帶到了我的電腦內存中,並在內存中分配了CameraFile->data?或者它只是讓我處理存儲在我的相機上的東西?

對不起,如果這是錯誤的地方問,我確實看到某種類型的libgphoto2郵件列表,但我不知道它是如何活躍。

回答

1

沒關係,我想我找到了它。

因此gp_camera_file_get結束呼叫gp_filesystem_get_file,它調用gp_filesystem_get_file_impl。該函數查看CameraFileType,如果它是GP_FILE_TYPE_NORMAL(就我而言),它將CameraFileSystemFile的實例作爲源調用gp_file_copy

gp_file_copy結束調用malloc如果GP_FILE_ACCESSTYPE_MEMORY是目標文件的接入類型,如果接入類型是GP_FILE_ACCESSTYPE_FD寫入磁盤。

然後,調用gp_file_free調用gp_file_clean,它調用free如果接入類型是GP_FILE_ACCESSTYPE_MEMORY