1
0
Fork 0
forked from External/mediamtx

playback: improve performance when reading big segments (#3209)

This commit is contained in:
Alessandro Ros 2024-04-08 21:35:23 +02:00 committed by GitHub
parent 34b120fd33
commit b5b44f4534
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -317,6 +317,7 @@ func segmentFMP4SeekAndMuxParts(
var tfdt *mp4.Tfdt var tfdt *mp4.Tfdt
atLeastOnePartWritten := false atLeastOnePartWritten := false
maxMuxerDTS := int64(0) maxMuxerDTS := int64(0)
breakAtNextMdat := false
_, err := mp4.ReadBoxStructure(r, func(h *mp4.ReadHandle) (interface{}, error) { _, err := mp4.ReadBoxStructure(r, func(h *mp4.ReadHandle) (interface{}, error) {
switch h.BoxInfo.Type.String() { switch h.BoxInfo.Type.String() {
@ -361,6 +362,7 @@ func segmentFMP4SeekAndMuxParts(
for _, e := range trun.Entries { for _, e := range trun.Entries {
if muxerDTS >= int64(durationMP4) { if muxerDTS >= int64(durationMP4) {
breakAtNextMdat = true
break break
} }
@ -392,6 +394,11 @@ func segmentFMP4SeekAndMuxParts(
if muxerDTS > maxMuxerDTS { if muxerDTS > maxMuxerDTS {
maxMuxerDTS = muxerDTS maxMuxerDTS = muxerDTS
} }
case "mdat":
if breakAtNextMdat {
return nil, errTerminated
}
} }
return nil, nil return nil, nil
}) })
@ -418,6 +425,7 @@ func segmentFMP4WriteParts(
var tfhd *mp4.Tfhd var tfhd *mp4.Tfhd
var tfdt *mp4.Tfdt var tfdt *mp4.Tfdt
maxMuxerDTS := int64(0) maxMuxerDTS := int64(0)
breakAtNextMdat := false
_, err := mp4.ReadBoxStructure(r, func(h *mp4.ReadHandle) (interface{}, error) { _, err := mp4.ReadBoxStructure(r, func(h *mp4.ReadHandle) (interface{}, error) {
switch h.BoxInfo.Type.String() { switch h.BoxInfo.Type.String() {
@ -462,6 +470,7 @@ func segmentFMP4WriteParts(
for _, e := range trun.Entries { for _, e := range trun.Entries {
if muxerDTS >= int64(durationMP4) { if muxerDTS >= int64(durationMP4) {
breakAtNextMdat = true
break break
} }
@ -489,6 +498,11 @@ func segmentFMP4WriteParts(
if muxerDTS > maxMuxerDTS { if muxerDTS > maxMuxerDTS {
maxMuxerDTS = muxerDTS maxMuxerDTS = muxerDTS
} }
case "mdat":
if breakAtNextMdat {
return nil, errTerminated
}
} }
return nil, nil return nil, nil
}) })