Skip to content

Commit

Permalink
Add report reception timestamps
Browse files Browse the repository at this point in the history
  • Loading branch information
mengelbart committed Jan 19, 2025
1 parent a71cb0a commit 5244e8b
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 14 deletions.
6 changes: 3 additions & 3 deletions pkg/ccfb/ccfb_receiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ type acknowledgementList struct {
acks []acknowledgement
}

func convertCCFB(ts time.Time, feedback *rtcp.CCFeedbackReport) map[uint32]acknowledgementList {
func convertCCFB(ts time.Time, feedback *rtcp.CCFeedbackReport) (time.Time, map[uint32]acknowledgementList) {
if feedback == nil {
return nil
return time.Time{}, nil
}
result := map[uint32]acknowledgementList{}
referenceTime := ntp.ToTime32(feedback.ReportTimestamp, ts)
for _, rb := range feedback.ReportBlocks {
result[rb.MediaSSRC] = convertMetricBlock(ts, referenceTime, rb.BeginSequence, rb.MetricBlocks)
}
return result
return referenceTime, result
}

func convertMetricBlock(ts time.Time, reference time.Time, seqNrOffset uint16, blocks []rtcp.CCFeedbackMetricBlock) acknowledgementList {
Expand Down
7 changes: 4 additions & 3 deletions pkg/ccfb/history.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import (
)

type PacketReportList struct {
Timestamp time.Time
Arrival time.Time
Departure time.Time
Reports []PacketReport
}

Expand Down Expand Up @@ -109,7 +110,7 @@ func (h *history) getReportForAck(al acknowledgementList) PacketReportList {
}

return PacketReportList{
Timestamp: al.ts,
Reports: reports,
Arrival: al.ts,
Reports: reports,
}
}
2 changes: 1 addition & 1 deletion pkg/ccfb/history_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func TestHistory(t *testing.T) {
},
},
expectedReport: PacketReportList{
Timestamp: time.Time{}.Add(time.Second),
Arrival: time.Time{}.Add(time.Second),
Reports: []PacketReport{
{1, 1200, time.Time{}.Add(2 * time.Millisecond), true, time.Time{}.Add(3 * time.Millisecond), 0},
{2, 1200, time.Time{}.Add(3 * time.Millisecond), false, time.Time{}, 0},
Expand Down
10 changes: 6 additions & 4 deletions pkg/ccfb/interceptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@ func (i *Interceptor) BindLocalStream(info *interceptor.StreamInfo, writer inter
// BindRTCPReader implements interceptor.Interceptor.
func (i *Interceptor) BindRTCPReader(reader interceptor.RTCPReader) interceptor.RTCPReader {
return interceptor.RTCPReaderFunc(func(b []byte, a interceptor.Attributes) (int, interceptor.Attributes, error) {
now := i.timestamp()

n, attr, err := reader.Read(b, a)
if err != nil {
return n, attr, err
}
now := i.timestamp()

buf := make([]byte, n)
copy(buf, b[:n])

Expand All @@ -111,14 +111,16 @@ func (i *Interceptor) BindRTCPReader(reader interceptor.RTCPReader) interceptor.
pkts, err := attr.GetRTCPPackets(buf)
for _, pkt := range pkts {
var reportLists map[uint32]acknowledgementList
var reportDeparture time.Time
switch fb := pkt.(type) {
case *rtcp.CCFeedbackReport:
reportLists = convertCCFB(now, fb)
reportDeparture, reportLists = convertCCFB(now, fb)
case *rtcp.TransportLayerCC:
reportLists = convertTWCC(now, fb)
reportDeparture, reportLists = convertTWCC(now, fb)
}
for ssrc, reportList := range reportLists {
prl := i.ssrcToHistory[ssrc].getReportForAck(reportList)
prl.Departure = reportDeparture
if l, ok := pktReportLists[ssrc]; !ok {
pktReportLists[ssrc] = &prl
} else {
Expand Down
7 changes: 4 additions & 3 deletions pkg/ccfb/twcc_receiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import (
"github.com/pion/rtcp"
)

func convertTWCC(ts time.Time, feedback *rtcp.TransportLayerCC) map[uint32]acknowledgementList {
func convertTWCC(ts time.Time, feedback *rtcp.TransportLayerCC) (time.Time, map[uint32]acknowledgementList) {
log.Printf("got twcc report: %v", feedback)
if feedback == nil {
return nil
return time.Time{}, nil
}
var acks []acknowledgement

nextTimestamp := time.Time{}.Add(time.Duration(feedback.ReferenceTime) * 64 * time.Millisecond)
reportDeparture := nextTimestamp
recvDeltaIndex := 0

offset := 0
Expand Down Expand Up @@ -85,7 +86,7 @@ func convertTWCC(ts time.Time, feedback *rtcp.TransportLayerCC) map[uint32]ackno
}
}

return map[uint32]acknowledgementList{
return reportDeparture, map[uint32]acknowledgementList{
0: {
ts: ts,
acks: acks,
Expand Down

0 comments on commit 5244e8b

Please sign in to comment.