final int tiffHeaderOffset,
final @NotNull RandomAccessReader reader,
final int byteCount) throws IOException
{
// Determine the camera model and makernote format.
Directory ifd0Directory = _metadata.getDirectory(ExifIFD0Directory.class);
if (ifd0Directory == null)
return false;
String cameraMake = ifd0Directory.getString(ExifIFD0Directory.TAG_MAKE);
final String firstTwoChars = reader.getString(makernoteOffset, 2);
final String firstThreeChars = reader.getString(makernoteOffset, 3);
final String firstFourChars = reader.getString(makernoteOffset, 4);
final String firstFiveChars = reader.getString(makernoteOffset, 5);
final String firstSixChars = reader.getString(makernoteOffset, 6);
final String firstSevenChars = reader.getString(makernoteOffset, 7);
final String firstEightChars = reader.getString(makernoteOffset, 8);
final String firstTwelveChars = reader.getString(makernoteOffset, 12);
boolean byteOrderBefore = reader.isMotorolaByteOrder();
if ("OLYMP".equals(firstFiveChars) || "EPSON".equals(firstFiveChars) || "AGFA".equals(firstFourChars)) {
// Olympus Makernote
// Epson and Agfa use Olympus makernote standard: http://www.ozhiker.com/electronics/pjmt/jpeg_info/
pushDirectory(OlympusMakernoteDirectory.class);
TiffReader.processIfd(this, reader, processedIfdOffsets, makernoteOffset + 8, tiffHeaderOffset);
} else if (cameraMake != null && cameraMake.toUpperCase().startsWith("MINOLTA")) {
// Cases seen with the model starting with MINOLTA in capitals seem to have a valid Olympus makernote
// area that commences immediately.
pushDirectory(OlympusMakernoteDirectory.class);
TiffReader.processIfd(this, reader, processedIfdOffsets, makernoteOffset, tiffHeaderOffset);
} else if (cameraMake != null && cameraMake.trim().toUpperCase().startsWith("NIKON")) {
if ("Nikon".equals(firstFiveChars)) {
/* There are two scenarios here:
* Type 1: **
* :0000: 4E 69 6B 6F 6E 00 01 00-05 00 02 00 02 00 06 00 Nikon...........
* :0010: 00 00 EC 02 00 00 03 00-03 00 01 00 00 00 06 00 ................
* Type 3: **
* :0000: 4E 69 6B 6F 6E 00 02 00-00 00 4D 4D 00 2A 00 00 Nikon....MM.*...
* :0010: 00 08 00 1E 00 01 00 07-00 00 00 04 30 32 30 30 ............0200
*/
switch (reader.getUInt8(makernoteOffset + 6)) {
case 1:
pushDirectory(NikonType1MakernoteDirectory.class);
TiffReader.processIfd(this, reader, processedIfdOffsets, makernoteOffset + 8, tiffHeaderOffset);
break;
case 2:
pushDirectory(NikonType2MakernoteDirectory.class);
TiffReader.processIfd(this, reader, processedIfdOffsets, makernoteOffset + 18, makernoteOffset + 10);
break;
default:
ifd0Directory.addError("Unsupported Nikon makernote data ignored.");
break;
}
} else {
// The IFD begins with the first Makernote byte (no ASCII name). This occurs with CoolPix 775, E990 and D1 models.
pushDirectory(NikonType2MakernoteDirectory.class);