diff --git a/internal/playback/on_get_test.go b/internal/playback/on_get_test.go index 560d37c1a33..75639218894 100644 --- a/internal/playback/on_get_test.go +++ b/internal/playback/on_get_test.go @@ -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}, + }, }, }, }, diff --git a/internal/playback/on_list_test.go b/internal/playback/on_list_test.go index 639057e4074..772291521c8 100644 --- a/internal/playback/on_list_test.go +++ b/internal/playback/on_list_test.go @@ -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) diff --git a/internal/playback/segment_fmp4.go b/internal/playback/segment_fmp4.go index af73035800d..c6b76f7d7c3 100644 --- a/internal/playback/segment_fmp4.go +++ b/internal/playback/segment_fmp4.go @@ -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