summaryrefslogtreecommitdiff
path: root/camlibs
diff options
context:
space:
mode:
authorMarcus Meissner <marcus@jet.franken.de>2021-04-10 18:01:52 +0200
committerMarcus Meissner <marcus@jet.franken.de>2021-04-10 18:01:52 +0200
commit30151d4ac7f9df4d931fca9e571e2ae5d6eab9ef (patch)
tree5fdb6a4f0586bd7a9b856d06a658061f4f195769 /camlibs
parent0bfa00a09bd938b8dcddc2511326f0e547385072 (diff)
downloadlibgphoto2-30151d4ac7f9df4d931fca9e571e2ae5d6eab9ef.tar.gz
first sucessfull (but not fully correct) capture code for sigma fp
https://github.com/gphoto/libgphoto2/issues/537
Diffstat (limited to 'camlibs')
-rw-r--r--camlibs/ptp2/cameras/sigma-fp.txt10
-rw-r--r--camlibs/ptp2/library.c92
-rw-r--r--camlibs/ptp2/ptp.c45
-rw-r--r--camlibs/ptp2/ptp.h7
4 files changed, 152 insertions, 2 deletions
diff --git a/camlibs/ptp2/cameras/sigma-fp.txt b/camlibs/ptp2/cameras/sigma-fp.txt
index e28ec42cc..2463c63e9 100644
--- a/camlibs/ptp2/cameras/sigma-fp.txt
+++ b/camlibs/ptp2/cameras/sigma-fp.txt
@@ -193,6 +193,16 @@ some 0x902c polling
0x902d no args getpictfileinfo2
0x902d: from cam: 0x38 bytes, with some info data
+ 4800000002002d9050000000
+
+ 38
+ 00 00 00 01
+ 00 00 00 0c
+ 00 00 00
+ 80 05 00 57
+ c2 b8 07 00
+ 24000000...
+
0x9022 3 args, 80 05 00 57, 00 00 00 00, c2 b8 07 00 getbigpartialpictfile
0x9022: 4 byte size, JPEG
diff --git a/camlibs/ptp2/library.c b/camlibs/ptp2/library.c
index 96325dff8..bd04a6311 100644
--- a/camlibs/ptp2/library.c
+++ b/camlibs/ptp2/library.c
@@ -2682,7 +2682,7 @@ static struct {
{"Samsung:EK-GC100", 0x04e8, 0x6866, 0},
/* 522903503@qq.com */
- {"Sigma:fp", 0x1003, 0xc432, PTP_CAP_PREVIEW},
+ {"Sigma:fp", 0x1003, 0xc432, PTP_CAP|PTP_CAP_PREVIEW},
/* Bernhard Wagner <me@bernhardwagner.net> */
{"Leica:M9", 0x1a98, 0x0002, PTP_CAP},
@@ -5452,6 +5452,90 @@ downloadfile:
return GP_ERROR;
}
+static int
+camera_sigma_fp_capture (Camera *camera, CameraCaptureType type, CameraFilePath *path, GPContext *context)
+{
+ PTPParams *params = &camera->pl->params;
+ unsigned char *data = NULL;
+ unsigned int size = 0;
+ uint32_t id, insize;
+ CameraFile *file;
+ int ret;
+
+ C_PTP_REP (ptp_sigma_fp_snap(params, 2, 1));
+
+ C_PTP_REP (ptp_sigma_fp_getcapturestatus(params, 0, &data, &size));
+ free (data);
+
+ C_PTP_REP (ptp_sigma_fp_getpictfileinfo2(params, &data, &size));
+ if (size < 0x38) {
+ GP_LOG_E ("unexpected size %d\n", size);
+ free (data);
+ return GP_ERROR;
+ }
+ if (data[0] != 0x38) {
+ GP_LOG_E ("unexpected size byte %d\n", data[0]);
+ free (data);
+ return GP_ERROR;
+ }
+ id = data[12] | (data[13]<<8) | (((unsigned int)data[14]) << 16) | (((unsigned int)data[15]) << 24);
+ insize = data[16] | (data[17]<<8) | (((unsigned int)data[18]) << 16) | (((unsigned int)data[19]) << 24);
+
+ free (data);
+
+ C_PTP_REP (ptp_sigma_fp_getbigpartialpictfile(params, id, 0, insize, &data, &size));
+
+ sprintf (path->name, "capt%04d.jpg", params->capcnt++);
+ strcpy (path->folder,"/");
+
+ ret = gp_file_new (&file);
+ if (ret != GP_OK) {
+ free (data);
+ return ret;
+ }
+
+ ret = gp_file_append (file, (char*)data+4, size-4);
+ free (data);
+ if (ret != GP_OK) {
+ gp_file_free (file);
+ return ret;
+ }
+
+ ret = gp_filesystem_append(camera->fs, path->folder, path->name, context);
+ if (ret != GP_OK) {
+ gp_file_free (file);
+ return ret;
+ }
+ ret = gp_filesystem_set_file_noop(camera->fs, path->folder, path->name, GP_FILE_TYPE_NORMAL, file, context);
+ if (ret != GP_OK) {
+ gp_file_free (file);
+ return ret;
+ }
+ return GP_OK;
+
+#if 0
+ CameraFileInfo info;
+ info.file.fields = GP_FILE_INFO_TYPE |
+ GP_FILE_INFO_WIDTH | GP_FILE_INFO_HEIGHT |
+ GP_FILE_INFO_SIZE | GP_FILE_INFO_MTIME;
+ strcpy_mime (info.file.type, params->deviceinfo.VendorExtensionID, ob->oi.ObjectFormat);
+ info.file.width = ob->oi.ImagePixWidth;
+ info.file.height = ob->oi.ImagePixHeight;
+ info.file.size = size;
+ info.file.mtime = time(NULL);
+
+ info.preview.fields = GP_FILE_INFO_TYPE |
+ GP_FILE_INFO_WIDTH | GP_FILE_INFO_HEIGHT |
+ GP_FILE_INFO_SIZE;
+ strcpy_mime (info.preview.type, params->deviceinfo.VendorExtensionID, ob->oi.ThumbFormat);
+ info.preview.width = ob->oi.ThumbPixWidth;
+ info.preview.height = ob->oi.ThumbPixHeight;
+ info.preview.size = ob->oi.ThumbCompressedSize;
+ GP_LOG_D ("setting fileinfo in fs");
+ return gp_filesystem_set_info_noop(camera->fs, path->folder, path->name, info, context);
+#endif
+}
+
static int
camera_capture (Camera *camera, CameraCaptureType type, CameraFilePath *path,
@@ -5558,6 +5642,11 @@ camera_capture (Camera *camera, CameraCaptureType type, CameraFilePath *path,
return camera_panasonic_capture (camera, type, path, context);
}
+ if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_GP_SIGMAFP) &&
+ ptp_operation_issupported(params, PTP_OC_SIGMA_FP_Snap)
+ ) {
+ return camera_sigma_fp_capture (camera, type, path, context);
+ }
if (!ptp_operation_issupported(params,PTP_OC_InitiateCapture)) {
gp_context_error(context,
@@ -8924,6 +9013,7 @@ delete_file_func (CameraFilesystem *fs, const char *folder,
(params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) ||
(params->deviceinfo.VendorExtensionID == PTP_VENDOR_FUJI) ||
(params->deviceinfo.VendorExtensionID == PTP_VENDOR_GP_OLYMPUS_OMD) ||
+ (params->deviceinfo.VendorExtensionID == PTP_VENDOR_GP_SIGMAFP) ||
(params->deviceinfo.VendorExtensionID == PTP_VENDOR_SONY) ||
(params->device_flags & DEVICE_FLAG_OLYMPUS_XML_WRAPPED)) &&
!strncmp (filename, "capt", 4)
diff --git a/camlibs/ptp2/ptp.c b/camlibs/ptp2/ptp.c
index da5573912..c06744e74 100644
--- a/camlibs/ptp2/ptp.c
+++ b/camlibs/ptp2/ptp.c
@@ -987,6 +987,51 @@ ptp_sigma_fp_9035 (PTPParams* params, unsigned char **data, unsigned int *size)
}
uint16_t
+ptp_sigma_fp_getcapturestatus (PTPParams* params, unsigned int p1, unsigned char **data, unsigned int *size)
+{
+ PTPContainer ptp;
+
+ PTP_CNT_INIT(ptp, PTP_OC_SIGMA_FP_GetCaptureStatus, p1);
+ return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
+}
+
+uint16_t
+ptp_sigma_fp_getpictfileinfo2 (PTPParams* params, unsigned char **data, unsigned int *size)
+{
+ PTPContainer ptp;
+
+ PTP_CNT_INIT(ptp, PTP_OC_SIGMA_FP_GetPictFileInfo2);
+ return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
+}
+
+uint16_t
+ptp_sigma_fp_getbigpartialpictfile (PTPParams* params, unsigned int p1, unsigned int off, unsigned int insize, unsigned char **data, unsigned int *size)
+{
+ PTPContainer ptp;
+
+ PTP_CNT_INIT(ptp, PTP_OC_SIGMA_FP_GetBigPartialPictFile, p1, off, insize);
+ return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
+}
+
+uint16_t
+ptp_sigma_fp_snap (PTPParams* params, unsigned int p1, unsigned int p2)
+{
+ PTPContainer ptp;
+ unsigned char *data = malloc(4);
+ uint16_t ret;
+
+ data[0] = 0x02;
+ data[1] = p1;
+ data[2] = p2;
+ data[3] = 0x02+p1+p2; /* checksum, just add everything */
+
+ PTP_CNT_INIT(ptp, PTP_OC_SIGMA_FP_Snap);
+ ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, 4, (unsigned char**)&data, 0);
+ free (data);
+ return ret;
+}
+
+uint16_t
ptp_olympus_init_pc_mode (PTPParams* params)
{
uint16_t ret;
diff --git a/camlibs/ptp2/ptp.h b/camlibs/ptp2/ptp.h
index 1f7451590..76a11ce35 100644
--- a/camlibs/ptp2/ptp.h
+++ b/camlibs/ptp2/ptp.h
@@ -1034,7 +1034,8 @@ typedef struct _PTPIPHeader PTPIPHeader;
#define PTP_OC_SIGMA_FP_GetDataGroup6 0x9029
#define PTP_OC_SIGMA_FP_SetDataGroup6 0x902a
#define PTP_OC_SIGMA_FP_GetCamViewFrame 0x902b /* liveview here! */
-#define PTP_OC_SIGMA_FP_GetPictFileInfo2 0x902c
+#define PTP_OC_SIGMA_FP_GetCamStatus2 0x902c
+#define PTP_OC_SIGMA_FP_GetPictFileInfo2 0x902d
/* Proprietary vendor extension operations mask */
#define PTP_OC_EXTENSION_MASK 0xF000
@@ -4784,6 +4785,10 @@ uint16_t ptp_panasonic_9415 (PTPParams* params, PanasonicLiveViewSize *liveviews
uint16_t ptp_sigma_fp_liveview_image (PTPParams* params, unsigned char **data, unsigned int *size);
uint16_t ptp_sigma_fp_9035 (PTPParams* params, unsigned char **data, unsigned int *size);
+uint16_t ptp_sigma_fp_getpictfileinfo2 (PTPParams* params, unsigned char **data, unsigned int *size);
+uint16_t ptp_sigma_fp_getbigpartialpictfile (PTPParams* params, uint32_t p1, uint32_t offset, uint32_t insize, unsigned char **data, unsigned int *size);
+uint16_t ptp_sigma_fp_snap (PTPParams* params, uint32_t p1, uint32_t p2);
+uint16_t ptp_sigma_fp_getcapturestatus (PTPParams* params, uint32_t p1, unsigned char **data, unsigned int *size);
uint16_t ptp_olympus_liveview_image (PTPParams* params, unsigned char **data, unsigned int *size);
#define ptp_olympus_omd_move_focus(params,direction,step_size) ptp_generic_no_data(params,PTP_OC_OLYMPUS_OMD_MFDrive,2,direction,step_size)