From 704dff2c27fb4865bfa950ed74c848c9f46ffe81 Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Wed, 3 Jan 2024 16:53:26 +0100 Subject: [PATCH] Properly handle PacketTypeMPEG2TSSequenceStart --- codec/av1parser/parser.go | 19 ++++++++++++++++--- format/flv/flv.go | 35 +++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/codec/av1parser/parser.go b/codec/av1parser/parser.go index 7ee0d2c..50ec01a 100644 --- a/codec/av1parser/parser.go +++ b/codec/av1parser/parser.go @@ -5,7 +5,8 @@ import ( ) type CodecData struct { - Record []byte + Record []byte + IsMpeg2TS bool } func (codec CodecData) Type() av.CodecType { @@ -16,6 +17,10 @@ func (codec CodecData) AV1DecoderConfRecordBytes() []byte { return codec.Record } +func (codec CodecData) AV1VideoDescriptorBytes() []byte { + return codec.Record +} + func (codec CodecData) Width() int { return 0 } @@ -24,8 +29,16 @@ func (codec CodecData) Height() int { return 0 } -func NewCodecDataFromAV1DecoderConfRecord(record []byte) (self CodecData, err error) { - self.Record = record +func NewCodecDataFromAV1DecoderConfRecord(record []byte) (data CodecData, err error) { + data.Record = record + data.IsMpeg2TS = false + + return +} + +func NewCodecDataFromAV1VideoDescriptor(record []byte) (data CodecData, err error) { + data.Record = record + data.IsMpeg2TS = true return } diff --git a/format/flv/flv.go b/format/flv/flv.go index 26fc3ab..3289fb5 100644 --- a/format/flv/flv.go +++ b/format/flv/flv.go @@ -134,19 +134,28 @@ func (prober *Prober) PushTag(tag flvio.Tag, timestamp int32) (err error) { prober.CacheTag(tag, timestamp) } } else if tag.FourCC == flvio.FOURCC_AV1 { - if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START { + if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START || tag.PacketType == flvio.PKTTYPE_MPEG2TS_SEQUENCE_START { if !prober.GotVideo { var stream av1parser.CodecData - //fmt.Printf("got AV1 sequence start:\n%s\n", hex.Dump(tag.Data)) - if stream, err = av1parser.NewCodecDataFromAV1DecoderConfRecord(tag.Data); err != nil { - err = fmt.Errorf("flv: av1 seqhdr invalid: %s", err.Error()) - return + + if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START { + //fmt.Printf("got AV1 sequence start:\n%s\n", hex.Dump(tag.Data)) + if stream, err = av1parser.NewCodecDataFromAV1DecoderConfRecord(tag.Data); err != nil { + err = fmt.Errorf("flv: av1 seqhdr invalid: %s", err.Error()) + return + } + } else { + //fmt.Printf("got AV1 video descriptor:\n%s\n", hex.Dump(tag.Data)) + if stream, err = av1parser.NewCodecDataFromAV1VideoDescriptor(tag.Data); err != nil { + err = fmt.Errorf("flv: av1 video descriptor invalid: %s", err.Error()) + return + } } prober.VideoStreamIdx = len(prober.Streams) prober.Streams = append(prober.Streams, stream) prober.GotVideo = true } - } else if tag.PacketType == flvio.PKTTYPE_CODED_FRAMES || tag.PacketType == flvio.PKTTYPE_CODED_FRAMESX || tag.PacketType == flvio.PKTTYPE_MPEG2TS_SEQUENCE_START { + } else if tag.PacketType == flvio.PKTTYPE_CODED_FRAMES || tag.PacketType == flvio.PKTTYPE_CODED_FRAMESX { prober.CacheTag(tag, timestamp) } } @@ -289,7 +298,7 @@ func CodecDataToTag(stream av.CodecData) (_tag flvio.Tag, ok bool, err error) { Data: h264.AVCDecoderConfRecordBytes(), FrameType: flvio.FRAME_KEY, } - //fmt.Printf("set H264 sequence start:\n%v\n", hex.Dump(h264.AVCDecoderConfRecordBytes())) + //fmt.Printf("set H264 sequence start:\n%v\n", hex.Dump(tag.Data)) ok = true _tag = tag @@ -303,7 +312,7 @@ func CodecDataToTag(stream av.CodecData) (_tag flvio.Tag, ok bool, err error) { Data: hevc.HEVCDecoderConfRecordBytes(), FrameType: flvio.FRAME_KEY, } - //fmt.Printf("set HEVC sequence start:\n%v\n", hex.Dump(hevc.HEVCDecoderConfRecordBytes())) + //fmt.Printf("set HEVC sequence start:\n%v\n", hex.Dump(tag.Data)) ok = true _tag = tag @@ -317,7 +326,7 @@ func CodecDataToTag(stream av.CodecData) (_tag flvio.Tag, ok bool, err error) { Data: vp9.VPDecoderConfRecordBytes(), FrameType: flvio.FRAME_KEY, } - //fmt.Printf("set VP9 sequence start:\n%v\n", hex.Dump(vp9.VPDecoderConfRecordBytes())) + //fmt.Printf("set VP9 sequence start:\n%v\n", hex.Dump(tag.Data)) ok = true _tag = tag @@ -331,7 +340,13 @@ func CodecDataToTag(stream av.CodecData) (_tag flvio.Tag, ok bool, err error) { Data: av1.AV1DecoderConfRecordBytes(), FrameType: flvio.FRAME_KEY, } - //fmt.Printf("set AV1 sequence start:\n%v\n", hex.Dump(av1.AV1DecoderConfRecordBytes())) + + if av1.IsMpeg2TS { + tag.PacketType = flvio.PKTTYPE_MPEG2TS_SEQUENCE_START + tag.Data = av1.AV1VideoDescriptorBytes() + } + + //fmt.Printf("set AV1 sequence start:\n%v\n", hex.Dump(tag.Data)) ok = true _tag = tag