in src/main/java/com/netflix/imflibrary/st0377/IndexTableSegment.java [85:147]
public IndexTableSegment(ByteProvider byteProvider, KLVPacket.Header header) throws IOException
{
if (!IndexTableSegment.isValidKey(header.getKey()))
{
throw new MXFException(String.format("IndexTableSegment key = %s invalid", Arrays.toString(header.getKey())));
}
this.header = header;
if ((this.header.getKey()[5] != 0x53) && (this.header.getKey()[5] != 0x13))
{
throw new MXFException(String.format("Found index table segment with registry designator byte value = 0x%x, only 0x53h or 0x13h are supported presently",
this.header.getKey()[5]));
}
long numBytesToRead = this.header.getVSize();
long numBytesRead = 0;
IndexEntryArray indexEntryArray = null;
while (numBytesRead < numBytesToRead)
{
Integer itemTag = MXFPropertyPopulator.getUnsignedShortAsInt(byteProvider.getBytes(2), KLVPacket.BYTE_ORDER);
numBytesRead += 2;
long itemSize;
if (this.header.getKey()[5] == 0x53)
{
itemSize = MXFPropertyPopulator.getUnsignedShortAsInt(byteProvider.getBytes(2), KLVPacket.BYTE_ORDER);
numBytesRead += 2;
}
else
{//(this.header.getKey()[5] == 0x13)
KLVPacket.LengthField lengthField = KLVPacket.getLength(byteProvider);
itemSize = lengthField.value;
numBytesRead += lengthField.sizeOfLengthField;
}
String itemName = IndexTableSegment.LOCAL_TAG_TO_ITEM_NAME.get(itemTag);
if (itemName != null)
{
int expectedLength = MXFPropertyPopulator.getFieldSizeInBytes(this, itemName);
if((expectedLength > 0) && (itemSize != expectedLength))
{
throw new MXFException(String.format("Actual length from bitstream = %d is different from expected length = %d",
itemSize, expectedLength));
}
MXFPropertyPopulator.populateField(byteProvider, this, itemName);
numBytesRead += itemSize;
}
else if (itemTag == 0x3f0a)
{
indexEntryArray = new IndexEntryArray(byteProvider);
numBytesRead += itemSize;
}
else
{
byteProvider.skipBytes(itemSize);
numBytesRead += itemSize;
}
}
this.indexEntryArray = indexEntryArray;
}