in src/main/java/org/apache/commons/imaging/formats/jpeg/iptc/IptcParser.java [131:256]
protected List<IptcRecord> parseIPTCBlock(byte bytes[], boolean verbose)
throws ImageReadException, IOException
{
List<IptcRecord> elements = new ArrayList<IptcRecord>();
int index = 0;
// Integer recordVersion = null;
while (index + 1 < bytes.length)
{
int tagMarker = 0xff & bytes[index++];
if (verbose)
Debug.debug("tagMarker", tagMarker + " (0x"
+ Integer.toHexString(tagMarker) + ")");
if (tagMarker != IPTC_RECORD_TAG_MARKER)
{
if (verbose)
System.out
.println("Unexpected record tag marker in IPTC data.");
return elements;
}
int recordNumber = 0xff & bytes[index++];
if (verbose)
Debug.debug("recordNumber", recordNumber + " (0x"
+ Integer.toHexString(recordNumber) + ")");
// int recordPrefix = convertByteArrayToShort("recordPrefix", index,
// bytes);
// if (verbose)
// Debug.debug("recordPrefix", recordPrefix + " (0x"
// + Integer.toHexString(recordPrefix) + ")");
// index += 2;
//
// if (recordPrefix != IPTC_RECORD_PREFIX)
// {
// if (verbose)
// System.out
// .println("Unexpected record prefix in IPTC data!");
// return elements;
// }
// throw new ImageReadException(
// "Unexpected record prefix in IPTC data.");
int recordType = 0xff & bytes[index];
if (verbose)
Debug.debug("recordType", recordType + " (0x"
+ Integer.toHexString(recordType) + ")");
index++;
int recordSize = convertByteArrayToShort("recordSize", index, bytes);
index += 2;
boolean extendedDataset = recordSize > IPTC_NON_EXTENDED_RECORD_MAXIMUM_SIZE;
int dataFieldCountLength = recordSize & 0x7fff;
if (extendedDataset && verbose)
Debug.debug("extendedDataset. dataFieldCountLength: "
+ dataFieldCountLength);
if (extendedDataset) // ignore extended dataset and everything
// after.
return elements;
byte recordData[] = readBytearray("recordData", bytes, index,
recordSize);
index += recordSize;
// Debug.debug("recordSize", recordSize + " (0x"
// + Integer.toHexString(recordSize) + ")");
if (recordNumber != IPTC_APPLICATION_2_RECORD_NUMBER)
continue;
if (recordType == 0)
{
if (verbose)
System.out.println("ignore record version record! "
+ elements.size());
// ignore "record version" record;
continue;
}
// if (recordVersion == null)
// {
// // The first record in a JPEG/Photoshop IPTC block must be
// // the record version.
// if (recordType != 0)
// throw new ImageReadException("Missing record version: "
// + recordType);
// recordVersion = new Integer(convertByteArrayToShort(
// "recordNumber", recordData));
//
// if (recordSize != 2)
// throw new ImageReadException(
// "Invalid record version record size: " + recordSize);
//
// // JPEG/Photoshop IPTC metadata is always in Record version
// // 2
// if (recordVersion.intValue() != 2)
// throw new ImageReadException(
// "Invalid IPTC record version: " + recordVersion);
//
// // Debug.debug("recordVersion", recordVersion);
// continue;
// }
String value = new String(recordData, "ISO-8859-1");
IptcType iptcType = IptcTypeLookup.getIptcType(recordType);
// Debug.debug("iptcType", iptcType);
// debugByteArray("iptcData", iptcData);
// Debug.debug();
// if (recordType == IPTC_TYPE_CREDIT.type
// || recordType == IPTC_TYPE_OBJECT_NAME.type)
// {
// this.debugByteArray("recordData", recordData);
// Debug.debug("index", IPTC_TYPE_CREDIT.name);
// }
IptcRecord element = new IptcRecord(iptcType, recordData, value);
elements.add(element);
}
return elements;
}