int OGRSEGYDataSource::Open( const char *pszFilename, const char *pszASCIITextHeader ) { pszName = CPLStrdup( pszFilename ); VSILFILE* fp = VSIFOpenL(pszFilename, "rb"); if( fp == nullptr ) return FALSE; VSIFSeekL(fp, 3200, SEEK_SET); // -------------------------------------------------------------------- // Read the next 400 bytes, where the Binary File Header is // located // -------------------------------------------------------------------- GByte abyFileHeader[400]; if( static_cast<int>(VSIFReadL(abyFileHeader, 1, 400, fp)) != 400 ) { VSIFCloseL(fp); return FALSE; } SEGYBinaryFileHeader sBFH; sBFH.nJobIdNumber = SEGYReadMSBInt32(abyFileHeader + 0); sBFH.nLineNumber = SEGYReadMSBInt32(abyFileHeader + 4); sBFH.nReelNumber = SEGYReadMSBInt32(abyFileHeader + 8); sBFH.nDataTracesPerEnsemble = SEGYReadMSBInt16(abyFileHeader + 12); sBFH.nAuxTracesPerEnsemble = SEGYReadMSBInt16(abyFileHeader + 14); sBFH.nSampleInterval = SEGYReadMSBInt16(abyFileHeader + 16); sBFH.nSampleIntervalOriginal = SEGYReadMSBInt16(abyFileHeader + 18); sBFH.nSamplesPerDataTrace = SEGYReadMSBInt16(abyFileHeader + 20); sBFH.nSamplesPerDataTraceOriginal = SEGYReadMSBInt16(abyFileHeader + 22); sBFH.nDataSampleType = SEGYReadMSBInt16(abyFileHeader + 24); sBFH.nEnsembleFold = SEGYReadMSBInt16(abyFileHeader + 26); sBFH.nTraceSortingCode = SEGYReadMSBInt16(abyFileHeader + 28); sBFH.nVerticalSumCode = SEGYReadMSBInt16(abyFileHeader + 30); sBFH.nSweepFrequencyAtStart = SEGYReadMSBInt16(abyFileHeader + 32); sBFH.nSweepFrequencyAtEnd = SEGYReadMSBInt16(abyFileHeader + 34); sBFH.nSweepLength = SEGYReadMSBInt16(abyFileHeader + 36); sBFH.nSweepType = SEGYReadMSBInt16(abyFileHeader + 38); sBFH.nTraceNumberOfSweepChannel = SEGYReadMSBInt16(abyFileHeader + 40); sBFH.nSweepTraceTaperLengthAtStart = SEGYReadMSBInt16(abyFileHeader + 42); sBFH.nSweepTraceTaperLengthAtEnd = SEGYReadMSBInt16(abyFileHeader + 44); sBFH.nTaperType = SEGYReadMSBInt16(abyFileHeader + 46); sBFH.nCorrelated = SEGYReadMSBInt16(abyFileHeader + 48); sBFH.nBinaryGainRecovered = SEGYReadMSBInt16(abyFileHeader + 50); sBFH.nAmplitudeRecoveryMethod = SEGYReadMSBInt16(abyFileHeader + 52); sBFH.nMeasurementSystem = SEGYReadMSBInt16(abyFileHeader + 54); sBFH.nImpulseSignalPolarity = SEGYReadMSBInt16(abyFileHeader + 56); sBFH.nVibratoryPolaryCode = SEGYReadMSBInt16(abyFileHeader + 58); sBFH.nSEGYRevisionNumber = SEGYReadMSBInt16(abyFileHeader + 300) & 0xffff; sBFH.dfSEGYRevisionNumber = sBFH.nSEGYRevisionNumber / 256.0; sBFH.nFixedLengthTraceFlag = SEGYReadMSBInt16(abyFileHeader + 302); sBFH.nNumberOfExtendedTextualFileHeader = SEGYReadMSBInt16(abyFileHeader + 304); #if DEBUG_VERBOSE CPLDebug("SEGY", "nJobIdNumber = %d", sBFH.nJobIdNumber); CPLDebug("SEGY", "nLineNumber = %d", sBFH.nLineNumber); CPLDebug("SEGY", "nReelNumber = %d", sBFH.nReelNumber); CPLDebug("SEGY", "nDataTracesPerEnsemble = %d", sBFH.nDataTracesPerEnsemble); CPLDebug("SEGY", "nAuxTracesPerEnsemble = %d", sBFH.nAuxTracesPerEnsemble); CPLDebug("SEGY", "nSampleInterval = %d", sBFH.nSampleInterval); CPLDebug("SEGY", "nSampleIntervalOriginal = %d", sBFH.nSampleIntervalOriginal); CPLDebug("SEGY", "nSamplesPerDataTrace = %d", sBFH.nSamplesPerDataTrace); CPLDebug("SEGY", "nSamplesPerDataTraceOriginal = %d", sBFH.nSamplesPerDataTraceOriginal); CPLDebug("SEGY", "nDataSampleType = %d", sBFH.nDataSampleType); CPLDebug("SEGY", "nEnsembleFold = %d", sBFH.nEnsembleFold); CPLDebug("SEGY", "nTraceSortingCode = %d", sBFH.nTraceSortingCode); CPLDebug("SEGY", "nVerticalSumCode = %d", sBFH.nVerticalSumCode); CPLDebug("SEGY", "nSweepFrequencyAtStart = %d", sBFH.nSweepFrequencyAtStart); CPLDebug("SEGY", "nSweepFrequencyAtEnd = %d", sBFH.nSweepFrequencyAtEnd); CPLDebug("SEGY", "nSweepLength = %d", sBFH.nSweepLength); CPLDebug("SEGY", "nSweepType = %d", sBFH.nSweepType); CPLDebug("SEGY", "nTraceNumberOfSweepChannel = %d", sBFH.nTraceNumberOfSweepChannel); CPLDebug("SEGY", "nSweepTraceTaperLengthAtStart = %d", sBFH.nSweepTraceTaperLengthAtStart); CPLDebug("SEGY", "nSweepTraceTaperLengthAtEnd = %d", sBFH.nSweepTraceTaperLengthAtEnd); CPLDebug("SEGY", "nTaperType = %d", sBFH.nTaperType); CPLDebug("SEGY", "nCorrelated = %d", sBFH.nCorrelated); CPLDebug("SEGY", "nBinaryGainRecovered = %d", sBFH.nBinaryGainRecovered); CPLDebug("SEGY", "nAmplitudeRecoveryMethod = %d", sBFH.nAmplitudeRecoveryMethod); CPLDebug("SEGY", "nMeasurementSystem = %d", sBFH.nMeasurementSystem); CPLDebug("SEGY", "nImpulseSignalPolarity = %d", sBFH.nImpulseSignalPolarity); CPLDebug("SEGY", "nVibratoryPolaryCode = %d", sBFH.nVibratoryPolaryCode); CPLDebug("SEGY", "nSEGYRevisionNumber = %d", sBFH.nSEGYRevisionNumber); CPLDebug("SEGY", "dfSEGYRevisionNumber = %f", sBFH.dfSEGYRevisionNumber); CPLDebug("SEGY", "nFixedLengthTraceFlag = %d", sBFH.nFixedLengthTraceFlag); CPLDebug("SEGY", "nNumberOfExtendedTextualFileHeader = %d", sBFH.nNumberOfExtendedTextualFileHeader); #endif // DEBUG_VERBOSE // -------------------------------------------------------------------- // Create layer // -------------------------------------------------------------------- nLayers = 2; papoLayers = static_cast<OGRLayer **>( CPLMalloc(nLayers * sizeof(OGRLayer*))); papoLayers[0] = new OGRSEGYLayer(pszName, fp, &sBFH); papoLayers[1] = new OGRSEGYHeaderLayer( CPLSPrintf("%s_header", CPLGetBasename(pszName)), &sBFH, pszASCIITextHeader); return TRUE; }
int OGRSEGYDataSource::Open( const char * pszFilename, int bUpdateIn) { if (bUpdateIn) { return FALSE; } pszName = CPLStrdup( pszFilename ); VSILFILE* fp = VSIFOpenL(pszFilename, "rb"); if (fp == NULL) return FALSE; // -------------------------------------------------------------------- // Read the first 3200 bytes, where the Textual File Header is // located // -------------------------------------------------------------------- GByte* pabyTextHeader = (GByte*) CPLMalloc(3200 + 1); GByte* pabyASCIITextHeader = (GByte*) CPLMalloc(3200 + 40 + 1); if ((int)VSIFReadL(pabyTextHeader, 1, 3200, fp) != 3200 || EQUALN((const char*)pabyTextHeader, "%PDF", 4)) { VSIFCloseL(fp); CPLFree(pabyTextHeader); CPLFree(pabyASCIITextHeader); return FALSE; } // -------------------------------------------------------------------- // Try to decode the header encoded as EBCDIC and then ASCII // -------------------------------------------------------------------- int i, j, k; for( k=0; k<2; k++) { for( i=0, j=0;i<3200;i++) { GByte chASCII = (k == 0) ? EBCDICToASCII[pabyTextHeader[i]] : pabyTextHeader[i]; if (chASCII < 32 && chASCII != '\t' && chASCII != '\n' && chASCII != '\r') { break; } pabyASCIITextHeader[j++] = chASCII; if (chASCII != '\n' && ((i + 1) % 80) == 0) pabyASCIITextHeader[j++] = '\n'; } pabyASCIITextHeader[j] = '\0'; if (i == 3200) break; if (k == 1) { VSIFCloseL(fp); CPLFree(pabyTextHeader); CPLFree(pabyASCIITextHeader); return FALSE; } } CPLDebug("SIGY", "Header = \n%s", pabyASCIITextHeader); CPLFree(pabyTextHeader); // -------------------------------------------------------------------- // SEGYRead the next 400 bytes, where the Binary File Header is // located // -------------------------------------------------------------------- GByte abyFileHeader[400]; if ((int)VSIFReadL(abyFileHeader, 1, 400, fp) != 400) { VSIFCloseL(fp); CPLFree(pabyASCIITextHeader); return FALSE; } // -------------------------------------------------------------------- // First check that this binary header is not EBCDIC nor ASCII // -------------------------------------------------------------------- for( k=0;k<2;k++ ) { for( i=0;i<400;i++) { GByte chASCII = (k == 0) ? abyFileHeader[i] : EBCDICToASCII[abyFileHeader[i]]; /* A translated 0 value, when source value is not 0, means an invalid */ /* EBCDIC value. Bail out also for control characters */ if (chASCII < 32 && chASCII != '\t' && chASCII != '\n' && chASCII != '\r') { break; } } if (i == 400) { VSIFCloseL(fp); CPLFree(pabyASCIITextHeader); return FALSE; } } SEGYBinaryFileHeader sBFH; sBFH.nJobIdNumber = SEGYReadMSBInt32(abyFileHeader + 0); sBFH.nLineNumber = SEGYReadMSBInt32(abyFileHeader + 4); sBFH.nReelNumber = SEGYReadMSBInt32(abyFileHeader + 8); sBFH.nDataTracesPerEnsemble = SEGYReadMSBInt16(abyFileHeader + 12); sBFH.nAuxTracesPerEnsemble = SEGYReadMSBInt16(abyFileHeader + 14); sBFH.nSampleInterval = SEGYReadMSBInt16(abyFileHeader + 16); sBFH.nSampleIntervalOriginal = SEGYReadMSBInt16(abyFileHeader + 18); sBFH.nSamplesPerDataTrace = SEGYReadMSBInt16(abyFileHeader + 20); sBFH.nSamplesPerDataTraceOriginal = SEGYReadMSBInt16(abyFileHeader + 22); sBFH.nDataSampleType = SEGYReadMSBInt16(abyFileHeader + 24); sBFH.nEnsembleFold = SEGYReadMSBInt16(abyFileHeader + 26); sBFH.nTraceSortingCode = SEGYReadMSBInt16(abyFileHeader + 28); sBFH.nVerticalSumCode = SEGYReadMSBInt16(abyFileHeader + 30); sBFH.nSweepFrequencyAtStart = SEGYReadMSBInt16(abyFileHeader + 32); sBFH.nSweepFrequencyAtEnd = SEGYReadMSBInt16(abyFileHeader + 34); sBFH.nSweepLength = SEGYReadMSBInt16(abyFileHeader + 36); sBFH.nSweepType = SEGYReadMSBInt16(abyFileHeader + 38); sBFH.nTraceNumberOfSweepChannel = SEGYReadMSBInt16(abyFileHeader + 40); sBFH.nSweepTraceTaperLengthAtStart = SEGYReadMSBInt16(abyFileHeader + 42); sBFH.nSweepTraceTaperLengthAtEnd = SEGYReadMSBInt16(abyFileHeader + 44); sBFH.nTaperType = SEGYReadMSBInt16(abyFileHeader + 46); sBFH.nCorrelated = SEGYReadMSBInt16(abyFileHeader + 48); sBFH.nBinaryGainRecovered = SEGYReadMSBInt16(abyFileHeader + 50); sBFH.nAmplitudeRecoveryMethod = SEGYReadMSBInt16(abyFileHeader + 52); sBFH.nMeasurementSystem = SEGYReadMSBInt16(abyFileHeader + 54); sBFH.nImpulseSignalPolarity = SEGYReadMSBInt16(abyFileHeader + 56); sBFH.nVibratoryPolaryCode = SEGYReadMSBInt16(abyFileHeader + 58); sBFH.nSEGYRevisionNumber = SEGYReadMSBInt16(abyFileHeader + 300) & 0xffff; sBFH.dfSEGYRevisionNumber = sBFH.nSEGYRevisionNumber / 256.0; sBFH.nFixedLengthTraceFlag = SEGYReadMSBInt16(abyFileHeader + 302); sBFH.nNumberOfExtendedTextualFileHeader = SEGYReadMSBInt16(abyFileHeader + 304); #if 0 CPLDebug("SIGY", "nJobIdNumber = %d", sBFH.nJobIdNumber); CPLDebug("SIGY", "nLineNumber = %d", sBFH.nLineNumber); CPLDebug("SIGY", "nReelNumber = %d", sBFH.nReelNumber); CPLDebug("SIGY", "nDataTracesPerEnsemble = %d", sBFH.nDataTracesPerEnsemble); CPLDebug("SIGY", "nAuxTracesPerEnsemble = %d", sBFH.nAuxTracesPerEnsemble); CPLDebug("SIGY", "nSampleInterval = %d", sBFH.nSampleInterval); CPLDebug("SIGY", "nSampleIntervalOriginal = %d", sBFH.nSampleIntervalOriginal); CPLDebug("SIGY", "nSamplesPerDataTrace = %d", sBFH.nSamplesPerDataTrace); CPLDebug("SIGY", "nSamplesPerDataTraceOriginal = %d", sBFH.nSamplesPerDataTraceOriginal); CPLDebug("SIGY", "nDataSampleType = %d", sBFH.nDataSampleType); CPLDebug("SIGY", "nEnsembleFold = %d", sBFH.nEnsembleFold); CPLDebug("SIGY", "nTraceSortingCode = %d", sBFH.nTraceSortingCode); CPLDebug("SIGY", "nVerticalSumCode = %d", sBFH.nVerticalSumCode); CPLDebug("SIGY", "nSweepFrequencyAtStart = %d", sBFH.nSweepFrequencyAtStart); CPLDebug("SIGY", "nSweepFrequencyAtEnd = %d", sBFH.nSweepFrequencyAtEnd); CPLDebug("SIGY", "nSweepLength = %d", sBFH.nSweepLength); CPLDebug("SIGY", "nSweepType = %d", sBFH.nSweepType); CPLDebug("SIGY", "nTraceNumberOfSweepChannel = %d", sBFH.nTraceNumberOfSweepChannel); CPLDebug("SIGY", "nSweepTraceTaperLengthAtStart = %d", sBFH.nSweepTraceTaperLengthAtStart); CPLDebug("SIGY", "nSweepTraceTaperLengthAtEnd = %d", sBFH.nSweepTraceTaperLengthAtEnd); CPLDebug("SIGY", "nTaperType = %d", sBFH.nTaperType); CPLDebug("SIGY", "nCorrelated = %d", sBFH.nCorrelated); CPLDebug("SIGY", "nBinaryGainRecovered = %d", sBFH.nBinaryGainRecovered); CPLDebug("SIGY", "nAmplitudeRecoveryMethod = %d", sBFH.nAmplitudeRecoveryMethod); CPLDebug("SIGY", "nMeasurementSystem = %d", sBFH.nMeasurementSystem); CPLDebug("SIGY", "nImpulseSignalPolarity = %d", sBFH.nImpulseSignalPolarity); CPLDebug("SIGY", "nVibratoryPolaryCode = %d", sBFH.nVibratoryPolaryCode); CPLDebug("SIGY", "nSEGYRevisionNumber = %d", sBFH.nSEGYRevisionNumber); CPLDebug("SIGY", "dfSEGYRevisionNumber = %f", sBFH.dfSEGYRevisionNumber); CPLDebug("SIGY", "nFixedLengthTraceFlag = %d", sBFH.nFixedLengthTraceFlag); CPLDebug("SIGY", "nNumberOfExtendedTextualFileHeader = %d", sBFH.nNumberOfExtendedTextualFileHeader); #endif // -------------------------------------------------------------------- // Create layer // -------------------------------------------------------------------- nLayers = 2; papoLayers = (OGRLayer**) CPLMalloc(nLayers * sizeof(OGRLayer*)); papoLayers[0] = new OGRSEGYLayer(pszName, fp, &sBFH); papoLayers[1] = new OGRSEGYHeaderLayer(CPLSPrintf("%s_header", CPLGetBasename(pszName)), &sBFH, (char*) pabyASCIITextHeader); return TRUE; }