Mercurial > hg > aim92
diff saitools/changeheader.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/saitools/changeheader.c Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,285 @@ +/* + Copyright (c) Applied Psychology Unit, Medical Research Council. 1993 + =========================================================================== + + Permission to use, copy, modify, and distribute this software without fee + is hereby granted for research purposes, provided that this copyright + notice appears in all copies and in all supporting documentation, and that + the software is not redistributed for any fee (except for a nominal + shipping charge). Anyone wanting to incorporate all or part of this + software in a commercial product must obtain a license from the Medical + Research Council. + + The MRC makes no representations about the suitability of this + software for any purpose. It is provided "as is" without express or + implied warranty. + + THE MRC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + THE A.P.U. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. +*/ + +/* ------------------------------------------------------------------------*/ + +/* changeheader.c +* ---------------- +* +* 'fakes' sai & nap headers. +* +* M.Akeroyd. Summer 1993. Revised 1994. +*/ + + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "tip.h" + + +void reset_header_bytes(); +void change_framebytes(); + +extern char progname[MAX_STRING_LENGTH]; +extern char header[MAX_LINES_HEADER][MAX_LINE_LENGTH]; + +extern int verboseflag; +extern int header_lines; /* number of lines in header */ + + +/* .nap parameters */ + +extern int no_frames; +extern int frameheight; /* number of channels */ +extern int framewidth_samples; /* = 1 +extern int frameshift_samples; /* = 1 */ +extern int width_win; /* pixels */ +extern int height_win; /* pixels */ +extern long samplerate; /* samples per sec */ +extern int mincf; /* Hz */ +extern int maxcf; /* Hz */ + +extern int greyscaleflag; /* ON or OFF */ + + + +/* ------------------------------------------------------------------------*/ + + + +void changeheader(int no_frames, int new_pwidth, int new_nwidth, int framewidth_samples_output) +{ + /* Reset various values: + * + * number of frames -> no_frames + * pwidth -> new_pwidth + * nwidth -> new_nwidth + * framewidth -> (pwidth+nwidth * samplerate). in msecs + * header_bytes + * + */ + + int new_header_length = 0; + int counter; + char tempstring[MAX_STRING_LENGTH]; + char tempstring2[MAX_STRING_LENGTH]; + + +/*-------------------------------- */ + + for(counter=1; counter<=header_lines; counter++){ + + /* frames */ + if (strncmp(header[counter], "frames=", 7) == 0 ) { + sprintf(header[counter], "frames=%d\n", no_frames);} + + /* pwidth */ + if (strncmp(header[counter], "pwidth_aid=", 11) == 0 ) + sprintf(header[counter], "pwidth_aid=%d\n", new_pwidth); + + /* nwidth */ + /* include a gratuitous minus */ + if (strncmp(header[counter], "nwidth_aid=", 11) == 0 ) + if (new_nwidth < 0) + sprintf(header[counter], "nwidth_aid=%d\n", new_nwidth); + else + sprintf(header[counter], "nwidth_aid=-%d\n", new_nwidth); + + /* framewidth */ + if (strncmp(header[counter], "framewidth=", 11) == 0 ) + sprintf(header[counter], "framewidth=%d\n", framewidth_samples_output); + + /*view=landscape */ + if (greyscaleflag == ON) + if (strncmp(header[counter], "view=landscape", 14) == 0 ) + sprintf(header[counter], "view=greyscale\n"); + + } + + /* reset framebytes */ + change_framebytes(); + + /* reset header */ + reset_header_bytes; + +} + + + +/* ------------------------------------------------------------------------*/ + + +void change_framebytes() +{ + /* This is seperate beacuse it depends on lots of things + * framebytes -> frameheight * framewidth *2 (bytes), I hope. + */ + + int counter; + char *p_equal=" "; /* pointer to where the '=' is in the headerline */ + char tempstring[MAX_STRING_LENGTH]; + int local_frameheight = 0; + int local_framewidth = 0; + + /* find out the values */ + + for(counter=1; counter<=header_lines; counter++) { + if (strncmp(header[counter], "frameheight=", 12) == 0 ) { + p_equal = strchr(header[counter], '='); + local_frameheight = atoi(++p_equal); } + if (strncmp(header[counter], "framewidth=", 11) == 0 ) { + p_equal = strchr(header[counter], '='); + local_framewidth = atoi(++p_equal); }} + + /* put in new value */ + + for(counter=1; counter<=header_lines; counter++){ + if (strncmp(header[counter], "framebytes=", 11) == 0 ) + sprintf(header[counter], "framebytes=%d\n", (local_framewidth * local_frameheight *2)); + } +} + + + +/* ------------------------------------------------------------------------*/ + + + +void reset_header_bytes() +{ + /* What this code does: + * + * My latest attempt to get the "header_bytes" field to be set to the + * right number, well, one that AIM accepts. + * + * At the moment, it assumes + * (1) all headers are an even number of bytes long + * (2) the field is 7 characters long + * (3) header_bytes = total length of all strings in header + + 2 + * + */ + + int new_header_length = 0; + int counter; + char tempstring[MAX_STRING_LENGTH]; + char tempstring2[MAX_STRING_LENGTH]; + + /* find out how many bytes there SHOULD be */ + for(counter=0; counter<=header_lines; counter++) + new_header_length = new_header_length + strlen(header[counter]); + + /* If this is odd, change to even.*/ + if ((new_header_length % 2) == 1) + new_header_length ++; + + /* add 2 to it */ + new_header_length += 2; + + /* put lots of zeros on front */ + sprintf(tempstring, "%d", new_header_length); + + /* add enough zero's on front to make it 7 chars long. + * Since this was the length of the input's field, I don't need to + * worry about it changing the true length of the header */ + + while (strlen(tempstring) != 7 ){ + strcpy(tempstring2, "0"); + strcat(tempstring2, tempstring); + strcpy(tempstring, tempstring2);} + + + /* use this value to reset header_bytes */ + sprintf(header[0], "header_bytes=%s\n", tempstring); + +} + + + +/* ------------------------------------------------------------------------*/ + + + +void changeheader_B(int new_mincf, int new_maxcf, int new_channels) +{ + /* Reset various values: + * + * mincf == new_mincf + * maxcf == new_maxcf + * channels = framehieght == new_channels + * + * NB This assumes "channels=" and "frameheight=" are both set to the + * same value. I haven't yet seen a .sai in which they are + * different, but I haven't looked too hard. + * + */ + + int new_header_length = 0; + int counter; + char tempstring[MAX_STRING_LENGTH]; + char tempstring2[MAX_STRING_LENGTH]; + + + for(counter=1; counter<=header_lines; counter++){ + + /* mincf */ + if (strncmp(header[counter], "mincf_afb=", 10) == 0 ) { + sprintf(header[counter], "mincf_afb=%d\n", new_mincf);} + + /* maxcf */ + if (strncmp(header[counter], "maxcf_afb=", 10) == 0 ) { + sprintf(header[counter], "maxcf_afb=%d\n", new_maxcf);} + + /* channels */ + if (strncmp(header[counter], "channels_afb=", 12) == 0 ) { + sprintf(header[counter], "channels_afb=%d\n", new_channels);} + + /* frameheight */ + if (strncmp(header[counter], "frameheight=", 12) == 0 ) + sprintf(header[counter], "frameheight=%d\n", new_channels); + + } + + /* reset framebytes */ + change_framebytes(); + + /* reset header */ + reset_header_bytes; + +} + + +/* The End */ +/* ------------------------------------------------------------------------*/ + + + + + + + + +