From 56338e0084c3d8d59173115a257f9a289c9b9c1c Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 20 Mar 2022 16:55:53 +0100 Subject: [PATCH] hls client: do not create audio track when there's no audio track --- internal/core/hls_source.go | 2 +- internal/hls/client.go | 40 ++++++++++++++------------ internal/hls/client_audio_processor.go | 4 +-- internal/hls/client_test.go | 2 +- internal/hls/client_video_processor.go | 4 +-- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/internal/core/hls_source.go b/internal/core/hls_source.go index c9fcb687..a5d612ec 100644 --- a/internal/core/hls_source.go +++ b/internal/core/hls_source.go @@ -103,7 +103,7 @@ func (s *hlsSource) runInner() bool { } }() - onTracks := func(videoTrack gortsplib.Track, audioTrack gortsplib.Track) error { + onTracks := func(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackAAC) error { var tracks gortsplib.Tracks if videoTrack != nil { diff --git a/internal/hls/client.go b/internal/hls/client.go index 6bc7968b..03c27f54 100644 --- a/internal/hls/client.go +++ b/internal/hls/client.go @@ -46,7 +46,7 @@ type ClientLogger interface { // Client is a HLS client. type Client struct { - onTracks func(gortsplib.Track, gortsplib.Track) error + onTracks func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error onVideoData func(time.Duration, [][]byte) onAudioData func(time.Duration, [][]byte) logger ClientLogger @@ -69,8 +69,8 @@ type Client struct { audioProc *clientAudioProcessor tracksMutex sync.RWMutex - videoTrack gortsplib.Track - audioTrack gortsplib.Track + videoTrack *gortsplib.TrackH264 + audioTrack *gortsplib.TrackAAC // in allocateProcs chan clientAllocateProcsReq @@ -83,7 +83,7 @@ type Client struct { func NewClient( primaryPlaylistURLStr string, fingerprint string, - onTracks func(gortsplib.Track, gortsplib.Track) error, + onTracks func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error, onVideoData func(time.Duration, [][]byte), onAudioData func(time.Duration, [][]byte), logger ClientLogger, @@ -167,12 +167,8 @@ func (c *Client) runInner() error { if c.videoPID != nil { c.videoProc = newClientVideoProcessor( innerCtx, - c.onVideoTrack, - func(pts time.Duration, nalus [][]byte) { - c.tracksMutex.RLock() - defer c.tracksMutex.RUnlock() - c.onVideoData(pts, nalus) - }, + c.onVideoProcessorTrack, + c.onVideoProcessorData, c.logger) go func() { errChan <- c.videoProc.run() }() @@ -181,12 +177,8 @@ func (c *Client) runInner() error { if c.audioPID != nil { c.audioProc = newClientAudioProcessor( innerCtx, - c.onAudioTrack, - func(pts time.Duration, aus [][]byte) { - c.tracksMutex.RLock() - defer c.tracksMutex.RUnlock() - c.onAudioData(pts, aus) - }) + c.onAudioProcessorTrack, + c.onAudioProcessorData) go func() { errChan <- c.audioProc.run() }() } @@ -525,7 +517,7 @@ func (c *Client) processSegment(innerCtx context.Context, byts []byte) error { } } -func (c *Client) onVideoTrack(track gortsplib.Track) error { +func (c *Client) onVideoProcessorTrack(track *gortsplib.TrackH264) error { c.tracksMutex.Lock() defer c.tracksMutex.Unlock() @@ -538,7 +530,13 @@ func (c *Client) onVideoTrack(track gortsplib.Track) error { return nil } -func (c *Client) onAudioTrack(track gortsplib.Track) error { +func (c *Client) onVideoProcessorData(pts time.Duration, nalus [][]byte) { + c.tracksMutex.RLock() + defer c.tracksMutex.RUnlock() + c.onVideoData(pts, nalus) +} + +func (c *Client) onAudioProcessorTrack(track *gortsplib.TrackAAC) error { c.tracksMutex.Lock() defer c.tracksMutex.Unlock() @@ -550,3 +548,9 @@ func (c *Client) onAudioTrack(track gortsplib.Track) error { return nil } + +func (c *Client) onAudioProcessorData(pts time.Duration, aus [][]byte) { + c.tracksMutex.RLock() + defer c.tracksMutex.RUnlock() + c.onAudioData(pts, aus) +} diff --git a/internal/hls/client_audio_processor.go b/internal/hls/client_audio_processor.go index eac6f860..95ec1a0e 100644 --- a/internal/hls/client_audio_processor.go +++ b/internal/hls/client_audio_processor.go @@ -16,7 +16,7 @@ type clientAudioProcessorData struct { type clientAudioProcessor struct { ctx context.Context - onTrack func(gortsplib.Track) error + onTrack func(*gortsplib.TrackAAC) error onData func(time.Duration, [][]byte) trackInitialized bool @@ -26,7 +26,7 @@ type clientAudioProcessor struct { func newClientAudioProcessor( ctx context.Context, - onTrack func(gortsplib.Track) error, + onTrack func(*gortsplib.TrackAAC) error, onData func(time.Duration, [][]byte), ) *clientAudioProcessor { p := &clientAudioProcessor{ diff --git a/internal/hls/client_test.go b/internal/hls/client_test.go index 7de45298..0ccbb578 100644 --- a/internal/hls/client_test.go +++ b/internal/hls/client_test.go @@ -214,7 +214,7 @@ func TestClient(t *testing.T) { c, err := NewClient( prefix+"://localhost:5780/stream.m3u8", "33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739", - func(gortsplib.Track, gortsplib.Track) error { + func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error { return nil }, func(pts time.Duration, nalus [][]byte) { diff --git a/internal/hls/client_video_processor.go b/internal/hls/client_video_processor.go index 1709ffae..b8080648 100644 --- a/internal/hls/client_video_processor.go +++ b/internal/hls/client_video_processor.go @@ -19,7 +19,7 @@ type clientVideoProcessorData struct { type clientVideoProcessor struct { ctx context.Context - onTrack func(gortsplib.Track) error + onTrack func(*gortsplib.TrackH264) error onData func(time.Duration, [][]byte) logger ClientLogger @@ -32,7 +32,7 @@ type clientVideoProcessor struct { func newClientVideoProcessor( ctx context.Context, - onTrack func(gortsplib.Track) error, + onTrack func(*gortsplib.TrackH264) error, onData func(time.Duration, [][]byte), logger ClientLogger, ) *clientVideoProcessor {