Store ddParser in atomic.Pointer (#4143)

* Store ddParser in atomic.Pointer

as release is handled outside lock

* log space

* make non-struct methods to release packets
This commit is contained in:
Raja Subramanian authored and GitHub committed 2025-12-10 13:01:17 +05:30
1 parent 037cb9062f
commit 20f6a49780
3 files changed
+34 -28

No files matched your search

+21 -18
View File
@@ -362,9 +362,14 @@ func (b *Buffer) createDDParserAndFrameRateCalculator() {
for i := range b.frameRateCalculator {
b.frameRateCalculator[i] = frc.GetFrameRateCalculatorForSpatial(int32(i))
}
b.ddParser = NewDependencyDescriptorParser(b.ddExtID, b.logger, func(spatial, temporal int32) {
frc.SetMaxLayer(spatial, temporal)
}, false)
b.ddParser = NewDependencyDescriptorParser(
b.ddExtID,
b.logger,
func(spatial, temporal int32) {
frc.SetMaxLayer(spatial, temporal)
},
false,
)
}
}
@@ -545,7 +550,7 @@ func (b *Buffer) ReadExtended(buf []byte) (*ExtPacket, error) {
ep := b.extPackets.PopFront()
patched := b.patchExtPacket(ep, buf)
if patched == nil {
b.ReleaseExtPacket(ep)
ReleaseExtPacket(ep)
continue
}
@@ -556,15 +561,6 @@ func (b *Buffer) ReadExtended(buf []byte) (*ExtPacket, error) {
}
}
func (b *Buffer) ReleaseExtPacket(extPkt *ExtPacket) {
if b.ddParser != nil {
b.ddParser.ReleaseExtDependencyDescriptor(extPkt.DependencyDescriptor)
}
*extPkt = ExtPacket{}
ExtPacketFactory.Put(extPkt)
}
func (b *Buffer) Close() error {
b.closeOnce.Do(func() {
b.closed.Store(true)
@@ -951,12 +947,12 @@ func (b *Buffer) getExtPacket(rtpPacket *rtp.Packet, arrivalTime int64, isBuffer
if err != nil {
if errors.Is(err, ErrDDExtentionNotFound) {
if b.mime == mime.MimeTypeVP8 || b.mime == mime.MimeTypeVP9 {
b.logger.Infow("dd extension not found, disable dd parser")
b.logger.Infow("dd extension not found, disable dd parser")
b.ddParser = nil
b.createFrameRateCalculator()
}
} else {
b.ReleaseExtPacket(ep)
ReleaseExtPacket(ep)
return nil
}
} else if ddVal != nil {
@@ -972,7 +968,7 @@ func (b *Buffer) getExtPacket(rtpPacket *rtp.Packet, arrivalTime int64, isBuffer
vp8Packet := VP8{}
if err := vp8Packet.Unmarshal(rtpPacket.Payload); err != nil {
b.logger.Warnw("could not unmarshal VP8 packet", err)
b.ReleaseExtPacket(ep)
ReleaseExtPacket(ep)
return nil
}
ep.KeyFrame = vp8Packet.IsKeyFrame
@@ -997,7 +993,7 @@ func (b *Buffer) getExtPacket(rtpPacket *rtp.Packet, arrivalTime int64, isBuffer
_, err := vp9Packet.Unmarshal(rtpPacket.Payload)
if err != nil {
b.logger.Warnw("could not unmarshal VP9 packet", err)
b.ReleaseExtPacket(ep)
ReleaseExtPacket(ep)
return nil
}
ep.VideoLayer = VideoLayer{
@@ -1038,7 +1034,7 @@ func (b *Buffer) getExtPacket(rtpPacket *rtp.Packet, arrivalTime int64, isBuffer
if ep.DependencyDescriptor == nil {
if len(rtpPacket.Payload) < 2 {
b.logger.Warnw("invalid H265 packet", nil)
b.ReleaseExtPacket(ep)
ReleaseExtPacket(ep)
return nil
}
ep.VideoLayer = VideoLayer{
@@ -1441,3 +1437,10 @@ func (b *Buffer) seedKeyFrame(keyFrameSeederGeneration int32) {
}
// ---------------------------------------------------------------
func ReleaseExtPacket(extPkt *ExtPacket) {
ReleaseExtDependencyDescriptor(extPkt.DependencyDescriptor)
*extPkt = ExtPacket{}
ExtPacketFactory.Put(extPkt)
}
+12 -9
View File
@@ -183,6 +183,7 @@ func (r *DependencyDescriptorParser) Parse(pkt *rtp.Packet) (*ExtDependencyDescr
"fn", ddVal.FrameNumber,
"extFN", extFN,
)
ReleaseExtDependencyDescriptor(extDD)
return nil, videoLayer, ErrDDStructureAttachedToNonFirstPacket
}
@@ -246,15 +247,6 @@ func (r *DependencyDescriptorParser) Parse(pkt *rtp.Packet) (*ExtDependencyDescr
return extDD, videoLayer, nil
}
func (r *DependencyDescriptorParser) ReleaseExtDependencyDescriptor(extDD *ExtDependencyDescriptor) {
if extDD == nil {
return
}
*extDD = ExtDependencyDescriptor{}
ExtDependencyDescriptorFactory.Put(extDD)
}
func (r *DependencyDescriptorParser) restart() {
r.frameChecker = NewFrameIntegrityChecker(integrityCheckFrame, integrityCheckPkt)
r.structure = nil
@@ -328,3 +320,14 @@ func ExtractDependencyDescriptorVideoSize(dd *dd.DependencyDescriptor) []VideoSi
return videoSizes
}
// ------------------------------------------------------------------------------
func ReleaseExtDependencyDescriptor(extDD *ExtDependencyDescriptor) {
if extDD == nil {
return
}
*extDD = ExtDependencyDescriptor{}
ExtDependencyDescriptorFactory.Put(extDD)
}
+1 -1
View File
@@ -869,7 +869,7 @@ func (w *WebRTCReceiver) forwardRTP(layer int32, buff *buffer.Buffer) {
numPacketsForwarded++
buff.ReleaseExtPacket(pkt)
buffer.ReleaseExtPacket(pkt)
}
}