# VideoDecoder

<a id="videodecoder"></a>

# VideoDecoder

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

struct VideoDecoder
```

[Defined in src/av/include/icy/av/videodecoder.h:28](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videodecoder.h#L28)

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

Decodes compressed video packets into raw frames.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`VideoDecoder`](#videodecoder-1) | `function` | Declared here |
| [`~VideoDecoder`](#videodecoder-2) | `function` | Declared here |
| [`create`](#create-6) | `function` | Declared here |
| [`open`](#open-4) | `function` | Declared here |
| [`close`](#close-14) | `function` | Declared here |
| [`decode`](#decode-3) | `function` | Declared here |
| [`flush`](#flush-7) | `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](https://auscaster.com/icey/docs/api-reference/icy-av-VideoEncoder.md#videoencoder) and [VideoDecoder](#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 Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`VideoDecoder`](#videodecoder-1)  | Construct a decoder for the given stream. The codec parameters are read from the stream's codecpar. |
|  | [`~VideoDecoder`](#videodecoder-2) `noexcept` `override` |  |
| `void` | [`create`](#create-6) `virtual` `override` | Initialise the AVCodecContext from the stream's codec parameters. |
| `void` | [`open`](#open-4) `virtual` `override` | Open the codec and initialise any required pixel format conversion context. |
| `void` | [`close`](#close-14) `virtual` `override` | Close and free the AVCodecContext and associated resources. |
| `bool` | [`decode`](#decode-3) `virtual` `override` | Decode the given compressed video packet and emit the decoded frame. Input packets must use the raw AVStream time base; time base conversion to microseconds is performed internally. |
| `void` | [`flush`](#flush-7) `virtual` `override` | Flush any frames buffered inside the decoder. Call repeatedly after the last packet until false is returned. |

---

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

### VideoDecoder

```cpp
VideoDecoder(AVStream * stream)
```

[Defined in src/av/include/icy/av/videodecoder.h:33](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videodecoder.h#L33)

Construct a decoder for the given stream. The codec parameters are read from the stream's codecpar.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `stream` | `AVStream *` | The AVStream to decode; must remain valid for the lifetime of this decoder. |

---

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

### ~VideoDecoder

`noexcept` `override`

```cpp
~VideoDecoder() noexcept override
```

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

---

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

### create

`virtual` `override`

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

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

Initialise the AVCodecContext from the stream's codec parameters.

#### Reimplements

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

---

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

### open

`virtual` `override`

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

[Defined in src/av/include/icy/av/videodecoder.h:40](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/videodecoder.h#L40)

Open the codec and initialise any required pixel format conversion context.

#### Reimplements

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

---

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

### close

`virtual` `override`

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

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

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="decode-3"></a>

### decode

`virtual` `override`

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

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

Decode the given compressed video packet and emit the decoded frame. Input packets must use the raw AVStream time base; time base conversion to microseconds is performed internally. 
#### Returns
True if an output frame was decoded and emitted, false otherwise.

#### Reimplements

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

#### Parameters

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

---

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

### flush

`virtual` `override`

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

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

Flush any frames buffered inside the decoder. Call repeatedly after the last packet until false is returned.

#### Reimplements

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