private void wantMoreData()

in src/main/java/com/aws/iot/edgeconnectorforkvs/videouploader/mkv/MkvFilesInputStream.java [112:177]


    private void wantMoreData() {
        if (byteArrayInputStream != null) {
            if (byteArrayInputStream.available() > 0) {
                return;
            } else {
                closeMkvInputStream();
            }
        }

        // We don't have data to read in current input stream.  Try to get data from next file.
        while (byteArrayInputStream == null) {
            if (!mkvIterator.hasNext()) {
                break;
            }

            final VideoFile mkvFile = mkvIterator.next();
            final Date mkvTimestamp = mkvFile.getVideoDate();
            if (mkvStartTime == null) {
                mkvStartTime = mkvTimestamp;
            }

            try (FileInputStream fileInputStream = new FileInputStream(mkvFile)) {
                final StreamingMkvReader streamingMkvReader =
                        StreamingMkvReader.createDefault(
                                new InputStreamParserByteSource(fileInputStream));

                mergeFragmentVisitor.setNextFragmentTimecodeOffsetMs(mkvTimestamp.getTime() - mkvStartTime.getTime());
                streamingMkvReader.apply(mergeFragmentVisitor);
                mkvFile.setParsed(true);

                if (byteArrayOutputStream.size() > 0) {
                    byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
                } else {
                    log.info("File: {} doesn't contain any video data, skip merging.", mkvFile.getAbsolutePath());
                    closeMkvInputStream();
                }
            } catch (FileNotFoundException exception) {
                log.error("File not found " + mkvFile.getAbsolutePath());
            } catch (IOException exception) {
                log.error("Failed to close file: " + mkvFile.getAbsolutePath());
            } catch (MkvElementVisitException exception) {
                log.error("Unable to parse " + mkvFile.getAbsolutePath());
            } catch (MergeFragmentException exception) {
                log.error("Failed to merge file: " + mkvFile.getAbsolutePath());
                mkvIterator.previous();
                closeMkvInputStream();
                break;
            }
        }

        if (byteArrayInputStream == null) {
            // We don't have data after iterate all files that can be merged, try to flush and get some data
            try {
                mergeFragmentVisitor.flush();
                if (byteArrayOutputStream.size() > 0) {
                    byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
                } else {
                    // No more available date, close it.
                    log.info("No more mkv data available to read");
                    close();
                }
            } catch (IOException exception) {
                log.debug("Failed to flush visitor");
            }
        }
    }