in src/main/java/com/aws/iot/edgeconnectorforkvs/videouploader/visitors/MergeFragmentVisitor.java [169:224]
public void visit(MkvStartMasterElement startMasterElement)
throws MkvElementVisitException, MergeFragmentException {
final EBMLTypeInfo ebmlTypeInfo = startMasterElement.getElementMetaData().getTypeInfo();
log.debug("+name=" + ebmlTypeInfo.getName() + ", level=" + ebmlTypeInfo.getLevel());
switch (state) {
case NEW:
if (!MkvTypeInfos.EBML.equals(ebmlTypeInfo)) {
throw new IllegalArgumentException("Un-expected non-EBML element in new MKV stream");
}
log.trace("state: NEW -> BUFFERING_SEGMENT");
state = MergeState.BUFFERING_SEGMENT;
bufferAndCollectSegment(startMasterElement);
break;
case BUFFERING_SEGMENT:
if (MkvTypeInfos.CLUSTER.equals(ebmlTypeInfo)) {
if (!isSegmentEmitted) {
if (tracksVisitor.isTracksAvailable()) {
emitBufferedSegmentData();
} else {
throw new MergeFragmentException("No track info available");
}
isSegmentVerified = true;
} else if (!isSegmentVerified) {
if (tracksVisitor.isTracksEquivalent()) {
log.info("Tracks of new incoming MKV data are the same");
} else {
log.info("Tracks of new incoming MKV data are different");
throw new MergeFragmentException("Tracks of new incoming MKV data are different");
}
}
isSegmentVerified = true;
log.trace("state: BUFFERING_SEGMENT -> BUFFERING_CLUSTER");
state = MergeState.BUFFERING_CLUSTER;
bufferAndCollectCluster(startMasterElement);
} else if (MkvTypeInfos.TAGS.equals(ebmlTypeInfo)) {
log.trace("state: BUFFERING_SEGMENT -> BUFFERING_TAG");
state = MergeState.BUFFERING_TAG;
log.debug("Ignore Tag header: " + ebmlTypeInfo.getName());
} else {
if (MkvTypeInfos.TRACKS.equals(ebmlTypeInfo)) {
isIgnoreTracksElements = true;
}
bufferAndCollectSegment(startMasterElement);
}
break;
case BUFFERING_CLUSTER:
bufferAndCollectCluster(startMasterElement);
break;
case BUFFERING_TAG:
log.debug("Ignore Tag header: " + ebmlTypeInfo.getName());
break;
default:
throw new MkvTracksException("Unknown state " + state);
}
}