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