@ -25,21 +25,22 @@ func partDurationIsCompatible(partDuration time.Duration, sampleDuration time.Du
@@ -25,21 +25,22 @@ func partDurationIsCompatible(partDuration time.Duration, sampleDuration time.Du
return partDuration > ( ( f * 85 ) / 100 )
}
func partDurationIsCompatibleWithAll ( partDuration time . Duration , sampleDurations map [ time . Duration ] struct { } ) bool {
for sd := range sampleDurations {
if ! partDurationIsCompatible ( partDuration , sd ) {
return false
}
}
return true
}
func findCompatiblePartDuration (
minPartDuration time . Duration ,
sampleDurations map [ time . Duration ] struct { } ,
) time . Duration {
i := minPartDuration
for ; i < 5 * time . Second ; i += 5 * time . Millisecond {
isCompatible := func ( ) bool {
for sd := range sampleDurations {
if ! partDurationIsCompatible ( i , sd ) {
return false
}
}
return true
} ( )
if isCompatible {
if partDurationIsCompatibleWithAll ( i , sampleDurations ) {
break
}
}
@ -147,6 +148,11 @@ func (m *muxerVariantFMP4Segmenter) adjustPartDuration(du time.Duration) {
@@ -147,6 +148,11 @@ func (m *muxerVariantFMP4Segmenter) adjustPartDuration(du time.Duration) {
return
}
// avoid a crash by skipping invalid durations
if du == 0 {
return
}
if _ , ok := m . sampleDurations [ du ] ; ! ok {
m . sampleDurations [ du ] = struct { } { }
m . adjustedPartDuration = findCompatiblePartDuration (