in src/main/java/com/amazonaws/kinesisvideo/parser/ebml/EBMLParser.java [91:153]
public void parse(ParserByteSource byteSource) {
try (CallState callState = new CallState(byteSource)) {
while (callState.shouldContinueParsing()) {
if (log.isDebugEnabled()) {
log.debug("Current element read state {}", currentElement.currentElementReadState);
}
switch (currentElement.currentElementReadState) {
case NEW:
//check if any master elements are done because their end offset has been reached.
removeMasterElementsBasedOnSizeEnd();
currentElement.readId(callState);
break;
case ID_DONE:
currentElement.readSize(callState);
break;
case SIZE_DONE:
currentElement.updateTypeInfo(typeInfoProvider);
//check if any master elements are done because an equal or higher level
//element is reached.
removeMasterElementsBasedOnLevel();
//Call onstartForElement();
if (currentElement.isKnownType()) {
log.debug("Invoking onStartElement for current element {}", currentElement);
callbacks.onStartElement(currentElement.getMetadata(),
currentElement.getDataSize(),
replayIdAndSizeBuffer.getByteBuffer(),
this::currentElementPath);
}
startReadingContentBasedOnType();
break;
case CONTENT_READING:
Validate.isTrue(currentElement.isKnownType(),
"We should read only from elements with known types");
currentElement.readContent(callState, callState, callbacks, maxContentBytesInOnePass);
break;
case CONTENT_SKIPPING:
Validate.isTrue(!currentElement.isKnownType(), "We should skip data for unknown elements only");
skipBuffer.rewind();
currentElement.skipContent(callState, callState, skipBuffer);
break;
case FINISHED:
invokeOnEndElementCallback(currentElement);
//check if any master elements are done because their end offset has been reached.
removeMasterElementsBasedOnSizeEnd();
createNewCurrentElementInfo();
break;
default:
throw new IllegalArgumentException("Unexpected ElementReadState");
}
}
log.debug("Stopping parsing");
if (endOfStream) {
closeParser();
}
}
}