FFmpeg
Data Structures | Macros | Functions | Variables
libspeexenc.c File Reference
#include <speex/speex.h>
#include <speex/speex_header.h>
#include <speex/speex_stereo.h>
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "codec_internal.h"
#include "encode.h"
#include "audio_frame_queue.h"

Go to the source code of this file.

Data Structures

struct  LibSpeexEncContext
 

Macros

#define OFFSET(x)   offsetof(LibSpeexEncContext, x)
 
#define AE   AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 

Functions

static av_cold void print_enc_params (AVCodecContext *avctx, LibSpeexEncContext *s)
 
static av_cold int encode_init (AVCodecContext *avctx)
 
static int encode_frame (AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
 
static av_cold int encode_close (AVCodecContext *avctx)
 

Variables

static const AVOption options []
 
static const AVClass speex_class
 
static const FFCodecDefault defaults []
 
const FFCodec ff_libspeex_encoder
 

Detailed Description

libspeex Speex audio encoder

Usage Guide This explains the values that need to be set prior to initialization in order to control various encoding parameters.

Channels Speex only supports mono or stereo, so avctx->ch_layout.nb_channels must be set to 1 or 2.

Sample Rate / Encoding Mode Speex has 3 modes, each of which uses a specific sample rate. narrowband : 8 kHz wideband : 16 kHz ultra-wideband : 32 kHz avctx->sample_rate must be set to one of these 3 values. This will be used to set the encoding mode.

Rate Control VBR mode is turned on by setting AV_CODEC_FLAG_QSCALE in avctx->flags. avctx->global_quality is used to set the encoding quality. For CBR mode, avctx->bit_rate can be used to set the constant bitrate. Alternatively, the 'cbr_quality' option can be set from 0 to 10 to set a constant bitrate based on quality. For ABR mode, set avctx->bit_rate and set the 'abr' option to 1. Approx. Bitrate Range: narrowband : 2400 - 25600 bps wideband : 4000 - 43200 bps ultra-wideband : 4400 - 45200 bps

Complexity Encoding complexity is controlled by setting avctx->compression_level. The valid range is 0 to 10. A higher setting gives generally better quality at the expense of encoding speed. This does not affect the bit rate.

Frames-per-Packet The encoder defaults to using 1 frame-per-packet. However, it is sometimes desirable to use multiple frames-per-packet to reduce the amount of container overhead. This can be done by setting the 'frames_per_packet' option to a value 1 to 8.

Optional features Speex encoder supports several optional features, which can be useful for some conditions.

Voice Activity Detection When enabled, voice activity detection detects whether the audio being encoded is speech or silence/background noise. VAD is always implicitly activated when encoding in VBR, so the option is only useful in non-VBR operation. In this case, Speex detects non-speech periods and encodes them with just enough bits to reproduce the background noise.

Discontinuous Transmission (DTX) DTX is an addition to VAD/VBR operation, that makes it possible to stop transmitting completely when the background noise is stationary. In file-based operation only 5 bits are used for such frames.

Definition in file libspeexenc.c.

Macro Definition Documentation

◆ OFFSET

#define OFFSET (   x)    offsetof(LibSpeexEncContext, x)

Definition at line 320 of file libspeexenc.c.

◆ AE

Definition at line 321 of file libspeexenc.c.

Function Documentation

◆ print_enc_params()

static av_cold void print_enc_params ( AVCodecContext avctx,
LibSpeexEncContext s 
)
static

Definition at line 112 of file libspeexenc.c.

Referenced by encode_init().

◆ encode_init()

static av_cold int encode_init ( AVCodecContext avctx)
static

Definition at line 146 of file libspeexenc.c.

◆ encode_frame()

static int encode_frame ( AVCodecContext avctx,
AVPacket avpkt,
const AVFrame frame,
int got_packet_ptr 
)
static

Definition at line 263 of file libspeexenc.c.

◆ encode_close()

static av_cold int encode_close ( AVCodecContext avctx)
static

Definition at line 308 of file libspeexenc.c.

Variable Documentation

◆ options

const AVOption options[]
static
Initial value:
= {
{ "abr", "Use average bit rate", OFFSET(abr), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AE },
{ "cbr_quality", "Set quality value (0 to 10) for CBR", OFFSET(cbr_quality), AV_OPT_TYPE_INT, { .i64 = 8 }, 0, 10, AE },
{ "frames_per_packet", "Number of frames to encode in each packet", OFFSET(frames_per_packet), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 8, AE },
{ "vad", "Voice Activity Detection", OFFSET(vad), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AE },
{ "dtx", "Discontinuous Transmission", OFFSET(dtx), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AE },
{ NULL },
}

Definition at line 322 of file libspeexenc.c.

◆ speex_class

const AVClass speex_class
static
Initial value:
= {
.class_name = "libspeex",
.item_name = av_default_item_name,
.option = options,
}

Definition at line 331 of file libspeexenc.c.

◆ defaults

const FFCodecDefault defaults[]
static
Initial value:
= {
{ "b", "0" },
{ "compression_level", "3" },
{ NULL },
}

Definition at line 338 of file libspeexenc.c.

◆ ff_libspeex_encoder

const FFCodec ff_libspeex_encoder
Initial value:
= {
.p.name = "libspeex",
CODEC_LONG_NAME("libspeex Speex"),
.p.type = AVMEDIA_TYPE_AUDIO,
.p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
.priv_data_size = sizeof(LibSpeexEncContext),
.close = encode_close,
.p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
.p.ch_layouts = (const AVChannelLayout[]) { AV_CHANNEL_LAYOUT_MONO,
{ 0 },
},
.p.supported_samplerates = (const int[]){ 8000, 16000, 32000, 0 },
.p.priv_class = &speex_class,
.defaults = defaults,
.p.wrapper_name = "libspeex",
}

Definition at line 344 of file libspeexenc.c.

AV_CHANNEL_LAYOUT_STEREO
#define AV_CHANNEL_LAYOUT_STEREO
Definition: channel_layout.h:379
encode_close
static av_cold int encode_close(AVCodecContext *avctx)
Definition: libspeexenc.c:308
FF_CODEC_CAP_NOT_INIT_THREADSAFE
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
Definition: codec_internal.h:34
defaults
static const FFCodecDefault defaults[]
Definition: libspeexenc.c:338
AV_CODEC_ID_SPEEX
@ AV_CODEC_ID_SPEEX
Definition: codec_id.h:475
AE
#define AE
Definition: libspeexenc.c:321
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:296
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
options
static const AVOption options[]
Definition: libspeexenc.c:322
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
NULL
#define NULL
Definition: coverity.c:32
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
speex_class
static const AVClass speex_class
Definition: libspeexenc.c:331
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:365
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:303
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
AV_SAMPLE_FMT_S16
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition: samplefmt.h:58
encode_frame
static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition: libspeexenc.c:263
OFFSET
#define OFFSET(x)
Definition: libspeexenc.c:320
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
AV_CHANNEL_LAYOUT_MONO
#define AV_CHANNEL_LAYOUT_MONO
Definition: channel_layout.h:378
LibSpeexEncContext
Definition: libspeexenc.c:97
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: libspeexenc.c:146