Skip to content

GCC (NoOpPacer and other pacers) drop NACK RTX because of SSRC #406

@arjunshajitech

Description

@arjunshajitech

Your environment.

  • Version: v0.1.44
  • Browser: Chrome

What did you do?

Set up a WebRTC pipeline in the following topology :

Client A (browser sender) → pion server → Client B (browser receiver)
  • Client A sends video to Client B via a pion server.
  • Client B sends a NACK for a missing packet.
  • The NACK Responder Interceptor correctly processes the NACK and attempts to retransmit (RTX) the buffered packet.
  • The sender-side interceptor chain also has the GCC (Google Congestion Control) interceptor enabled, configured with NoOpPacer.

What did you expect?

The RTX packet should be delivered to Client B.

What happened?

The RTX packet is silently dropped by the NoOpPacer (and other pacers) because the packet's SSRC does not match the tracked SSRC in the pacer state.

The following warning is logged by the NACK responder:

nack WARNING: 2026/03/03 14:58:20 failed resending nacked packet: unknown ssrc: 1913968682

The NACK Responder correctly processes the NACK and attempts retransmission, but the CC layer blocks the write. The receiver never gets the retransmitted packet.

Root Cause

The check at [noop_pacer.go#L50](https://github.com/pion/interceptor/blob/7cc50665cc3f8ab3457393229ec75e8b899e6909/pkg/gcc/noop_pacer.go#L50)

rejects any RTP packet whose SSRC was not originally registered with the pacer. RTX retransmissions use a separate SSRC (the RTX SSRC, negotiated via apt in SDP), which is never registered with the GCC pacer, causing every retransmitted packet to be rejected.

The same root cause likely affects all other pacer implementations in pkg/gcc/.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions