Properly handle PacketTypeMPEG2TSSequenceStart

This commit is contained in:
Ingo Oppermann 2024-01-03 16:53:26 +01:00
parent b2c6d2e5ff
commit 704dff2c27
2 changed files with 41 additions and 13 deletions

View File

@ -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
}

View File

@ -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