playback: fix bug that messed up duration of last sample of each track (#3210)
This commit is contained in:
@@ -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},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user