/* Helpful functions */ int firstRecordLen(char *ceosName) { FILE *f; struct HEADER h; f=FOPEN(ceosName,"rb"); /*Open file.*/ ASF_FREAD(&h,1,12,f); /*Read first CEOS header.*/ FCLOSE(f); /*Close file*/ return bigInt32(h.recsiz); /*put recsiz in proper endian format & return*/ }
meta_parameters *open_terrasar(const char *data_name, const char *meta_name, const char *band, int multilook, ClientInterface *client) { ReadTerrasarClientInfo *info = MALLOC(sizeof(ReadTerrasarClientInfo)); terrasar_meta *terrasar = read_terrasar_meta(meta_name); meta_parameters *meta = terrasar2meta(terrasar); if (!meta) return NULL; client->read_client_info = info; client->read_fn = read_terrasar_client; client->thumb_fn = get_terrasar_thumbnail_data; client->free_fn = free_terrasar_client_info; client->data_type = GREYSCALE_FLOAT; info->fp = fopen(data_name, "rb"); if (!info->fp) { asfPrintWarning("Failed to open Terrasar file %s: %s\n", data_name, strerror(errno)); return FALSE; } FILE *fpIn = info->fp; unsigned char intValue[4]; int asfv, aslv, rsfv, rslv; FREAD(&intValue, 1, 4, fpIn); //int bytes_in_burst = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); //int range_sample_relative_index = bigInt32(intValue);; FREAD(&intValue, 1, 4, fpIn); int range_samples = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); int azimuth_samples = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); //int burst_index = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); int rangeline_total_number_bytes = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); int total_number_lines = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); // Check for the first and last azimuth and range pixel int kk; asfv = 1; // azimuth sample first valid FSEEK(fpIn, 2*rangeline_total_number_bytes+8, SEEK_SET); for (kk=2; kk<range_samples; kk++) { FREAD(&intValue, 1, 4, fpIn); if (bigInt32(intValue) > asfv) asfv = bigInt32(intValue); } aslv = azimuth_samples; // azimuth sample last valid FSEEK(fpIn, 3*rangeline_total_number_bytes+8, SEEK_SET); for (kk=2; kk<range_samples; kk++) { FREAD(&intValue, 1, 4, fpIn); if (bigInt32(intValue) < aslv) aslv = bigInt32(intValue); } rsfv = 1; // range sample first valid rslv = range_samples; // range sample last valid for (kk=4; kk<total_number_lines; kk++) { FSEEK(fpIn, 4*rangeline_total_number_bytes, SEEK_SET); FREAD(&intValue, 1, 4, fpIn); if (bigInt32(intValue) > rsfv) rsfv = bigInt32(intValue); FREAD(&intValue, 1, 4, fpIn); if (bigInt32(intValue) < rslv) rslv = bigInt32(intValue); } info->aslv = aslv; info->asfv = asfv; info->rslv = rslv; info->rsfv = rsfv; info->header = (asfv+2)*rangeline_total_number_bytes + 8; info->width = rangeline_total_number_bytes; info->multilook = multilook; meta->general->line_count = aslv - asfv + 1; meta->general->sample_count = rslv - rsfv + 1; return meta; }