public void visit()

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);
            }
        }