# MediaCapture

<a id="mediacapture"></a>

# MediaCapture

```cpp
#include <icy/av/mediacapture.h>

class MediaCapture
```

[Defined in src/av/include/icy/av/mediacapture.h:37](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L37)

> **Inherits:** [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture), [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable)
> **Subclassed by:** [`AudioCapture`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCapture.md#audiocapture), [`VideoCapture`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoCapture.md#videocapture)

Unified capture and decode source for files and live media devices.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`Closing`](#closing) | `variable` | Declared here |
| [`MediaCapture`](#mediacapture-1) | `function` | Declared here |
| [`~MediaCapture`](#mediacapture-2) | `function` | Declared here |
| [`MediaCapture`](#mediacapture-3) | `function` | Declared here |
| [`operator=`](#operator-151) | `function` | Declared here |
| [`MediaCapture`](#mediacapture-4) | `function` | Declared here |
| [`operator=`](#operator-152) | `function` | Declared here |
| [`openFile`](#openfile-1) | `function` | Declared here |
| [`close`](#close-12) | `function` | Declared here |
| [`start`](#start-18) | `function` | Declared here |
| [`stop`](#stop-9) | `function` | Declared here |
| [`run`](#run-7) | `function` | Declared here |
| [`getEncoderFormat`](#getencoderformat-1) | `function` | Declared here |
| [`getEncoderAudioCodec`](#getencoderaudiocodec-1) | `function` | Declared here |
| [`getEncoderVideoCodec`](#getencodervideocodec-1) | `function` | Declared here |
| [`setLoopInput`](#setloopinput) | `function` | Declared here |
| [`setLimitFramerate`](#setlimitframerate) | `function` | Declared here |
| [`setRealtimePTS`](#setrealtimepts) | `function` | Declared here |
| [`setOpenOptions`](#setopenoptions) | `function` | Declared here |
| [`setOpenTimeoutUsec`](#setopentimeoutusec) | `function` | Declared here |
| [`setPassthroughVideo`](#setpassthroughvideo) | `function` | Declared here |
| [`formatCtx`](#formatctx) | `function` | Declared here |
| [`video`](#video-1) | `function` | Declared here |
| [`audio`](#audio-1) | `function` | Declared here |
| [`stopping`](#stopping-1) | `function` | Declared here |
| [`error`](#error-9) | `function` | Declared here |
| [`_mutex`](#_mutex-7) | `variable` | Declared here |
| [`_thread`](#_thread-4) | `variable` | Declared here |
| [`_formatCtx`](#_formatctx) | `variable` | Declared here |
| [`_video`](#_video) | `variable` | Declared here |
| [`_audio`](#_audio) | `variable` | Declared here |
| [`_error`](#_error-2) | `variable` | Declared here |
| [`_stopping`](#_stopping) | `variable` | Declared here |
| [`_looping`](#_looping) | `variable` | Declared here |
| [`_realtime`](#_realtime) | `variable` | Declared here |
| [`_ratelimit`](#_ratelimit) | `variable` | Declared here |
| [`_passthroughVideo`](#_passthroughvideo) | `variable` | Declared here |
| [`_ioStartedUsec`](#_iostartedusec) | `variable` | Declared here |
| [`_ioTimeoutUsec`](#_iotimeoutusec) | `variable` | Declared here |
| [`_openOptions`](#_openoptions) | `variable` | Declared here |
| [`_videoStream`](#_videostream) | `variable` | Declared here |
| [`openStream`](#openstream-1) | `function` | Declared here |
| [`emit`](#emit-7) | `function` | Declared here |
| [`markIoStart`](#markiostart) | `function` | Declared here |
| [`clearIoStart`](#cleariostart) | `function` | Declared here |
| [`Ptr`](#ptr-6) | `typedef` | Declared here |
| [`emitter`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#emitter-5) | `variable` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture-1) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`~ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture-2) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`start`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#start-15) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`stop`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#stop-7) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`openFile`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openfile) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`close`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#close-7) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`getEncoderFormat`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencoderformat) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`getEncoderAudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencoderaudiocodec) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`getEncoderVideoCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencodervideocodec) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`openAudio`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openaudio) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`openVideo`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openvideo) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#onstreamstatechange-5) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`openStream`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openstream) | `function` | Inherited from [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture) |
| [`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) |
| [`start`](https://auscaster.com/icey/docs/api-reference/icy-basic-Startable.md#start-21) | `function` | Inherited from [`Startable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Startable.md#startable) |
| [`stop`](https://auscaster.com/icey/docs/api-reference/icy-basic-Startable.md#stop-12) | `function` | Inherited from [`Startable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Startable.md#startable) |
| [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-1) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`~Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-2) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`cancelled`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancelled-3) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`exit`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#exit) | `variable` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |

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

| Kind | Name | Description |
|------|------|-------------|
| `variable` | [`emitter`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#emitter-5)  |  |
| `function` | [`ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture-1) `inline` |  |
| `function` | [`~ICapture`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#icapture-2) `virtual` | Defaulted destructor. |
| `function` | [`start`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#start-15) `virtual` `override` | Start capturing and emitting packets. |
| `function` | [`stop`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#stop-7) `virtual` `override` | Stop capturing and release device resources. |
| `function` | [`openFile`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openfile) `virtual` `inline` | Open a media file as the capture source. |
| `function` | [`close`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#close-7) `virtual` `inline` | Release the capture source and any associated resources. |
| `function` | [`getEncoderFormat`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencoderformat) `virtual` | Populate `iformat` with the encoder-ready format derived from this capture source. |
| `function` | [`getEncoderAudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencoderaudiocodec) `virtual` `inline` | Populate `params` with the encoder-ready audio codec parameters. |
| `function` | [`getEncoderVideoCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencodervideocodec) `virtual` `inline` | Populate `params` with the encoder-ready video codec parameters. |
| `function` | [`openAudio`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openaudio) `virtual` `inline` | Open an audio capture device with the given parameters. |
| `function` | [`openVideo`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openvideo) `virtual` `inline` | Open a video capture device with the given parameters. |
| `function` | [`onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#onstreamstatechange-5) `virtual` `inline` `override` | React to [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) state transitions by starting or stopping capture. |
| `function` | [`openStream`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openstream) `virtual` `inline` |  |

## 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. |

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

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`start`](https://auscaster.com/icey/docs/api-reference/icy-basic-Startable.md#start-21) `virtual` | Starts the object (e.g. begins processing or listening). |
| `function` | [`stop`](https://auscaster.com/icey/docs/api-reference/icy-basic-Startable.md#stop-12) `virtual` | Stops the object (e.g. halts processing or closes resources). |

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

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-1) `inline` |  |
| `function` | [`~Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-2) `virtual` | Defaulted destructor. |
| `function` | [`run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) `virtual` | The run method will be called by the asynchronous context. |
| `function` | [`cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) `virtual` `inline` | Cancel the current task. The [run()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) method should return ASAP. |
| `function` | [`cancelled`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancelled-3) `virtual` `const` `inline` | Returns true when the task has been cancelled. |
| `variable` | [`exit`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#exit)  |  |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`NullSignal`](https://auscaster.com/icey/docs/api-reference/base.md#nullsignal) | [`Closing`](#closing)  | Signals that the capture thread is closing. This signal is emitted from the capture thread context. |

---

<a id="closing"></a>

### Closing

```cpp
NullSignal Closing
```

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

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

Signals that the capture thread is closing. This signal is emitted from the capture thread context.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`MediaCapture`](#mediacapture-1)  |  |
|  | [`~MediaCapture`](#mediacapture-2) `noexcept` `override` |  |
|  | [`MediaCapture`](#mediacapture-3)  | Deleted constructor. |
| [`MediaCapture`](#mediacapture) & | [`operator=`](#operator-151)  | Deleted assignment operator. |
|  | [`MediaCapture`](#mediacapture-4)  | Deleted constructor. |
| [`MediaCapture`](#mediacapture) & | [`operator=`](#operator-152)  | Deleted assignment operator. |
| `void` | [`openFile`](#openfile-1) `virtual` `override` | Open a media file for decoding. Automatically detects video and audio streams. |
| `void` | [`close`](#close-12) `virtual` `override` | Stop the capture thread and close the media stream and all decoders. |
| `void` | [`start`](#start-18) `virtual` `override` | Start the background capture and decode thread. Throws std::runtime_error if no media streams have been opened. |
| `void` | [`stop`](#stop-9) `virtual` `override` | [Signal](https://auscaster.com/icey/docs/api-reference/icy-Signal.md#signal) the capture thread to stop and join it before returning. |
| `void` | [`run`](#run-7) `virtual` `override` | Entry point for the background capture thread. Reads and decodes packets from the format context until EOF or [stop()](#stop-9) is called. |
| `void` | [`getEncoderFormat`](#getencoderformat-1) `virtual` `override` | Fill `format` with the combined encoder-ready video and audio codec parameters. |
| `void` | [`getEncoderAudioCodec`](#getencoderaudiocodec-1) `virtual` `override` | Fill `params` with the decoder's output audio codec parameters. Throws std::runtime_error if audio parameters have not been initialised. |
| `void` | [`getEncoderVideoCodec`](#getencodervideocodec-1) `virtual` `override` | Fill `params` with the decoder's output video codec parameters. Throws std::runtime_error if video parameters have not been initialised. |
| `void` | [`setLoopInput`](#setloopinput)  | Continuously loop the input file when set. |
| `void` | [`setLimitFramerate`](#setlimitframerate)  | Limit playback to video FPS. |
| `void` | [`setRealtimePTS`](#setrealtimepts)  | Set to use realtime PTS calculation. This is preferred when using live captures as FFmpeg-provided values are not always reliable. |
| `void` | [`setOpenOptions`](#setopenoptions)  | Set demuxer options applied at the next [openFile()](#openfile-1) call. Keys map to libavformat AVOption entries (e.g. "rtsp_transport", "fflags", "analyzeduration", "probesize"). Network opens also receive a default protocol allowlist and I/O timeout unless callers override the corresponding options. Pass an empty map to clear. |
| `void` | [`setOpenTimeoutUsec`](#setopentimeoutusec)  | Set FFmpeg blocking I/O timeout in microseconds. Values <= 0 disable the interrupt timeout but [stop()](#stop-9) still interrupts blocking calls. |
| `void` | [`setPassthroughVideo`](#setpassthroughvideo)  | Skip the video decoder. Encoded video AVPackets from the input stream are emitted directly as [`av::VideoPacket`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoPacket.md#videopacket) without decoding. The emitted packets carry the source's encoded payload and a `time` in microseconds rescaled from the stream's timebase. The `iframe` flag is set from `AV_PKT_FLAG_KEY`. |
| `AVFormatContext *` | [`formatCtx`](#formatctx) `const` |  |
| [`VideoDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder) * | [`video`](#video-1) `const` |  |
| [`AudioDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder) * | [`audio`](#audio-1) `const` |  |
| `bool` | [`stopping`](#stopping-1) `const` |  |
| `std::string` | [`error`](#error-9) `const` |  |

---

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

### MediaCapture

```cpp
MediaCapture()
```

[Defined in src/av/include/icy/av/mediacapture.h:43](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L43)

---

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

### ~MediaCapture

`noexcept` `override`

```cpp
~MediaCapture() noexcept override
```

[Defined in src/av/include/icy/av/mediacapture.h:44](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L44)

---

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

### MediaCapture

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

[Defined in src/av/include/icy/av/mediacapture.h:46](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L46)

Deleted constructor.

---

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

### operator=

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

[Defined in src/av/include/icy/av/mediacapture.h:47](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L47)

Deleted assignment operator.

---

<a id="mediacapture-4"></a>

### MediaCapture

```cpp
MediaCapture(MediaCapture &&) = delete
```

[Defined in src/av/include/icy/av/mediacapture.h:48](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L48)

Deleted constructor.

---

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

### operator=

```cpp
MediaCapture & operator=(MediaCapture &&) = delete
```

[Defined in src/av/include/icy/av/mediacapture.h:49](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L49)

Deleted assignment operator.

---

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

### openFile

`virtual` `override`

```cpp
virtual void openFile(const std::string & file) override
```

[Defined in src/av/include/icy/av/mediacapture.h:53](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L53)

Open a media file for decoding. Automatically detects video and audio streams.

#### Reimplements

- [`ICapture::openFile`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openfile)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `file` | `const std::string &` | Path to the media file. |

---

<a id="close-12"></a>

### close

`virtual` `override`

```cpp
virtual void close() override
```

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

Stop the capture thread and close the media stream and all decoders.

#### Reimplements

- [`ICapture::close`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#close-7)

---

<a id="start-18"></a>

### start

`virtual` `override`

```cpp
virtual void start() override
```

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

Start the background capture and decode thread. Throws std::runtime_error if no media streams have been opened.

#### Reimplements

- [`ICapture::start`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#start-15)

---

<a id="stop-9"></a>

### stop

`virtual` `override`

```cpp
virtual void stop() override
```

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

[Signal](https://auscaster.com/icey/docs/api-reference/icy-Signal.md#signal) the capture thread to stop and join it before returning.

#### Reimplements

- [`ICapture::stop`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#stop-7)

---

<a id="run-7"></a>

### run

`virtual` `override`

```cpp
virtual void run() override
```

[Defined in src/av/include/icy/av/mediacapture.h:71](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L71)

Entry point for the background capture thread. Reads and decodes packets from the format context until EOF or [stop()](#stop-9) is called.

#### Reimplements

- [`Runnable::run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11)

---

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

### getEncoderFormat

`virtual` `override`

```cpp
virtual void getEncoderFormat(Format & format) override
```

[Defined in src/av/include/icy/av/mediacapture.h:75](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L75)

Fill `format` with the combined encoder-ready video and audio codec parameters.

#### Reimplements

- [`ICapture::getEncoderFormat`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencoderformat)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `format` | [`Format`](https://auscaster.com/icey/docs/api-reference/icy-av-Format.md#format-5) & | Output [Format](https://auscaster.com/icey/docs/api-reference/icy-av-Format.md#format-5) struct to populate. |

---

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

### getEncoderAudioCodec

`virtual` `override`

```cpp
virtual void getEncoderAudioCodec(AudioCodec & params) override
```

[Defined in src/av/include/icy/av/mediacapture.h:80](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L80)

Fill `params` with the decoder's output audio codec parameters. Throws std::runtime_error if audio parameters have not been initialised.

#### Reimplements

- [`ICapture::getEncoderAudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencoderaudiocodec)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `params` | [`AudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCodec.md#audiocodec) & | Output [AudioCodec](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCodec.md#audiocodec) struct to populate. |

---

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

### getEncoderVideoCodec

`virtual` `override`

```cpp
virtual void getEncoderVideoCodec(VideoCodec & params) override
```

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

Fill `params` with the decoder's output video codec parameters. Throws std::runtime_error if video parameters have not been initialised.

#### Reimplements

- [`ICapture::getEncoderVideoCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#getencodervideocodec)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `params` | [`VideoCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoCodec.md#videocodec) & | Output [VideoCodec](https://auscaster.com/icey/docs/api-reference/icy-av-VideoCodec.md#videocodec) struct to populate. |

---

<a id="setloopinput"></a>

### setLoopInput

```cpp
void setLoopInput(bool flag)
```

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

Continuously loop the input file when set.

---

<a id="setlimitframerate"></a>

### setLimitFramerate

```cpp
void setLimitFramerate(bool flag)
```

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

Limit playback to video FPS.

---

<a id="setrealtimepts"></a>

### setRealtimePTS

```cpp
void setRealtimePTS(bool flag)
```

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

Set to use realtime PTS calculation. This is preferred when using live captures as FFmpeg-provided values are not always reliable.

---

<a id="setopenoptions"></a>

### setOpenOptions

```cpp
void setOpenOptions(const std::map< std::string, std::string > & options)
```

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

Set demuxer options applied at the next [openFile()](#openfile-1) call. Keys map to libavformat AVOption entries (e.g. "rtsp_transport", "fflags", "analyzeduration", "probesize"). Network opens also receive a default protocol allowlist and I/O timeout unless callers override the corresponding options. Pass an empty map to clear.

---

<a id="setopentimeoutusec"></a>

### setOpenTimeoutUsec

```cpp
void setOpenTimeoutUsec(int64_t timeoutUsec)
```

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

Set FFmpeg blocking I/O timeout in microseconds. Values <= 0 disable the interrupt timeout but [stop()](#stop-9) still interrupts blocking calls.

---

<a id="setpassthroughvideo"></a>

### setPassthroughVideo

```cpp
void setPassthroughVideo(bool flag)
```

[Defined in src/av/include/icy/av/mediacapture.h:119](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L119)

Skip the video decoder. Encoded video AVPackets from the input stream are emitted directly as [`av::VideoPacket`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoPacket.md#videopacket) without decoding. The emitted packets carry the source's encoded payload and a `time` in microseconds rescaled from the stream's timebase. The `iframe` flag is set from `AV_PKT_FLAG_KEY`.

Use case: forwarding already-browser-compatible H.264 to a WebRTC sender without the cost of decode plus re-encode. Must be called before [openFile()](#openfile-1); changing the mode after the stream is open is not supported.

---

<a id="formatctx"></a>

### formatCtx

`const`

```cpp
AVFormatContext * formatCtx() const
```

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

#### Returns
The underlying AVFormatContext (thread-safe, mutex-protected).

---

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

### video

`const`

```cpp
VideoDecoder * video() const
```

[Defined in src/av/include/icy/av/mediacapture.h:125](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L125)

#### Returns
The active [VideoDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder), or nullptr if no video stream was opened.

---

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

### audio

`const`

```cpp
AudioDecoder * audio() const
```

[Defined in src/av/include/icy/av/mediacapture.h:128](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L128)

#### Returns
The active [AudioDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder), or nullptr if no audio stream was opened.

---

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

### stopping

`const`

```cpp
bool stopping() const
```

[Defined in src/av/include/icy/av/mediacapture.h:131](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L131)

#### Returns
True if the capture thread has been asked to stop.

---

<a id="error-9"></a>

### error

`const`

```cpp
std::string error() const
```

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

#### Returns
The last error message, or an empty string if no error has occurred.

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| `std::mutex` | [`_mutex`](#_mutex-7)  |  |
| [`Thread`](https://auscaster.com/icey/docs/api-reference/icy-Thread.md#thread-1) | [`_thread`](#_thread-4)  |  |
| `AVFormatContext *` | [`_formatCtx`](#_formatctx)  |  |
| std::unique_ptr< [`VideoDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder) > | [`_video`](#_video)  |  |
| std::unique_ptr< [`AudioDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder) > | [`_audio`](#_audio)  |  |
| `std::string` | [`_error`](#_error-2)  |  |
| `std::atomic< bool >` | [`_stopping`](#_stopping)  |  |
| `std::atomic< bool >` | [`_looping`](#_looping)  |  |
| `std::atomic< bool >` | [`_realtime`](#_realtime)  |  |
| `std::atomic< bool >` | [`_ratelimit`](#_ratelimit)  |  |
| `std::atomic< bool >` | [`_passthroughVideo`](#_passthroughvideo)  |  |
| `std::atomic< int64_t >` | [`_ioStartedUsec`](#_iostartedusec)  |  |
| `std::atomic< int64_t >` | [`_ioTimeoutUsec`](#_iotimeoutusec)  |  |
| `std::map< std::string, std::string >` | [`_openOptions`](#_openoptions)  |  |
| `AVStream *` | [`_videoStream`](#_videostream)  |  |

---

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

### _mutex

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

[Defined in src/av/include/icy/av/mediacapture.h:154](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L154)

---

<a id="_thread-4"></a>

### _thread

```cpp
Thread _thread
```

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

[Defined in src/av/include/icy/av/mediacapture.h:155](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L155)

---

<a id="_formatctx"></a>

### _formatCtx

```cpp
AVFormatContext * _formatCtx
```

[Defined in src/av/include/icy/av/mediacapture.h:156](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L156)

---

<a id="_video"></a>

### _video

```cpp
std::unique_ptr< VideoDecoder > _video
```

Type: std::unique_ptr< [`VideoDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder) >

[Defined in src/av/include/icy/av/mediacapture.h:157](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L157)

---

<a id="_audio"></a>

### _audio

```cpp
std::unique_ptr< AudioDecoder > _audio
```

Type: std::unique_ptr< [`AudioDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder) >

[Defined in src/av/include/icy/av/mediacapture.h:158](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L158)

---

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

### _error

```cpp
std::string _error
```

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

---

<a id="_stopping"></a>

### _stopping

```cpp
std::atomic< bool > _stopping
```

[Defined in src/av/include/icy/av/mediacapture.h:160](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L160)

---

<a id="_looping"></a>

### _looping

```cpp
std::atomic< bool > _looping
```

[Defined in src/av/include/icy/av/mediacapture.h:161](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L161)

---

<a id="_realtime"></a>

### _realtime

```cpp
std::atomic< bool > _realtime
```

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

---

<a id="_ratelimit"></a>

### _ratelimit

```cpp
std::atomic< bool > _ratelimit
```

[Defined in src/av/include/icy/av/mediacapture.h:163](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L163)

---

<a id="_passthroughvideo"></a>

### _passthroughVideo

```cpp
std::atomic< bool > _passthroughVideo {false}
```

[Defined in src/av/include/icy/av/mediacapture.h:164](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L164)

---

<a id="_iostartedusec"></a>

### _ioStartedUsec

```cpp
std::atomic< int64_t > _ioStartedUsec {0}
```

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

---

<a id="_iotimeoutusec"></a>

### _ioTimeoutUsec

```cpp
std::atomic< int64_t > _ioTimeoutUsec {15000000}
```

[Defined in src/av/include/icy/av/mediacapture.h:166](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L166)

---

<a id="_openoptions"></a>

### _openOptions

```cpp
std::map< std::string, std::string > _openOptions
```

[Defined in src/av/include/icy/av/mediacapture.h:167](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L167)

---

<a id="_videostream"></a>

### _videoStream

```cpp
AVStream * _videoStream = nullptr
```

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

## Protected Methods

| Return | Name | Description |
|--------|------|-------------|
| `void` | [`openStream`](#openstream-1) `virtual` `override` | Open the underlying media stream. |
| `void` | [`emit`](#emit-7) `virtual` `override` | Emit an existing packet directly onto the outgoing signal. |
| `void` | [`markIoStart`](#markiostart)  |  |
| `void` | [`clearIoStart`](#cleariostart)  |  |

---

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

### openStream

`virtual` `override`

```cpp
virtual void openStream(const std::string & filename, const AVInputFormat * inputFormat, AVDictionary ** formatParams) override
```

[Defined in src/av/include/icy/av/mediacapture.h:146](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L146)

Open the underlying media stream.

#### Reimplements

- [`ICapture::openStream`](https://auscaster.com/icey/docs/api-reference/icy-av-ICapture.md#openstream)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `filename` | `const std::string &` | The file path or device name to open. |
| `inputFormat` | `const AVInputFormat *` | The forced input format, or nullptr for auto-detect. |
| `formatParams` | `AVDictionary **` | Optional format parameters; may be updated by FFmpeg on return. |

---

<a id="emit-7"></a>

### emit

`virtual` `override`

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

[Defined in src/av/include/icy/av/mediacapture.h:148](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L148)

Emit an existing packet directly onto the outgoing signal.

#### Reimplements

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

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `packet` | [`IPacket`](https://auscaster.com/icey/docs/api-reference/icy-IPacket.md#ipacket) & | The packet to forward; must remain valid for the duration of the call. |

---

<a id="markiostart"></a>

### markIoStart

```cpp
void markIoStart()
```

[Defined in src/av/include/icy/av/mediacapture.h:150](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L150)

---

<a id="cleariostart"></a>

### clearIoStart

```cpp
void clearIoStart()
```

[Defined in src/av/include/icy/av/mediacapture.h:151](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L151)

## Public Types

| Name | Description |
|------|-------------|
| [`Ptr`](#ptr-6)  |  |

---

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

### Ptr

```cpp
using Ptr = std::shared_ptr< MediaCapture >
```

Type: std::shared_ptr< [`MediaCapture`](#mediacapture) >

[Defined in src/av/include/icy/av/mediacapture.h:41](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/mediacapture.h#L41)
