annotate tools/bufframe.c @ 0:5242703e91d3 tip

Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author tomwalters
date Fri, 20 May 2011 15:19:45 +0100
parents
children
rev   line source
tomwalters@0 1 /*
tomwalters@0 2 bufframe.c shifting AIM output frame buffer.
tomwalters@0 3 ----------
tomwalters@0 4
tomwalters@0 5
tomwalters@0 6
tomwalters@0 7 Examples:
tomwalters@0 8
tomwalters@0 9 1. To convert gennap output to multiple animated frames:
tomwalters@0 10
tomwalters@0 11 gennap len=16ms display=off output=stdout file | \
tomwalters@0 12 bufframe width=8ms frstep=0.2ms anim=on > file.sai
tomwalters@0 13 gensai useprev=on top=1000 cegc -(for landscape plot)
tomwalters@0 14 genspl useprev=on top=1000 pensize=2 cegc -(for spiral plot)
tomwalters@0 15
tomwalters@0 16 (Note: spirals look better in a square box, so you might use options:
tomwalters@0 17 dencf=1 width=500 height=500 )
tomwalters@0 18
tomwalters@0 19 2. To view the basilar membrane from a cross section, animating the waves on it.
tomwalters@0 20
tomwalters@0 21 genbmm mincf=220 maxcf=660 len=8ms output=stdout display=off file | \
tomwalters@0 22 bufframe width=1p frstep=1p Tran=on display=on anim=on > foo.sai
tomwalters@0 23 gensai bott=-100 useprev=on mag=.2 foo
tomwalters@0 24
tomwalters@0 25 or:
tomwalters@0 26
tomwalters@0 27 genbmm mincf=220 maxcf=660 len=32ms output=stdout display=off file | \
tomwalters@0 28 bufframe width=1p frstep=1p Tran=on Header=off > foo
tomwalters@0 29
tomwalters@0 30 x11play -n75 -a500 foo
tomwalters@0 31
tomwalters@0 32 */
tomwalters@0 33
tomwalters@0 34
tomwalters@0 35
tomwalters@0 36 #include <stdio.h>
tomwalters@0 37 #include <math.h>
tomwalters@0 38 #include "header.h"
tomwalters@0 39 #include "options.h"
tomwalters@0 40 #include "units.h"
tomwalters@0 41 #include "strmatch.h"
tomwalters@0 42
tomwalters@0 43
tomwalters@0 44 char applic[] = "shifting AIM output frame buffer. " ;
tomwalters@0 45
tomwalters@0 46
tomwalters@0 47 static char *helpstr, *debugstr, *dispstr, *anistr, *transtr ;
tomwalters@0 48 static char *widthstr, *shiftstr, *headerstr, *framestr ;
tomwalters@0 49
tomwalters@0 50 static Options option[] = {
tomwalters@0 51 { "help" , "off" , &helpstr , "help" , DEBUG },
tomwalters@0 52 { "debug" , "off" , &debugstr , "debugging switch" , DEBUG },
tomwalters@0 53 { "width" , "32ms" , &widthstr , "Width of image frame." , VAL },
tomwalters@0 54 { "frstep" , "16ms" , &shiftstr , "Step between image frames." , VAL },
tomwalters@0 55 { "frames" , "min-max" , &framestr , "Select frames inclusively" , VAL },
tomwalters@0 56 { "Transpose" , "off" , &transtr , "Transpose image frames" , SETFLAG },
tomwalters@0 57 { "Header" , "on" , &headerstr , "Header (for gensai useprevious=on)." , VAL },
tomwalters@0 58 { "display" , "on" , &dispstr , "Display output image." , SETFLAG },
tomwalters@0 59 { "animate" , "off" , &anistr , "Animate cartoon." , SETFLAG },
tomwalters@0 60 ( char * ) 0 } ;
tomwalters@0 61
tomwalters@0 62
tomwalters@0 63 int frameheight, framewidth, frames, framebytes ;
tomwalters@0 64 int Newframeheight, Newframewidth, Newframes, Newframebytes ;
tomwalters@0 65
tomwalters@0 66 int rows, cols, numframes ;
tomwalters@0 67 int Newrows, Newcols, Newnumframes ;
tomwalters@0 68
tomwalters@0 69 int samplerate ;
tomwalters@0 70 int frstep ;
tomwalters@0 71 int application ;
tomwalters@0 72 int startbytes ;
tomwalters@0 73 int frshift ;
tomwalters@0 74 int Transpose ;
tomwalters@0 75
tomwalters@0 76 main(argc, argv)
tomwalters@0 77 int argc ;
tomwalters@0 78 char *argv[] ;
tomwalters@0 79 {
tomwalters@0 80 FILE *fp ;
tomwalters@0 81 char *header, *Header() ;
tomwalters@0 82 short *frame, *endframe ;
tomwalters@0 83 char *val1, *val2 ;
tomwalters@0 84 int i,j,k, a,b ;
tomwalters@0 85
tomwalters@0 86 fp = openopts( option,argc,argv ) ;
tomwalters@0 87 if ( !isoff( helpstr ) )
tomwalters@0 88 helpopts( helpstr, argv[0], applic, option ) ;
tomwalters@0 89
tomwalters@0 90 if ( ( header = ReadHeader( fp ) ) == (char *) 0 ) {
tomwalters@0 91 fprintf( stderr, "edframe: header not found\n" ) ;
tomwalters@0 92 exit( 1 ) ;
tomwalters@0 93 }
tomwalters@0 94 frameheight = HeaderInt( header, "frameheight" );
tomwalters@0 95 framewidth = HeaderInt( header, "framewidth" );
tomwalters@0 96 frames = HeaderInt( header, "frames" );
tomwalters@0 97 samplerate = HeaderSamplerate( header );
tomwalters@0 98
tomwalters@0 99 if ( ( application = Applic( header) ) < 0 ) {
tomwalters@0 100 fprintf(stderr,"bufframe: application name not found in header\n" ) ;
tomwalters@0 101 exit( 1 ) ;
tomwalters@0 102 }
tomwalters@0 103 if ( Format( application ) != NAP ) {
tomwalters@0 104 fprintf(stderr,"bufframe: buffer for %s format not implemented\n", gen_applics[application] ) ;
tomwalters@0 105 exit( 1 ) ;
tomwalters@0 106 }
tomwalters@0 107 frame_to_matrix( NAP, &rows, &cols, &numframes, frameheight, framewidth, frames ) ;
tomwalters@0 108
tomwalters@0 109 Transpose = ison( transtr ) ;
tomwalters@0 110 frstep = to_p( shiftstr, samplerate ) ;
tomwalters@0 111 Newrows = frameheight ;
tomwalters@0 112 Newcols = to_p( widthstr, samplerate ) ;
tomwalters@0 113 Newnumframes = ( cols - Newcols ) / frstep + 1 ; /* since: Newcols + ( Newnumframes - 1 ) * frstep <= cols */
tomwalters@0 114
tomwalters@0 115
tomwalters@0 116 /* Get limits on specified number of frames */
tomwalters@0 117
tomwalters@0 118 if ( getvals( framestr, &val1, &val2, "-" ) == BADVAL ) {
tomwalters@0 119 fprintf(stderr,"bufframe: bad frame selector [%s]\n", framestr ) ;
tomwalters@0 120 exit( 1 ) ;
tomwalters@0 121 }
tomwalters@0 122 if ( ismin( val1 ) ) a = 0 ;
tomwalters@0 123 else if ( ismax( val1 ) ) a = Newnumframes - 1 ;
tomwalters@0 124 else if ( Units( val1 ) ) a = (int)to_p( val1, samplerate ) / frstep ;
tomwalters@0 125 else a = atoi( val1 ) ;
tomwalters@0 126
tomwalters@0 127 if ( isempty( val2 ) ) b = a ;
tomwalters@0 128 else if ( ismin( val2 ) ) b = 0 ;
tomwalters@0 129 else if ( ismax( val2 ) ) b = Newnumframes - 1 ;
tomwalters@0 130 else if ( Units( val2 ) ) b = (int)to_p( val2, samplerate ) / frstep ;
tomwalters@0 131 else b = atoi( val2 ) ;
tomwalters@0 132
tomwalters@0 133 if (a<0 || b>=Newnumframes || a>b) {
tomwalters@0 134 if ( b>=Newnumframes ) fprintf(stderr,"bufframe: bad frame selector [%d frames needed but %d available]\n", b+1, Newnumframes );
tomwalters@0 135 else fprintf(stderr,"bufframe: bad frame selector \n" );
tomwalters@0 136 exit(1);
tomwalters@0 137 }
tomwalters@0 138
tomwalters@0 139 Newnumframes = b - a + 1 ;
tomwalters@0 140
tomwalters@0 141 framebytes = Newrows * ( Newcols + ( Newnumframes - 1 ) * frstep ) * sizeof(short) ;
tomwalters@0 142
tomwalters@0 143 if ( Transpose )
tomwalters@0 144 matrix_to_frame( SAI, Newcols, Newrows, Newnumframes, &Newframeheight, &Newframewidth, &Newframes ) ;
tomwalters@0 145 else
tomwalters@0 146 matrix_to_frame( SAI, Newrows, Newcols, Newnumframes, &Newframeheight, &Newframewidth, &Newframes ) ;
tomwalters@0 147
tomwalters@0 148 Newframebytes = Newframeheight * Newframewidth * sizeof(short) ;
tomwalters@0 149
tomwalters@0 150 if ( ison( headerstr ) )
tomwalters@0 151 WriteHeader( Header( header ), stdout ) ;
tomwalters@0 152
tomwalters@0 153
tomwalters@0 154 /* Allocate space for framebytes of data */
tomwalters@0 155
tomwalters@0 156 if ( ( frame = (short *)malloc( framebytes ) ) == NULL ) {
tomwalters@0 157 fprintf( stderr, "bufframe: malloc out of space\n" ) ;
tomwalters@0 158 exit( 1 ) ;
tomwalters@0 159 }
tomwalters@0 160
tomwalters@0 161 frshift = frstep * rows ;
tomwalters@0 162
tomwalters@0 163 /* Seek past `a' frames in blocks of framebytes */
tomwalters@0 164
tomwalters@0 165 startbytes = a * frshift * sizeof(short) ;
tomwalters@0 166 for (i=framebytes ; i < startbytes ; i += framebytes)
tomwalters@0 167 if ( fread( frame, framebytes, 1, fp ) == NULL ) {
tomwalters@0 168 fprintf(stderr,"bufframe: missing data after header\n");
tomwalters@0 169 exit(1);
tomwalters@0 170 }
tomwalters@0 171 if ( (startbytes -= (i - framebytes)) > 0 )
tomwalters@0 172 if ( fread( frame, startbytes, 1, fp ) == NULL ) {
tomwalters@0 173 fprintf(stderr,"bufframe: missing data after header\n");
tomwalters@0 174 exit(1);
tomwalters@0 175 }
tomwalters@0 176
tomwalters@0 177 /* Read framebytes of data */
tomwalters@0 178
tomwalters@0 179 if ( fread( frame, framebytes, 1, fp ) == NULL ) {
tomwalters@0 180 fprintf(stderr,"bufframe: insufficient data after header\n");
tomwalters@0 181 exit(1);
tomwalters@0 182 }
tomwalters@0 183 fclose( fp ) ;
tomwalters@0 184
tomwalters@0 185 endframe = frame + Newframes * frshift ;
tomwalters@0 186
tomwalters@0 187 fprintf(stderr,"bufframe: %d frames [height=%d width=%d]\n", Newnumframes, Newframeheight, Newframewidth );
tomwalters@0 188
tomwalters@0 189 if ( ison( debugstr ) ) {
tomwalters@0 190 fprintf( stderr," frameheight=%3d framewidth=%3d frames=%3d framebytes=%d\n", frameheight, framewidth, frames, framebytes ) ;
tomwalters@0 191 fprintf( stderr,"Newframeheight=%3d Newframewidth=%3d Newframes=%3d Newframebytes=%d\n", Newframeheight, Newframewidth, Newframes, Newframebytes ) ;
tomwalters@0 192 fprintf( stderr," rows=%3d cols=%3d numframes=%d\n", rows, cols, numframes ) ;
tomwalters@0 193 fprintf( stderr," Newrows=%3d Newcols=%3d Newnumframes=%d\n", Newrows, Newcols, Newnumframes ) ;
tomwalters@0 194 fprintf( stderr,"frstep=%d startbytes=%d frshift=%d\n", frstep, startbytes, frshift ) ;
tomwalters@0 195 exit( 1 ) ;
tomwalters@0 196 }
tomwalters@0 197
tomwalters@0 198 if ( Transpose ) {
tomwalters@0 199
tomwalters@0 200 for ( ; frame < endframe ; frame += frshift )
tomwalters@0 201 for ( j=0 ; j < Newcols ; j++ )
tomwalters@0 202 fwrite( frame + j*frameheight, sizeof(short), Newrows, stdout ) ;
tomwalters@0 203 }
tomwalters@0 204
tomwalters@0 205 else {
tomwalters@0 206 for ( ; frame < endframe ; frame += frshift )
tomwalters@0 207 for (j=0 ; j < Newrows ; j++)
tomwalters@0 208 for (k=0 , i=j ; k < Newcols ; k++, i+=frameheight)
tomwalters@0 209 fwrite( &frame[i], sizeof(short), 1, stdout );
tomwalters@0 210 }
tomwalters@0 211 fprintf(stderr,"bufframe: done\n" );
tomwalters@0 212 }
tomwalters@0 213
tomwalters@0 214
tomwalters@0 215
tomwalters@0 216 /* Return 1 if the str has appended units. Otherwise return 0. */
tomwalters@0 217 /* (A freqency specifier with no units is interpreted as a channel number) */
tomwalters@0 218
tomwalters@0 219 Units(str)
tomwalters@0 220 char *str ;
tomwalters@0 221 {
tomwalters@0 222 char *eptr = str + strlen( str ) ;
tomwalters@0 223
tomwalters@0 224 if( isdigit( *--eptr ) ) return 0 ; /* last char is digit, so no units */
tomwalters@0 225 else return 1 ;
tomwalters@0 226 }
tomwalters@0 227
tomwalters@0 228
tomwalters@0 229 /*
tomwalters@0 230 Copy the original (NAP format) header to a new sai header, changing in order:
tomwalters@0 231 frstep
tomwalters@0 232 frames
tomwalters@0 233 framewidth
tomwalters@0 234 frameheight
tomwalters@0 235 framebytes
tomwalters@0 236 animate
tomwalters@0 237 display
tomwalters@0 238 Copy application name "sai" into the version string.
tomwalters@0 239 Finally, update the new header_bytes, and return the new header.
tomwalters@0 240 */
tomwalters@0 241
tomwalters@0 242 char *Header( oldheader )
tomwalters@0 243 char *oldheader ;
tomwalters@0 244 {
tomwalters@0 245 char *saiheader;
tomwalters@0 246 char *p0, *p1, *p2, *s, str[64];
tomwalters@0 247
tomwalters@0 248 saiheader = (char *)malloc( strlen(oldheader) + 256 ) ;
tomwalters@0 249
tomwalters@0 250 p0 = saiheader ;
tomwalters@0 251 p1 = oldheader ;
tomwalters@0 252
tomwalters@0 253 /* copy to first item after the header_bytes */
tomwalters@0 254
tomwalters@0 255 p2 = HeaderString( oldheader , "header_bytes" ) ;
tomwalters@0 256 while( p1 < p2 )
tomwalters@0 257 *p0++ = *p1++ ;
tomwalters@0 258 while (*p1 != '\n')
tomwalters@0 259 *p0++ = *p1++ ;
tomwalters@0 260 *p0++ = *p1++;
tomwalters@0 261
tomwalters@0 262 /* insert frstep_aid at top of new header */
tomwalters@0 263
tomwalters@0 264 sprintf( str,"frstep_aid=%s\n", shiftstr ) ;
tomwalters@0 265 for (s = str ; *s != '\n' ; )
tomwalters@0 266 *p0++ = *s++;
tomwalters@0 267 *p0++ = *s;
tomwalters@0 268
tomwalters@0 269
tomwalters@0 270 /** copy up to channels_afb (if transpose changes apparent number of channels) **/
tomwalters@0 271
tomwalters@0 272 if ( Transpose ) {
tomwalters@0 273 p2 = HeaderString( oldheader , "channels_afb" ) ;
tomwalters@0 274 while( p1 < p2 )
tomwalters@0 275 *p0++ = *p1++ ;
tomwalters@0 276
tomwalters@0 277 sprintf(str,"%d\n", Newframeheight);
tomwalters@0 278 for (s = str ; *s != '\n' ; )
tomwalters@0 279 *p0++ = *s++;
tomwalters@0 280 *p0++ = *s;
tomwalters@0 281 while (*p1 != '\n')
tomwalters@0 282 *p1++;
tomwalters@0 283 *p1++;
tomwalters@0 284 }
tomwalters@0 285
tomwalters@0 286
tomwalters@0 287 /** copy up to frames **/
tomwalters@0 288
tomwalters@0 289 p2 = HeaderString( oldheader , "frames" ) ;
tomwalters@0 290 while( p1 < p2 )
tomwalters@0 291 *p0++ = *p1++ ;
tomwalters@0 292
tomwalters@0 293 sprintf(str,"%d\n", Newframes);
tomwalters@0 294 for (s = str ; *s != '\n' ; )
tomwalters@0 295 *p0++ = *s++;
tomwalters@0 296 *p0++ = *s;
tomwalters@0 297 while (*p1 != '\n')
tomwalters@0 298 *p1++;
tomwalters@0 299 *p1++;
tomwalters@0 300
tomwalters@0 301
tomwalters@0 302 /** copy up to framewidth **/
tomwalters@0 303
tomwalters@0 304 p2 = HeaderString( oldheader , "framewidth" ) ;
tomwalters@0 305 while ( p1 < p2 )
tomwalters@0 306 *p0++ = *p1++ ;
tomwalters@0 307
tomwalters@0 308 sprintf(str,"%d\n", Newframewidth);
tomwalters@0 309 for (s = str ; *s != '\n' ; )
tomwalters@0 310 *p0++ = *s++;
tomwalters@0 311 *p0++ = *s;
tomwalters@0 312 while (*p1 != '\n')
tomwalters@0 313 *p1++;
tomwalters@0 314 *p1++;
tomwalters@0 315
tomwalters@0 316
tomwalters@0 317 /** copy up to frameheight **/
tomwalters@0 318
tomwalters@0 319 p2 = HeaderString( oldheader , "frameheight" ) ;
tomwalters@0 320 while ( p1 < p2 )
tomwalters@0 321 *p0++ = *p1++ ;
tomwalters@0 322
tomwalters@0 323 sprintf(str,"%d\n", Newframeheight);
tomwalters@0 324 for (s = str ; *s != '\n' ; )
tomwalters@0 325 *p0++ = *s++;
tomwalters@0 326 *p0++ = *s;
tomwalters@0 327 while (*p1 != '\n')
tomwalters@0 328 *p1++;
tomwalters@0 329 *p1++;
tomwalters@0 330
tomwalters@0 331
tomwalters@0 332 /** copy up to framebytes **/
tomwalters@0 333
tomwalters@0 334 p2 = HeaderString( oldheader , "framebytes" ) ;
tomwalters@0 335 while ( p1 < p2 )
tomwalters@0 336 *p0++ = *p1++ ;
tomwalters@0 337
tomwalters@0 338 sprintf(str,"%d\n", Newframebytes);
tomwalters@0 339 for (s = str ; *s != '\n' ; )
tomwalters@0 340 *p0++ = *s++;
tomwalters@0 341 *p0++ = *s;
tomwalters@0 342 while (*p1 != '\n')
tomwalters@0 343 *p1++;
tomwalters@0 344 *p1++;
tomwalters@0 345
tomwalters@0 346
tomwalters@0 347 /** copy up to animate_ctn **/
tomwalters@0 348
tomwalters@0 349 p2 = HeaderString( oldheader , "animate_ctn" ) ;
tomwalters@0 350 while ( p1 < p2 )
tomwalters@0 351 *p0++ = *p1++ ;
tomwalters@0 352
tomwalters@0 353 sprintf(str,"%s\n", anistr );
tomwalters@0 354 for (s = str ; *s != '\n' ; )
tomwalters@0 355 *p0++ = *s++;
tomwalters@0 356 *p0++ = *s;
tomwalters@0 357 while (*p1 != '\n')
tomwalters@0 358 *p1++;
tomwalters@0 359 *p1++;
tomwalters@0 360
tomwalters@0 361
tomwalters@0 362 /** copy up to display **/
tomwalters@0 363
tomwalters@0 364 p2 = HeaderString( oldheader , "display" ) ;
tomwalters@0 365 while ( p1 < p2 )
tomwalters@0 366 *p0++ = *p1++ ;
tomwalters@0 367
tomwalters@0 368 sprintf(str,"%s\n", dispstr );
tomwalters@0 369 for (s = str ; *s != '\n' ; )
tomwalters@0 370 *p0++ = *s++;
tomwalters@0 371 *p0++ = *s;
tomwalters@0 372 while (*p1 != '\n')
tomwalters@0 373 *p1++;
tomwalters@0 374 *p1++;
tomwalters@0 375
tomwalters@0 376
tomwalters@0 377 /** copy rest of header **/
tomwalters@0 378
tomwalters@0 379 p2 = HeaderString( oldheader , "Version" ) ;
tomwalters@0 380 while ( p1 < p2 )
tomwalters@0 381 *p0++ = *p1++ ;
tomwalters@0 382
tomwalters@0 383 /** ( copy application name "sai" into header ) **/
tomwalters@0 384
tomwalters@0 385 if ( ( p2 = ApplicString( oldheader ) ) == (char *)0 ) {
tomwalters@0 386 fprintf(stderr,"bufframe: application name not found in header\n");
tomwalters@0 387 exit( 1 ) ;
tomwalters@0 388 }
tomwalters@0 389 while ( p1 < p2 )
tomwalters@0 390 *p0++ = *p1++ ;
tomwalters@0 391
tomwalters@0 392 *p0++ = 's' ; *p0++ = 'a' ; *p0++ = 'i' ;
tomwalters@0 393 p1 += 3 ;
tomwalters@0 394
tomwalters@0 395 while (*p1 != '\n')
tomwalters@0 396 *p0++ = *p1++ ;
tomwalters@0 397 *p0++ = *p1++ ;
tomwalters@0 398
tomwalters@0 399
tomwalters@0 400 /** update header_bytes **/
tomwalters@0 401
tomwalters@0 402 sprintf(str, "%0*d", 7, p0-saiheader);
tomwalters@0 403 p0 = HeaderString( saiheader , "header_bytes" ) ;
tomwalters@0 404 s = str;
tomwalters@0 405 while(*p0 != '\n')
tomwalters@0 406 *p0++ = *s++ ;
tomwalters@0 407
tomwalters@0 408
tomwalters@0 409 return saiheader;
tomwalters@0 410 }
tomwalters@0 411
tomwalters@0 412
tomwalters@0 413
tomwalters@0 414