Browse Source

rtmp: fix panic when publishing audio-only streams (#1459) (#1502)

pull/1503/head
Alessandro Ros 3 years ago committed by GitHub
parent
commit
c7938eb832
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      internal/rtmp/conn.go
  2. 59
      internal/rtmp/conn_test.go

6
internal/rtmp/conn.go

@ -584,7 +584,7 @@ func (c *Conn) WriteMessage(msg message.Message) error {
return c.mrw.Write(msg) return c.mrw.Write(msg)
} }
func trackFromH264DecoderConfig(data []byte) (*format.H264, error) { func trackFromH264DecoderConfig(data []byte) (format.Format, error) {
var conf h264conf.Conf var conf h264conf.Conf
err := conf.Unmarshal(data) err := conf.Unmarshal(data)
if err != nil { if err != nil {
@ -766,9 +766,9 @@ func (c *Conn) readTracksFromMetadata(payload []interface{}) (format.Format, *fo
} }
} }
func (c *Conn) readTracksFromMessages(msg message.Message) (*format.H264, *format.MPEG4Audio, error) { func (c *Conn) readTracksFromMessages(msg message.Message) (format.Format, *format.MPEG4Audio, error) {
var startTime *time.Duration var startTime *time.Duration
var videoTrack *format.H264 var videoTrack format.Format
var audioTrack *format.MPEG4Audio var audioTrack *format.MPEG4Audio
// analyze 1 second of packets // analyze 1 second of packets

59
internal/rtmp/conn_test.go

@ -5,6 +5,7 @@ import (
"net" "net"
"net/url" "net/url"
"testing" "testing"
"time"
"github.com/aler9/gortsplib/v2/pkg/codecs/h264" "github.com/aler9/gortsplib/v2/pkg/codecs/h264"
"github.com/aler9/gortsplib/v2/pkg/codecs/mpeg4audio" "github.com/aler9/gortsplib/v2/pkg/codecs/mpeg4audio"
@ -537,7 +538,7 @@ func TestReadTracks(t *testing.T) {
}, },
}, },
{ {
"missing metadata", "missing metadata, video+audio",
&format.H264{ &format.H264{
PayloadTyp: 96, PayloadTyp: 96,
SPS: sps, SPS: sps,
@ -556,6 +557,21 @@ func TestReadTracks(t *testing.T) {
IndexDeltaLength: 3, IndexDeltaLength: 3,
}, },
}, },
{
"missing metadata, audio",
nil,
&format.MPEG4Audio{
PayloadTyp: 96,
Config: &mpeg4audio.Config{
Type: 2,
SampleRate: 44100,
ChannelCount: 2,
},
SizeLength: 13,
IndexLength: 3,
IndexDeltaLength: 3,
},
},
{ {
"obs studio h265", "obs studio h265",
&format.H265{ &format.H265{
@ -796,6 +812,7 @@ func TestReadTracks(t *testing.T) {
SPS: sps, SPS: sps,
PPS: pps, PPS: pps,
}.Marshal() }.Marshal()
err = mrw.Write(&message.MsgVideo{ err = mrw.Write(&message.MsgVideo{
ChunkStreamID: message.MsgVideoChunkStreamID, ChunkStreamID: message.MsgVideoChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -811,6 +828,7 @@ func TestReadTracks(t *testing.T) {
ChannelCount: 2, ChannelCount: 2,
}.Marshal() }.Marshal()
require.NoError(t, err) require.NoError(t, err)
err = mrw.Write(&message.MsgAudio{ err = mrw.Write(&message.MsgAudio{
ChunkStreamID: message.MsgAudioChunkStreamID, ChunkStreamID: message.MsgAudioChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -855,6 +873,7 @@ func TestReadTracks(t *testing.T) {
SPS: sps, SPS: sps,
PPS: pps, PPS: pps,
}.Marshal() }.Marshal()
err = mrw.Write(&message.MsgVideo{ err = mrw.Write(&message.MsgVideo{
ChunkStreamID: message.MsgVideoChunkStreamID, ChunkStreamID: message.MsgVideoChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -893,6 +912,7 @@ func TestReadTracks(t *testing.T) {
SPS: sps, SPS: sps,
PPS: pps, PPS: pps,
}.Marshal() }.Marshal()
err = mrw.Write(&message.MsgVideo{ err = mrw.Write(&message.MsgVideo{
ChunkStreamID: message.MsgVideoChunkStreamID, ChunkStreamID: message.MsgVideoChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -908,6 +928,7 @@ func TestReadTracks(t *testing.T) {
ChannelCount: 2, ChannelCount: 2,
}.Marshal() }.Marshal()
require.NoError(t, err) require.NoError(t, err)
err = mrw.Write(&message.MsgAudio{ err = mrw.Write(&message.MsgAudio{
ChunkStreamID: message.MsgAudioChunkStreamID, ChunkStreamID: message.MsgAudioChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -919,11 +940,12 @@ func TestReadTracks(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
case "missing metadata": case "missing metadata, video+audio":
buf, _ := h264conf.Conf{ buf, _ := h264conf.Conf{
SPS: sps, SPS: sps,
PPS: pps, PPS: pps,
}.Marshal() }.Marshal()
err = mrw.Write(&message.MsgVideo{ err = mrw.Write(&message.MsgVideo{
ChunkStreamID: message.MsgVideoChunkStreamID, ChunkStreamID: message.MsgVideoChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -939,6 +961,7 @@ func TestReadTracks(t *testing.T) {
ChannelCount: 2, ChannelCount: 2,
}.Marshal() }.Marshal()
require.NoError(t, err) require.NoError(t, err)
err = mrw.Write(&message.MsgAudio{ err = mrw.Write(&message.MsgAudio{
ChunkStreamID: message.MsgAudioChunkStreamID, ChunkStreamID: message.MsgAudioChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,
@ -950,6 +973,37 @@ func TestReadTracks(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
case "missing metadata, audio":
enc, err := mpeg4audio.Config{
Type: 2,
SampleRate: 44100,
ChannelCount: 2,
}.Marshal()
require.NoError(t, err)
err = mrw.Write(&message.MsgAudio{
ChunkStreamID: message.MsgAudioChunkStreamID,
MessageStreamID: 0x1000000,
Rate: flvio.SOUND_44Khz,
Depth: flvio.SOUND_16BIT,
Channels: flvio.SOUND_STEREO,
AACType: flvio.AAC_SEQHDR,
Payload: enc,
})
require.NoError(t, err)
err = mrw.Write(&message.MsgAudio{
ChunkStreamID: message.MsgAudioChunkStreamID,
MessageStreamID: 0x1000000,
Rate: flvio.SOUND_44Khz,
Depth: flvio.SOUND_16BIT,
Channels: flvio.SOUND_STEREO,
AACType: flvio.AAC_SEQHDR,
Payload: enc,
DTS: 1 * time.Second,
})
require.NoError(t, err)
case "obs studio h265": case "obs studio h265":
err = mrw.Write(&message.MsgDataAMF0{ err = mrw.Write(&message.MsgDataAMF0{
ChunkStreamID: 4, ChunkStreamID: 4,
@ -1017,6 +1071,7 @@ func TestReadTracks(t *testing.T) {
ChannelCount: 2, ChannelCount: 2,
}.Marshal() }.Marshal()
require.NoError(t, err) require.NoError(t, err)
err = mrw.Write(&message.MsgAudio{ err = mrw.Write(&message.MsgAudio{
ChunkStreamID: message.MsgAudioChunkStreamID, ChunkStreamID: message.MsgAudioChunkStreamID,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,

Loading…
Cancel
Save