ISCE_INSAR/contrib/demUtils/demstitcher/bindings/demStitch.c

172 lines
5.6 KiB
C
Raw Normal View History

2019-01-16 19:40:08 +00:00
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Copyright 2010 California Institute of Technology. ALL RIGHTS RESERVED.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// United States Government Sponsorship acknowledged. This software is subject to
// U.S. export control laws and regulations and has been classified as 'EAR99 NLR'
// (No [Export] License Required except when exporting to an embargoed country,
// end user, or in support of a prohibited end use). By downloading this software,
// the user agrees to comply with all applicable U.S. export laws and regulations.
// The user has the responsibility to obtain export licenses, or other export
// authority as may be required before exporting this software to any 'EAR99'
// embargoed foreign country or citizen of those countries.
//
// Author: Giangi Sacco
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void swap2Bytes(short * in, short * out, uint64_t numEl)
{
uint64_t i = 0;
for(i = 0; i < numEl; ++i)
{
out[i] = (in[i] & 0xFF00) >> 8 |
( in[i] & 0x00FF) << 8;
}
}
int concatenateDem(char ** filenamesIn, int * numFilesV,char * filenameOut, int * samples, int * swap)
{
uint64_t GlobalNumSamples = (*samples);
char ** GlobalInputFilenames = filenamesIn;
char * GlobalOutputFilename = filenameOut;
// this has two value [numRow,numCol] i.e. the number of files along the rows and the number of files along the column.
int * GlobalNumFiles = numFilesV;
//number of samples in the file
int GlobalNeedSwap = (*swap);
uint64_t i = 0;
uint64_t j = 0;
uint64_t k = 0;
uint64_t l = 0;
uint64_t pos = 0;
FILE * fout;
/*
printf("%llu %llu %llu \n",GlobalNumSamples*GlobalNumSamples*GlobalNumFiles[0]*GlobalNumFiles[1],
sizeof(short)*GlobalNumSamples*GlobalNumSamples*((uint64_t)GlobalNumFiles[0]*GlobalNumFiles[1]),
sizeof(short)*((GlobalNumSamples - 1)*(uint64_t)GlobalNumFiles[0])*((GlobalNumSamples - 1)*(uint64_t)GlobalNumFiles[1]));
return;
*/
int numFiles = GlobalNumFiles[0]*GlobalNumFiles[1];
FILE ** fin = malloc(sizeof(FILE *)*numFiles);
// load all the images in one buffer, they are small anyway
short * inbuf = malloc(sizeof(short)*GlobalNumSamples*GlobalNumSamples*((uint64_t)GlobalNumFiles[0]*GlobalNumFiles[1]));
//beacuse hte edge overlap we excluse the very last column to the right and the very last row to the bottom
short * outbuf = malloc(sizeof(short)*((GlobalNumSamples - 1)*(uint64_t)GlobalNumFiles[0])*((GlobalNumSamples - 1)*(uint64_t)GlobalNumFiles[1]));
if(fin == NULL)
{
fprintf(stderr,"Cannot allocate file pointers for stitching.\n");
return 1;
}
fout = fopen(GlobalOutputFilename,"w");
if(fout == NULL)
{
fprintf(stderr,"Cannot open DEM output file %s for writing.\n",GlobalOutputFilename);
return 1;
}
//load all files
for(i = 0; i < numFiles; ++i)
{
fin[i] = fopen(GlobalInputFilenames[i],"r");
if(fin[i] == NULL)
{
fprintf(stderr,"Cannot open DEM file %s for reading.\n",GlobalInputFilenames[i]);
return 1;
}
//read the all file
fread(&inbuf[pos],sizeof(short),GlobalNumSamples*GlobalNumSamples,fin[i]);
fclose(fin[i]);
pos += GlobalNumSamples*GlobalNumSamples;
}
if(GlobalNeedSwap == 1)
{
short * tmpbuf = malloc(sizeof(short)*(GlobalNumSamples)*GlobalNumSamples*GlobalNumFiles[0]*GlobalNumFiles[1]);
uint64_t numEl = GlobalNumSamples*GlobalNumSamples*GlobalNumFiles[0]*GlobalNumFiles[1];
swap2Bytes(inbuf, tmpbuf, numEl);
free(inbuf);
inbuf = tmpbuf;
}
pos = 0;
for(i = 0; i < GlobalNumFiles[0]; ++i)
{
for(l = 0; l < GlobalNumSamples - 1; ++l)
{
for(j = 0; j < GlobalNumFiles[1]; ++j)
{
for(k = 0; k < GlobalNumSamples - 1; ++k)
{
outbuf[pos] = inbuf[k + l*GlobalNumSamples + j*GlobalNumSamples*GlobalNumSamples +i*GlobalNumSamples*GlobalNumSamples*GlobalNumFiles[1]];
++pos;
}
}
}
}
fwrite(outbuf,sizeof(short),pos,fout);
fclose(fout);
free(fin);
free(inbuf);
free(outbuf);
return 0;
}
/*
int main(int argc, char ** argv)
{
short int bufin[121];
int dim[2] = {2,3};
int samp = 11;
char * output = "outDemTest";
int i,j,v,k;
FILE * fp;
k = 0;
for(i = 0; i < 11; ++i)
{
for(j = 0; j < 11; ++j)
{
bufin[k] = k;
if((k%11) == 0)
printf("\n");
printf("%3d ",k);
++k;
}
}
printf("\n");
fp = fopen("testFileDem","w");
fwrite(bufin,sizeof(short),121,fp);
fclose(fp);
char ** filein = malloc(sizeof(char *)*6);
for(i = 0; i < 6; ++i)
{
filein[i] = "testFileDem";
}
setNumSamples(&samp);
setOutputFilename(output);
setInputFilenames(filein);
setNumFiles(dim);
concatenateDem();
}
*/