# MediaBridge

<a id="mediabridge"></a>

# MediaBridge

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

class MediaBridge
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:69](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L69)

Convenience wrapper that creates WebRTC tracks on a PeerConnection and exposes per-track sender/receiver adapters for [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) integration.

For video-only, leave audioCodec default (disabled). For audio-only, leave videoCodec default (disabled). For data-channel-only, don't create a [MediaBridge](#mediabridge) at all.

For full control over individual tracks, use [createVideoTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#createvideotrack), [createAudioTrack()](https://auscaster.com/icey/docs/api-reference/webrtc.md#createaudiotrack), [WebRtcTrackSender](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackSender.md#webrtctracksender), and [WebRtcTrackReceiver](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackReceiver.md#webrtctrackreceiver) directly instead of this class.

The sender and receiver adapter objects are stable for the lifetime of the [MediaBridge](#mediabridge). [attach()](#attach-5) and [detach()](#detach-5) rebind or unbind the underlying WebRTC tracks without invalidating references previously obtained from [videoSender()](#videosender), [audioSender()](#audiosender), [videoReceiver()](#videoreceiver), or [audioReceiver()](#audioreceiver).

Example - send camera to browser:

[MediaBridge](#mediabridge) bridge; bridge.attach(pc, {.videoCodec = {"H264", "libx264", 1280, 720, 30}});

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

Example - receive from browser and record:

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

The receiver emits owning encoded packets. Feed those into a decoder or recorder callback; see `samples/media-recorder` for a complete example.

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`ThreadSignal`](https://auscaster.com/icey/docs/api-reference/base.md#threadsignal)< void()> | [`KeyframeRequested`](#keyframerequested)  | Remote peer requests a keyframe. Connect to encoder to force IDR. |
| [`ThreadSignal`](https://auscaster.com/icey/docs/api-reference/base.md#threadsignal)< void(unsigned int)> | [`BitrateEstimate`](#bitrateestimate)  | Remote peer reports estimated bandwidth (bits/sec). |

---

<a id="keyframerequested"></a>

### KeyframeRequested

```cpp
ThreadSignal< void()> KeyframeRequested
```

Type: [`ThreadSignal`](https://auscaster.com/icey/docs/api-reference/base.md#threadsignal)< void()>

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:149](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L149)

Remote peer requests a keyframe. Connect to encoder to force IDR.

---

<a id="bitrateestimate"></a>

### BitrateEstimate

```cpp
ThreadSignal< void(unsigned int)> BitrateEstimate
```

Type: [`ThreadSignal`](https://auscaster.com/icey/docs/api-reference/base.md#threadsignal)< void(unsigned int)>

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:152](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L152)

Remote peer reports estimated bandwidth (bits/sec).

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`MediaBridge`](#mediabridge-1)  | Construct a detached bridge with stable sender and receiver adapters. |
|  | [`~MediaBridge`](#mediabridge-2)  | Destroy the bridge and release any attached PeerConnection state. |
|  | [`MediaBridge`](#mediabridge-3)  | Deleted copy constructor; [MediaBridge](#mediabridge) owns live track and adapter state. |
| [`MediaBridge`](#mediabridge) & | [`operator=`](#operator-253)  | Deleted assignment operator. |
| `void` | [`attach`](#attach-5)  | Create tracks on the PeerConnection and set up handler chains. Only creates tracks for codecs with a non-empty encoder name. |
| `void` | [`detach`](#detach-5)  | Detach all tracks and adapters. |
| `void` | [`requestKeyframe`](#requestkeyframe)  | Request an immediate keyframe (IDR) from the remote sender. Sends a PLI (Picture Loss Indication) RTCP message on the video track. No-op if no video track is attached. |
| `void` | [`requestBitrate`](#requestbitrate)  | Request that the remote sender reduce to a target bitrate. Sends a TMMBR RTCP message on the video track. |
| [`WebRtcTrackSender`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackSender.md#webrtctracksender) & | [`videoSender`](#videosender)  | Video send processor. Attach to a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) after a VideoEncoder. Throws if no video track was created. |
| [`WebRtcTrackSender`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackSender.md#webrtctracksender) & | [`audioSender`](#audiosender)  | Audio send processor. Attach to a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) after an AudioEncoder. Throws if no audio track was created. |
| [`WebRtcTrackReceiver`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackReceiver.md#webrtctrackreceiver) & | [`videoReceiver`](#videoreceiver)  | Video receive adapter. Attach as a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) source. Only valid after a remote video track arrives. |
| [`WebRtcTrackReceiver`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackReceiver.md#webrtctrackreceiver) & | [`audioReceiver`](#audioreceiver)  | Audio receive adapter. Attach as a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) source. Only valid after a remote audio track arrives. |
| `std::shared_ptr< rtc::Track >` | [`videoTrack`](#videotrack) `const` | The underlying libdatachannel video track, or nullptr if none was created. |
| `std::shared_ptr< rtc::Track >` | [`audioTrack`](#audiotrack) `const` | The underlying libdatachannel audio track, or nullptr if none was created. |
| `bool` | [`hasVideo`](#hasvideo) `const` | True if a video track was created at [attach()](#attach-5). |
| `bool` | [`hasAudio`](#hasaudio) `const` | True if an audio track was created at [attach()](#attach-5). |
| `bool` | [`attached`](#attached) `const` | True if [attach()](#attach-5) has been called and a PeerConnection is held. |

---

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

### MediaBridge

```cpp
MediaBridge()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:98](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L98)

Construct a detached bridge with stable sender and receiver adapters.

---

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

### ~MediaBridge

```cpp
~MediaBridge()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:100](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L100)

Destroy the bridge and release any attached PeerConnection state.

---

<a id="mediabridge-3"></a>

### MediaBridge

```cpp
MediaBridge(const MediaBridge &) = delete
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:103](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L103)

Deleted copy constructor; [MediaBridge](#mediabridge) owns live track and adapter state.

---

<a id="operator-253"></a>

### operator=

```cpp
MediaBridge & operator=(const MediaBridge &) = delete
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:104](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L104)

Deleted assignment operator.

---

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

### attach

```cpp
void attach(std::shared_ptr< rtc::PeerConnection > pc, const Options & opts)
```

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

Create tracks on the PeerConnection and set up handler chains. Only creates tracks for codecs with a non-empty encoder name.

---

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

### detach

```cpp
void detach()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:112](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L112)

Detach all tracks and adapters.

---

<a id="requestkeyframe"></a>

### requestKeyframe

```cpp
void requestKeyframe()
```

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

Request an immediate keyframe (IDR) from the remote sender. Sends a PLI (Picture Loss Indication) RTCP message on the video track. No-op if no video track is attached.

---

<a id="requestbitrate"></a>

### requestBitrate

```cpp
void requestBitrate(unsigned int bitrate)
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:122](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L122)

Request that the remote sender reduce to a target bitrate. Sends a TMMBR RTCP message on the video track.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `bitrate` | `unsigned int` | Target bitrate in bits per second. |

---

<a id="videosender"></a>

### videoSender

```cpp
WebRtcTrackSender & videoSender()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:130](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L130)

Video send processor. Attach to a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) after a VideoEncoder. Throws if no video track was created.

---

<a id="audiosender"></a>

### audioSender

```cpp
WebRtcTrackSender & audioSender()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:134](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L134)

Audio send processor. Attach to a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) after an AudioEncoder. Throws if no audio track was created.

---

<a id="videoreceiver"></a>

### videoReceiver

```cpp
WebRtcTrackReceiver & videoReceiver()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:138](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L138)

Video receive adapter. Attach as a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) source. Only valid after a remote video track arrives.

---

<a id="audioreceiver"></a>

### audioReceiver

```cpp
WebRtcTrackReceiver & audioReceiver()
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:142](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L142)

Audio receive adapter. Attach as a [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) source. Only valid after a remote audio track arrives.

---

<a id="videotrack"></a>

### videoTrack

`const`

```cpp
std::shared_ptr< rtc::Track > videoTrack() const
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:159](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L159)

The underlying libdatachannel video track, or nullptr if none was created.

---

<a id="audiotrack"></a>

### audioTrack

`const`

```cpp
std::shared_ptr< rtc::Track > audioTrack() const
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:162](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L162)

The underlying libdatachannel audio track, or nullptr if none was created.

---

<a id="hasvideo"></a>

### hasVideo

`const`

```cpp
bool hasVideo() const
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:165](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L165)

True if a video track was created at [attach()](#attach-5).

---

<a id="hasaudio"></a>

### hasAudio

`const`

```cpp
bool hasAudio() const
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:168](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L168)

True if an audio track was created at [attach()](#attach-5).

---

<a id="attached"></a>

### attached

`const`

```cpp
bool attached() const
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:171](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L171)

True if [attach()](#attach-5) has been called and a PeerConnection is held.

## Private Attributes

| Return | Name | Description |
|--------|------|-------------|
| `std::shared_ptr< rtc::PeerConnection >` | [`_pc`](#_pc)  |  |
| [`WebRtcTrackSender`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackSender.md#webrtctracksender) | [`_videoSender`](#_videosender)  |  |
| [`WebRtcTrackSender`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackSender.md#webrtctracksender) | [`_audioSender`](#_audiosender)  |  |
| [`TrackHandle`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-TrackHandle.md#trackhandle) | [`_videoHandle`](#_videohandle)  |  |
| [`TrackHandle`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-TrackHandle.md#trackhandle) | [`_audioHandle`](#_audiohandle)  |  |
| [`WebRtcTrackReceiver`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackReceiver.md#webrtctrackreceiver) | [`_videoReceiver`](#_videoreceiver)  |  |
| [`WebRtcTrackReceiver`](https://auscaster.com/icey/docs/api-reference/icy-wrtc-WebRtcTrackReceiver.md#webrtctrackreceiver) | [`_audioReceiver`](#_audioreceiver)  |  |
| `std::shared_ptr< rtc::Track >` | [`_videoReceiveTrack`](#_videoreceivetrack)  |  |
| `std::shared_ptr< rtc::Track >` | [`_audioReceiveTrack`](#_audioreceivetrack)  |  |
| `std::mutex` | [`_mutex`](#_mutex-24)  |  |

---

<a id="_pc"></a>

### _pc

```cpp
std::shared_ptr< rtc::PeerConnection > _pc
```

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:174](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L174)

---

<a id="_videosender"></a>

### _videoSender

```cpp
WebRtcTrackSender _videoSender
```

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:178](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L178)

---

<a id="_audiosender"></a>

### _audioSender

```cpp
WebRtcTrackSender _audioSender
```

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:179](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L179)

---

<a id="_videohandle"></a>

### _videoHandle

```cpp
TrackHandle _videoHandle
```

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:180](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L180)

---

<a id="_audiohandle"></a>

### _audioHandle

```cpp
TrackHandle _audioHandle
```

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:181](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L181)

---

<a id="_videoreceiver"></a>

### _videoReceiver

```cpp
WebRtcTrackReceiver _videoReceiver
```

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:184](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L184)

---

<a id="_audioreceiver"></a>

### _audioReceiver

```cpp
WebRtcTrackReceiver _audioReceiver
```

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:185](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L185)

---

<a id="_videoreceivetrack"></a>

### _videoReceiveTrack

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:186](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L186)

---

<a id="_audioreceivetrack"></a>

### _audioReceiveTrack

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:187](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L187)

---

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

### _mutex

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

[Defined in src/webrtc/include/icy/webrtc/mediabridge.h:189](https://github.com/auscaster/icey/blob/main/src/webrtc/include/icy/webrtc/mediabridge.h#L189)
