diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2021-04-10 18:01:52 +0200 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2021-04-10 18:01:52 +0200 |
commit | 30151d4ac7f9df4d931fca9e571e2ae5d6eab9ef (patch) | |
tree | 5fdb6a4f0586bd7a9b856d06a658061f4f195769 /camlibs | |
parent | 0bfa00a09bd938b8dcddc2511326f0e547385072 (diff) | |
download | libgphoto2-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.txt | 10 | ||||
-rw-r--r-- | camlibs/ptp2/library.c | 92 | ||||
-rw-r--r-- | camlibs/ptp2/ptp.c | 45 | ||||
-rw-r--r-- | camlibs/ptp2/ptp.h | 7 |
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) |