METHODDEF boolean get_app0(j_decompress_ptr cinfo) /* Process an APP0 marker */ { #define JFIF_LEN 14 INT32 length; UINT8 b[JFIF_LEN]; int buffp; INPUT_VARS(cinfo); INPUT_2BYTES(cinfo, length, return FALSE); length -= 2; /* See if a JFIF APP0 marker is present */ if(length >= JFIF_LEN) { for(buffp = 0; buffp < JFIF_LEN; buffp++) INPUT_BYTE(cinfo, b[buffp], return FALSE); length -= JFIF_LEN; if(b[0] == 0x4A && b[1] == 0x46 && b[2] == 0x49 && b[3] == 0x46 && b[4] == 0) { /* Found JFIF APP0 marker: check version */ /* Major version must be 1, anything else signals an incompatible change. * We used to treat this as an error, but now it's a nonfatal warning, * because some bozo at Hijaak couldn't read the spec. * Minor version should be 0..2, but process anyway if newer. */ if(b[5] != 1) WARNMS2(cinfo, JWRN_JFIF_MAJOR, b[5], b[6]); else if(b[6] > 2) TRACEMS2(cinfo, 1, JTRC_JFIF_MINOR, b[5], b[6]); /* Save info */ cinfo->saw_JFIF_marker = TRUE; cinfo->density_unit = b[7]; cinfo->X_density = (b[8] << 8) + b[9]; cinfo->Y_density = (b[10] << 8) + b[11]; TRACEMS3(cinfo, 1, JTRC_JFIF, cinfo->X_density, cinfo->Y_density, cinfo->density_unit); if(b[12] | b[13]) TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, b[12], b[13]); if(length != ((INT32) b[12] * (INT32) b[13] * (INT32) 3)) TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int)length); } else { /* Start of APP0 does not match "JFIF" */ TRACEMS1(cinfo, 1, JTRC_APP0, (int)length + JFIF_LEN); } } else {
METHODDEF boolean get_app0 (j_decompress_ptr cinfo) /* Process an APP0 marker */ { #define JFIF_LEN 14 INT32 length; UINT8 b[JFIF_LEN]; int buffp; INPUT_VARS(cinfo); INPUT_2BYTES(cinfo, length, return FALSE); length -= 2; /* See if a JFIF APP0 marker is present */ if (length >= JFIF_LEN) { for (buffp = 0; buffp < JFIF_LEN; buffp++) INPUT_BYTE(cinfo, b[buffp], return FALSE); length -= JFIF_LEN; if (b[0]==0x4A && b[1]==0x46 && b[2]==0x49 && b[3]==0x46 && b[4]==0) { /* Found JFIF APP0 marker: check version */ /* Major version must be 1 */ if (b[5] != 1) ERREXIT2(cinfo, JERR_JFIF_MAJOR, b[5], b[6]); /* Minor version should be 0..2, but try to process anyway if newer */ if (b[6] > 2) TRACEMS2(cinfo, 1, JTRC_JFIF_MINOR, b[5], b[6]); /* Save info */ cinfo->saw_JFIF_marker = TRUE; cinfo->density_unit = b[7]; cinfo->X_density = (b[8] << 8) + b[9]; cinfo->Y_density = (b[10] << 8) + b[11]; TRACEMS3(cinfo, 1, JTRC_JFIF, cinfo->X_density, cinfo->Y_density, cinfo->density_unit); if (b[12] | b[13]) TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, b[12], b[13]); if (length != ((INT32) b[12] * (INT32) b[13] * (INT32) 3)) TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) length); } else { /* Start of APP0 does not match "JFIF" */ TRACEMS1(cinfo, 1, JTRC_APP0, (int) length + JFIF_LEN); } } else {
LOCAL void default_decompress_parms (j_decompress_ptr cinfo) { /* Guess the input colorspace, and set output colorspace accordingly. */ /* (Wish JPEG committee had provided a real way to specify this...) */ /* Note application may override our guesses. */ switch (cinfo->num_components) { case 1: cinfo->jpeg_color_space = JCS_GRAYSCALE; cinfo->out_color_space = JCS_GRAYSCALE; break; case 3: if (cinfo->saw_JFIF_marker) { cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ } else if (cinfo->saw_Adobe_marker) { switch (cinfo->Adobe_transform) { case 0: cinfo->jpeg_color_space = JCS_RGB; break; case 1: cinfo->jpeg_color_space = JCS_YCbCr; break; default: WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ break; } } else { /* Saw no special markers, try to guess from the component IDs */ int cid0 = cinfo->comp_info[0].component_id; int cid1 = cinfo->comp_info[1].component_id; int cid2 = cinfo->comp_info[2].component_id; if (cid0 == 1 && cid1 == 2 && cid2 == 3) cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ else if (cid0 == 82 && cid1 == 71 && cid2 == 66) cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ else { TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ } } /* Always guess RGB is proper output colorspace. */ cinfo->out_color_space = JCS_RGB; break; case 4: if (cinfo->saw_Adobe_marker) { switch (cinfo->Adobe_transform) { case 0: cinfo->jpeg_color_space = JCS_CMYK; break; case 2: cinfo->jpeg_color_space = JCS_YCCK; break; default: WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ break; } } else { /* No special markers, assume straight CMYK. */ cinfo->jpeg_color_space = JCS_CMYK; } cinfo->out_color_space = JCS_CMYK; break; default: cinfo->jpeg_color_space = JCS_UNKNOWN; cinfo->out_color_space = JCS_UNKNOWN; break; } /* Set defaults for other decompression parameters. */ cinfo->scale_num = 1; /* 1:1 scaling */ cinfo->scale_denom = 1; cinfo->output_gamma = 1.0; cinfo->buffered_image = FALSE; cinfo->raw_data_out = FALSE; cinfo->dct_method = JDCT_DEFAULT; cinfo->do_fancy_upsampling = TRUE; cinfo->do_block_smoothing = TRUE; cinfo->quantize_colors = FALSE; /* We set these in case application only sets quantize_colors. */ cinfo->dither_mode = JDITHER_FS; #ifdef QUANT_2PASS_SUPPORTED cinfo->two_pass_quantize = TRUE; #else cinfo->two_pass_quantize = FALSE; #endif cinfo->desired_number_of_colors = 256; cinfo->colormap = NULL; /* Initialize for no mode change in buffered-image mode. */ cinfo->enable_1pass_quant = FALSE; cinfo->enable_external_quant = FALSE; cinfo->enable_2pass_quant = FALSE; }
get_sos (j_decompress_ptr cinfo) /* Process a SOS marker */ { INT32 length; int i, ci, n, c, cc; jpeg_component_info * compptr; INPUT_VARS(cinfo); if (! cinfo->marker->saw_SOF) ERREXIT(cinfo, JERR_SOS_NO_SOF); INPUT_2BYTES(cinfo, length, return FALSE); INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) ERREXIT(cinfo, JERR_BAD_LENGTH); TRACEMS1(cinfo, 1, JTRC_SOS, n); cinfo->comps_in_scan = n; /* Collect the component-spec parameters */ for (i = 0; i < n; i++) { INPUT_BYTE(cinfo, cc, return FALSE); INPUT_BYTE(cinfo, c, return FALSE); for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { if (cc == compptr->component_id) goto id_found; } ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); id_found: cinfo->cur_comp_info[i] = compptr; compptr->dc_tbl_no = (c >> 4) & 15; compptr->ac_tbl_no = (c ) & 15; TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, compptr->dc_tbl_no, compptr->ac_tbl_no); } /* Collect the additional scan parameters Ss, Se, Ah/Al. */ INPUT_BYTE(cinfo, c, return FALSE); cinfo->Ss = c; INPUT_BYTE(cinfo, c, return FALSE); cinfo->Se = c; INPUT_BYTE(cinfo, c, return FALSE); cinfo->Ah = (c >> 4) & 15; cinfo->Al = (c ) & 15; TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); /* Prepare to scan data & restart markers */ cinfo->marker->next_restart_num = 0; /* Count another SOS marker */ cinfo->input_scan_number++; INPUT_SYNC(cinfo); return TRUE; }
LOCAL boolean get_sos (j_decompress_ptr cinfo) /* Process a SOS marker */ { INT32 length; int i, ci, n, c, cc, ccc; jpeg_component_info * compptr; INPUT_VARS(cinfo); if (! cinfo->marker->saw_SOF) ERREXIT(cinfo, JERR_SOS_NO_SOF); INPUT_2BYTES(cinfo, length, return FALSE); INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) ERREXIT(cinfo, JERR_BAD_LENGTH); TRACEMS1(cinfo, 1, JTRC_SOS, n); cinfo->comps_in_scan = n; /* Collect the component-spec parameters */ for (i = 0; i < n; i++) { INPUT_BYTE(cinfo, cc, return FALSE); INPUT_BYTE(cinfo, c, return FALSE); for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { if (cc == compptr->component_id) goto id_found; } ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); id_found: cinfo->cur_comp_info[i] = compptr; compptr->dc_tbl_no = (c >> 4) & 15; compptr->ac_tbl_no = (c ) & 15; TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, compptr->dc_tbl_no, compptr->ac_tbl_no); } /* Collect the additional scan parameters Ss, Se, Ah/Al. * Currently we just validate that they are right for sequential JPEG. * This ought to be an error condition, but we make it a warning because * there are some baseline files out there with all zeroes in these bytes. * (Thank you, Logitech :-(.) */ INPUT_BYTE(cinfo, c, return FALSE); INPUT_BYTE(cinfo, cc, return FALSE); INPUT_BYTE(cinfo, ccc, return FALSE); if (c != 0 || cc != DCTSIZE2-1 || ccc != 0) WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); /* Prepare to scan data & restart markers */ cinfo->marker->next_restart_num = 0; INPUT_SYNC(cinfo); return TRUE; }
/*{{{ read_neurofile(transform_info_ptr tinfo) {*/ METHODDEF DATATYPE * read_neurofile(transform_info_ptr tinfo) { struct read_neurofile_storage *local_arg=(struct read_neurofile_storage *)tinfo->methods->local_storage; transform_argument *args=tinfo->methods->arguments; array myarray; FILE *infile=local_arg->infile; Bool not_correct_trigger=FALSE; long trigger_point, file_start_point, file_end_point; char *innamebuf; int channel; char *description=NULL; if (local_arg->epochs--==0) return NULL; tinfo->beforetrig=local_arg->beforetrig; tinfo->aftertrig=local_arg->aftertrig; tinfo->nr_of_points=local_arg->beforetrig+local_arg->aftertrig; tinfo->nr_of_channels=local_arg->nr_of_channels; tinfo->nrofaverages=1; if (tinfo->nr_of_points<=0) { ERREXIT1(tinfo->emethods, "read_neurofile: Invalid nr_of_points %d\n", MSGPARM(tinfo->nr_of_points)); } /*{{{ Find the next window that fits into the actual data*/ /* This is just for the Continuous option (no trigger file): */ file_end_point=local_arg->current_point-1; do { if (args[ARGS_CONTINUOUS].is_set) { /* Simulate a trigger at current_point+beforetrig */ file_start_point=file_end_point+1; trigger_point=file_start_point+tinfo->beforetrig; file_end_point=trigger_point+tinfo->aftertrig-1; if (local_arg->points_in_file>0 && file_end_point>=local_arg->points_in_file) return NULL; local_arg->current_trigger++; local_arg->current_point+=tinfo->nr_of_points; tinfo->condition=0; } else do { tinfo->condition=read_neurofile_read_trigger(tinfo, &trigger_point, &description); if (tinfo->condition==0) return NULL; /* No more triggers in file */ file_start_point=trigger_point-tinfo->beforetrig+local_arg->offset; file_end_point=trigger_point+tinfo->aftertrig-1-local_arg->offset; if (local_arg->trigcodes==NULL) { not_correct_trigger=FALSE; } else { int trigno=0; not_correct_trigger=TRUE; while (local_arg->trigcodes[trigno]!=0) { if (local_arg->trigcodes[trigno]==tinfo->condition) { not_correct_trigger=FALSE; break; } trigno++; } } } while (not_correct_trigger || file_start_point<0 || (local_arg->points_in_file>0 && file_end_point>=local_arg->points_in_file)); } while (--local_arg->fromepoch>0); if (description==NULL) { TRACEMS3(tinfo->emethods, 1, "read_neurofile: Reading around tag %d at %d, condition=%d\n", MSGPARM(local_arg->current_trigger), MSGPARM(trigger_point), MSGPARM(tinfo->condition)); } else { TRACEMS4(tinfo->emethods, 1, "read_neurofile: Reading around tag %d at %d, condition=%d, description=%s\n", MSGPARM(local_arg->current_trigger), MSGPARM(trigger_point), MSGPARM(tinfo->condition), MSGPARM(description)); } /*{{{ Handle triggers within the epoch (option -T)*/ if (args[ARGS_TRIGTRANSFER].is_set) { int trigs_in_epoch, code; long trigpoint; long const old_current_trigger=local_arg->current_trigger; char *thisdescription; /* First trigger entry holds file_start_point */ push_trigger(&tinfo->triggers, file_start_point, -1, NULL); read_neurofile_reset_triggerbuffer(tinfo); for (trigs_in_epoch=1; (code=read_neurofile_read_trigger(tinfo, &trigpoint, &thisdescription))!=0;) { if (trigpoint>=file_start_point && trigpoint<=file_end_point) { push_trigger(&tinfo->triggers, trigpoint-file_start_point, code, thisdescription); trigs_in_epoch++; } } push_trigger(&tinfo->triggers, 0, 0, NULL); /* End of list */ local_arg->current_trigger=old_current_trigger; } /*}}} */ fseek(infile, file_start_point*tinfo->nr_of_channels, SEEK_SET); /*{{{ Configure myarray*/ myarray.element_skip=tinfo->itemsize=1; tinfo->multiplexed=TRUE; myarray.nr_of_elements=tinfo->nr_of_channels; myarray.nr_of_vectors=tinfo->nr_of_points; if (array_allocate(&myarray)==NULL || (tinfo->channelnames=(char **)malloc(tinfo->nr_of_channels*sizeof(char *)))==NULL || (innamebuf=(char *)malloc(local_arg->stringlength))==NULL || (tinfo->comment=(char *)malloc(strlen((char *)local_arg->seq.comment)+(1+17+1)))==NULL) { ERREXIT(tinfo->emethods, "read_neurofile: Error allocating data\n"); } /*}}} */ sprintf(tinfo->comment, "%s %02d/%02d/%02d,%02d:%02d:%02d", local_arg->seq.comment, local_arg->seq.month, local_arg->seq.day, local_arg->seq.year, local_arg->seq.hour, local_arg->seq.minute, local_arg->seq.second); for (channel=0; channel<tinfo->nr_of_channels; channel++) { strcpy(innamebuf, (char *)local_arg->seq.elnam[channel]); tinfo->channelnames[channel]=innamebuf; innamebuf+=strlen(innamebuf)+1; } do { signed char exponent; short delta; if (fread(&exponent, sizeof(exponent), 1, infile)!=1) { ERREXIT(tinfo->emethods, "read_neurofile: Error reading data\n"); } delta=exponent; exponent&=0x03; if (exponent==0x03) { delta>>=2; } else { delta=(delta&0xfffc)<<(exponent*2); } local_arg->last_values[myarray.current_element]+=delta; array_write(&myarray, local_arg->last_values[myarray.current_element]*local_arg->factor); } while (myarray.message!=ARRAY_ENDOFSCAN);
default_decompress_parms (j_decompress_ptr cinfo) { /* Guess the input colorspace, and set output colorspace accordingly. */ /* (Wish JPEG committee had provided a real way to specify this...) */ /* Note application may override our guesses. */ JDIMENSION divw =0,divh =0; JDIMENSION downwidth, downheight; switch (cinfo->num_components) { case 1: cinfo->jpeg_color_space = JCS_GRAYSCALE; cinfo->out_color_space = JCS_GRAYSCALE; break; case 3: if (cinfo->saw_JFIF_marker) { cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ } else if (cinfo->saw_Adobe_marker) { switch (cinfo->Adobe_transform) { case 0: cinfo->jpeg_color_space = JCS_RGB; break; case 1: cinfo->jpeg_color_space = JCS_YCbCr; break; default: WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ break; } } else { /* Saw no special markers, try to guess from the component IDs */ int cid0 = cinfo->comp_info[0].component_id; int cid1 = cinfo->comp_info[1].component_id; int cid2 = cinfo->comp_info[2].component_id; if (cid0 == 1 && cid1 == 2 && cid2 == 3) cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ else if (cid0 == 82 && cid1 == 71 && cid2 == 66) cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ else { TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ } } /* Always guess RGB is proper output colorspace. */ cinfo->out_color_space = JCS_RGB; break; case 4: if (cinfo->saw_Adobe_marker) { switch (cinfo->Adobe_transform) { case 0: cinfo->jpeg_color_space = JCS_CMYK; break; case 2: cinfo->jpeg_color_space = JCS_YCCK; break; default: WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ break; } } else { /* No special markers, assume straight CMYK. */ cinfo->jpeg_color_space = JCS_CMYK; } cinfo->out_color_space = JCS_CMYK; break; default: cinfo->jpeg_color_space = JCS_UNKNOWN; cinfo->out_color_space = JCS_UNKNOWN; break; } /* Set defaults for other decompression parameters. */ cinfo->scale_num = 1; /* 1:1 scaling */ if(1)//cinfo->dest_width == 0) divw = 1; else divw = cinfo->image_width/cinfo->dest_width; if(1)//cinfo->dest_height == 0) divh = 1; else divh = cinfo->image_height/cinfo->dest_height; if (divh > divw) { divw = divh;//let divw represents the max div } switch(divw) { case 0: case 1: cinfo->scale_denom = 1; downwidth = cinfo->image_width; downheight = cinfo->image_height; break; case 2: case 3: cinfo->scale_denom = 2; downwidth = cinfo->image_width>>1; downheight = cinfo->image_height>>1; break; case 4: case 5: case 6: case 7: cinfo->scale_denom = 4; downwidth = cinfo->image_width>>2; downheight = cinfo->image_height>>2; break; default://>=8 cinfo->scale_denom = 8; downwidth = cinfo->image_width>>3; downheight = cinfo->image_height>>3; } if(cinfo->is_yuv_format!=2) { if (downwidth>cinfo->dest_width && downheight<=cinfo->dest_height) { cinfo->dest_height = downheight*cinfo->dest_width/downwidth; } else if (downwidth<=cinfo->dest_width && downheight > cinfo->dest_height) { cinfo->dest_width = downwidth*cinfo->dest_height/downheight; } else if(downwidth>cinfo->dest_width && downheight>cinfo->dest_height) { if (downwidth>=downheight) { cinfo->dest_height = downheight*cinfo->dest_width/downwidth; } else { cinfo->dest_width = downwidth*cinfo->dest_height/downheight; } } else { cinfo->dest_width = downwidth; cinfo->dest_height = downheight; } } // cinfo->output_gamma = 1.0; cinfo->buffered_image = FALSE; cinfo->raw_data_out = FALSE; cinfo->dct_method = JDCT_FASTEST; //cinfo->do_fancy_upsampling = FALSE; cinfo->do_block_smoothing = FALSE; cinfo->quantize_colors = FALSE; /* We set these in case application only sets quantize_colors. */ cinfo->dither_mode = JDITHER_FS; #ifdef QUANT_2PASS_SUPPORTED cinfo->two_pass_quantize = TRUE; #else cinfo->two_pass_quantize = FALSE; #endif cinfo->desired_number_of_colors = 256; cinfo->colormap = NULL; /* Initialize for no mode change in buffered-image mode. */ cinfo->enable_1pass_quant = FALSE; cinfo->enable_external_quant = FALSE; cinfo->enable_2pass_quant = FALSE; }