00001
00002
00003
00004
00005
00006 #include <fcntl.h>
00007 #include <unistd.h>
00008 #include <string.h>
00009
00010
00011 #include <stdio.h>
00012 #include <stdlib.h>
00013 #include <sys/mman.h>
00014
00015 #include "imageaccess.h"
00016 #define D(x)
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 unsigned char* convert8to8 ( int data_fd,
00044 unsigned long * row8Bit,
00045 int rowNumber,
00046 int ImageWidth,
00047 int Contrast);
00048
00049 unsigned char* convert16to8 ( int data_fd,
00050 unsigned long * row8Bit,
00051 int rowNumber,
00052 int ImageWidth,
00053 int Contrast);
00054 int initPalette (struct pixel_buffers * pbp,
00055 const char * pseudo
00056 );
00057
00058 int initPalette (struct pixel_buffers * pbp,
00059 const char * pseudo
00060 ) {
00061 int i,l;
00062 int c, c0, p,p0,p1,k,d;
00063 int r,g,b;
00064 char pseudo_dflt[]="0W";
00065 const char * cp= pseudo;
00066 c0=0;p0=0;
00067 if ((!cp) || (strlen(cp)==0)) return 0;
00068 pbp->color=2;
00069 if (strlen(cp) < 2) {
00070 pseudo_dflt[1]=cp[0];
00071 cp=(const char *) pseudo_dflt;
00072 }
00073 l=strlen(cp);
00074 for (i=0; i<l;i++) {
00075 p1=(i*255)/(l-1);
00076 switch (cp[i] ) {
00077 case '0': case 'k': case 'K': {c=0;break;}
00078 case '1': case 'r': case 'R': {c=1;break;}
00079 case '2': case 'g': case 'G': {c=2;break;}
00080 case '3': case 'y': case 'Y': {c=3;break;}
00081 case '4': case 'b': case 'B': {c=4;break;}
00082 case '5': case 'm': case 'M': {c=5;break;}
00083 case '6': case 'c': case 'C': {c=6;break;}
00084 case '7': case 'w': case 'W': {c=7;break;}
00085 default: {c=1;break;}
00086 }
00087 if (i>0) {
00088 k=0xff0000/(p1-p0);
00089 D(fprintf(stderr,"p0=%x p1=%x k=%x\r\n",p0,p1,k));
00090 for (p=0;p<=(p1-p0);p++) {
00091 d=(p*k)>>16;
00092 if ((c^c0) & 1) {
00093 r= (c&1)?d:255-d;
00094 } else {
00095 r= (c&1)?255:0;
00096 }
00097
00098 if ((c^c0) & 2) {
00099 g= (c&2)?d:255-d;
00100 } else {
00101 g= (c&2)?255:0;
00102 }
00103
00104 if ((c^c0) & 4) {
00105 b= (c&4)?d:255-d;
00106 } else {
00107 b= (c&4)?255:0;
00108 }
00109 D(fprintf(stderr,"c=%x r=%x g=%x b=%x\r\n",c,r,g,b));
00110
00111 pbp->palette[p+p0]=b | (g<<8) | (r<<16);
00112 }
00113 }
00114
00115 c0=c;
00116 p0=p1;
00117 }
00118 D(for (i=0;i<256;i++) fprintf(stderr,"%03x: %08x\r\n",i,pbp->palette[i]));
00119 return 1;
00120 }
00121 unsigned long * getPalette (struct pixel_buffers * pbp) {return ((pbp->color)==2)?pbp->palette:NULL; }
00122
00123
00124
00125
00126
00127
00128
00129 int initPixelBuffers(struct pixel_buffers * pbp,
00130 const char * dmaFileName,
00131 int width,
00132 int height,
00133 int contrast,
00134 int colorMode,
00135 int bayer,
00136 int pixelDepth,
00137 const char * pseudo
00138 ) {
00139 int i;
00140 MD(fprintf(stderr,"dmaFileName- %s,width - %d, height %d, contrast - %d, colorMode - %d, bayer - %d, pixelDepth - %d\r\n",dmaFileName,width,height,contrast,colorMode,bayer,pixelDepth));
00141
00142
00143 pbp->data_fd=-1;
00144 switch (pixelDepth) {
00145 case 10:
00146 case 8:
00147 case 4: {pbp->depth=pixelDepth; break;}
00148 default: return -1;
00149 }
00150 MD(fprintf(stderr,"\r\n"));
00151
00152 if ((contrast >=0) && (contrast <6)) pbp->shft=contrast;
00153 else return -1;
00154 MD(fprintf(stderr,"\r\n"));
00155 pbp->color=(colorMode>0);
00156 pbp->BayerOrient=bayer & 3;
00157 for (i=0;i<3;i++) pbp->bufferedRows[i] =-1;
00158 if ((width >0) && (width <= MAX_IMAGE_WIDTH)) pbp->imageWidth=width;
00159 else return -1;
00160 MD(fprintf(stderr,"\r\n"));
00161 if ((height >0) && (height <= MAX_IMAGE_HEIGHT)) pbp->imageHeight=height;
00162 else return -1;
00163 MD(fprintf(stderr,"\r\n"));
00164
00165
00166 if ((pbp->data_fd = open(dmaFileName, O_RDONLY))==-1) return -2;
00167 MD(fprintf(stderr,"\r\n"));
00168 initPalette ( pbp, pseudo);
00169 return 0;
00170 }
00171
00172 void closePixelBuffers(struct pixel_buffers * pbp) {
00173 if (pbp->data_fd>=0) {
00174 close(pbp->data_fd);
00175 pbp->data_fd=-1;
00176 }
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 unsigned char * getPixelRow(struct pixel_buffers * pbp, int row) {
00200 int i,j;
00201 int curFilter;
00202 unsigned char * pr;
00203 unsigned long * pp;
00204 unsigned long d;
00205 if (pbp->data_fd <0) return NULL;
00206
00207 if ((pbp->color)==1) {
00208 if ((row < 1) || (row >= (pbp->imageHeight-1))) return NULL;
00209
00210 if ((row-1) == pbp->bufferedRows[0]) pbp->prev= (unsigned char *) pbp->BayerRows[0];
00211 else if ((row-1) == pbp->bufferedRows[1]) pbp->prev= (unsigned char *) pbp->BayerRows[1];
00212 else if ((row-1) == pbp->bufferedRows[2]) pbp->prev= (unsigned char *) pbp->BayerRows[2];
00213 else {
00214 i= (pbp->bufferedRows[0] > pbp->bufferedRows[1])? \
00215 ((pbp->bufferedRows[2] > pbp->bufferedRows[1])? 1 : 2 ): \
00216 ((pbp->bufferedRows[0] > pbp->bufferedRows[2])? 2 : 0 );
00217 pbp->prev= getMonoRow(pbp, row-1, i);
00218 pbp->bufferedRows[i]=row-1;
00219 }
00220 if ((row ) == pbp->bufferedRows[0]) pbp->this= (unsigned char *) pbp->BayerRows[0];
00221 else if ((row ) == pbp->bufferedRows[1]) pbp->this= (unsigned char *) pbp->BayerRows[1];
00222 else if ((row ) == pbp->bufferedRows[2]) pbp->this= (unsigned char *) pbp->BayerRows[2];
00223 else {
00224 i= (pbp->bufferedRows[0] > pbp->bufferedRows[1])? \
00225 ((pbp->bufferedRows[2] > pbp->bufferedRows[1])? 1 : 2 ): \
00226 ((pbp->bufferedRows[0] > pbp->bufferedRows[2])? 2 : 0 );
00227 pbp->this= getMonoRow(pbp, row , i);
00228 pbp->bufferedRows[i]=row ;
00229 }
00230 if ((row+1) == pbp->bufferedRows[0]) pbp->next= (unsigned char *) pbp->BayerRows[0];
00231 else if ((row+1) == pbp->bufferedRows[1]) pbp->next= (unsigned char *) pbp->BayerRows[1];
00232 else if ((row+1) == pbp->bufferedRows[2]) pbp->next= (unsigned char *) pbp->BayerRows[2];
00233 else {
00234 i= (pbp->bufferedRows[0] > pbp->bufferedRows[1])? \
00235 ((pbp->bufferedRows[2] > pbp->bufferedRows[1])? 1 : 2 ): \
00236 ((pbp->bufferedRows[0] > pbp->bufferedRows[2])? 2 : 0 );
00237 pbp->next= getMonoRow(pbp, row+1, i);
00238 pbp->bufferedRows[i]=row+1;
00239 }
00240
00241
00242 if ((!pbp->prev) || (!pbp->this) || (!pbp->next)) return NULL;
00243
00244
00245 curFilter=((pbp->BayerOrient ^ 1) ^ (row << 1)) & 3;
00246 j=0;
00247 for (i=1;i<(pbp->imageWidth-1);i++){
00248 switch (curFilter) {
00249 case 0: {
00250 pbp->rgb[j++]= pbp->this[i];
00251 pbp->rgb[j++]=((int) pbp->this[i+1]+pbp->this[i-1]+pbp->prev[i ]+pbp->next[i ]) >> 2;
00252 pbp->rgb[j++]=((int) pbp->prev[i+1]+pbp->prev[i-1]+pbp->next[i+1]+pbp->next[i-1]) >> 2;
00253 break;
00254 }
00255 case 1: {
00256 pbp->rgb[j++]=((int) pbp->this[i+1]+pbp->this[i-1]) >> 1;
00257 pbp->rgb[j++]= pbp->this[i ];
00258 pbp->rgb[j++]=((int) pbp->prev[i ]+pbp->next[i ]) >> 1;
00259 break;
00260 }
00261 case 2: {
00262 pbp->rgb[j++]=((int) pbp->prev[i ]+pbp->next[i ]) >> 1;
00263 pbp->rgb[j++]= pbp->this[i ];
00264 pbp->rgb[j++]=((int) pbp->this[i+1]+pbp->this[i-1]) >> 1;
00265 break;
00266 }
00267 case 3: {
00268 pbp->rgb[j++]=((int) pbp->prev[i+1]+pbp->prev[i-1]+pbp->next[i+1]+pbp->next[i-1]) >> 2;
00269 pbp->rgb[j++]=((int) pbp->this[i+1]+pbp->this[i-1]+pbp->prev[i ]+pbp->next[i ]) >> 2;
00270 pbp->rgb[j++]= pbp->this[i];
00271 break;
00272 }
00273 }
00274 curFilter ^=1;
00275
00276 }
00277
00278
00279 return (unsigned char*) pbp->rgb;
00280 } else if ((pbp->color)==2) {
00281
00282
00283
00284 pr=getMonoRow(pbp, row, 0);
00285 pp=getPalette(pbp);
00286 j=0;
00287 for (i=0;i<(pbp->imageWidth);i++){
00288 d=pp[pr[i]];
00289
00290
00291
00292
00293 pbp->rgb[j++]= ((d >> 16) & 0xff);
00294 pbp->rgb[j++]= ((d >> 8) & 0xff);
00295 pbp->rgb[j++]= (d & 0xff);
00296 }
00297 return (unsigned char*) pbp->rgb;
00298 } else return getMonoRow(pbp, row, 0);
00299 }
00300
00301 unsigned char * getMonoRow(struct pixel_buffers * pbp, int row, int bufn) {
00302
00303
00304 if (pbp->data_fd < 0) return NULL;
00305 if ((bufn < 0) || (bufn > 2)) return NULL;
00306 if ((row < 0) || (row >= pbp->imageHeight)) return NULL;
00307 switch(pbp->depth){
00308 case 8: return convert8to8 (pbp->data_fd,pbp->BayerRows[bufn],row,pbp->imageWidth,pbp->shft);
00309 default: return convert16to8 (pbp->data_fd,pbp->BayerRows[bufn],row,pbp->imageWidth,pbp->shft);
00310 }
00311 }
00312
00313
00314
00315
00316
00317
00318
00319 unsigned char* convert8to8 ( int data_fd,
00320 unsigned long * row8Bit,
00321 int rowNumber,
00322 int ImageWidth,
00323 int Contrast) {
00324 int i,DMALongsPerRow;
00325 unsigned long dmask;
00326
00327
00328 lseek(data_fd,ImageWidth*rowNumber,0);
00329 read (data_fd,row8Bit,ImageWidth);
00330 if (Contrast>0) {
00331 DMALongsPerRow=(ImageWidth>>2)+ ((ImageWidth & 3)? 1:0);
00332 dmask=(0xff<<Contrast) & 0xff;
00333 dmask |= ((dmask)<<8) | ((dmask)<<16) | ((dmask)<<24);
00334 MD(fprintf(stderr,"row= %d, Contrast=%d, dmask=%lx\r\n",rowNumber,Contrast,dmask));
00335 for (i=0;i<DMALongsPerRow;i++) row8Bit[i]=(row8Bit[i]<<Contrast) & dmask;
00336 }
00337 return (unsigned char*) row8Bit;
00338 }
00339
00340 unsigned char* convert16to8 ( int data_fd,
00341 unsigned long * row8Bit,
00342 int rowNumber,
00343 int ImageWidth,
00344 int Contrast) {
00345 int i,sr,sl;
00346 unsigned long lrow16[(MAX_IMAGE_WIDTH >>1 ) + 4] ;
00347 short * row16= (short *) lrow16;
00348 unsigned char * brow8= (unsigned char *) row8Bit;
00349
00350 lseek(data_fd,(ImageWidth*rowNumber)<<1,0);
00351 read (data_fd,row16,ImageWidth<<1);
00352 sr=2-Contrast;
00353 sl=Contrast-2;
00354 if (Contrast <= 2) for (i=0;i<ImageWidth;i++) brow8[i]= (row16[i]>>sr) & 0xff;
00355 else for (i=0;i<ImageWidth;i++) brow8[i]= (row16[i]<<sl) & 0xff;
00356 return (unsigned char*) row8Bit;
00357 }
00358
00359
00360