# VideoContext

<a id="videocontext"></a>

# VideoContext

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

struct VideoContext
```

[Defined in src/av/include/icy/av/videocontext.h:42](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L42)

> **Subclassed by:** [`VideoDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder), [`VideoEncoder`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#videoencoder)

Base video context from which all video encoders and decoders derive.

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal) | [`emitter`](#emitter-8)  |  |
| [`VideoCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoCodec.md#videocodec) | [`iparams`](#iparams-1)  | input parameters |
| [`VideoCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoCodec.md#videocodec) | [`oparams`](#oparams-1)  | output parameters |
| `AVStream *` | [`stream`](#stream-9)  | encoder or decoder stream |
| `AVCodecContext *` | [`ctx`](#ctx-1)  | encoder or decoder context |
| `const AVCodec *` | [`codec`](#codec-6)  | encoder or decoder codec |
| `AVFrame *` | [`frame`](#frame-1)  | encoder or decoder frame |
| std::unique_ptr< [`VideoConverter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoConverter.md#videoconverter) > | [`conv`](#conv)  | video conversion context |
| `int64_t` | [`time`](#time-1)  | stream time in codec time base |
| `int64_t` | [`pts`](#pts-1)  | last packet pts value |
| `double` | [`seconds`](#seconds-4)  | video time in seconds |
| `std::string` | [`error`](#error-10)  | error message |

---

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

### emitter

```cpp
PacketSignal emitter
```

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

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

---

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

### iparams

```cpp
VideoCodec iparams
```

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

[Defined in src/av/include/icy/av/videocontext.h:105](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L105)

input parameters

---

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

### oparams

```cpp
VideoCodec oparams
```

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

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

output parameters

---

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

### stream

```cpp
AVStream * stream
```

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

encoder or decoder stream

---

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

### ctx

```cpp
AVCodecContext * ctx
```

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

encoder or decoder context

---

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

### codec

```cpp
const AVCodec * codec
```

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

encoder or decoder codec

---

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

### frame

```cpp
AVFrame * frame
```

[Defined in src/av/include/icy/av/videocontext.h:110](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L110)

encoder or decoder frame

---

<a id="conv"></a>

### conv

```cpp
std::unique_ptr< VideoConverter > conv
```

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

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

video conversion context

---

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

### time

```cpp
int64_t time
```

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

stream time in codec time base

---

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

### pts

```cpp
int64_t pts
```

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

last packet pts value

---

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

### seconds

```cpp
double seconds
```

[Defined in src/av/include/icy/av/videocontext.h:114](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L114)

video time in seconds

---

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

### error

```cpp
std::string error
```

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

error message

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`VideoContext`](#videocontext-1)  |  |
|  | [`~VideoContext`](#videocontext-2) `virtual` `noexcept` |  |
|  | [`VideoContext`](#videocontext-3)  | Deleted constructor. |
| [`VideoContext`](#videocontext) & | [`operator=`](#operator-153)  | Deleted assignment operator. |
|  | [`VideoContext`](#videocontext-4)  | Deleted constructor. |
| [`VideoContext`](#videocontext) & | [`operator=`](#operator-154)  | Deleted assignment operator. |
| `void` | [`create`](#create-5) `virtual` | Initialise the AVCodecContext with codec-specific defaults. Overridden by [VideoEncoder](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#videoencoder) and [VideoDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder). |
| `void` | [`open`](#open-3) `virtual` | Open the codec and create the pixel format conversion context if required. Throws std::runtime_error if the codec context has not been created. |
| `void` | [`close`](#close-13) `virtual` | Close the codec context, free the frame, and reset timestamps. |
| `bool` | [`decode`](#decode-2) `virtual` | Decode a compressed video packet and emit the resulting frame. |
| `bool` | [`encode`](#encode-6) `virtual` | Encode a buffer of interleaved video data. |
| `bool` | [`encode`](#encode-7) `virtual` | Encode a planar video frame. |
| `bool` | [`encode`](#encode-8) `virtual` | Encode a single AVFrame. |
| `void` | [`flush`](#flush-6) `virtual` | Flush any frames buffered inside the codec and emit remaining output. |
| `AVFrame *` | [`convert`](#convert) `virtual` | Convert the video frame and return the result. |
| `bool` | [`recreateConverter`](#recreateconverter) `virtual` | Recreate the [VideoConverter](https://auscaster.com/icey/docs/api-reference/icy-av-VideoConverter.md#videoconverter) if the input or output parameters have changed. Called automatically by [open()](#open-3) and [convert()](#convert). |

---

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

### VideoContext

```cpp
VideoContext()
```

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

---

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

### ~VideoContext

`virtual` `noexcept`

```cpp
virtual ~VideoContext() noexcept
```

[Defined in src/av/include/icy/av/videocontext.h:45](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L45)

---

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

### VideoContext

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

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

Deleted constructor.

---

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

### operator=

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

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

Deleted assignment operator.

---

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

### VideoContext

```cpp
VideoContext(VideoContext &&) = delete
```

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

Deleted constructor.

---

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

### operator=

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

[Defined in src/av/include/icy/av/videocontext.h:50](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L50)

Deleted assignment operator.

---

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

### create

`virtual`

```cpp
virtual void create()
```

[Defined in src/av/include/icy/av/videocontext.h:54](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L54)

Initialise the AVCodecContext with codec-specific defaults. Overridden by [VideoEncoder](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#videoencoder) and [VideoDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder).

#### Reimplemented by

- [`VideoDecoder::create`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#create-6)
- [`VideoEncoder::create`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#create-7)

---

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

### open

`virtual`

```cpp
virtual void open()
```

[Defined in src/av/include/icy/av/videocontext.h:58](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L58)

Open the codec and create the pixel format conversion context if required. Throws std::runtime_error if the codec context has not been created.

#### Reimplemented by

- [`VideoDecoder::open`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#open-4)

---

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

### close

`virtual`

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

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

Close the codec context, free the frame, and reset timestamps.

#### Reimplemented by

- [`VideoDecoder::close`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#close-14)
- [`VideoEncoder::close`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#close-15)

---

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

### decode

`virtual`

```cpp
virtual bool decode(AVPacket & ipacket)
```

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

Decode a compressed video packet and emit the resulting frame. 
#### Returns
True if an output frame was decoded and emitted, false otherwise.

#### Reimplemented by

- [`VideoDecoder::decode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#decode-3)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `ipacket` | `AVPacket &` | The compressed video packet to decode. |

---

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

### encode

`virtual`

```cpp
virtual bool encode(uint8_t * data, int size, int64_t pts)
```

[Defined in src/av/include/icy/av/videocontext.h:73](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L73)

Encode a buffer of interleaved video data. 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplemented by

- [`VideoEncoder::encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#encode-9)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `data` | `uint8_t *` | Pointer to the interleaved frame buffer. |
| `size` | `int` | Size of the buffer in bytes. |
| `pts` | `int64_t` | Presentation timestamp in stream time base units. |

---

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

### encode

`virtual`

```cpp
virtual bool encode(uint8_t * data, int linesize, int64_t pts)
```

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

Encode a planar video frame. 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplemented by

- [`VideoEncoder::encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#encode-10)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `data` | `uint8_t *` | Array of per-plane data pointers (up to 4 planes). |
| `linesize` | `int` | Array of per-plane byte strides. |
| `pts` | `int64_t` | Presentation timestamp in stream time base units. |

---

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

### encode

`virtual`

```cpp
virtual bool encode(AVFrame * iframe)
```

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

Encode a single AVFrame. 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplemented by

- [`VideoEncoder::encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#encode-11)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `iframe` | `AVFrame *` | The source video frame; must have all fields set correctly. |

---

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

### flush

`virtual`

```cpp
virtual void flush()
```

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

Flush any frames buffered inside the codec and emit remaining output.

#### Reimplemented by

- [`VideoDecoder::flush`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#flush-7)
- [`VideoEncoder::flush`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#flush-8)

---

<a id="convert"></a>

### convert

`virtual`

```cpp
virtual AVFrame * convert(AVFrame * iframe)
```

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

Convert the video frame and return the result.

The input frame will only be converted if it doesn't match the output format. If the frame is not converted the input frame will be returned. If the input frame format does not match the [`VideoConverter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoConverter.md#videoconverter) context then the [`VideoConverter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoConverter.md#videoconverter) will be recreated with the input frame params.

---

<a id="recreateconverter"></a>

### recreateConverter

`virtual`

```cpp
virtual bool recreateConverter()
```

[Defined in src/av/include/icy/av/videocontext.h:101](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videocontext.h#L101)

Recreate the [VideoConverter](https://auscaster.com/icey/docs/api-reference/icy-av-VideoConverter.md#videoconverter) if the input or output parameters have changed. Called automatically by [open()](#open-3) and [convert()](#convert). 
#### Returns
True if the converter was (re)created, false if it is already up to date.
