# WebRtcTrackReceiver

<a id="webrtctrackreceiver"></a>

# WebRtcTrackReceiver

```cpp
#include <icy/webrtc/trackreceiver.h>

class WebRtcTrackReceiver
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:61](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L61)

> **Inherits:** [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter)

[PacketStreamAdapter](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) that receives depacketized frames from a single remote libdatachannel Track and emits them as VideoPacket or AudioPacket into a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream).

Call [setupReceiveTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#setupreceivetrack) on the track first to install the correct depacketizer, then bind this receiver to it.

Usage: pc->onTrack([&](shared_ptr<rtc::Track> track) { if (setupReceiveTrack(track)) videoReceiver.bind(track); });

videoReceiver.emitter += packetSlot(&recorder, &Recorder::onEncodedVideo);

Emits owning packets - the frame data is copied, so downstream processors can safely queue packets asynchronously.

Emits VideoPacket for video tracks, AudioPacket for audio tracks. Use those packets to drive a decoder, recorder, or custom pipeline. See `samples/media-recorder` for a complete receive -> decode -> file example.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`emitter`](#emitter-16) | `variable` | Declared here |
| [`WebRtcTrackReceiver`](#webrtctrackreceiver-1) | `function` | Declared here |
| [`~WebRtcTrackReceiver`](#webrtctrackreceiver-2) | `function` | Declared here |
| [`bind`](#bind-6) | `function` | Declared here |
| [`configureJitterBuffer`](#configurejitterbuffer) | `function` | Declared here |
| [`jitterBufferConfig`](#jitterbufferconfig-1) | `function` | Declared here |
| [`jitterBufferEnabled`](#jitterbufferenabled) | `function` | Declared here |
| [`_dispatch`](#_dispatch) | `variable` | Declared here |
| [`_timer`](#_timer-5) | `variable` | Declared here |
| [`_state`](#_state-6) | `variable` | Declared here |
| [`_generation`](#_generation) | `variable` | Declared here |
| [`flushPending`](#flushpending) | `function` | Declared here |
| [`enqueue`](#enqueue) | `function` | Declared here |
| [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`~PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-2) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-2) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-3) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-4) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-5) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`getEmitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#getemitter) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`retention`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#retention-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#onstreamstatechange-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`_emitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#_emitter) | `variable` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-3) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-72) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-4) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-73) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |

## Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-1)  | Construct the adapter, binding it to the given packet signal. |
| `function` | [`~PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-2) `virtual` `inline` |  |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-1) `virtual` | Emit a mutable raw buffer as a packet. |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-2) `virtual` | Emit a read-only raw buffer as a packet (data is copied internally). |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-3) `virtual` | Emit a string as a packet (data is copied internally). |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-4) `virtual` | Emit a flag-only packet carrying no payload data. |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-5) `virtual` | Emit an existing packet directly onto the outgoing signal. |
| `function` | [`getEmitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#getemitter)  | Returns a reference to the outgoing packet signal. |
| `function` | [`retention`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#retention-1) `virtual` `const` | Returns how this adapter treats incoming packet lifetime. Most adapters are synchronous and therefore only borrow the packet for the current call chain. Queue-style adapters override this to advertise that they clone before deferred use. Callers may treat the first adapter reporting Cloned or Retained as the explicit ownership boundary in the stream graph. |
| `function` | [`onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#onstreamstatechange-1) `virtual` `inline` | Called by the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) to notify when the internal [Stream](https://auscaster.com/icey/docs/api-reference/icy-Stream.md#stream) state changes. On receiving the Stopped state, it is the responsibility of the adapter to have ceased all outgoing packet transmission, especially in multi-thread scenarios. |
| `variable` | [`_emitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#_emitter)  |  |
| `function` | [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-3)  | NonCopyable and NonMovable. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-72)  | Deleted assignment operator. |
| `function` | [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-73)  | Deleted assignment operator. |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal) | [`emitter`](#emitter-16)  |  |

---

<a id="emitter-16"></a>

### emitter

```cpp
PacketSignal emitter
```

Type: [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal)

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:87](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L87)

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`WebRtcTrackReceiver`](#webrtctrackreceiver-1)  | Construct an unbound receiver. Call [bind()](#bind-6) to attach a remote track. |
|  | [`~WebRtcTrackReceiver`](#webrtctrackreceiver-2) `override` |  |
| `void` | [`bind`](#bind-6)  | Bind to a remote track. Must be called after [setupReceiveTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#setupreceivetrack) returned true. Installs an onFrame callback that converts each depacketized frame to a VideoPacket or AudioPacket and emits it on the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream). The track type (video/audio) is detected from the SDP description. |
| `void` | [`configureJitterBuffer`](#configurejitterbuffer)  | Replace the receive-side jitter-buffer settings. |
| [`JitterBufferConfig`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-JitterBufferConfig.md#jitterbufferconfig) | [`jitterBufferConfig`](#jitterbufferconfig-1) `const` | Current jitter-buffer settings for this receiver. |
| `bool` | [`jitterBufferEnabled`](#jitterbufferenabled) `const` | True when depacketized receive frames are buffered before emission. |

---

<a id="webrtctrackreceiver-1"></a>

### WebRtcTrackReceiver

```cpp
WebRtcTrackReceiver()
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:65](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L65)

Construct an unbound receiver. Call [bind()](#bind-6) to attach a remote track.

---

<a id="webrtctrackreceiver-2"></a>

### ~WebRtcTrackReceiver

`override`

```cpp
~WebRtcTrackReceiver() override
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:66](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L66)

---

<a id="bind-6"></a>

### bind

```cpp
void bind(std::shared_ptr< rtc::Track > track)
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:74](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L74)

Bind to a remote track. Must be called after [setupReceiveTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#setupreceivetrack) returned true. Installs an onFrame callback that converts each depacketized frame to a VideoPacket or AudioPacket and emits it on the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream). The track type (video/audio) is detected from the SDP description.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `track` | `std::shared_ptr< rtc::Track >` | Remote track from the PeerConnection::onTrack callback. |

---

<a id="configurejitterbuffer"></a>

### configureJitterBuffer

```cpp
void configureJitterBuffer(const JitterBufferConfig & config)
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:79](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L79)

Replace the receive-side jitter-buffer settings.

Reconfiguring resets any buffered media still waiting for release.

---

<a id="jitterbufferconfig-1"></a>

### jitterBufferConfig

`const`

```cpp
JitterBufferConfig jitterBufferConfig() const
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:82](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L82)

Current jitter-buffer settings for this receiver.

---

<a id="jitterbufferenabled"></a>

### jitterBufferEnabled

`const`

```cpp
bool jitterBufferEnabled() const
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:85](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L85)

True when depacketized receive frames are buffered before emission.

## Private Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer) | [`_dispatch`](#_dispatch)  |  |
| [`Timer`](https://auscaster.com/icey/docs/api-reference/icy-Timer.md#timer) | [`_timer`](#_timer-5)  |  |
| `std::shared_ptr< DispatchState >` | [`_state`](#_state-6)  |  |
| `uint64_t` | [`_generation`](#_generation)  |  |

---

<a id="_dispatch"></a>

### _dispatch

```cpp
Synchronizer _dispatch
```

Type: [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer)

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:115](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L115)

---

<a id="_timer-5"></a>

### _timer

```cpp
Timer _timer
```

Type: [`Timer`](https://auscaster.com/icey/docs/api-reference/icy-Timer.md#timer)

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:116](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L116)

---

<a id="_state-6"></a>

### _state

```cpp
std::shared_ptr< DispatchState > _state = std::make_shared<DispatchState>()
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:117](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L117)

---

<a id="_generation"></a>

### _generation

```cpp
uint64_t _generation = 0
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:118](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L118)

## Private Methods

| Return | Name | Description |
|--------|------|-------------|
| `void` | [`flushPending`](#flushpending)  |  |

---

<a id="flushpending"></a>

### flushPending

```cpp
void flushPending()
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:113](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L113)

## Private Static Methods

| Return | Name | Description |
|--------|------|-------------|
| `void` | [`enqueue`](#enqueue) `static` |  |

---

<a id="enqueue"></a>

### enqueue

`static`

```cpp
static void enqueue(const std::shared_ptr< DispatchState > & state, std::unique_ptr< IPacket > packet)
```

[Defined in src/webrtc/include/icy/webrtc/trackreceiver.h:111](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/trackreceiver.h#L111)
