Loading src/drivers/elphel/exif393.c +53 −41 Original line number Original line Diff line number Diff line Loading @@ -176,12 +176,24 @@ ssize_t minor_file_size(int minor) { //return current file size for different mi } } ssize_t minor_max_size(int minor) { //return max file size for different minors ssize_t minor_max_size(int minor) { //return max file size for different minors switch (minor) { switch (minor) { case X3X3_EXIF_TEMPLATE: return MAX_EXIF_SIZE; case X3X3_EXIF_TEMPLATE: case X3X3_EXIF_EXIF: return MAX_EXIF_SIZE * (MAX_EXIF_FRAMES+1); return MAX_EXIF_SIZE; case X3X3_EXIF_META: return MAX_EXIF_SIZE; case X3X3_EXIF_EXIF_CHN_0: case X3X3_EXIF_METADIR: return MAX_EXIF_FIELDS * sizeof(struct exif_dir_table_t); case X3X3_EXIF_EXIF_CHN_1: case X3X3_EXIF_TIME: return sizeof(struct exif_time_t); case X3X3_EXIF_EXIF_CHN_2: default:return 0; case X3X3_EXIF_EXIF_CHN_3: return MAX_EXIF_SIZE * (MAX_EXIF_FRAMES+1); case X3X3_EXIF_META_CHN_0: case X3X3_EXIF_META_CHN_1: case X3X3_EXIF_META_CHN_2: case X3X3_EXIF_META_CHN_3: return MAX_EXIF_SIZE; case X3X3_EXIF_METADIR: return MAX_EXIF_FIELDS * sizeof(struct exif_dir_table_t); case X3X3_EXIF_TIME: return sizeof(struct exif_time_t); default: return 0; } } } } void exif_invalidate(void) { // 393: OK, only invalidates all ayt once void exif_invalidate(void) { // 393: OK, only invalidates all ayt once Loading Loading @@ -231,6 +243,7 @@ int exif_rebuild_chn(int sensor_port, int frames) { return -1; return -1; } } memset(meta_buffer, 0, aexif_meta_size[sensor_port] * (MAX_EXIF_FRAMES+1)); memset(meta_buffer, 0, aexif_meta_size[sensor_port] * (MAX_EXIF_FRAMES+1)); ameta_buffer[sensor_port] = meta_buffer; aexif_valid[sensor_port] = 1; aexif_valid[sensor_port] = 1; return 0; return 0; } } Loading Loading @@ -507,7 +520,6 @@ static loff_t exif_lseek (struct file * file, loff_t offset, int orig) { int maxsize=minor_max_size(p); int maxsize=minor_max_size(p); // int sensor_port; // int sensor_port; int fp; int fp; switch (orig) { switch (orig) { case SEEK_SET: case SEEK_SET: file->f_pos = offset; file->f_pos = offset; Loading src/drivers/elphel/sensor_common.c +222 −221 Original line number Original line Diff line number Diff line Loading @@ -149,13 +149,14 @@ static struct image_acq_pd_t image_acq_priv; static volatile int JPEG_wp; static volatile int JPEG_wp; static volatile int JPEG_rp; static volatile int JPEG_rp; static int fpga_counter_prev=0; /// Previous value of the FPGA transfer counter (to find out if it did change) static int fpga_counter_prev=0; /// Previous value of the FPGA transfer counter (to find out if it did change) static struct meta_offsets_t { // works like a cache to time save on looking for tags in the directory (forced to recalcualte if does not match) static struct meta_offsets_t { // works like a cache to time save on looking for tags in the directory (forced to recalculate if does not match) int Image_DateTime; // will have offset of the Exif_Image_DateTime data in meta page (Exif_Photo_SubSecTime should go immediately after in meta page) int Image_DateTime; // will have offset of the Exif_Image_DateTime data in meta page (Exif_Photo_SubSecTime should go immediately after in meta page) int Photo_DateTimeOriginal; int Photo_DateTimeOriginal; int Photo_ExposureTime; int Photo_ExposureTime; int Image_FrameNumber; int Image_FrameNumber; int Image_Orientation; int Image_Orientation; int Photo_MakerNote; int Photo_MakerNote; int PageNumber; } meta_offsets; } meta_offsets; #ifdef TEST_DISABLE_CODE #ifdef TEST_DISABLE_CODE Loading Loading @@ -422,8 +423,8 @@ inline struct interframe_params_t* updateIRQ_interframe(struct jpeg_ptr_t *jptr) * @param interframe pointer to interframe parameters structure * @param interframe pointer to interframe parameters structure */ */ inline void updateIRQ_Exif(struct jpeg_ptr_t *jptr, struct interframe_params_t* interframe) { inline void updateIRQ_Exif(struct jpeg_ptr_t *jptr, struct interframe_params_t* interframe) { // int index_time = aJPEG_wp-11[sensor_port]; if (index_time<0) index_time+=get_globalParam (sensor_port, G_CIRCBUFSIZE)>>2; unsigned char short_buff[2]; int sensor_port = jptr->chn_num; unsigned int sensor_port = jptr->chn_num; int index_time = jptr->jpeg_wp - 11; if (index_time<0) index_time+=get_globalParam (sensor_port, G_CIRCBUFSIZE)>>2; int index_time = jptr->jpeg_wp - 11; if (index_time<0) index_time+=get_globalParam (sensor_port, G_CIRCBUFSIZE)>>2; // struct exif_datetime_t // struct exif_datetime_t /// calculates datetime([20] and subsec[7], returns pointer to char[27] /// calculates datetime([20] and subsec[7], returns pointer to char[27] Loading @@ -441,19 +442,19 @@ inline void updateIRQ_Exif(struct jpeg_ptr_t *jptr, struct interframe_params_t* extra_flips=get_imageParamsThis(sensor_port, P_MULTI_MODE_FLIPS); extra_flips=get_imageParamsThis(sensor_port, P_MULTI_MODE_FLIPS); global_flips=extra_flips & 3; global_flips=extra_flips & 3; } } /* unsigned char orientations[]={1,6,3,8, 2,7,4,5, 4,5,2,7, 3,8,1,6}; */ unsigned char orientations[]="1638274545273816"; unsigned char orientations[]="1638274545273816"; unsigned char orientation_short[2]; unsigned char orientation_short[2]; orientation_short[0]=0; orientation_short[0]=0; orientation_short[1]=0xf & orientations[(get_imageParamsThis(sensor_port, P_PORTRAIT)&3) | (global_flips<<2)]; orientation_short[1]=0xf & orientations[(get_imageParamsThis(sensor_port, P_PORTRAIT)&3) | (global_flips<<2)]; write_meta_irq(sensor_port, orientation_short, &meta_offsets.Image_Orientation, Exif_Image_Orientation, 2); write_meta_irq(sensor_port, orientation_short, &meta_offsets.Image_Orientation, Exif_Image_Orientation, 2); // write sensor number // short_buff[0] = 0xf & (jptr->chn_num >> 8); short_buff[0] = 0; short_buff[1] = 0xf & sensor_port; write_meta_irq(sensor_port, short_buff, &meta_offsets.PageNumber, Exif_Image_PageNumber, 2); //TODO - use memcpy //TODO - use memcpy int maker_offset; int maker_offset; maker_offset=putlong_meta_irq(sensor_port, get_imageParamsThis(sensor_port, P_GAINR), &meta_offsets.Photo_MakerNote, Exif_Photo_MakerNote); maker_offset=putlong_meta_irq(sensor_port, get_imageParamsThis(sensor_port, P_GAINR), &meta_offsets.Photo_MakerNote, Exif_Photo_MakerNote); Loading src/include/elphel/c313a.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -4,7 +4,7 @@ */ */ #ifndef _ASM_CMOSCAM_H #ifndef _ASM_CMOSCAM_H #define _ASM_CMOSCAM_HPARS_FRAMES #define _ASM_CMOSCAM_H #define SAFE_CHECK 1 // perform more verification on the paremeters #define SAFE_CHECK 1 // perform more verification on the paremeters //#define ELPHEL_DEBUG 0 //global debug on/off in multiple files //#define ELPHEL_DEBUG 0 //global debug on/off in multiple files //#define ELPHEL_DEBUG_STARTUP 000a4c00 ; //#define ELPHEL_DEBUG_STARTUP 000a4c00 ; Loading src/include/elphel/exifa.h +27 −6 Original line number Original line Diff line number Diff line Loading @@ -66,6 +66,8 @@ struct exif_dir_table_t { // hack, reusing field to keep it protected // hack, reusing field to keep it protected #define Exif_Image_IPTCNAA 0x083bb #define Exif_Image_IPTCNAA 0x083bb #define Exif_Image_FrameNumber 0x083bb #define Exif_Image_FrameNumber 0x083bb // used for sensor number #define Exif_Image_PageNumber 0x00129 #define Exif_Image_ExifTag 0x08769 #define Exif_Image_ExifTag 0x08769 #define Exif_Image_GPSTag 0x08825 #define Exif_Image_GPSTag 0x08825 Loading Loading @@ -178,13 +180,32 @@ struct meta_CompassInfo_t { #define Exif_GPSInfo_CompassRoll_Index 0x12 #define Exif_GPSInfo_CompassRoll_Index 0x12 #define Exif_Image_FrameNumber_Index 0x13 #define Exif_Image_FrameNumber_Index 0x13 #define Exif_Image_Orientation_Index 0x14 #define Exif_Image_Orientation_Index 0x14 #define Exif_Photo_MakerNote_Index 0x15 #define Exif_Image_PageNumber_Index 0x15 #define Exif_Photo_MakerNote_Index 0x16 /// update ExifKmlNumber to be total number of *_Index entries /// update ExifKmlNumber to be total number of *_Index entries #define ExifKmlNumber Exif_Photo_MakerNote_Index+1 #define ExifKmlNumber Exif_Photo_MakerNote_Index+1 //#define EXIF_DEV_NAME "/dev/exif_exif" #define EXIF_DEV_NAME "/dev/exif_exif" #define EXIFDIR_DEV_NAME "/dev/exif_metadir" #define EXIFDIR_DEV_NAME "/dev/exif_metadir" #define EXIFMETA_DEV_NAME "/dev/exif_meta" //#define EXIFMETA_DEV_NAME "/dev/exif_meta" /** * @brief This macro is used to construct file names in user space applications. Example * of usage: <e>const char *exif_file_names[SENSOR_PORTS] = { EXIF_DEV_NAMES };</e>. Then the * sensor port number can be used to access file name. */ #define EXIF_DEV_NAMES "/dev/exif_exif0", \ "/dev/exif_exif1", \ "/dev/exif_exif2", \ "/dev/exif_exif3" /** * @brief This macro is used to construct file names in user space applications. Example * of usage: <e>const char *exifmeta_file_names[SENSOR_PORTS] = { EXIFMETA_DEV_NAMES };</e>. Then * the sensor port number can be used to access file name. */ #define EXIFMETA_DEV_NAMES "/dev/exif_meta0", \ "/dev/exif_meta1", \ "/dev/exif_meta2", \ "/dev/exif_meta3" #endif #endif /* _ASM_EXIF_H */ Loading
src/drivers/elphel/exif393.c +53 −41 Original line number Original line Diff line number Diff line Loading @@ -176,12 +176,24 @@ ssize_t minor_file_size(int minor) { //return current file size for different mi } } ssize_t minor_max_size(int minor) { //return max file size for different minors ssize_t minor_max_size(int minor) { //return max file size for different minors switch (minor) { switch (minor) { case X3X3_EXIF_TEMPLATE: return MAX_EXIF_SIZE; case X3X3_EXIF_TEMPLATE: case X3X3_EXIF_EXIF: return MAX_EXIF_SIZE * (MAX_EXIF_FRAMES+1); return MAX_EXIF_SIZE; case X3X3_EXIF_META: return MAX_EXIF_SIZE; case X3X3_EXIF_EXIF_CHN_0: case X3X3_EXIF_METADIR: return MAX_EXIF_FIELDS * sizeof(struct exif_dir_table_t); case X3X3_EXIF_EXIF_CHN_1: case X3X3_EXIF_TIME: return sizeof(struct exif_time_t); case X3X3_EXIF_EXIF_CHN_2: default:return 0; case X3X3_EXIF_EXIF_CHN_3: return MAX_EXIF_SIZE * (MAX_EXIF_FRAMES+1); case X3X3_EXIF_META_CHN_0: case X3X3_EXIF_META_CHN_1: case X3X3_EXIF_META_CHN_2: case X3X3_EXIF_META_CHN_3: return MAX_EXIF_SIZE; case X3X3_EXIF_METADIR: return MAX_EXIF_FIELDS * sizeof(struct exif_dir_table_t); case X3X3_EXIF_TIME: return sizeof(struct exif_time_t); default: return 0; } } } } void exif_invalidate(void) { // 393: OK, only invalidates all ayt once void exif_invalidate(void) { // 393: OK, only invalidates all ayt once Loading Loading @@ -231,6 +243,7 @@ int exif_rebuild_chn(int sensor_port, int frames) { return -1; return -1; } } memset(meta_buffer, 0, aexif_meta_size[sensor_port] * (MAX_EXIF_FRAMES+1)); memset(meta_buffer, 0, aexif_meta_size[sensor_port] * (MAX_EXIF_FRAMES+1)); ameta_buffer[sensor_port] = meta_buffer; aexif_valid[sensor_port] = 1; aexif_valid[sensor_port] = 1; return 0; return 0; } } Loading Loading @@ -507,7 +520,6 @@ static loff_t exif_lseek (struct file * file, loff_t offset, int orig) { int maxsize=minor_max_size(p); int maxsize=minor_max_size(p); // int sensor_port; // int sensor_port; int fp; int fp; switch (orig) { switch (orig) { case SEEK_SET: case SEEK_SET: file->f_pos = offset; file->f_pos = offset; Loading
src/drivers/elphel/sensor_common.c +222 −221 Original line number Original line Diff line number Diff line Loading @@ -149,13 +149,14 @@ static struct image_acq_pd_t image_acq_priv; static volatile int JPEG_wp; static volatile int JPEG_wp; static volatile int JPEG_rp; static volatile int JPEG_rp; static int fpga_counter_prev=0; /// Previous value of the FPGA transfer counter (to find out if it did change) static int fpga_counter_prev=0; /// Previous value of the FPGA transfer counter (to find out if it did change) static struct meta_offsets_t { // works like a cache to time save on looking for tags in the directory (forced to recalcualte if does not match) static struct meta_offsets_t { // works like a cache to time save on looking for tags in the directory (forced to recalculate if does not match) int Image_DateTime; // will have offset of the Exif_Image_DateTime data in meta page (Exif_Photo_SubSecTime should go immediately after in meta page) int Image_DateTime; // will have offset of the Exif_Image_DateTime data in meta page (Exif_Photo_SubSecTime should go immediately after in meta page) int Photo_DateTimeOriginal; int Photo_DateTimeOriginal; int Photo_ExposureTime; int Photo_ExposureTime; int Image_FrameNumber; int Image_FrameNumber; int Image_Orientation; int Image_Orientation; int Photo_MakerNote; int Photo_MakerNote; int PageNumber; } meta_offsets; } meta_offsets; #ifdef TEST_DISABLE_CODE #ifdef TEST_DISABLE_CODE Loading Loading @@ -422,8 +423,8 @@ inline struct interframe_params_t* updateIRQ_interframe(struct jpeg_ptr_t *jptr) * @param interframe pointer to interframe parameters structure * @param interframe pointer to interframe parameters structure */ */ inline void updateIRQ_Exif(struct jpeg_ptr_t *jptr, struct interframe_params_t* interframe) { inline void updateIRQ_Exif(struct jpeg_ptr_t *jptr, struct interframe_params_t* interframe) { // int index_time = aJPEG_wp-11[sensor_port]; if (index_time<0) index_time+=get_globalParam (sensor_port, G_CIRCBUFSIZE)>>2; unsigned char short_buff[2]; int sensor_port = jptr->chn_num; unsigned int sensor_port = jptr->chn_num; int index_time = jptr->jpeg_wp - 11; if (index_time<0) index_time+=get_globalParam (sensor_port, G_CIRCBUFSIZE)>>2; int index_time = jptr->jpeg_wp - 11; if (index_time<0) index_time+=get_globalParam (sensor_port, G_CIRCBUFSIZE)>>2; // struct exif_datetime_t // struct exif_datetime_t /// calculates datetime([20] and subsec[7], returns pointer to char[27] /// calculates datetime([20] and subsec[7], returns pointer to char[27] Loading @@ -441,19 +442,19 @@ inline void updateIRQ_Exif(struct jpeg_ptr_t *jptr, struct interframe_params_t* extra_flips=get_imageParamsThis(sensor_port, P_MULTI_MODE_FLIPS); extra_flips=get_imageParamsThis(sensor_port, P_MULTI_MODE_FLIPS); global_flips=extra_flips & 3; global_flips=extra_flips & 3; } } /* unsigned char orientations[]={1,6,3,8, 2,7,4,5, 4,5,2,7, 3,8,1,6}; */ unsigned char orientations[]="1638274545273816"; unsigned char orientations[]="1638274545273816"; unsigned char orientation_short[2]; unsigned char orientation_short[2]; orientation_short[0]=0; orientation_short[0]=0; orientation_short[1]=0xf & orientations[(get_imageParamsThis(sensor_port, P_PORTRAIT)&3) | (global_flips<<2)]; orientation_short[1]=0xf & orientations[(get_imageParamsThis(sensor_port, P_PORTRAIT)&3) | (global_flips<<2)]; write_meta_irq(sensor_port, orientation_short, &meta_offsets.Image_Orientation, Exif_Image_Orientation, 2); write_meta_irq(sensor_port, orientation_short, &meta_offsets.Image_Orientation, Exif_Image_Orientation, 2); // write sensor number // short_buff[0] = 0xf & (jptr->chn_num >> 8); short_buff[0] = 0; short_buff[1] = 0xf & sensor_port; write_meta_irq(sensor_port, short_buff, &meta_offsets.PageNumber, Exif_Image_PageNumber, 2); //TODO - use memcpy //TODO - use memcpy int maker_offset; int maker_offset; maker_offset=putlong_meta_irq(sensor_port, get_imageParamsThis(sensor_port, P_GAINR), &meta_offsets.Photo_MakerNote, Exif_Photo_MakerNote); maker_offset=putlong_meta_irq(sensor_port, get_imageParamsThis(sensor_port, P_GAINR), &meta_offsets.Photo_MakerNote, Exif_Photo_MakerNote); Loading
src/include/elphel/c313a.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -4,7 +4,7 @@ */ */ #ifndef _ASM_CMOSCAM_H #ifndef _ASM_CMOSCAM_H #define _ASM_CMOSCAM_HPARS_FRAMES #define _ASM_CMOSCAM_H #define SAFE_CHECK 1 // perform more verification on the paremeters #define SAFE_CHECK 1 // perform more verification on the paremeters //#define ELPHEL_DEBUG 0 //global debug on/off in multiple files //#define ELPHEL_DEBUG 0 //global debug on/off in multiple files //#define ELPHEL_DEBUG_STARTUP 000a4c00 ; //#define ELPHEL_DEBUG_STARTUP 000a4c00 ; Loading
src/include/elphel/exifa.h +27 −6 Original line number Original line Diff line number Diff line Loading @@ -66,6 +66,8 @@ struct exif_dir_table_t { // hack, reusing field to keep it protected // hack, reusing field to keep it protected #define Exif_Image_IPTCNAA 0x083bb #define Exif_Image_IPTCNAA 0x083bb #define Exif_Image_FrameNumber 0x083bb #define Exif_Image_FrameNumber 0x083bb // used for sensor number #define Exif_Image_PageNumber 0x00129 #define Exif_Image_ExifTag 0x08769 #define Exif_Image_ExifTag 0x08769 #define Exif_Image_GPSTag 0x08825 #define Exif_Image_GPSTag 0x08825 Loading Loading @@ -178,13 +180,32 @@ struct meta_CompassInfo_t { #define Exif_GPSInfo_CompassRoll_Index 0x12 #define Exif_GPSInfo_CompassRoll_Index 0x12 #define Exif_Image_FrameNumber_Index 0x13 #define Exif_Image_FrameNumber_Index 0x13 #define Exif_Image_Orientation_Index 0x14 #define Exif_Image_Orientation_Index 0x14 #define Exif_Photo_MakerNote_Index 0x15 #define Exif_Image_PageNumber_Index 0x15 #define Exif_Photo_MakerNote_Index 0x16 /// update ExifKmlNumber to be total number of *_Index entries /// update ExifKmlNumber to be total number of *_Index entries #define ExifKmlNumber Exif_Photo_MakerNote_Index+1 #define ExifKmlNumber Exif_Photo_MakerNote_Index+1 //#define EXIF_DEV_NAME "/dev/exif_exif" #define EXIF_DEV_NAME "/dev/exif_exif" #define EXIFDIR_DEV_NAME "/dev/exif_metadir" #define EXIFDIR_DEV_NAME "/dev/exif_metadir" #define EXIFMETA_DEV_NAME "/dev/exif_meta" //#define EXIFMETA_DEV_NAME "/dev/exif_meta" /** * @brief This macro is used to construct file names in user space applications. Example * of usage: <e>const char *exif_file_names[SENSOR_PORTS] = { EXIF_DEV_NAMES };</e>. Then the * sensor port number can be used to access file name. */ #define EXIF_DEV_NAMES "/dev/exif_exif0", \ "/dev/exif_exif1", \ "/dev/exif_exif2", \ "/dev/exif_exif3" /** * @brief This macro is used to construct file names in user space applications. Example * of usage: <e>const char *exifmeta_file_names[SENSOR_PORTS] = { EXIFMETA_DEV_NAMES };</e>. Then * the sensor port number can be used to access file name. */ #define EXIFMETA_DEV_NAMES "/dev/exif_meta0", \ "/dev/exif_meta1", \ "/dev/exif_meta2", \ "/dev/exif_meta3" #endif #endif /* _ASM_EXIF_H */