Commit a2a841fa authored by Mikhail Karpenko's avatar Mikhail Karpenko
Browse files

Add PageNumber field to Exif and use it as sensor port number storage

parent 97a0469d
Loading
Loading
Loading
Loading
+53 −41
Original line number Original line Diff line number Diff line
@@ -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
@@ -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;
}
}
@@ -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;
+222 −221
Original line number Original line Diff line number Diff line
@@ -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
@@ -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]
@@ -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);
+1 −1
Original line number Original line Diff line number Diff line
@@ -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 ; 
+27 −6
Original line number Original line Diff line number Diff line
@@ -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
@@ -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 */