void ossimOpenJpegNitfReader::initializeReadMode() { // Initialize the read mode. theReadMode = READ_MODE_UNKNOWN; const ossimNitfImageHeader* hdr = getCurrentImageHeader(); if (!hdr) { return; } if ( (hdr->getIMode() == "B") && (hdr->getCompressionCode()== "C8") ) { theReadMode = READ_JPEG_BLOCK; } }
bool ossimQuickbirdNitfTileSource::open() { if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "ossimQuickbirdNitfTileSource::open(file) DEBUG: entered ..." << std::endl; } ossimFilename file = theImageFile; file = file.replaceAllThatMatch("_R[0-9]+C[0-9]+"); ossimQuickbirdTile tileFile; bool openedTileFile = false; file.setExtension("TIL"); if(!tileFile.open(file)) { file.setExtension("TIL"); if(tileFile.open(file)) { openedTileFile = true; } else { file.setExtension("til"); if(tileFile.open(file)) { openedTileFile = true; } } } else { openedTileFile = true; } if(openedTileFile) { if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "ossimQuickbirdNitfTileSource::open(file) DEBUG:" << "\nOpened tile file" << std::endl; } // Call the base class open... if(!ossimNitfTileSource::open()) { return false; } ossimQuickbirdTileInfo info; ossimIrect tempBounds = getCurrentImageHeader()->getImageRect(); tempBounds = ossimIrect(0, 0, tempBounds.width() - 1, tempBounds.height() - 1); if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "ossimQuickbirdNitfTileSource::open(file) DEBUG:" << "\nheader rectangle = " << tempBounds << std::endl; } ossimIpt ulPt; ossimIpt urPt; ossimIpt lrPt; ossimIpt llPt; ossimDpt shift; if(tileFile.getInfo(info, theImageFile.file().upcase())) { ulPt.makeNan(); urPt.makeNan(); lrPt.makeNan(); llPt.makeNan(); if((info.theUlXOffset != OSSIM_INT_NAN) && (info.theUlYOffset != OSSIM_INT_NAN)) { shift = ossimIpt(info.theUlXOffset, info.theUlYOffset); } else { shift = ossimIpt(0,0); } m_transform = new ossim2dTo2dShiftTransform(shift); } if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "ossimQuickbirdNitfTileSource::open(file) DEBUG:" << "\nUl = " << ulPt << "\nUr = " << urPt << "\nLr = " << lrPt << "\nLl = " << llPt << "\ntheImageRect: " << getImageRectangle(0) << "\nExiting..." << std::endl; } } else { if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "ossimQuickbirdNitfTileSource::open(file) DEBUG" << "Not opened..." << std::endl; } } return openedTileFile; }
bool ossimOpenJpegNitfReader::scanForJpegBlockOffsets() { const ossimNitfImageHeader* hdr = getCurrentImageHeader(); if ( !hdr || (theReadMode != READ_JPEG_BLOCK) || !theFileStr ) { return false; } theNitfBlockOffset.clear(); theNitfBlockSize.clear(); //--- // NOTE: // SOC = 0xff4f Start of Codestream // SOT = 0xff90 Start of tile // SOD = 0xff93 Last marker in each tile // EOC = 0xffd9 End of Codestream //--- char c; // Seek to the first block. theFileStr.seekg(hdr->getDataLocation(), ios::beg); if (theFileStr.fail()) { return false; } // Read the first two bytes and verify it is SOC; if not, get out. theFileStr.get( c ); if (static_cast<ossim_uint8>(c) != 0xff) { return false; } theFileStr.get(c); if (static_cast<ossim_uint8>(c) != 0x4f) { return false; } ossim_uint32 blockSize = 2; // Read two bytes... // Add the first offset. // theNitfBlockOffset.push_back(hdr->getDataLocation()); // Find all the SOC markers. while ( theFileStr.get(c) ) { ++blockSize; if (static_cast<ossim_uint8>(c) == 0xff) { if ( theFileStr.get(c) ) { ++blockSize; if (static_cast<ossim_uint8>(c) == 0x90) // At SOC marker... { std::streamoff pos = theFileStr.tellg(); theNitfBlockOffset.push_back(pos-2); } else if (static_cast<ossim_uint8>(c) == 0x93) // At EOC marker... { // Capture the size of this block. theNitfBlockSize.push_back(blockSize); blockSize = 0; } } } } theFileStr.seekg(0, ios::beg); theFileStr.clear(); // We should have the same amount of offsets as we do blocks... ossim_uint32 total_blocks = hdr->getNumberOfBlocksPerRow()*hdr->getNumberOfBlocksPerCol(); if (theNitfBlockOffset.size() != total_blocks) { if (traceDebug()) { ossimNotify(ossimNotifyLevel_WARN) << "DEBUG:" << "\nBlock offset count wrong!" << "\nblocks: " << total_blocks << "\noffsets: " << theNitfBlockOffset.size() << std::endl; } return false; } if (theNitfBlockSize.size() != total_blocks) { if (traceDebug()) { ossimNotify(ossimNotifyLevel_WARN) << "DEBUG:" << "\nBlock size count wrong!" << "\nblocks: " << total_blocks << "\nblock size array: " << theNitfBlockSize.size() << std::endl; } return false; } return true; }