in src/main/java/com/amazonaws/kinesisvideo/parser/utilities/OutputSegmentMerger.java [211:273]
public void visit(final MkvStartMasterElement startMasterElement) throws MkvElementVisitException {
try {
switch (state) {
case NEW:
//Only the ebml header is expected in the new state
Validate.isTrue(MkvTypeInfos.EBML.equals(startMasterElement.getElementMetaData().getTypeInfo()),
"EBML should be the only expected element type when a new MKV stream is expected");
log.info("Detected start of EBML element, transitioning from {} to BUFFERING", state);
//Change state to buffering and bufferAndCollect this element.
state = MergeState.BUFFERING_SEGMENT;
bufferAndCollect(startMasterElement);
break;
case BUFFERING_SEGMENT:
//if it is the cluster start element check if the buffered elements should be emitted and
// then change state to emitting, emit this the element as well.
final EBMLTypeInfo startElementTypeInfo = startMasterElement.getElementMetaData().getTypeInfo();
if (MkvTypeInfos.CLUSTER.equals(startElementTypeInfo) || MkvTypeInfos.TAGS.equals(
startElementTypeInfo)) {
final boolean shouldEmitSegment = shouldEmitBufferedSegmentData();
if (shouldEmitSegment) {
if (configuration.stopAtFirstNonMatchingSegment && emittedSegments >= 1) {
log.info("Detected start of element {} transitioning from {} to DONE",
startElementTypeInfo,
state);
state = MergeState.DONE;
} else {
emitBufferedSegmentData(true);
resetChannels();
log.info("Detected start of element {} transitioning from {} to EMITTING",
startElementTypeInfo,
state);
state = EMITTING;
emit(startMasterElement);
}
} else {
log.info("Detected start of element {} transitioning from {} to BUFFERING_CLUSTER_START",
startElementTypeInfo,
state);
state = BUFFERING_CLUSTER_START;
bufferAndCollect(startMasterElement);
}
} else {
bufferAndCollect(startMasterElement);
}
break;
case BUFFERING_CLUSTER_START:
bufferAndCollect(startMasterElement);
break;
case EMITTING:
emit(startMasterElement);
break;
case DONE:
log.warn("OutputSegmentMerger is already done. It will not process any more elements.");
break;
}
} catch (final IOException ie) {
wrapIOException(ie);
}
}