# VideoEncoder

<a id="videoencoder"></a>

# VideoEncoder

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

struct VideoEncoder
```

[Defined in src/av/include/icy/av/videoencoder.h:30](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videoencoder.h#L30)

> **Inherits:** [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext)
> **Subclassed by:** [`VideoPacketEncoder`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoPacketEncoder.md#videopacketencoder)

Encodes raw video frames into a compressed format.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`format`](#format-13) | `variable` | Declared here |
| [`VideoEncoder`](#videoencoder-1) | `function` | Declared here |
| [`~VideoEncoder`](#videoencoder-2) | `function` | Declared here |
| [`create`](#create-7) | `function` | Declared here |
| [`close`](#close-15) | `function` | Declared here |
| [`encode`](#encode-9) | `function` | Declared here |
| [`encode`](#encode-10) | `function` | Declared here |
| [`encode`](#encode-11) | `function` | Declared here |
| [`flush`](#flush-8) | `function` | Declared here |
| [`emitter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#emitter-8) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`iparams`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#iparams-1) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`oparams`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#oparams-1) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`stream`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#stream-9) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`ctx`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#ctx-1) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`codec`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#codec-6) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`frame`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#frame-1) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`conv`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#conv) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`time`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#time-1) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`pts`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#pts-1) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`seconds`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#seconds-4) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`error`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#error-10) | `variable` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-1) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`~VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-2) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-3) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#operator-153) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-4) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#operator-154) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`create`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#create-5) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`open`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#open-3) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`close`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#close-13) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`decode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#decode-2) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#encode-6) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#encode-7) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#encode-8) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`flush`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#flush-6) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`convert`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#convert) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |
| [`recreateConverter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#recreateconverter) | `function` | Inherited from [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext) |

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

| Kind | Name | Description |
|------|------|-------------|
| `variable` | [`emitter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#emitter-8)  |  |
| `variable` | [`iparams`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#iparams-1)  | input parameters |
| `variable` | [`oparams`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#oparams-1)  | output parameters |
| `variable` | [`stream`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#stream-9)  | encoder or decoder stream |
| `variable` | [`ctx`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#ctx-1)  | encoder or decoder context |
| `variable` | [`codec`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#codec-6)  | encoder or decoder codec |
| `variable` | [`frame`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#frame-1)  | encoder or decoder frame |
| `variable` | [`conv`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#conv)  | video conversion context |
| `variable` | [`time`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#time-1)  | stream time in codec time base |
| `variable` | [`pts`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#pts-1)  | last packet pts value |
| `variable` | [`seconds`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#seconds-4)  | video time in seconds |
| `variable` | [`error`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#error-10)  | error message |
| `function` | [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-1)  |  |
| `function` | [`~VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-2) `virtual` `noexcept` |  |
| `function` | [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-3)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#operator-153)  | Deleted assignment operator. |
| `function` | [`VideoContext`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#videocontext-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#operator-154)  | Deleted assignment operator. |
| `function` | [`create`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#create-5) `virtual` | Initialise the AVCodecContext with codec-specific defaults. Overridden by [VideoEncoder](#videoencoder) and [VideoDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-VideoDecoder.md#videodecoder). |
| `function` | [`open`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#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. |
| `function` | [`close`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#close-13) `virtual` | Close the codec context, free the frame, and reset timestamps. |
| `function` | [`decode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#decode-2) `virtual` | Decode a compressed video packet and emit the resulting frame. |
| `function` | [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#encode-6) `virtual` | Encode a buffer of interleaved video data. |
| `function` | [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#encode-7) `virtual` | Encode a planar video frame. |
| `function` | [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#encode-8) `virtual` | Encode a single AVFrame. |
| `function` | [`flush`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#flush-6) `virtual` | Flush any frames buffered inside the codec and emit remaining output. |
| `function` | [`convert`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#convert) `virtual` | Convert the video frame and return the result. |
| `function` | [`recreateConverter`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#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()](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#open-3) and [convert()](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#convert). |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| `AVFormatContext *` | [`format`](#format-13)  |  |

---

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

### format

```cpp
AVFormatContext * format
```

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

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`VideoEncoder`](#videoencoder-1)  | Construct an encoder, optionally tied to an existing muxer context. |
|  | [`~VideoEncoder`](#videoencoder-2) `noexcept` `override` |  |
| `void` | [`create`](#create-7) `virtual` `override` | Initialise the AVCodecContext using oparams. Adds a video stream to `format` if one was provided at construction. |
| `void` | [`close`](#close-15) `virtual` `override` | Close and free the AVCodecContext and associated resources. |
| `bool` | [`encode`](#encode-9) `virtual` `override` | Encode a single video frame. This method is for interleaved video formats. |
| `bool` | [`encode`](#encode-10) `virtual` `override` | Encode a single video frame. This method is for planar video formats. |
| `bool` | [`encode`](#encode-11) `virtual` `override` | Encode a single AVFrame (typically from a decoder or converter). |
| `void` | [`flush`](#flush-8) `virtual` `override` | Flush remaining packets to be encoded. This method should be called once before stream closure. |

---

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

### VideoEncoder

```cpp
VideoEncoder(AVFormatContext * format = nullptr)
```

[Defined in src/av/include/icy/av/videoencoder.h:34](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videoencoder.h#L34)

Construct an encoder, optionally tied to an existing muxer context.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `format` | `AVFormatContext *` | The AVFormatContext that will receive encoded packets, or nullptr for standalone use. |

---

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

### ~VideoEncoder

`noexcept` `override`

```cpp
~VideoEncoder() noexcept override
```

[Defined in src/av/include/icy/av/videoencoder.h:35](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videoencoder.h#L35)

---

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

### create

`virtual` `override`

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

[Defined in src/av/include/icy/av/videoencoder.h:39](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videoencoder.h#L39)

Initialise the AVCodecContext using oparams. Adds a video stream to `format` if one was provided at construction.

#### Reimplements

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

---

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

### close

`virtual` `override`

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

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

Close and free the AVCodecContext and associated resources.

#### Reimplements

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

---

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

### encode

`virtual` `override`

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

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

Encode a single video frame. This method is for interleaved video formats.

#### Reimplements

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

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `data` | `uint8_t *` | The raw video frame buffer. |
| `size` | `int` | The buffer size in bytes. |
| `pts` | `int64_t` | The presentation timestamp in stream time base units. |

---

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

### encode

`virtual` `override`

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

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

Encode a single video frame. This method is for planar video formats.

#### Reimplements

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

#### 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` | The presentation timestamp in stream time base units. |

---

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

### encode

`virtual` `override`

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

[Defined in src/av/include/icy/av/videoencoder.h:63](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videoencoder.h#L63)

Encode a single AVFrame (typically from a decoder or converter). 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplements

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

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `iframe` | `AVFrame *` | The source video frame with all fields set. |

---

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

### flush

`virtual` `override`

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

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

Flush remaining packets to be encoded. This method should be called once before stream closure.

#### Reimplements

- [`VideoContext::flush`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoContext.md#flush-6)
