in src/main/java/com/aws/iot/edgeconnectorforkvs/videouploader/visitors/MergeFragmentVisitor.java [415:451]
private void bufferAndCollectCluster(final MkvDataElement dataElement)
throws MkvElementVisitException {
if (currentCluster == null) {
throw new MkvElementVisitException("Unable to buffer data element to empty clusters",
new RuntimeException());
}
final EBMLTypeInfo ebmlTypeInfo = dataElement.getElementMetaData().getTypeInfo();
if (MkvTypeInfos.TIMECODE.equals(ebmlTypeInfo)) {
Optional<BigInteger> clusterTimecode = Optional.of((BigInteger) dataElement.getValueCopy().getVal());
final long clusterTimecodeMs = clusterTimecode.get().longValue();
if (nextFragmentTimecodeOffsetMs == -1) {
if (previousCluster != null) {
// TODO: we can do better guess if we refer to more than one previous cluster
nextFragmentTimecodeOffsetMs = previousCluster.getExpectedNextTimeCode();
} else {
// There is no previous cluster to help us guess
nextFragmentTimecodeOffsetMs = 0;
}
}
final long clusterTimecodeUpdatedMs = clusterTimecodeMs + nextFragmentTimecodeOffsetMs / timescaleMs;
log.trace("Update cluster timecode from " + clusterTimecodeMs + " to " + clusterTimecodeUpdatedMs);
currentCluster.setAbsoluteTimecode(clusterTimecodeUpdatedMs);
} else if (MkvTypeInfos.SIMPLEBLOCK.equals(ebmlTypeInfo)) {
final MkvValue<Frame> frame = dataElement.getValueCopy();
currentCluster.addSimpleBlock(new MkvSimpleBlock(
frame.getVal().getTimeCode(),
frame.getVal().getTrackNumber(),
dataElement.getIdAndSizeRawBytes(),
dataElement.getDataBuffer()));
} else {
log.debug("Ignore ebml element: " + ebmlTypeInfo.getName());
}
}