Skip to content

Commit f11722c

Browse files
secitasticode
andauthored
fix(packet_pool): align discontinuity detection with FFmpeg behavior (#70)
* Added devcontainer * fix(packet_pool): align discontinuity detection with FFmpeg behavior - Added check for PIDNull to skip discontinuity detection (matches FFmpeg's handling) - Fixed adaptation field discontinuity indicator logic (matches FFmpeg's specification) - Improved continuity counter validation to match FFmpeg's implementation - Updated test case to reflect FFmpeg-compliant behavior BREAKING CHANGE: The function now follows FFmpeg's rules for PIDNull and adaptation field discontinuity indicators, which were previously handled differently. Test case in packet_pool_test.go has been updated to match FFmpeg's expected behavior. * chore(packet_pool_test): add test cases for PIDNull and empty packet list Adds two new test cases to the hasDiscontinuity function: - Verifies that a packet with PIDNull does not trigger a discontinuity - Tests handling of empty packet lists when checking against a packet with continuity counter * fix: correct trailing newline in Dockerfile and remove tmp/.gitignore due to rebase --------- Co-authored-by: Quentin Renard <contact-github@asticode.com>
1 parent 86767b5 commit f11722c

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

packet_pool.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,31 @@ func (b *packetPool) dumpUnlocked() (ps []*Packet) {
118118

119119
// hasDiscontinuity checks whether a packet is discontinuous with a set of packets
120120
func hasDiscontinuity(ps []*Packet, p *Packet) bool {
121+
if p.Header.PID == PIDNull {
122+
return false
123+
}
124+
125+
isDiscontinuityIndicator := p.Header.HasAdaptationField && p.AdaptationField.DiscontinuityIndicator
126+
if isDiscontinuityIndicator {
127+
return false
128+
}
129+
121130
l := len(ps)
122-
return (p.Header.HasAdaptationField && p.AdaptationField.DiscontinuityIndicator) || (l > 0 && ((p.Header.HasPayload && p.Header.ContinuityCounter != (ps[l-1].Header.ContinuityCounter+1)%16) ||
123-
(!p.Header.HasPayload && p.Header.ContinuityCounter != ps[l-1].Header.ContinuityCounter)))
131+
if l == 0 {
132+
return false
133+
}
134+
135+
var expectedContinuityCounter uint8
136+
if p.Header.HasPayload {
137+
expectedContinuityCounter = (ps[l-1].Header.ContinuityCounter + 1) & 0x0f
138+
} else {
139+
expectedContinuityCounter = ps[l-1].Header.ContinuityCounter
140+
}
141+
if expectedContinuityCounter == p.Header.ContinuityCounter {
142+
return false
143+
}
144+
145+
return true
124146
}
125147

126148
// isSameAsPrevious checks whether a packet is the same as the last packet of a set of packets

packet_pool_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
func TestHasDiscontinuity(t *testing.T) {
1010
assert.False(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{Header: PacketHeader{ContinuityCounter: 0, HasPayload: true}}))
1111
assert.False(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{Header: PacketHeader{ContinuityCounter: 15}}))
12-
assert.True(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{AdaptationField: &PacketAdaptationField{DiscontinuityIndicator: true}, Header: PacketHeader{ContinuityCounter: 0, HasAdaptationField: true, HasPayload: true}}))
12+
assert.False(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{AdaptationField: &PacketAdaptationField{DiscontinuityIndicator: true}, Header: PacketHeader{ContinuityCounter: 0, HasAdaptationField: true, HasPayload: true}}))
13+
assert.False(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{Header: PacketHeader{PID: PIDNull}}))
14+
assert.False(t, hasDiscontinuity([]*Packet{}, &Packet{Header: PacketHeader{ContinuityCounter: 5}}))
1315
assert.True(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{Header: PacketHeader{ContinuityCounter: 1, HasPayload: true}}))
1416
assert.True(t, hasDiscontinuity([]*Packet{{Header: PacketHeader{ContinuityCounter: 15}}}, &Packet{Header: PacketHeader{ContinuityCounter: 0}}))
1517
}

0 commit comments

Comments
 (0)