playback: fix bug that messed up duration of last sample of each track (#3210)

This commit is contained in:
Alessandro Ros
2024-04-08 23:01:23 +02:00
committed by GitHub
parent b5b44f4534
commit 14bf7f4cc5
3 changed files with 32 additions and 6 deletions
+20 -2
View File
@@ -134,7 +134,7 @@ func writeSegment2(t *testing.T, fpath string) {
var buf2 seekablebuffer.Buffer
parts := fmp4.Parts{
{
SequenceNumber: 1,
SequenceNumber: 3,
Tracks: []*fmp4.PartTrack{{
ID: 1,
BaseTime: 0,
@@ -152,6 +152,20 @@ func writeSegment2(t *testing.T, fpath string) {
},
}},
},
{
SequenceNumber: 4,
Tracks: []*fmp4.PartTrack{{
ID: 1,
BaseTime: 2 * 90000,
Samples: []*fmp4.PartSample{
{
Duration: 1 * 90000,
IsNonSyncSample: false,
Payload: []byte{11, 12},
},
},
}},
},
}
err = parts.Marshal(&buf2)
require.NoError(t, err)
@@ -189,7 +203,7 @@ func writeSegment3(t *testing.T, fpath string) {
{
Duration: 1 * 90000,
IsNonSyncSample: false,
Payload: []byte{10, 11},
Payload: []byte{13, 14},
},
},
}},
@@ -479,6 +493,10 @@ func TestOnGetNTPCompensation(t *testing.T) {
Duration: 90000,
Payload: []byte{9, 10},
},
{
Duration: 90000,
Payload: []byte{11, 12},
},
},
},
},
+2 -2
View File
@@ -64,11 +64,11 @@ func TestOnList(t *testing.T) {
require.Equal(t, []interface{}{
map[string]interface{}{
"duration": float64(64),
"duration": float64(65),
"start": time.Date(2008, 11, 0o7, 11, 22, 0, 500000000, time.Local).Format(time.RFC3339Nano),
},
map[string]interface{}{
"duration": float64(2),
"duration": float64(3),
"start": time.Date(2009, 11, 0o7, 11, 23, 2, 500000000, time.Local).Format(time.RFC3339Nano),
},
}, out)
+10 -2
View File
@@ -359,6 +359,7 @@ func segmentFMP4SeekAndMuxParts(
}
muxerDTS := int64(tfdt.BaseMediaDecodeTimeV1) - int64(segmentStartOffsetMP4)
atLeastOneSampleWritten := false
for _, e := range trun.Entries {
if muxerDTS >= int64(durationMP4) {
@@ -386,10 +387,13 @@ func segmentFMP4SeekAndMuxParts(
return nil, err
}
atLeastOneSampleWritten = true
muxerDTS += int64(e.SampleDuration)
}
m.writeFinalDTS(muxerDTS)
if atLeastOneSampleWritten {
m.writeFinalDTS(muxerDTS)
}
if muxerDTS > maxMuxerDTS {
maxMuxerDTS = muxerDTS
@@ -467,6 +471,7 @@ func segmentFMP4WriteParts(
}
muxerDTS := int64(tfdt.BaseMediaDecodeTimeV1) + int64(segmentStartOffsetMP4)
atLeastOneSampleWritten := false
for _, e := range trun.Entries {
if muxerDTS >= int64(durationMP4) {
@@ -490,10 +495,13 @@ func segmentFMP4WriteParts(
return nil, err
}
atLeastOneSampleWritten = true
muxerDTS += int64(e.SampleDuration)
}
m.writeFinalDTS(muxerDTS)
if atLeastOneSampleWritten {
m.writeFinalDTS(muxerDTS)
}
if muxerDTS > maxMuxerDTS {
maxMuxerDTS = muxerDTS