# AudioEncoder

<a id="audioencoder"></a>

# AudioEncoder

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

struct AudioEncoder
```

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

> **Inherits:** [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext)
> **Subclassed by:** [`AudioPacketEncoder`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioPacketEncoder.md#audiopacketencoder)

Encodes raw audio samples into a compressed format.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`fifo`](#fifo-1) | `variable` | Declared here |
| [`format`](#format-12) | `variable` | Declared here |
| [`nextOutputPts`](#nextoutputpts) | `variable` | Declared here |
| [`AudioEncoder`](#audioencoder-1) | `function` | Declared here |
| [`~AudioEncoder`](#audioencoder-2) | `function` | Declared here |
| [`create`](#create-4) | `function` | Declared here |
| [`close`](#close-11) | `function` | Declared here |
| [`encode`](#encode-3) | `function` | Declared here |
| [`encode`](#encode-4) | `function` | Declared here |
| [`encode`](#encode-5) | `function` | Declared here |
| [`flush`](#flush-5) | `function` | Declared here |
| [`emitter`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#emitter-7) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`iparams`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#iparams) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`oparams`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#oparams) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`stream`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#stream-8) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`ctx`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#ctx) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`codec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#codec-5) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`frame`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#frame) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`resampler`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#resampler) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`outputFrameSize`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#outputframesize) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`time`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#time) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`pts`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#pts) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`seconds`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#seconds-3) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`error`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#error-8) | `variable` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-1) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`~AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-2) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-3) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#operator-149) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-4) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#operator-150) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`create`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#create-2) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`open`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#open-2) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`close`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#close-9) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`decode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#decode) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#encode) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#encode-1) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#encode-2) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`flush`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#flush-3) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |
| [`recreateResampler`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#recreateresampler) | `function` | Inherited from [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext) |

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

| Kind | Name | Description |
|------|------|-------------|
| `variable` | [`emitter`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#emitter-7)  |  |
| `variable` | [`iparams`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#iparams)  | input parameters |
| `variable` | [`oparams`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#oparams)  | output parameters |
| `variable` | [`stream`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#stream-8)  | encoder or decoder stream |
| `variable` | [`ctx`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#ctx)  | encoder or decoder context |
| `variable` | [`codec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#codec-5)  | encoder or decoder codec |
| `variable` | [`frame`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#frame)  | last encoded or decoded frame |
| `variable` | [`resampler`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#resampler)  | audio resampler |
| `variable` | [`outputFrameSize`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#outputframesize)  | encoder or decoder output frame size |
| `variable` | [`time`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#time)  | stream time in codec time base |
| `variable` | [`pts`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#pts)  | last packet pts value |
| `variable` | [`seconds`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#seconds-3)  | audio time in seconds |
| `variable` | [`error`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#error-8)  | error message |
| `function` | [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-1)  |  |
| `function` | [`~AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-2) `virtual` `noexcept` |  |
| `function` | [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-3)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#operator-149)  | Deleted assignment operator. |
| `function` | [`AudioContext`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#audiocontext-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#operator-150)  | Deleted assignment operator. |
| `function` | [`create`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#create-2) `virtual` | Initialise the AVCodecContext with codec-specific defaults. Implemented by [AudioEncoder](#audioencoder) and [AudioDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder). |
| `function` | [`open`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#open-2) `virtual` | Open the codec and create the resampler if input/output parameters differ. Throws std::runtime_error if the codec context has not been created. |
| `function` | [`close`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#close-9) `virtual` | Close the codec context, free the frame, and reset timestamps. |
| `function` | [`decode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#decode) `virtual` | Decode a compressed audio packet and emit the resulting samples. |
| `function` | [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#encode) `virtual` | Encode a buffer of interleaved audio samples. |
| `function` | [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#encode-1) `virtual` | Encode a buffer of planar audio samples. |
| `function` | [`encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#encode-2) `virtual` | Encode a single AVFrame. |
| `function` | [`flush`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#flush-3) `virtual` | Flush any frames buffered inside the codec and emit remaining output. |
| `function` | [`recreateResampler`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#recreateresampler) `virtual` | Recreate the [AudioResampler](https://auscaster.com/icey/docs/api-reference/icy-av-AudioResampler.md#audioresampler) using the current iparams and oparams. Called automatically by [open()](https://auscaster.com/icey/docs/api-reference/icy-av-AudioContext.md#open-2) when format conversion is required. |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`av::AudioBuffer`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioBuffer.md#audiobuffer) | [`fifo`](#fifo-1)  |  |
| `AVFormatContext *` | [`format`](#format-12)  |  |
| `int64_t` | [`nextOutputPts`](#nextoutputpts)  | Running PTS counter for encoder output, in encoder time_base units. Anchored to the first input packet's PTS, then advanced by frame->nb_samples per encoded frame. AV_NOPTS_VALUE before anchoring. |

---

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

### fifo

```cpp
av::AudioBuffer fifo
```

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

[Defined in src/av/include/icy/av/audioencoder.h:74](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audioencoder.h#L74)

---

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

### format

```cpp
AVFormatContext * format
```

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

---

<a id="nextoutputpts"></a>

### nextOutputPts

```cpp
int64_t nextOutputPts = AV_NOPTS_VALUE
```

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

Running PTS counter for encoder output, in encoder time_base units. Anchored to the first input packet's PTS, then advanced by frame->nb_samples per encoded frame. AV_NOPTS_VALUE before anchoring.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`AudioEncoder`](#audioencoder-1)  | Construct an encoder, optionally tied to an existing muxer context. |
|  | [`~AudioEncoder`](#audioencoder-2) `noexcept` `override` |  |
| `void` | [`create`](#create-4) `virtual` `override` | Initialise the AVCodecContext using oparams. Adds an audio stream to `format` if one was provided at construction. |
| `void` | [`close`](#close-11) `virtual` `override` | Close and free the AVCodecContext, FIFO buffer, and associated resources. |
| `bool` | [`encode`](#encode-3) `virtual` `override` | Encode interleaved audio samples. |
| `bool` | [`encode`](#encode-4) `virtual` `override` | Encode planar audio samples. |
| `bool` | [`encode`](#encode-5) `virtual` `override` | Encode a single AVFrame (typically from a decoder or resampler). |
| `void` | [`flush`](#flush-5) `virtual` `override` | Flush remaining packets to be encoded. This method should be called once before stream closure. |

---

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

### AudioEncoder

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

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

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="audioencoder-2"></a>

### ~AudioEncoder

`noexcept` `override`

```cpp
~AudioEncoder() noexcept override
```

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

---

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

### create

`virtual` `override`

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

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

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

#### Reimplements

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

---

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

### close

`virtual` `override`

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

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

Close and free the AVCodecContext, FIFO buffer, and associated resources.

#### Reimplements

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

---

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

### encode

`virtual` `override`

```cpp
virtual bool encode(uint8_t * samples, const int numSamples, const int64_t pts) override
```

[Defined in src/av/include/icy/av/audioencoder.h:56](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audioencoder.h#L56)

Encode interleaved audio samples.

#### Reimplements

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

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `samples` | `uint8_t *` | The input samples to encode. |
| `numSamples` | `const int` | The number of input samples per channel. |
| `pts` | `const int64_t` | The input samples presentation timestamp. |

---

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

### encode

`virtual` `override`

```cpp
virtual bool encode(uint8_t * samples, const int numSamples, const int64_t pts) override
```

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

Encode planar audio samples.

#### Reimplements

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

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `samples` | `uint8_t *` | The input samples to encode. |
| `numSamples` | `const int` | The number of input samples per channel. |
| `pts` | `const int64_t` | The input samples presentation timestamp. |

---

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

### encode

`virtual` `override`

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

[Defined in src/av/include/icy/av/audioencoder.h:68](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audioencoder.h#L68)

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

#### Reimplements

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

#### Parameters

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

---

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

### flush

`virtual` `override`

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

[Defined in src/av/include/icy/av/audioencoder.h:72](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audioencoder.h#L72)

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

#### Reimplements

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