mediamtx/internal/protocols/mpegts/enhanced_reader.go
dependabot[bot] f843df4ab8
build(deps): bump github.com/bluenviron/mediacommon/v2 (#5297)
Bumps [github.com/bluenviron/mediacommon/v2](https://github.com/bluenviron/mediacommon) from 2.5.3 to 2.6.0.
- [Commits](https://github.com/bluenviron/mediacommon/compare/v2.5.3...v2.6.0)

---
updated-dependencies:
- dependency-name: github.com/bluenviron/mediacommon/v2
  dependency-version: 2.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-28 15:44:36 +01:00

79 lines
1.6 KiB
Go

package mpegts
import (
"io"
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg4audio"
mcmpegts "github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
tscodecs "github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts/codecs"
"github.com/bluenviron/mediacommon/v2/pkg/rewindablereader"
)
// EnhancedReader is a mpegts.Reader wrapper
// That provides additional informations that are needed in order
// to perform conversion to RTSP.
type EnhancedReader struct {
R io.Reader
*mcmpegts.Reader
latmConfigs map[uint16]*mpeg4audio.StreamMuxConfig
}
// Initialize initializes EnhancedReader.
func (r *EnhancedReader) Initialize() error {
rr := &rewindablereader.Reader{R: r.R}
mr := &mcmpegts.Reader{R: rr}
err := mr.Initialize()
if err != nil {
return err
}
r.latmConfigs = make(map[uint16]*mpeg4audio.StreamMuxConfig)
tracksToParse := 0
for _, track := range mr.Tracks() {
if _, ok := track.Codec.(*tscodecs.MPEG4AudioLATM); ok {
cpid := track.PID
done := false
tracksToParse++
mr.OnDataMPEG4AudioLATM(track, func(_ int64, els [][]byte) error {
if done {
return nil
}
var ame mpeg4audio.AudioMuxElement
ame.MuxConfigPresent = true
err2 := ame.Unmarshal(els[0])
if err2 != nil {
return nil //nolint:nilerr
}
if ame.MuxConfigPresent {
r.latmConfigs[cpid] = ame.StreamMuxConfig
tracksToParse--
done = true
}
return nil
})
}
}
for tracksToParse > 0 {
err = mr.Read()
if err != nil {
return err
}
}
rr.Rewind()
r.Reader = &mcmpegts.Reader{R: rr}
err = r.Reader.Initialize()
if err != nil {
return err
}
return err
}