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 }