mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 23:26:54 +08:00
add CreateDecoder() method to all tracks that can be decoded
This commit is contained in:
@@ -9,7 +9,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtph264"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -75,10 +74,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup RTP/H264->H264 decoder
|
// setup RTP/H264->H264 decoder
|
||||||
rtpDec := &rtph264.Decoder{
|
rtpDec := track.CreateDecoder()
|
||||||
PacketizationMode: track.PacketizationMode,
|
|
||||||
}
|
|
||||||
rtpDec.Init()
|
|
||||||
|
|
||||||
// setup H264->raw frames decoder
|
// setup H264->raw frames decoder
|
||||||
h264RawDec, err := newH264Decoder()
|
h264RawDec, err := newH264Decoder()
|
||||||
|
@@ -2,7 +2,6 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtph264"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -47,10 +46,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup RTP/H264->H264 decoder
|
// setup RTP/H264->H264 decoder
|
||||||
rtpDec := &rtph264.Decoder{
|
rtpDec := track.CreateDecoder()
|
||||||
PacketizationMode: track.PacketizationMode,
|
|
||||||
}
|
|
||||||
rtpDec.Init()
|
|
||||||
|
|
||||||
// setup H264->MPEGTS muxer
|
// setup H264->MPEGTS muxer
|
||||||
mpegtsMuxer, err := newMPEGTSMuxer(track.SafeSPS(), track.SafePPS())
|
mpegtsMuxer, err := newMPEGTSMuxer(track.SafeSPS(), track.SafePPS())
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtph264"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -52,10 +51,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup RTP/H264->H264 decoder
|
// setup RTP/H264->H264 decoder
|
||||||
rtpDec := &rtph264.Decoder{
|
rtpDec := track.CreateDecoder()
|
||||||
PacketizationMode: track.PacketizationMode,
|
|
||||||
}
|
|
||||||
rtpDec.Init()
|
|
||||||
|
|
||||||
// setup H264->raw frames decoder
|
// setup H264->raw frames decoder
|
||||||
h264RawDec, err := newH264Decoder()
|
h264RawDec, err := newH264Decoder()
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtpmpeg4audio"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -49,13 +48,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup decoder
|
// setup decoder
|
||||||
dec := &rtpmpeg4audio.Decoder{
|
dec := track.CreateDecoder()
|
||||||
SampleRate: track.Config.SampleRate,
|
|
||||||
SizeLength: track.SizeLength,
|
|
||||||
IndexLength: track.IndexLength,
|
|
||||||
IndexDeltaLength: track.IndexDeltaLength,
|
|
||||||
}
|
|
||||||
dec.Init()
|
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtpopus"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -49,10 +48,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup decoder
|
// setup decoder
|
||||||
dec := &rtpopus.Decoder{
|
dec := track.CreateDecoder()
|
||||||
SampleRate: track.SampleRate,
|
|
||||||
}
|
|
||||||
dec.Init()
|
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtpvp8"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -49,8 +48,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup decoder
|
// setup decoder
|
||||||
dec := &rtpvp8.Decoder{}
|
dec := track.CreateDecoder()
|
||||||
dec.Init()
|
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/rtpvp9"
|
|
||||||
"github.com/aler9/gortsplib/pkg/url"
|
"github.com/aler9/gortsplib/pkg/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -49,8 +48,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup decoder
|
// setup decoder
|
||||||
dec := &rtpvp9.Decoder{}
|
dec := track.CreateDecoder()
|
||||||
dec.Init()
|
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
c.OnPacketRTP = func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
||||||
|
@@ -124,15 +124,6 @@ func (t *TrackGeneric) ClockRate() int {
|
|||||||
return t.clockRate
|
return t.clockRate
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackGeneric) clone() Track {
|
|
||||||
return &TrackGeneric{
|
|
||||||
Media: t.Media,
|
|
||||||
Payloads: append([]TrackGenericPayload(nil), t.Payloads...),
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
clockRate: t.clockRate,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackGeneric) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackGeneric) MediaDescription() *psdp.MediaDescription {
|
||||||
formats := make([]string, len(t.Payloads))
|
formats := make([]string, len(t.Payloads))
|
||||||
@@ -171,3 +162,12 @@ func (t *TrackGeneric) MediaDescription() *psdp.MediaDescription {
|
|||||||
Attributes: attributes,
|
Attributes: attributes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackGeneric) clone() Track {
|
||||||
|
return &TrackGeneric{
|
||||||
|
Media: t.Media,
|
||||||
|
Payloads: append([]TrackGenericPayload(nil), t.Payloads...),
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
clockRate: t.clockRate,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -9,6 +9,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
psdp "github.com/pion/sdp/v3"
|
psdp "github.com/pion/sdp/v3"
|
||||||
|
|
||||||
|
"github.com/aler9/gortsplib/pkg/rtph264"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TrackH264 is a H264 track.
|
// TrackH264 is a H264 track.
|
||||||
@@ -100,44 +102,6 @@ func (t *TrackH264) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackH264) clone() Track {
|
|
||||||
return &TrackH264{
|
|
||||||
PayloadType: t.PayloadType,
|
|
||||||
SPS: t.SPS,
|
|
||||||
PPS: t.PPS,
|
|
||||||
PacketizationMode: t.PacketizationMode,
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SafeSPS returns the track SPS.
|
|
||||||
func (t *TrackH264) SafeSPS() []byte {
|
|
||||||
t.mutex.RLock()
|
|
||||||
defer t.mutex.RUnlock()
|
|
||||||
return t.SPS
|
|
||||||
}
|
|
||||||
|
|
||||||
// SafePPS returns the track PPS.
|
|
||||||
func (t *TrackH264) SafePPS() []byte {
|
|
||||||
t.mutex.RLock()
|
|
||||||
defer t.mutex.RUnlock()
|
|
||||||
return t.PPS
|
|
||||||
}
|
|
||||||
|
|
||||||
// SafeSetSPS sets the track SPS.
|
|
||||||
func (t *TrackH264) SafeSetSPS(v []byte) {
|
|
||||||
t.mutex.Lock()
|
|
||||||
defer t.mutex.Unlock()
|
|
||||||
t.SPS = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SafeSetPPS sets the track PPS.
|
|
||||||
func (t *TrackH264) SafeSetPPS(v []byte) {
|
|
||||||
t.mutex.Lock()
|
|
||||||
defer t.mutex.Unlock()
|
|
||||||
t.PPS = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackH264) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackH264) MediaDescription() *psdp.MediaDescription {
|
||||||
t.mutex.RLock()
|
t.mutex.RLock()
|
||||||
@@ -190,3 +154,50 @@ func (t *TrackH264) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackH264) clone() Track {
|
||||||
|
return &TrackH264{
|
||||||
|
PayloadType: t.PayloadType,
|
||||||
|
SPS: t.SPS,
|
||||||
|
PPS: t.PPS,
|
||||||
|
PacketizationMode: t.PacketizationMode,
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDecoder creates a decoder able to decode the content of the track.
|
||||||
|
func (t *TrackH264) CreateDecoder() *rtph264.Decoder {
|
||||||
|
d := &rtph264.Decoder{
|
||||||
|
PacketizationMode: t.PacketizationMode,
|
||||||
|
}
|
||||||
|
d.Init()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafeSPS returns the track SPS.
|
||||||
|
func (t *TrackH264) SafeSPS() []byte {
|
||||||
|
t.mutex.RLock()
|
||||||
|
defer t.mutex.RUnlock()
|
||||||
|
return t.SPS
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafePPS returns the track PPS.
|
||||||
|
func (t *TrackH264) SafePPS() []byte {
|
||||||
|
t.mutex.RLock()
|
||||||
|
defer t.mutex.RUnlock()
|
||||||
|
return t.PPS
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafeSetSPS sets the track SPS.
|
||||||
|
func (t *TrackH264) SafeSetSPS(v []byte) {
|
||||||
|
t.mutex.Lock()
|
||||||
|
defer t.mutex.Unlock()
|
||||||
|
t.SPS = v
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafeSetPPS sets the track PPS.
|
||||||
|
func (t *TrackH264) SafeSetPPS(v []byte) {
|
||||||
|
t.mutex.Lock()
|
||||||
|
defer t.mutex.Unlock()
|
||||||
|
t.PPS = v
|
||||||
|
}
|
||||||
|
@@ -93,6 +93,52 @@ func (t *TrackH265) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MediaDescription returns the track media description in SDP format.
|
||||||
|
func (t *TrackH265) MediaDescription() *psdp.MediaDescription {
|
||||||
|
t.mutex.RLock()
|
||||||
|
defer t.mutex.RUnlock()
|
||||||
|
|
||||||
|
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
||||||
|
|
||||||
|
fmtp := typ
|
||||||
|
|
||||||
|
var tmp []string
|
||||||
|
if t.VPS != nil {
|
||||||
|
tmp = append(tmp, "sprop-vps="+base64.StdEncoding.EncodeToString(t.VPS))
|
||||||
|
}
|
||||||
|
if t.SPS != nil {
|
||||||
|
tmp = append(tmp, "sprop-sps="+base64.StdEncoding.EncodeToString(t.SPS))
|
||||||
|
}
|
||||||
|
if t.PPS != nil {
|
||||||
|
tmp = append(tmp, "sprop-pps="+base64.StdEncoding.EncodeToString(t.PPS))
|
||||||
|
}
|
||||||
|
if tmp != nil {
|
||||||
|
fmtp += " " + strings.Join(tmp, "; ")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &psdp.MediaDescription{
|
||||||
|
MediaName: psdp.MediaName{
|
||||||
|
Media: "video",
|
||||||
|
Protos: []string{"RTP", "AVP"},
|
||||||
|
Formats: []string{typ},
|
||||||
|
},
|
||||||
|
Attributes: []psdp.Attribute{
|
||||||
|
{
|
||||||
|
Key: "rtpmap",
|
||||||
|
Value: typ + " H265/90000",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "fmtp",
|
||||||
|
Value: fmtp,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "control",
|
||||||
|
Value: t.control,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TrackH265) clone() Track {
|
func (t *TrackH265) clone() Track {
|
||||||
return &TrackH265{
|
return &TrackH265{
|
||||||
PayloadType: t.PayloadType,
|
PayloadType: t.PayloadType,
|
||||||
@@ -144,49 +190,3 @@ func (t *TrackH265) SafeSetPPS(v []byte) {
|
|||||||
defer t.mutex.Unlock()
|
defer t.mutex.Unlock()
|
||||||
t.PPS = v
|
t.PPS = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
|
||||||
func (t *TrackH265) MediaDescription() *psdp.MediaDescription {
|
|
||||||
t.mutex.RLock()
|
|
||||||
defer t.mutex.RUnlock()
|
|
||||||
|
|
||||||
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
|
||||||
|
|
||||||
fmtp := typ
|
|
||||||
|
|
||||||
var tmp []string
|
|
||||||
if t.VPS != nil {
|
|
||||||
tmp = append(tmp, "sprop-vps="+base64.StdEncoding.EncodeToString(t.VPS))
|
|
||||||
}
|
|
||||||
if t.SPS != nil {
|
|
||||||
tmp = append(tmp, "sprop-sps="+base64.StdEncoding.EncodeToString(t.SPS))
|
|
||||||
}
|
|
||||||
if t.PPS != nil {
|
|
||||||
tmp = append(tmp, "sprop-pps="+base64.StdEncoding.EncodeToString(t.PPS))
|
|
||||||
}
|
|
||||||
if tmp != nil {
|
|
||||||
fmtp += " " + strings.Join(tmp, "; ")
|
|
||||||
}
|
|
||||||
|
|
||||||
return &psdp.MediaDescription{
|
|
||||||
MediaName: psdp.MediaName{
|
|
||||||
Media: "video",
|
|
||||||
Protos: []string{"RTP", "AVP"},
|
|
||||||
Formats: []string{typ},
|
|
||||||
},
|
|
||||||
Attributes: []psdp.Attribute{
|
|
||||||
{
|
|
||||||
Key: "rtpmap",
|
|
||||||
Value: typ + " H265/90000",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: "fmtp",
|
|
||||||
Value: fmtp,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: "control",
|
|
||||||
Value: t.control,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -24,12 +24,6 @@ func (t *TrackJPEG) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackJPEG) clone() Track {
|
|
||||||
return &TrackJPEG{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackJPEG) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackJPEG) MediaDescription() *psdp.MediaDescription {
|
||||||
return &psdp.MediaDescription{
|
return &psdp.MediaDescription{
|
||||||
@@ -50,3 +44,9 @@ func (t *TrackJPEG) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackJPEG) clone() Track {
|
||||||
|
return &TrackJPEG{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -24,12 +24,6 @@ func (t *TrackMPEG2Audio) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackMPEG2Audio) clone() Track {
|
|
||||||
return &TrackMPEG2Audio{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackMPEG2Audio) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackMPEG2Audio) MediaDescription() *psdp.MediaDescription {
|
||||||
return &psdp.MediaDescription{
|
return &psdp.MediaDescription{
|
||||||
@@ -46,3 +40,9 @@ func (t *TrackMPEG2Audio) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackMPEG2Audio) clone() Track {
|
||||||
|
return &TrackMPEG2Audio{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -24,12 +24,6 @@ func (t *TrackMPEG2Video) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackMPEG2Video) clone() Track {
|
|
||||||
return &TrackMPEG2Video{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackMPEG2Video) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackMPEG2Video) MediaDescription() *psdp.MediaDescription {
|
||||||
return &psdp.MediaDescription{
|
return &psdp.MediaDescription{
|
||||||
@@ -46,3 +40,9 @@ func (t *TrackMPEG2Video) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackMPEG2Video) clone() Track {
|
||||||
|
return &TrackMPEG2Video{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -9,6 +9,7 @@ import (
|
|||||||
psdp "github.com/pion/sdp/v3"
|
psdp "github.com/pion/sdp/v3"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib/pkg/mpeg4audio"
|
"github.com/aler9/gortsplib/pkg/mpeg4audio"
|
||||||
|
"github.com/aler9/gortsplib/pkg/rtpmpeg4audio"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TrackMPEG4Audio is a MPEG-4 audio track.
|
// TrackMPEG4Audio is a MPEG-4 audio track.
|
||||||
@@ -108,17 +109,6 @@ func (t *TrackMPEG4Audio) ClockRate() int {
|
|||||||
return t.Config.SampleRate
|
return t.Config.SampleRate
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackMPEG4Audio) clone() Track {
|
|
||||||
return &TrackMPEG4Audio{
|
|
||||||
PayloadType: t.PayloadType,
|
|
||||||
Config: t.Config,
|
|
||||||
SizeLength: t.SizeLength,
|
|
||||||
IndexLength: t.IndexLength,
|
|
||||||
IndexDeltaLength: t.IndexDeltaLength,
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackMPEG4Audio) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackMPEG4Audio) MediaDescription() *psdp.MediaDescription {
|
||||||
enc, err := t.Config.Marshal()
|
enc, err := t.Config.Marshal()
|
||||||
@@ -176,3 +166,26 @@ func (t *TrackMPEG4Audio) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackMPEG4Audio) clone() Track {
|
||||||
|
return &TrackMPEG4Audio{
|
||||||
|
PayloadType: t.PayloadType,
|
||||||
|
Config: t.Config,
|
||||||
|
SizeLength: t.SizeLength,
|
||||||
|
IndexLength: t.IndexLength,
|
||||||
|
IndexDeltaLength: t.IndexDeltaLength,
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDecoder creates a decoder able to decode the content of the track.
|
||||||
|
func (t *TrackMPEG4Audio) CreateDecoder() *rtpmpeg4audio.Decoder {
|
||||||
|
d := &rtpmpeg4audio.Decoder{
|
||||||
|
SampleRate: t.Config.SampleRate,
|
||||||
|
SizeLength: t.SizeLength,
|
||||||
|
IndexLength: t.IndexLength,
|
||||||
|
IndexDeltaLength: t.IndexDeltaLength,
|
||||||
|
}
|
||||||
|
d.Init()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
@@ -6,6 +6,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
psdp "github.com/pion/sdp/v3"
|
psdp "github.com/pion/sdp/v3"
|
||||||
|
|
||||||
|
"github.com/aler9/gortsplib/pkg/rtpopus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TrackOpus is a Opus track.
|
// TrackOpus is a Opus track.
|
||||||
@@ -53,15 +55,6 @@ func (t *TrackOpus) ClockRate() int {
|
|||||||
return t.SampleRate
|
return t.SampleRate
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackOpus) clone() Track {
|
|
||||||
return &TrackOpus{
|
|
||||||
PayloadType: t.PayloadType,
|
|
||||||
SampleRate: t.SampleRate,
|
|
||||||
ChannelCount: t.ChannelCount,
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackOpus) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackOpus) MediaDescription() *psdp.MediaDescription {
|
||||||
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
||||||
@@ -94,3 +87,21 @@ func (t *TrackOpus) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackOpus) clone() Track {
|
||||||
|
return &TrackOpus{
|
||||||
|
PayloadType: t.PayloadType,
|
||||||
|
SampleRate: t.SampleRate,
|
||||||
|
ChannelCount: t.ChannelCount,
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDecoder creates a decoder able to decode the content of the track.
|
||||||
|
func (t *TrackOpus) CreateDecoder() *rtpopus.Decoder {
|
||||||
|
d := &rtpopus.Decoder{
|
||||||
|
SampleRate: t.SampleRate,
|
||||||
|
}
|
||||||
|
d.Init()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
@@ -33,12 +33,6 @@ func (t *TrackPCMA) ClockRate() int {
|
|||||||
return 8000
|
return 8000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackPCMA) clone() Track {
|
|
||||||
return &TrackPCMA{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackPCMA) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackPCMA) MediaDescription() *psdp.MediaDescription {
|
||||||
return &psdp.MediaDescription{
|
return &psdp.MediaDescription{
|
||||||
@@ -59,3 +53,9 @@ func (t *TrackPCMA) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackPCMA) clone() Track {
|
||||||
|
return &TrackPCMA{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -33,12 +33,6 @@ func (t *TrackPCMU) ClockRate() int {
|
|||||||
return 8000
|
return 8000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackPCMU) clone() Track {
|
|
||||||
return &TrackPCMU{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackPCMU) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackPCMU) MediaDescription() *psdp.MediaDescription {
|
||||||
return &psdp.MediaDescription{
|
return &psdp.MediaDescription{
|
||||||
@@ -59,3 +53,9 @@ func (t *TrackPCMU) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackPCMU) clone() Track {
|
||||||
|
return &TrackPCMU{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
27
track_vp8.go
27
track_vp8.go
@@ -6,6 +6,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
psdp "github.com/pion/sdp/v3"
|
psdp "github.com/pion/sdp/v3"
|
||||||
|
|
||||||
|
"github.com/aler9/gortsplib/pkg/rtpvp8"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TrackVP8 is a VP8 track.
|
// TrackVP8 is a VP8 track.
|
||||||
@@ -83,15 +85,6 @@ func (t *TrackVP8) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackVP8) clone() Track {
|
|
||||||
return &TrackVP8{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
PayloadType: t.PayloadType,
|
|
||||||
MaxFR: t.MaxFR,
|
|
||||||
MaxFS: t.MaxFS,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackVP8) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackVP8) MediaDescription() *psdp.MediaDescription {
|
||||||
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
||||||
@@ -131,3 +124,19 @@ func (t *TrackVP8) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackVP8) clone() Track {
|
||||||
|
return &TrackVP8{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
PayloadType: t.PayloadType,
|
||||||
|
MaxFR: t.MaxFR,
|
||||||
|
MaxFS: t.MaxFS,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDecoder creates a decoder able to decode the content of the track.
|
||||||
|
func (t *TrackVP8) CreateDecoder() *rtpvp8.Decoder {
|
||||||
|
d := &rtpvp8.Decoder{}
|
||||||
|
d.Init()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
29
track_vp9.go
29
track_vp9.go
@@ -6,6 +6,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
psdp "github.com/pion/sdp/v3"
|
psdp "github.com/pion/sdp/v3"
|
||||||
|
|
||||||
|
"github.com/aler9/gortsplib/pkg/rtpvp9"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TrackVP9 is a VP9 track.
|
// TrackVP9 is a VP9 track.
|
||||||
@@ -92,16 +94,6 @@ func (t *TrackVP9) ClockRate() int {
|
|||||||
return 90000
|
return 90000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TrackVP9) clone() Track {
|
|
||||||
return &TrackVP9{
|
|
||||||
trackBase: t.trackBase,
|
|
||||||
PayloadType: t.PayloadType,
|
|
||||||
MaxFR: t.MaxFR,
|
|
||||||
MaxFS: t.MaxFS,
|
|
||||||
ProfileID: t.ProfileID,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MediaDescription returns the track media description in SDP format.
|
// MediaDescription returns the track media description in SDP format.
|
||||||
func (t *TrackVP9) MediaDescription() *psdp.MediaDescription {
|
func (t *TrackVP9) MediaDescription() *psdp.MediaDescription {
|
||||||
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
typ := strconv.FormatInt(int64(t.PayloadType), 10)
|
||||||
@@ -144,3 +136,20 @@ func (t *TrackVP9) MediaDescription() *psdp.MediaDescription {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TrackVP9) clone() Track {
|
||||||
|
return &TrackVP9{
|
||||||
|
trackBase: t.trackBase,
|
||||||
|
PayloadType: t.PayloadType,
|
||||||
|
MaxFR: t.MaxFR,
|
||||||
|
MaxFS: t.MaxFS,
|
||||||
|
ProfileID: t.ProfileID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDecoder creates a decoder able to decode the content of the track.
|
||||||
|
func (t *TrackVP9) CreateDecoder() *rtpvp9.Decoder {
|
||||||
|
d := &rtpvp9.Decoder{}
|
||||||
|
d.Init()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user