|
|
|
|
@ -16,6 +16,7 @@ import (
@@ -16,6 +16,7 @@ import (
|
|
|
|
|
"github.com/aler9/gortsplib/pkg/rtpaac" |
|
|
|
|
"github.com/aler9/gortsplib/pkg/rtph264" |
|
|
|
|
"github.com/notedit/rtmp/av" |
|
|
|
|
"github.com/pion/rtcp" |
|
|
|
|
"github.com/pion/rtp" |
|
|
|
|
|
|
|
|
|
"github.com/aler9/rtsp-simple-server/internal/conf" |
|
|
|
|
@ -39,7 +40,7 @@ func pathNameAndQuery(inURL *url.URL) (string, url.Values, string) {
@@ -39,7 +40,7 @@ func pathNameAndQuery(inURL *url.URL) (string, url.Values, string) {
|
|
|
|
|
|
|
|
|
|
type rtmpConnTrackIDPayloadPair struct { |
|
|
|
|
trackID int |
|
|
|
|
buf []byte |
|
|
|
|
packet *rtp.Packet |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type rtmpConnPathManager interface { |
|
|
|
|
@ -330,14 +331,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
@@ -330,14 +331,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
|
|
|
|
pair := data.(rtmpConnTrackIDPayloadPair) |
|
|
|
|
|
|
|
|
|
if videoTrack != nil && pair.trackID == videoTrackID { |
|
|
|
|
var pkt rtp.Packet |
|
|
|
|
err := pkt.Unmarshal(pair.buf) |
|
|
|
|
if err != nil { |
|
|
|
|
c.log(logger.Warn, "unable to decode RTP packet: %v", err) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
nalus, pts, err := h264Decoder.DecodeUntilMarker(&pkt) |
|
|
|
|
nalus, pts, err := h264Decoder.DecodeUntilMarker(pair.packet) |
|
|
|
|
if err != nil { |
|
|
|
|
if err != rtph264.ErrMorePacketsNeeded && err != rtph264.ErrNonStartingPacketAndNoPrevious { |
|
|
|
|
c.log(logger.Warn, "unable to decode video track: %v", err) |
|
|
|
|
@ -398,14 +392,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
@@ -398,14 +392,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} else if audioTrack != nil && pair.trackID == audioTrackID { |
|
|
|
|
var pkt rtp.Packet |
|
|
|
|
err := pkt.Unmarshal(pair.buf) |
|
|
|
|
if err != nil { |
|
|
|
|
c.log(logger.Warn, "unable to decode RTP packet: %v", err) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
aus, pts, err := aacDecoder.Decode(&pkt) |
|
|
|
|
aus, pts, err := aacDecoder.Decode(pair.packet) |
|
|
|
|
if err != nil { |
|
|
|
|
if err != rtpaac.ErrMorePacketsNeeded { |
|
|
|
|
c.log(logger.Warn, "unable to decode audio track: %v", err) |
|
|
|
|
@ -510,9 +497,9 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
@@ -510,9 +497,9 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
|
|
|
|
|
rtcpSenders := rtcpsenderset.New(tracks, rres.stream.onPacketRTCP) |
|
|
|
|
defer rtcpSenders.Close() |
|
|
|
|
|
|
|
|
|
onPacketRTP := func(trackID int, payload []byte) { |
|
|
|
|
rtcpSenders.OnPacketRTP(trackID, payload) |
|
|
|
|
rres.stream.onPacketRTP(trackID, payload) |
|
|
|
|
onPacketRTP := func(trackID int, pkt *rtp.Packet) { |
|
|
|
|
rtcpSenders.OnPacketRTP(trackID, pkt) |
|
|
|
|
rres.stream.onPacketRTP(trackID, pkt) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
@ -555,17 +542,8 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
@@ -555,17 +542,8 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
|
|
|
|
|
return fmt.Errorf("error while encoding H264: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bytss := make([][]byte, len(pkts)) |
|
|
|
|
for i, pkt := range pkts { |
|
|
|
|
byts, err := pkt.Marshal() |
|
|
|
|
if err != nil { |
|
|
|
|
return fmt.Errorf("error while encoding H264: %v", err) |
|
|
|
|
} |
|
|
|
|
bytss[i] = byts |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, byts := range bytss { |
|
|
|
|
onPacketRTP(videoTrackID, byts) |
|
|
|
|
for _, pkt := range pkts { |
|
|
|
|
onPacketRTP(videoTrackID, pkt) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case av.AAC: |
|
|
|
|
@ -578,17 +556,8 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
@@ -578,17 +556,8 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
|
|
|
|
|
return fmt.Errorf("error while encoding AAC: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bytss := make([][]byte, len(pkts)) |
|
|
|
|
for i, pkt := range pkts { |
|
|
|
|
byts, err := pkt.Marshal() |
|
|
|
|
if err != nil { |
|
|
|
|
return fmt.Errorf("error while encoding AAC: %v", err) |
|
|
|
|
} |
|
|
|
|
bytss[i] = byts |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, byts := range bytss { |
|
|
|
|
onPacketRTP(audioTrackID, byts) |
|
|
|
|
for _, pkt := range pkts { |
|
|
|
|
onPacketRTP(audioTrackID, pkt) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -646,12 +615,12 @@ func (c *rtmpConn) onReaderAccepted() {
@@ -646,12 +615,12 @@ func (c *rtmpConn) onReaderAccepted() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// onReaderPacketRTP implements reader.
|
|
|
|
|
func (c *rtmpConn) onReaderPacketRTP(trackID int, payload []byte) { |
|
|
|
|
c.ringBuffer.Push(rtmpConnTrackIDPayloadPair{trackID, payload}) |
|
|
|
|
func (c *rtmpConn) onReaderPacketRTP(trackID int, pkt *rtp.Packet) { |
|
|
|
|
c.ringBuffer.Push(rtmpConnTrackIDPayloadPair{trackID, pkt}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// onReaderPacketRTCP implements reader.
|
|
|
|
|
func (c *rtmpConn) onReaderPacketRTCP(trackID int, payload []byte) { |
|
|
|
|
func (c *rtmpConn) onReaderPacketRTCP(trackID int, pkt rtcp.Packet) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// onReaderAPIDescribe implements reader.
|
|
|
|
|
|