diff --git a/pkg/avframe.go b/pkg/avframe.go index 1e1772c..9275868 100644 --- a/pkg/avframe.go +++ b/pkg/avframe.go @@ -140,11 +140,11 @@ func (b *BaseSample) GetCTS32() uint32 { return uint32(b.CTS / time.Millisecond) } -func (b *BaseSample) GetNalus() *util.ReuseArray[util.Memory] { +func (b *BaseSample) GetNalus() *Nalus { if b.Raw == nil { b.Raw = &Nalus{} } - return b.Raw.(*util.ReuseArray[util.Memory]) + return b.Raw.(*Nalus) } func (b *BaseSample) GetAudioData() *AudioData { diff --git a/pkg/util/index.go b/pkg/util/index.go index 1860e96..2770da1 100644 --- a/pkg/util/index.go +++ b/pkg/util/index.go @@ -114,9 +114,11 @@ func (s *ReuseArray[T]) Reduce() ReuseArray[T] { } func (s *ReuseArray[T]) Remove(item *T) bool { - for i := range *s { + count := s.Count() + for i := range count { if &(*s)[i] == item { *s = append((*s)[:i], (*s)[i+1:]...) + *s = append(*s, *item)[:count-1] return true } } diff --git a/plugin/rtmp/pkg/video.go b/plugin/rtmp/pkg/video.go index b2c62ec..d92baa1 100644 --- a/plugin/rtmp/pkg/video.go +++ b/plugin/rtmp/pkg/video.go @@ -286,8 +286,8 @@ func (avcc *VideoFrame) Demux() error { } func (avcc *VideoFrame) muxOld26x(codecID VideoCodecID, fromBase *Sample) { - nalus := fromBase.Raw.(*Nalus) - avcc.InitRecycleIndexes(len(*nalus)) // Recycle partial data + nalus := fromBase.GetNalus() + avcc.InitRecycleIndexes(nalus.Count()) // Recycle partial data head := avcc.NextN(5) head[0] = util.Conditional[byte](fromBase.IDR, 0x10, 0x20) | byte(codecID) head[1] = 1 @@ -296,6 +296,9 @@ func (avcc *VideoFrame) muxOld26x(codecID VideoCodecID, fromBase *Sample) { naluLenM := avcc.NextN(4) naluLen := uint32(nalu.Size) binary.BigEndian.PutUint32(naluLenM, naluLen) + if nalu.Size != len(util.ConcatBuffers(nalu.Buffers)) { + panic("nalu size mismatch") + } avcc.Push(nalu.Buffers...) } } diff --git a/plugin/rtp/pkg/audio.go b/plugin/rtp/pkg/audio.go index 110ecd3..cf93adc 100644 --- a/plugin/rtp/pkg/audio.go +++ b/plugin/rtp/pkg/audio.go @@ -320,9 +320,8 @@ func (r *AudioFrame) Mux(from *Sample) (err error) { ctx.PayloadType = 8 ctx.ClockRate = uint32(ctx.SampleRate) r.ICodecCtx = &ctx - } else { - ctx = &r.ICodecCtx.(*PCMACtx).RTPCtx } + ctx = &r.ICodecCtx.(*PCMACtx).RTPCtx case *codec.PCMUCtx: if r.ICodecCtx == nil { var ctx PCMUCtx @@ -332,9 +331,8 @@ func (r *AudioFrame) Mux(from *Sample) (err error) { ctx.PayloadType = 0 ctx.ClockRate = uint32(ctx.SampleRate) r.ICodecCtx = &ctx - } else { - ctx = &r.ICodecCtx.(*PCMUCtx).RTPCtx } + ctx = &r.ICodecCtx.(*PCMUCtx).RTPCtx } pts := uint32(from.Timestamp * time.Duration(ctx.ClockRate) / time.Second) if reader := data.NewReader(); reader.Length > MTUSize { diff --git a/plugin/rtp/pkg/video.go b/plugin/rtp/pkg/video.go index 9904c59..8c71e18 100644 --- a/plugin/rtp/pkg/video.go +++ b/plugin/rtp/pkg/video.go @@ -61,12 +61,6 @@ const ( MTUSize = 1460 ) -func (r *VideoFrame) Parse(data IAVFrame) (err error) { - input := data.(*VideoFrame) - r.Packets = append(r.Packets[:0], input.Packets...) - return -} - func (r *VideoFrame) Recycle() { r.RecyclableMemory.Recycle() r.Packets.Reset() @@ -98,10 +92,10 @@ func (r *VideoFrame) CheckCodecChange() (err error) { switch nalType { case h264parser.NALU_SPS: sps = nalu.ToBytes() - defer nalus.Remove(nalu) + //TODO: defer nalus.Remove(nalu) case h264parser.NALU_PPS: pps = nalu.ToBytes() - defer nalus.Remove(nalu) + //TODO: defer nalus.Remove(nalu) case codec.NALU_IDR_Picture: r.IDR = true } @@ -377,13 +371,8 @@ func (r *VideoFrame) Demux() (err error) { switch c := r.ICodecCtx.(type) { case *H264Ctx: nalus := r.GetNalus() - nalu := nalus.GetNextPointer() + var nalu *util.Memory var naluType codec.H264NALUType - gotNalu := func() { - if nalu.Size > 0 { - nalu = nalus.GetNextPointer() - } - } for packet := range r.Packets.RangePoint { if len(packet.Payload) < 2 { continue @@ -393,8 +382,7 @@ func (r *VideoFrame) Demux() (err error) { } b0 := packet.Payload[0] if t := codec.ParseH264NALUType(b0); t < 24 { - nalu.PushOne(packet.Payload) - gotNalu() + nalus.GetNextPointer().PushOne(packet.Payload) } else { offset := t.Offset() switch t { @@ -404,8 +392,7 @@ func (r *VideoFrame) Demux() (err error) { } for buffer := util.Buffer(packet.Payload[offset:]); buffer.CanRead(); { if nextSize := int(buffer.ReadUint16()); buffer.Len() >= nextSize { - nalu.PushOne(buffer.ReadN(nextSize)) - gotNalu() + nalus.GetNextPointer().PushOne(buffer.ReadN(nextSize)) } else { return fmt.Errorf("invalid nalu size %d", nextSize) } @@ -413,23 +400,23 @@ func (r *VideoFrame) Demux() (err error) { case codec.NALU_FUA, codec.NALU_FUB: b1 := packet.Payload[1] if util.Bit1(b1, 0) { + nalu = nalus.GetNextPointer() naluType.Parse(b1) nalu.PushOne([]byte{naluType.Or(b0 & 0x60)}) } if nalu.Size > 0 { nalu.PushOne(packet.Payload[offset:]) + if util.Bit1(b1, 1) { + // 结束位 + } } else { continue } - if util.Bit1(b1, 1) { - gotNalu() - } default: return fmt.Errorf("unsupported nalu type %d", t) } } } - nalus.Reduce() return nil case *H265Ctx: nalus := r.GetNalus()