public void visit()

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

        }