# WebRtcTrackSender

<a id="webrtctracksender"></a>

# WebRtcTrackSender

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

class WebRtcTrackSender
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:56](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L56)

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

[PacketProcessor](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) that sends encoded media to a single libdatachannel Track via sendFrame().

Bind to one track (video or audio). Accepts the corresponding packet type from the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) and converts timestamps from FFmpeg microseconds to the track's RTP clock rate.

Usage: auto vh = createVideoTrack(pc, codec); [WebRtcTrackSender](#webrtctracksender) videoSender(vh);

[PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) stream; stream.attachSource(capture); stream.attach(encoder, 1, true); stream.attach(&videoSender, 5, false); stream.start();

Only emits the packet downstream on successful send, so a chained recorder won't record frames that failed to transmit.

Accepts only the packet type that matches the bound track. Non-matching packets are passed through unchanged so mixed audio/video [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) chains can share one source cleanly.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`emitter`](#emitter-15) | `variable` | Declared here |
| [`WebRtcTrackSender`](#webrtctracksender-1) | `function` | Declared here |
| [`WebRtcTrackSender`](#webrtctracksender-2) | `function` | Declared here |
| [`bind`](#bind-5) | `function` | Declared here |
| [`unbind`](#unbind-1) | `function` | Declared here |
| [`process`](#process-22) | `function` | Declared here |
| [`accepts`](#accepts-8) | `function` | Declared here |
| [`onStreamStateChange`](#onstreamstatechange-11) | `function` | Declared here |
| [`isVideo`](#isvideo) | `function` | Declared here |
| [`bound`](#bound) | `function` | Declared here |
| [`_track`](#_track) | `variable` | Declared here |
| [`_rtpConfig`](#_rtpconfig) | `variable` | Declared here |
| [`_kind`](#_kind) | `variable` | Declared here |
| [`_mutex`](#_mutex-26) | `variable` | Declared here |
| [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor-1) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`process`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`accepts`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#accepts-1) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#operator-69) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`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 [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor-1) `inline` |  |
| `function` | [`process`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1) `virtual` | This method performs processing on the given packet and emits the result. |
| `function` | [`accepts`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#accepts-1) `virtual` `inline` | This method ensures compatibility with the given packet type. Return false to reject the packet. |
| `function` | [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#operator-69) `virtual` `inline` | [Stream](https://auscaster.com/icey/docs/api-reference/icy-Stream.md#stream) operator alias for [process()](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1) |

## 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-15)  |  |

---

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

### emitter

```cpp
PacketSignal emitter
```

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

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:96](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L96)

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`WebRtcTrackSender`](#webrtctracksender-1)  | Construct an unbound sender. Call [bind()](#bind-5) before use. |
|  | [`WebRtcTrackSender`](#webrtctracksender-2) `explicit` | Construct bound to a track handle from [createVideoTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#createvideotrack) or [createAudioTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#createaudiotrack). |
| `void` | [`bind`](#bind-5)  | Bind to a track. Can be called to rebind to a different track. |
| `void` | [`unbind`](#unbind-1)  | Unbind from the current track. |
| `void` | [`process`](#process-22) `virtual` `override` | Send an encoded media frame to the bound WebRTC track. Converts the FFmpeg microsecond timestamp to an RTP timestamp using the track's clock rate, then calls rtc::Track::sendFrame(). Only forwards the packet downstream on a successful send. |
| `bool` | [`accepts`](#accepts-8) `virtual` `override` | Return true only for the packet type that matches the bound track. |
| `void` | [`onStreamStateChange`](#onstreamstatechange-11) `virtual` `override` | Called by the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) when stream state changes. Logs when the stream is stopping; no other action is taken. |
| `bool` | [`isVideo`](#isvideo) `const` | True if this sender is bound to a video track. |
| `bool` | [`bound`](#bound) `const` | True if bound to any track. |

---

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

### WebRtcTrackSender

```cpp
WebRtcTrackSender()
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:60](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L60)

Construct an unbound sender. Call [bind()](#bind-5) before use.

---

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

### WebRtcTrackSender

`explicit`

```cpp
explicit WebRtcTrackSender(const TrackHandle & handle)
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:64](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L64)

Construct bound to a track handle from [createVideoTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#createvideotrack) or [createAudioTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#createaudiotrack).

---

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

### bind

```cpp
void bind(const TrackHandle & handle)
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:67](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L67)

Bind to a track. Can be called to rebind to a different track.

---

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

### unbind

```cpp
void unbind()
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:70](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L70)

Unbind from the current track.

---

<a id="process-22"></a>

### process

`virtual` `override`

```cpp
virtual void process(IPacket & packet) override
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:78](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L78)

Send an encoded media frame to the bound WebRTC track. Converts the FFmpeg microsecond timestamp to an RTP timestamp using the track's clock rate, then calls rtc::Track::sendFrame(). Only forwards the packet downstream on a successful send.

#### Reimplements

- [`PacketProcessor::process`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `packet` | [`IPacket`](https://auscaster.com/icey/docs/api-reference/icy-IPacket.md#ipacket) & | An [av::VideoPacket](https://auscaster.com/icey/docs/api-reference/icy-av-VideoPacket.md#videopacket) or [av::AudioPacket](https://auscaster.com/icey/docs/api-reference/icy-av-AudioPacket.md#audiopacket) carrying the encoded frame data and a microsecond timestamp. |

---

<a id="accepts-8"></a>

### accepts

`virtual` `override`

```cpp
virtual bool accepts(IPacket * packet) override
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:83](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L83)

Return true only for the packet type that matches the bound track. 
#### Returns
True if the packet can be processed by this sender.

#### Reimplements

- [`PacketProcessor::accepts`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#accepts-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `packet` | [`IPacket`](https://auscaster.com/icey/docs/api-reference/icy-IPacket.md#ipacket) * | Packet to test. May be nullptr. |

---

<a id="onstreamstatechange-11"></a>

### onStreamStateChange

`virtual` `override`

```cpp
virtual void onStreamStateChange(const PacketStreamState & state) override
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:88](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L88)

Called by the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) when stream state changes. Logs when the stream is stopping; no other action is taken.

#### Reimplements

- [`PacketStreamAdapter::onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#onstreamstatechange-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `state` | const [`PacketStreamState`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamState.md#packetstreamstate) & | New [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) state. |

---

<a id="isvideo"></a>

### isVideo

`const`

```cpp
bool isVideo() const
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:91](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L91)

True if this sender is bound to a video track.

---

<a id="bound"></a>

### bound

`const`

```cpp
bool bound() const
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:94](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L94)

True if bound to any track.

## Private Attributes

| Return | Name | Description |
|--------|------|-------------|
| `std::shared_ptr< rtc::Track >` | [`_track`](#_track)  |  |
| `std::shared_ptr< rtc::RtpPacketizationConfig >` | [`_rtpConfig`](#_rtpconfig)  |  |
| `std::atomic< TrackKind >` | [`_kind`](#_kind)  |  |
| `std::mutex` | [`_mutex`](#_mutex-26)  |  |

---

<a id="_track"></a>

### _track

```cpp
std::shared_ptr< rtc::Track > _track
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:106](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L106)

---

<a id="_rtpconfig"></a>

### _rtpConfig

```cpp
std::shared_ptr< rtc::RtpPacketizationConfig > _rtpConfig
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:107](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L107)

---

<a id="_kind"></a>

### _kind

```cpp
std::atomic< TrackKind > _kind {TrackKind::Unbound}
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:108](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L108)

---

<a id="_mutex-26"></a>

### _mutex

```cpp
std::mutex _mutex
```

[Defined in src/webrtc/include/icy/webrtc/tracksender.h:109](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/tracksender.h#L109)
