00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "autoexposure.h"
00031
00032
00033 int exposureHDR (int frame, int target_frame) {
00034 unsigned long write_data[4];
00035 int target_frame8=target_frame & PARS_FRAMES_MASK;
00036 int HDR_mode;
00037 int vexpos, vexpos_HDR;
00038 int rslt;
00039 if (!((HDR_mode=framePars[target_frame8].pars[P_HDR_DUR]))) return 0;
00040 if ((HDR_mode<1) || (HDR_mode<1)) {
00041 ELP_FERR(fprintf(stderr, "Wrong HDR mode %d (only 1 or 2 are supported)\n",HDR_mode));
00042 return -1;
00043 }
00044 vexpos= framePars[target_frame8].pars[P_VEXPOS];
00045 vexpos_HDR=framePars[target_frame8].pars[P_HDR_VEXPOS];
00046 if (vexpos_HDR>0x10000) vexpos_HDR= (((long long) vexpos_HDR) * vexpos) >> 16;
00047 write_data[0]= FRAMEPARS_SETFRAME;
00048 write_data[2]= P_VEXPOS;
00050 MDF5(fprintf(stderr,">>>>>HDR_mode=%d, write: %08lx %08lx %08lx %08lx\n",HDR_mode,write_data[0],write_data[1],write_data[2],write_data[3]));
00051
00052 switch (HDR_mode) {
00053 case 1:
00054 write_data[1]= target_frame+1;
00055 write_data[3]= vexpos_HDR;
00056 rslt=write(fd_fparmsall, write_data, sizeof(write_data));
00057 MDF5(fprintf(stderr,"write: %08lx %08lx %08lx %08lx -> %d\n",write_data[0],write_data[1],write_data[2],write_data[3],rslt));
00058 if (rslt < sizeof(write_data)) return -errno;
00059 write_data[1]= target_frame+2;
00060 write_data[3]= vexpos;
00061 rslt=write(fd_fparmsall, write_data, sizeof(write_data));
00062 if (rslt < sizeof(write_data)) return -errno;
00063 MDF5(fprintf(stderr,"write: %08lx %08lx %08lx %08lx -> %d\n",write_data[0],write_data[1],write_data[2],write_data[3],rslt));
00064 break;
00065 case 2:
00066 write_data[1]= target_frame+2;
00067 write_data[3]= vexpos_HDR;
00068 rslt=write(fd_fparmsall, write_data, sizeof(write_data));
00069 if (rslt < sizeof(write_data)) return -errno;
00070 MDF5(fprintf(stderr,"write: %08lx %08lx %08lx %08lx -> %d\n",write_data[0],write_data[1],write_data[2],write_data[3],rslt));
00071 break;
00072 }
00074 lseek(fd_fparmsall, frame + 2+LSEEK_FRAME_WAIT_ABS, SEEK_END);
00075 switch (HDR_mode) {
00076 case 1:
00077 write_data[1]= target_frame+3;
00078 write_data[3]= vexpos_HDR;
00079 rslt=write(fd_fparmsall, write_data, sizeof(write_data));
00080 if (rslt < sizeof(write_data)) return -errno;
00081 MDF5(fprintf(stderr,"write: %08lx %08lx %08lx %08lx -> %d\n",write_data[0],write_data[1],write_data[2],write_data[3],rslt));
00082 write_data[1]= target_frame+4;
00083 write_data[3]= vexpos;
00084 rslt=write(fd_fparmsall, write_data, sizeof(write_data));
00085 if (rslt < sizeof(write_data)) return -errno;
00086 MDF5(fprintf(stderr,"write: %08lx %08lx %08lx %08lx -> %d\n",write_data[0],write_data[1],write_data[2],write_data[3],rslt));
00087 break;
00088 case 2:
00089 write_data[1]= target_frame+4;
00090 write_data[3]= vexpos;
00091 rslt=write(fd_fparmsall, write_data, sizeof(write_data));
00092 if (rslt < sizeof(write_data)) return -errno;
00093 MDF5(fprintf(stderr,"write: %08lx %08lx %08lx %08lx -> %d\n",write_data[0],write_data[1],write_data[2],write_data[3],rslt));
00094 break;
00095 }
00096 return 1;
00097 }
00098
00099
00100
00106 int skipHDR(int mode, unsigned long frame) {
00107 int patt;
00108 int skip;
00109 switch (mode) {
00110 case 0: return 0;
00111 case 1: patt=HDR_PATTERN1;
00112 break;
00113 case 2: patt=HDR_PATTERN2;
00114 break;
00115 default: return -1;
00116 }
00117 patt >>= (frame & PARS_FRAMES_MASK);
00118 if (patt & 1) return 0;
00119 skip=0;
00120 while (patt && !(patt & 1)) {
00121 patt >>= 1;
00122 skip++;
00123 }
00124 lseek(fd_histogram_cache, LSEEK_HIST_WAIT_Y, SEEK_END);
00125 lseek(fd_histogram_cache, LSEEK_HIST_NEEDED + 0, SEEK_END);
00126
00127 lseek(fd_histogram_cache, skip-1, SEEK_CUR);
00128 return 1;
00129 }