From 2f5c038aff084b805b6c30f2fb310fb32d2deb66 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:12:38 +0200 Subject: [PATCH] mpegts: allow interacting with streams with unsupported codecs --- pkg/formats/mpegts/codec_unsupported.go | 19 +++++++++++++++++++ pkg/formats/mpegts/reader.go | 7 ------- pkg/formats/mpegts/track.go | 18 ++++++------------ 3 files changed, 25 insertions(+), 19 deletions(-) create mode 100644 pkg/formats/mpegts/codec_unsupported.go diff --git a/pkg/formats/mpegts/codec_unsupported.go b/pkg/formats/mpegts/codec_unsupported.go new file mode 100644 index 0000000..c752a8e --- /dev/null +++ b/pkg/formats/mpegts/codec_unsupported.go @@ -0,0 +1,19 @@ +package mpegts + +import ( + "github.com/asticode/go-astits" +) + +// CodecUnsupported is an unsupported codec. +type CodecUnsupported struct{} + +// IsVideo implements Codec. +func (CodecUnsupported) IsVideo() bool { + return false +} + +func (*CodecUnsupported) isCodec() {} + +func (c CodecUnsupported) marshal(uint16) (*astits.PMTElementaryStream, error) { + panic("this should not happen") +} diff --git a/pkg/formats/mpegts/reader.go b/pkg/formats/mpegts/reader.go index 2c70a21..d9b67d4 100644 --- a/pkg/formats/mpegts/reader.go +++ b/pkg/formats/mpegts/reader.go @@ -78,19 +78,12 @@ func NewReader(br io.Reader) (*Reader, error) { var track Track err := track.unmarshal(dem, es) if err != nil { - if errors.Is(err, errUnsupportedCodec) { - continue - } return nil, err } tracks = append(tracks, &track) } - if tracks == nil { - return nil, fmt.Errorf("no tracks with supported codecs found") - } - // rewind demuxer dem = astits.NewDemuxer( context.Background(), diff --git a/pkg/formats/mpegts/track.go b/pkg/formats/mpegts/track.go index 7d0b481..3a15308 100644 --- a/pkg/formats/mpegts/track.go +++ b/pkg/formats/mpegts/track.go @@ -1,7 +1,6 @@ package mpegts import ( - "errors" "fmt" "github.com/asticode/go-astits" @@ -15,8 +14,6 @@ const ( opusIdentifier = 'O'<<24 | 'p'<<16 | 'u'<<8 | 's' ) -var errUnsupportedCodec = errors.New("unsupported codec") - func findMPEG4AudioConfig(dem *astits.Demuxer, pid uint16) (*mpeg4audio.Config, error) { for { data, err := dem.NextData() @@ -125,19 +122,15 @@ func (t *Track) unmarshal(dem *astits.Demuxer, es *astits.PMTElementaryStream) e switch es.StreamType { case astits.StreamTypeH265Video: t.Codec = &CodecH265{} - return nil case astits.StreamTypeH264Video: t.Codec = &CodecH264{} - return nil case astits.StreamTypeMPEG4Video: t.Codec = &CodecMPEG4Video{} - return nil case astits.StreamTypeMPEG2Video, astits.StreamTypeMPEG1Video: t.Codec = &CodecMPEG1Video{} - return nil case astits.StreamTypeAACAudio: conf, err := findMPEG4AudioConfig(dem, es.ElementaryPID) @@ -148,11 +141,9 @@ func (t *Track) unmarshal(dem *astits.Demuxer, es *astits.PMTElementaryStream) e t.Codec = &CodecMPEG4Audio{ Config: *conf, } - return nil case astits.StreamTypeMPEG1Audio: t.Codec = &CodecMPEG1Audio{} - return nil case astits.StreamTypeAC3Audio: sampleRate, channelCount, err := findAC3Parameters(dem, es.ElementaryPID) @@ -164,15 +155,18 @@ func (t *Track) unmarshal(dem *astits.Demuxer, es *astits.PMTElementaryStream) e SampleRate: sampleRate, ChannelCount: channelCount, } - return nil case astits.StreamTypePrivateData: codec := findOpusCodec(es.ElementaryStreamDescriptors) if codec != nil { t.Codec = codec - return nil + } else { + t.Codec = &CodecUnsupported{} } + + default: + t.Codec = &CodecUnsupported{} } - return errUnsupportedCodec + return nil }