Adds check to emit fragments on keyframe boundaries when rapAlignement is set
Related to #30.
I'm not sure how to approach adding a test for this because the .mp4 files are not present in the repository, but this has been successful for me.
I do think that it might be better to make the nb_samples and rapAlignment options mutually exclusive.
Digging through a bit more I've observed some other issues with fragmentation/configuration.
Something like this would make emitting a segment dependent on either rapAlignement or nb_samples, but not both.
const nextSample = trak && trak.samples[trak.nextSample];
const emitSegment =
// if rapAlignement is true, we emit a fragment when we have a rap sample coming up next
(fragTrak.rapAlignement === true && (nextSample && nextSample.is_sync)) ||
// if rapAlignement is false, we emit a fragment when we have the required number of samples
(!fragTrak.rapAlignement &&
trak.nextSample % fragTrak.nb_samples === 0) ||
// if this is the last sample, we emit the fragment
last ||
// if we have more samples than the number of samples requested, we emit the fragment
trak.nextSample >= trak.samples.length;
Additionally, it's currently not possible to set the rapAlignment option to false.
This code, in ISOFile.prototype.setSegmentOptions is setting the option. However, if options.rapAlignement is false, the conditional will never execute, and rapAlignement will keep its default value, true.
if (options) {
if (options.nbSamples) fragTrack.nb_samples = options.nbSamples;
if (options.rapAlignement) fragTrack.rapAlignement = options.rapAlignement;
}
Something like this would be better, as it only checks for the presence of a key, and will return true even if value is false.
if (options) {
if ("nbSamples" in options) fragTrack.nb_samples = options.nbSamples;
if ("rapAlignement" in options) fragTrack.rapAlignement = options.rapAlignement;
}
Could you please re-open this PR for the next branch?