mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-09-26 19:51:26 +08:00
79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package mpegts
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg4audio"
|
|
mcmpegts "github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
|
|
"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.(*mcmpegts.CodecMPEG4AudioLATM); 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
|
|
}
|