in src/main/java/com/amazonaws/kinesisvideo/parser/utilities/OutputSegmentMerger.java [310:362]
public void visit(final MkvDataElement dataElement) throws MkvElementVisitException {
try {
switch (state) {
case NEW:
Validate.isTrue(false, "Should not start with a data element " + dataElement.toString());
break;
case BUFFERING_SEGMENT:
bufferAndCollect(dataElement);
break;
case BUFFERING_CLUSTER_START:
if (MkvTypeInfos.TIMECODE.equals(dataElement.getElementMetaData().getTypeInfo())) {
final BigInteger currentTimeCode = (BigInteger) dataElement.getValueCopy().getVal();
if (lastClusterTimecode.isPresent()
&& currentTimeCode.compareTo(lastClusterTimecode.get()) <= 0) {
if (configuration.stopAtFirstNonMatchingSegment && emittedSegments >= 1) {
log.info("Detected time code going back from {} to {}, state from {} to DONE",
lastClusterTimecode,
currentTimeCode,
state);
state = MergeState.DONE;
} else {
//emit buffered segment start
emitBufferedSegmentData(true);
}
}
if (!isDone()) {
emitClusterStart();
resetChannels();
state = EMITTING;
emitAdjustedTimeCode(dataElement);
}
} else {
bufferAndCollect(dataElement);
}
break;
case EMITTING:
if (MkvTypeInfos.TIMECODE.equals(dataElement.getElementMetaData().getTypeInfo())) {
emitAdjustedTimeCode(dataElement);
} else if (MkvTypeInfos.SIMPLEBLOCK.equals(dataElement.getElementMetaData().getTypeInfo())) {
emitFrame(dataElement);
} else {
emit(dataElement);
}
break;
case DONE:
log.warn("OutputSegmentMerger is already done. It will not process any more elements.");
break;
}
} catch (final IOException ie) {
wrapIOException(ie);
}
}