FFmpeg
Loading...
Searching...
No Matches
pcm.c File Reference

PCM codecs. More...

#include "config.h"
#include "config_components.h"
#include "libavutil/attributes.h"
#include "libavutil/float_dsp.h"
#include "libavutil/mem.h"
#include "libavutil/reverse.h"
#include "libavutil/thread.h"
#include "avcodec.h"
#include "bytestream.h"
#include "codec_internal.h"
#include "decode.h"
#include "encode.h"
#include "pcm_tablegen.h"

Go to the source code of this file.

Data Structures

struct  PCMDecode
 
struct  PCMScaleDecode
 
struct  PCMLUTDecode
 

Macros

#define ENCODE(type, endian, src, dst, n, shift, offset)
 Write PCM samples macro.
 
#define ENCODE_PLANAR(type, endian, dst, n, shift, offset)
 
#define ENTRY(CODEC_ID, SAMPLE_FMT, BITS_PER_SAMPLE)
 
#define DECODE(size, endian, src, dst, n, shift, offset)
 Read PCM samples macro.
 
#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset)
 
#define PCM_ENCODER_0(id_, sample_fmt_, name_, long_name_)
 
#define PCM_ENCODER_1(id_, sample_fmt_, name_, long_name_)
 
#define PCM_ENCODER_2(cf, id, sample_fmt, name, long_name)
 
#define PCM_ENCODER_3(cf, id, sample_fmt, name, long_name)
 
#define PCM_ENCODER(id, sample_fmt, name, long_name)
 
#define PCM_DECODER_0(id, sample_fmt, name, long_name, Context, init_func)
 
#define PCM_DECODER_1(id_, sample_fmt, name_, long_name, Context, init_func)
 
#define PCM_DECODER_2(cf, id, sample_fmt, name, long_name, Context, init_func)
 
#define PCM_DECODER_3(cf, id, sample_fmt, name, long_name, Context, init_func)
 
#define PCM_DEC_EXT(id, sample_fmt, name, long_name, Context, init_func)
 
#define PCM_DECODER(id, sample_fmt, name, long_name)
 
#define PCM_CODEC(id, sample_fmt_, name, long_name_)
 
#define PCM_CODEC_EXT(id, sample_fmt, name, long_name, DecContext, dec_init_func)
 

Functions

av_unused static av_cold int pcm_encode_init (AVCodecContext *avctx)
 
static av_unused int pcm_encode_frame (AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
 
av_unused static av_cold int pcm_decode_init (AVCodecContext *avctx)
 
av_unused static av_cold int pcm_scale_decode_init (AVCodecContext *avctx)
 
av_unused static av_cold int pcm_lut_decode_init (AVCodecContext *avctx)
 
static int pcm_decode_frame (AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
 
 PCM_CODEC_EXT (ALAW, S16, alaw, "PCM A-law / G.711 A-law", PCMLUTDecode, pcm_lut_decode_init)
 
 PCM_DEC_EXT (F16LE, FLT, f16le, "PCM 16.8 floating point little-endian", PCMScaleDecode, pcm_scale_decode_init)
 
 PCM_DEC_EXT (F24LE, FLT, f24le, "PCM 24.0 floating point little-endian", PCMScaleDecode, pcm_scale_decode_init)
 
 PCM_CODEC (F32BE, FLT, f32be, "PCM 32-bit floating point big-endian")
 
 PCM_CODEC (F32LE, FLT, f32le, "PCM 32-bit floating point little-endian")
 
 PCM_CODEC (F64BE, DBL, f64be, "PCM 64-bit floating point big-endian")
 
 PCM_CODEC (F64LE, DBL, f64le, "PCM 64-bit floating point little-endian")
 
 PCM_DECODER (LXF, S32P, lxf, "PCM signed 20-bit little-endian planar")
 
 PCM_CODEC_EXT (MULAW, S16, mulaw, "PCM mu-law / G.711 mu-law", PCMLUTDecode, pcm_lut_decode_init)
 
 PCM_CODEC (S8, U8, s8, "PCM signed 8-bit")
 
 PCM_CODEC (S8_PLANAR, U8P, s8_planar, "PCM signed 8-bit planar")
 
 PCM_CODEC (S16BE, S16, s16be, "PCM signed 16-bit big-endian")
 
 PCM_CODEC (S16BE_PLANAR, S16P, s16be_planar, "PCM signed 16-bit big-endian planar")
 
 PCM_CODEC (S16LE, S16, s16le, "PCM signed 16-bit little-endian")
 
 PCM_CODEC (S16LE_PLANAR, S16P, s16le_planar, "PCM signed 16-bit little-endian planar")
 
 PCM_CODEC (S24BE, S32, s24be, "PCM signed 24-bit big-endian")
 
 PCM_CODEC (S24DAUD, S16, s24daud, "PCM D-Cinema audio signed 24-bit")
 
 PCM_CODEC (S24LE, S32, s24le, "PCM signed 24-bit little-endian")
 
 PCM_CODEC (S24LE_PLANAR, S32P, s24le_planar, "PCM signed 24-bit little-endian planar")
 
 PCM_CODEC (S32BE, S32, s32be, "PCM signed 32-bit big-endian")
 
 PCM_CODEC (S32LE, S32, s32le, "PCM signed 32-bit little-endian")
 
 PCM_CODEC (S32LE_PLANAR, S32P, s32le_planar, "PCM signed 32-bit little-endian planar")
 
 PCM_CODEC (U8, U8, u8, "PCM unsigned 8-bit")
 
 PCM_CODEC (U16BE, S16, u16be, "PCM unsigned 16-bit big-endian")
 
 PCM_CODEC (U16LE, S16, u16le, "PCM unsigned 16-bit little-endian")
 
 PCM_CODEC (U24BE, S32, u24be, "PCM unsigned 24-bit big-endian")
 
 PCM_CODEC (U24LE, S32, u24le, "PCM unsigned 24-bit little-endian")
 
 PCM_CODEC (U32BE, S32, u32be, "PCM unsigned 32-bit big-endian")
 
 PCM_CODEC (U32LE, S32, u32le, "PCM unsigned 32-bit little-endian")
 
 PCM_CODEC (S64BE, S64, s64be, "PCM signed 64-bit big-endian")
 
 PCM_CODEC (S64LE, S64, s64le, "PCM signed 64-bit little-endian")
 
 PCM_CODEC_EXT (VIDC, S16, vidc, "PCM Archimedes VIDC", PCMLUTDecode, pcm_lut_decode_init)
 
 PCM_DECODER (SGA, U8, sga, "PCM SGA")
 

Detailed Description

PCM codecs.

Definition in file pcm.c.

Macro Definition Documentation

◆ ENCODE

#define ENCODE ( type,
endian,
src,
dst,
n,
shift,
offset )
Value:
samples_ ## type = (const type *) src; \
for (; n > 0; n--) { \
register type v = (*samples_ ## type++ >> shift) + offset; \
bytestream_put_ ## endian(&dst, v); \
}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
cl_device_type type
unsigned offset
Definition libaomenc.c:763
static int shift(int a, int b)
Definition bonk.c:261
#define src
Definition vp8dsp.c:248

Write PCM samples macro.

Parameters
typeDatatype of native machine format
endianbytestream_put_xxx() suffix
srcSource pointer (variable name)
dstDestination pointer (variable name)
nTotal number of samples (variable name)
shiftBitshift (bits)
offsetSample value offset

Definition at line 88 of file pcm.c.

Referenced by main(), and pcm_encode_frame().

◆ ENCODE_PLANAR

#define ENCODE_PLANAR ( type,
endian,
dst,
n,
shift,
offset )
Value:
n /= avctx->ch_layout.nb_channels; \
for (c = 0; c < avctx->ch_layout.nb_channels; c++) { \
int i; \
samples_ ## type = (const type *) frame->extended_data[c]; \
for (i = n; i > 0; i--) { \
register type v = (*samples_ ## type++ >> shift) + offset; \
bytestream_put_ ## endian(&dst, v); \
} \
}
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static AVFrame * frame
static double c[64]

Definition at line 95 of file pcm.c.

Referenced by pcm_encode_frame().

◆ ENTRY

#define ENTRY ( CODEC_ID,
SAMPLE_FMT,
BITS_PER_SAMPLE )
Value:
{ AV_CODEC_ID_PCM_ ## CODEC_ID, AV_SAMPLE_FMT_ ## SAMPLE_FMT, \
BITS_PER_SAMPLE / 8, BITS_PER_SAMPLE }

Referenced by pcm_decode_init().

◆ DECODE

#define DECODE ( size,
endian,
src,
dst,
n,
shift,
offset )
Value:
for (; n > 0; n--) { \
uint ## size ## _t v = bytestream_get_ ## endian(&src); \
AV_WN ## size ## A(dst, (uint ## size ## _t)(v - offset) << shift); \
dst += size / 8; \
}
#define A(x)
Definition vpx_arith.h:28
#define AV_WN(s, p, v)
int size

Read PCM samples macro.

Parameters
sizeData size of native machine format
endianbytestream_get_xxx() endian suffix
srcSource pointer (variable name)
dstDestination pointer (variable name)
nTotal number of samples (variable name)
shiftBitshift (bits)
offsetSample value offset

Definition at line 384 of file pcm.c.

Referenced by main(), and pcm_decode_frame().

◆ DECODE_PLANAR

#define DECODE_PLANAR ( size,
endian,
src,
dst,
n,
shift,
offset )
Value:
n /= channels; \
for (c = 0; c < avctx->ch_layout.nb_channels; c++) { \
int i; \
dst = frame->extended_data[c]; \
for (i = n; i > 0; i--) { \
uint ## size ## _t v = bytestream_get_ ## endian(&src); \
AV_WN ## size ## A(dst, (uint ## size ##_t)(v - offset) << shift); \
dst += size / 8; \
} \
}
channels
Definition aptx.h:31

Definition at line 391 of file pcm.c.

Referenced by pcm_decode_frame().

◆ PCM_ENCODER_0

#define PCM_ENCODER_0 ( id_,
sample_fmt_,
name_,
long_name_ )

Definition at line 626 of file pcm.c.

◆ PCM_ENCODER_1

#define PCM_ENCODER_1 ( id_,
sample_fmt_,
name_,
long_name_ )
Value:
const FFCodec ff_ ## name_ ## _encoder = { \
.p.name = #name_, \
CODEC_LONG_NAME(long_name_), \
.p.type = AVMEDIA_TYPE_AUDIO, \
.p.id = id_, \
.init = pcm_encode_init, \
FF_CODEC_ENCODE_CB(pcm_encode_frame), \
CODEC_SAMPLEFMTS(sample_fmt_), \
}
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition codec.h:147
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE
Audio encoder supports receiving a different number of samples in each call.
Definition codec.h:116
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
av_unused static av_cold int pcm_encode_init(AVCodecContext *avctx)
Definition pcm.c:41
static av_unused int pcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition pcm.c:106

Definition at line 627 of file pcm.c.

◆ PCM_ENCODER_2

#define PCM_ENCODER_2 ( cf,
id,
sample_fmt,
name,
long_name )
Value:
PCM_ENCODER_ ## cf(id, sample_fmt, name, long_name)
const char * name
Definition qsvenc.c:142

Definition at line 640 of file pcm.c.

◆ PCM_ENCODER_3

#define PCM_ENCODER_3 ( cf,
id,
sample_fmt,
name,
long_name )
Value:
PCM_ENCODER_2(cf, id, sample_fmt, name, long_name)
#define PCM_ENCODER_2(cf, id, sample_fmt, name, long_name)
Definition pcm.c:640

Definition at line 642 of file pcm.c.

◆ PCM_ENCODER

#define PCM_ENCODER ( id,
sample_fmt,
name,
long_name )
Value:
PCM_ENCODER_3(CONFIG_PCM_ ## id ## _ENCODER, AV_CODEC_ID_PCM_ ## id, \
AV_SAMPLE_FMT_ ## sample_fmt, pcm_ ## name, long_name)
#define PCM_ENCODER_3(cf, id, sample_fmt, name, long_name)
Definition pcm.c:642

Definition at line 644 of file pcm.c.

◆ PCM_DECODER_0

#define PCM_DECODER_0 ( id,
sample_fmt,
name,
long_name,
Context,
init_func )

Definition at line 648 of file pcm.c.

◆ PCM_DECODER_1

#define PCM_DECODER_1 ( id_,
sample_fmt,
name_,
long_name,
Context,
init_func )
Value:
const FFCodec ff_ ## name_ ## _decoder = { \
.p.name = #name_, \
CODEC_LONG_NAME(long_name), \
.p.type = AVMEDIA_TYPE_AUDIO, \
.p.id = id_, \
.priv_data_size = sizeof(Context), \
.init = init_func, \
}
#define FF_CODEC_DECODE_CB(func)
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
#define AV_CODEC_CAP_PARAM_CHANGE
Codec supports changed parameters at any point.
Definition codec.h:106
static int pcm_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition pcm.c:403

Definition at line 649 of file pcm.c.

◆ PCM_DECODER_2

#define PCM_DECODER_2 ( cf,
id,
sample_fmt,
name,
long_name,
Context,
init_func )
Value:
PCM_DECODER_ ## cf(id, sample_fmt, name, long_name, Context, init_func)

Definition at line 661 of file pcm.c.

◆ PCM_DECODER_3

#define PCM_DECODER_3 ( cf,
id,
sample_fmt,
name,
long_name,
Context,
init_func )
Value:
PCM_DECODER_2(cf, id, sample_fmt, name, long_name, Context, init_func)
#define PCM_DECODER_2(cf, id, sample_fmt, name, long_name, Context, init_func)
Definition pcm.c:661

Definition at line 663 of file pcm.c.

◆ PCM_DEC_EXT

#define PCM_DEC_EXT ( id,
sample_fmt,
name,
long_name,
Context,
init_func )
Value:
PCM_DECODER_3(CONFIG_PCM_ ## id ## _DECODER, AV_CODEC_ID_PCM_ ## id, \
AV_SAMPLE_FMT_ ## sample_fmt, pcm_ ## name, long_name, \
Context, init_func)
#define PCM_DECODER_3(cf, id, sample_fmt, name, long_name, Context, init_func)
Definition pcm.c:663

Definition at line 665 of file pcm.c.

◆ PCM_DECODER

#define PCM_DECODER ( id,
sample_fmt,
name,
long_name )
Value:
PCM_DEC_EXT(id, sample_fmt, name, long_name, PCMDecode, pcm_decode_init)
#define PCM_DEC_EXT(id, sample_fmt, name, long_name, Context, init_func)
Definition pcm.c:665
av_unused static av_cold int pcm_decode_init(AVCodecContext *avctx)
Definition pcm.c:265

Definition at line 670 of file pcm.c.

◆ PCM_CODEC

#define PCM_CODEC ( id,
sample_fmt_,
name,
long_name_ )
Value:
PCM_ENCODER(id, sample_fmt_, name, long_name_); \
PCM_DECODER(id, sample_fmt_, name, long_name_)
#define PCM_ENCODER(id, sample_fmt, name, long_name)
Definition pcm.c:644

Definition at line 673 of file pcm.c.

◆ PCM_CODEC_EXT

#define PCM_CODEC_EXT ( id,
sample_fmt,
name,
long_name,
DecContext,
dec_init_func )
Value:
PCM_DEC_EXT(id, sample_fmt, name, long_name, DecContext, dec_init_func); \
PCM_ENCODER(id, sample_fmt, name, long_name)

Definition at line 677 of file pcm.c.

Function Documentation

◆ pcm_encode_init()

av_unused static av_cold int pcm_encode_init ( AVCodecContext * avctx)
static

Definition at line 41 of file pcm.c.

◆ pcm_encode_frame()

static av_unused int pcm_encode_frame ( AVCodecContext * avctx,
AVPacket * avpkt,
const AVFrame * frame,
int * got_packet_ptr )
static

Definition at line 106 of file pcm.c.

◆ pcm_decode_init()

av_unused static av_cold int pcm_decode_init ( AVCodecContext * avctx)
static

Definition at line 265 of file pcm.c.

◆ pcm_scale_decode_init()

av_unused static av_cold int pcm_scale_decode_init ( AVCodecContext * avctx)
static

Definition at line 315 of file pcm.c.

Referenced by PCM_DEC_EXT(), and PCM_DEC_EXT().

◆ pcm_lut_decode_init()

av_unused static av_cold int pcm_lut_decode_init ( AVCodecContext * avctx)
static

Definition at line 341 of file pcm.c.

Referenced by PCM_CODEC_EXT(), PCM_CODEC_EXT(), and PCM_CODEC_EXT().

◆ pcm_decode_frame()

static int pcm_decode_frame ( AVCodecContext * avctx,
AVFrame * frame,
int * got_frame_ptr,
AVPacket * avpkt )
static

Definition at line 403 of file pcm.c.

◆ PCM_CODEC_EXT() [1/3]

PCM_CODEC_EXT ( ALAW ,
S16 ,
alaw ,
"PCM A-law / G.711 A-law" ,
PCMLUTDecode ,
pcm_lut_decode_init  )

◆ PCM_DEC_EXT() [1/2]

PCM_DEC_EXT ( F16LE ,
FLT ,
f16le ,
"PCM 16.8 floating point little-endian" ,
PCMScaleDecode ,
pcm_scale_decode_init  )

◆ PCM_DEC_EXT() [2/2]

PCM_DEC_EXT ( F24LE ,
FLT ,
f24le ,
"PCM 24.0 floating point little-endian" ,
PCMScaleDecode ,
pcm_scale_decode_init  )

◆ PCM_CODEC() [1/26]

PCM_CODEC ( F32BE ,
FLT ,
f32be ,
"PCM 32-bit floating point big-endian"  )

◆ PCM_CODEC() [2/26]

PCM_CODEC ( F32LE ,
FLT ,
f32le ,
"PCM 32-bit floating point little-endian"  )

◆ PCM_CODEC() [3/26]

PCM_CODEC ( F64BE ,
DBL ,
f64be ,
"PCM 64-bit floating point big-endian"  )

◆ PCM_CODEC() [4/26]

PCM_CODEC ( F64LE ,
DBL ,
f64le ,
"PCM 64-bit floating point little-endian"  )

◆ PCM_DECODER() [1/2]

PCM_DECODER ( LXF ,
S32P ,
lxf ,
"PCM signed 20-bit little-endian planar"  )

◆ PCM_CODEC_EXT() [2/3]

PCM_CODEC_EXT ( MULAW ,
S16 ,
mulaw ,
"PCM mu-law / G.711 mu-law" ,
PCMLUTDecode ,
pcm_lut_decode_init  )

◆ PCM_CODEC() [5/26]

PCM_CODEC ( S8 ,
U8 ,
s8 ,
"PCM signed 8-bit"  )

◆ PCM_CODEC() [6/26]

PCM_CODEC ( S8_PLANAR ,
U8P ,
s8_planar ,
"PCM signed 8-bit planar"  )

◆ PCM_CODEC() [7/26]

PCM_CODEC ( S16BE ,
S16 ,
s16be ,
"PCM signed 16-bit big-endian"  )

◆ PCM_CODEC() [8/26]

PCM_CODEC ( S16BE_PLANAR ,
S16P ,
s16be_planar ,
"PCM signed 16-bit big-endian planar"  )

◆ PCM_CODEC() [9/26]

PCM_CODEC ( S16LE ,
S16 ,
s16le ,
"PCM signed 16-bit little-endian"  )

◆ PCM_CODEC() [10/26]

PCM_CODEC ( S16LE_PLANAR ,
S16P ,
s16le_planar ,
"PCM signed 16-bit little-endian planar"  )

◆ PCM_CODEC() [11/26]

PCM_CODEC ( S24BE ,
S32 ,
s24be ,
"PCM signed 24-bit big-endian"  )

◆ PCM_CODEC() [12/26]

PCM_CODEC ( S24DAUD ,
S16 ,
s24daud ,
"PCM D-Cinema audio signed 24-bit"  )

◆ PCM_CODEC() [13/26]

PCM_CODEC ( S24LE ,
S32 ,
s24le ,
"PCM signed 24-bit little-endian"  )

◆ PCM_CODEC() [14/26]

PCM_CODEC ( S24LE_PLANAR ,
S32P ,
s24le_planar ,
"PCM signed 24-bit little-endian planar"  )

◆ PCM_CODEC() [15/26]

PCM_CODEC ( S32BE ,
S32 ,
s32be ,
"PCM signed 32-bit big-endian"  )

◆ PCM_CODEC() [16/26]

PCM_CODEC ( S32LE ,
S32 ,
s32le ,
"PCM signed 32-bit little-endian"  )

◆ PCM_CODEC() [17/26]

PCM_CODEC ( S32LE_PLANAR ,
S32P ,
s32le_planar ,
"PCM signed 32-bit little-endian planar"  )

◆ PCM_CODEC() [18/26]

PCM_CODEC ( U8 ,
U8 ,
u8 ,
"PCM unsigned 8-bit"  )

◆ PCM_CODEC() [19/26]

PCM_CODEC ( U16BE ,
S16 ,
u16be ,
"PCM unsigned 16-bit big-endian"  )

◆ PCM_CODEC() [20/26]

PCM_CODEC ( U16LE ,
S16 ,
u16le ,
"PCM unsigned 16-bit little-endian"  )

◆ PCM_CODEC() [21/26]

PCM_CODEC ( U24BE ,
S32 ,
u24be ,
"PCM unsigned 24-bit big-endian"  )

◆ PCM_CODEC() [22/26]

PCM_CODEC ( U24LE ,
S32 ,
u24le ,
"PCM unsigned 24-bit little-endian"  )

◆ PCM_CODEC() [23/26]

PCM_CODEC ( U32BE ,
S32 ,
u32be ,
"PCM unsigned 32-bit big-endian"  )

◆ PCM_CODEC() [24/26]

PCM_CODEC ( U32LE ,
S32 ,
u32le ,
"PCM unsigned 32-bit little-endian"  )

◆ PCM_CODEC() [25/26]

PCM_CODEC ( S64BE ,
S64 ,
s64be ,
"PCM signed 64-bit big-endian"  )

◆ PCM_CODEC() [26/26]

PCM_CODEC ( S64LE ,
S64 ,
s64le ,
"PCM signed 64-bit little-endian"  )

◆ PCM_CODEC_EXT() [3/3]

PCM_CODEC_EXT ( VIDC ,
S16 ,
vidc ,
"PCM Archimedes VIDC" ,
PCMLUTDecode ,
pcm_lut_decode_init  )

◆ PCM_DECODER() [2/2]

PCM_DECODER ( SGA ,
U8 ,
sga ,
"PCM SGA"  )