Hi, I just committed code that tries to handle it more generically.
commit 4ab78020b304ef3105d11701d70d8b785476fafa Author: Marcus Meissner <mar...@jet.franken.de> Date: Thu Apr 4 17:35:06 2024 +0200 try a workaround for newer Sonys that have two enums. It reads the next 16bit value, if its < 0x200 (as it would be 0x5something or 0xDsomething) it assumes it has a secondary enum list and reads over that. Can you try this? Ciao, Marcus On Wed, Apr 03, 2024 at 09:44:29PM +0200, Jeroen Lichtenauer wrote: > Hi Marcus, > > Thank you for your quick reply. > After doing some debugging, I found out that the Sony A7S III includes a > second ENUM list for every property. The second one is either as long as > the first list, or longer. It seems like the first list contains the > enabled options, and the second list contains all the possible options > (some of which you might not be able to choose in the current state). > > in ptp2/ptp-pack.c > static inline int ptp_unpack_Sony_DPD (PTPParams *params, unsigned char* > data, PTPDevicePropDesc *dpd, unsigned int dpdlen, unsigned int *poffset) > > After the current ENUM list extraction > for (i=0;i<N;i++) { > ret = ptp_unpack_DPV (params, data, poffset, dpdlen, > &dpd->FORM.Enum.SupportedValue[i], dpd->DataType); > > /* Slightly different handling here. The HP PhotoSmart 120 > * specifies an enumeration with N in wrong endian > * 00 01 instead of 01 00, so we count the enum just until the > * the end of the packet. > */ > if (!ret) { > if (!i) > goto outofmemory; > dpd->FORM.Enum.NumberOfValues = i; > break; > } > } > > I added some code that updates the offset to skip the second list: > > if(strcmp(params->deviceinfo.Model, "ILCE-7SM3")==0) > { > int enum_value_len; > switch (dpd->DataType) { > case PTP_DTC_INT8: > enum_value_len = 1; > break; > case PTP_DTC_UINT8: > enum_value_len = 1; > break; > case PTP_DTC_INT16: > enum_value_len = 2; > break; > case PTP_DTC_UINT16: > enum_value_len = 2; > break; > case PTP_DTC_INT32: > enum_value_len = 4; > break; > case PTP_DTC_UINT32: > enum_value_len = 4; > break; > case PTP_DTC_INT64: > enum_value_len = 8; > break; > case PTP_DTC_UINT64: > enum_value_len = 8; > break; > case PTP_DTC_UINT128: > enum_value_len = 16; > break; > case PTP_DTC_INT128: > enum_value_len = 16; > break; > case PTP_DTC_AINT8: > enum_value_len = 1; > break; > case PTP_DTC_AUINT8: > enum_value_len = 1; > break; > case PTP_DTC_AUINT16: > enum_value_len = 2; > break; > case PTP_DTC_AINT16: > enum_value_len = 2; > break; > case PTP_DTC_AUINT32: > enum_value_len = 4; > break; > case PTP_DTC_AINT32: > enum_value_len = 4; > break; > case PTP_DTC_AUINT64: > enum_value_len = 8; > break; > case PTP_DTC_AINT64: > enum_value_len = 8; > break; > case PTP_DTC_STR: > goto outofmemory; > break; > default: > goto outofmemory; > } > uint16_t N_all = dtoh16a(&data[*poffset]); > *poffset+=sizeof(uint16_t); > *poffset += enum_value_len*N_all; > } > > The debug log is here > https://drive.usercontent.google.com/uc?id=1MEanNTniSpzv8xd82fZ_D9n72hZBrFwQ&export=download > Although I now finally get lots of properties (hundreds), it still misses > some essential actions, such as image capture. > Perhaps because these have different addresses for this camera? > > Kind regards, Jeroen > > On Wed, Apr 3, 2024 at 3:47 PM Marcus Meissner <mar...@jet.franken.de> > wrote: > > > Hi, > > > > Thanks for this report. > > > > it seems the binary format of this variable has changed, which leds to > > this error. > > > > I will need to adjust the decoder :( > > > > You can short term perhaps add a ignore to the decoder, perhaps it will > > help, > > except you cant use any config reads > > > > Ciao, Marcus > > On Wed, Apr 03, 2024 at 02:13:31PM +0200, Jeroen Lichtenauer wrote: > > _______________________________________________ Gphoto-devel mailing list Gphoto-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gphoto-devel