FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Enumerations | Functions | Variables
flacenc.c File Reference
#include "libavutil/avassert.h"
#include "libavutil/crc.h"
#include "libavutil/intmath.h"
#include "libavutil/md5.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "dsputil.h"
#include "put_bits.h"
#include "golomb.h"
#include "internal.h"
#include "lpc.h"
#include "flac.h"
#include "flacdata.h"
#include "flacdsp.h"

Go to the source code of this file.

Data Structures

struct  CompressionOptions
 
struct  RiceContext
 
struct  FlacSubframe
 
struct  FlacFrame
 
struct  FlacEncodeContext
 

Macros

#define FLAC_SUBFRAME_CONSTANT   0
 
#define FLAC_SUBFRAME_VERBATIM   1
 
#define FLAC_SUBFRAME_FIXED   8
 
#define FLAC_SUBFRAME_LPC   32
 
#define MAX_FIXED_ORDER   4
 
#define MAX_PARTITION_ORDER   8
 
#define MAX_PARTITIONS   (1 << MAX_PARTITION_ORDER)
 
#define MAX_LPC_PRECISION   15
 
#define MAX_LPC_SHIFT   15
 
#define COPY_SAMPLES(bits)
 
#define rice_encode_count(sum, n, k)   (((n)*((k)+1))+((sum-(n>>1))>>(k)))
 
#define FLAGS   AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
 

Enumerations

enum  CodingMode { CODING_MODE_RICE = 4, CODING_MODE_RICE2 = 5 }
 

Functions

static void write_streaminfo (FlacEncodeContext *s, uint8_t *header)
 Write streaminfo metadata block to byte array.
 
static int select_blocksize (int samplerate, int block_time_ms)
 Set blocksize based on samplerate.
 
static av_cold void dprint_compression_options (FlacEncodeContext *s)
 
static av_cold int flac_encode_init (AVCodecContext *avctx)
 
static void init_frame (FlacEncodeContext *s, int nb_samples)
 
static void copy_samples (FlacEncodeContext *s, const void *samples)
 Copy channel-interleaved input samples into separate subframes.
 
static uint64_t rice_count_exact (int32_t *res, int n, int k)
 
static uint64_t subframe_count_exact (FlacEncodeContext *s, FlacSubframe *sub, int pred_order)
 
static int find_optimal_param (uint64_t sum, int n, int max_param)
 Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0.
 
static uint64_t calc_optimal_rice_params (RiceContext *rc, int porder, uint64_t *sums, int n, int pred_order)
 
static void calc_sums (int pmin, int pmax, uint32_t *data, int n, int pred_order, uint64_t sums[][MAX_PARTITIONS])
 
static uint64_t calc_rice_params (RiceContext *rc, int pmin, int pmax, int32_t *data, int n, int pred_order)
 
static int get_max_p_order (int max_porder, int n, int order)
 
static uint64_t find_subframe_rice_params (FlacEncodeContext *s, FlacSubframe *sub, int pred_order)
 
static void encode_residual_fixed (int32_t *res, const int32_t *smp, int n, int order)
 
static int encode_residual_ch (FlacEncodeContext *s, int ch)
 
static int count_frame_header (FlacEncodeContext *s)
 
static int encode_frame (FlacEncodeContext *s)
 
static void remove_wasted_bits (FlacEncodeContext *s)
 
static int estimate_stereo_mode (int32_t *left_ch, int32_t *right_ch, int n, int max_rice_param)
 
static void channel_decorrelation (FlacEncodeContext *s)
 Perform stereo channel decorrelation.
 
static void write_utf8 (PutBitContext *pb, uint32_t val)
 
static void write_frame_header (FlacEncodeContext *s)
 
static void write_subframes (FlacEncodeContext *s)
 
static void write_frame_footer (FlacEncodeContext *s)
 
static int write_frame (FlacEncodeContext *s, AVPacket *avpkt)
 
static int update_md5_sum (FlacEncodeContext *s, const void *samples)
 
static int flac_encode_frame (AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
 
static av_cold int flac_encode_close (AVCodecContext *avctx)
 

Variables

static const AVOption options []
 
static const AVClass flac_encoder_class
 
AVCodec ff_flac_encoder
 

Macro Definition Documentation

#define FLAC_SUBFRAME_CONSTANT   0

Definition at line 37 of file flacenc.c.

Referenced by encode_residual_ch(), subframe_count_exact(), and write_subframes().

#define FLAC_SUBFRAME_VERBATIM   1

Definition at line 38 of file flacenc.c.

Referenced by encode_residual_ch(), subframe_count_exact(), and write_subframes().

#define FLAC_SUBFRAME_FIXED   8

Definition at line 39 of file flacenc.c.

Referenced by encode_residual_ch().

#define FLAC_SUBFRAME_LPC   32
#define MAX_FIXED_ORDER   4

Definition at line 42 of file flacenc.c.

Referenced by encode_residual_ch(), and flac_encode_init().

#define MAX_PARTITION_ORDER   8

Definition at line 43 of file flacenc.c.

Referenced by calc_rice_params().

#define MAX_PARTITIONS   (1 << MAX_PARTITION_ORDER)

Definition at line 44 of file flacenc.c.

Referenced by calc_rice_params().

#define MAX_LPC_PRECISION   15

Definition at line 45 of file flacenc.c.

#define MAX_LPC_SHIFT   15

Definition at line 46 of file flacenc.c.

Referenced by encode_residual_ch().

#define COPY_SAMPLES (   bits)
Value:
do { \
const int ## bits ## _t *samples0 = samples; \
frame = &s->frame; \
for (i = 0, j = 0; i < frame->blocksize; i++) \
for (ch = 0; ch < s->channels; ch++, j++) \
frame->subframes[ch].samples[i] = samples0[j] >> shift; \
} while (0)
#define rice_encode_count (   sum,
  n,
 
)    (((n)*((k)+1))+((sum-(n>>1))>>(k)))

Definition at line 565 of file flacenc.c.

Referenced by calc_optimal_rice_params(), and estimate_stereo_mode().

Definition at line 1310 of file flacenc.c.

Enumeration Type Documentation

enum CodingMode
Enumerator:
CODING_MODE_RICE 
CODING_MODE_RICE2 

Definition at line 48 of file flacenc.c.

Function Documentation

static void write_streaminfo ( FlacEncodeContext s,
uint8_t header 
)
static

Write streaminfo metadata block to byte array.

Definition at line 124 of file flacenc.c.

Referenced by flac_encode_frame(), and flac_encode_init().

static int select_blocksize ( int  samplerate,
int  block_time_ms 
)
static

Set blocksize based on samplerate.

Choose the closest predefined blocksize >= BLOCK_TIME_MS milliseconds.

Definition at line 151 of file flacenc.c.

Referenced by flac_encode_init().

static av_cold void dprint_compression_options ( FlacEncodeContext s)
static

Definition at line 170 of file flacenc.c.

Referenced by flac_encode_init().

static av_cold int flac_encode_init ( AVCodecContext avctx)
static

Definition at line 228 of file flacenc.c.

static void init_frame ( FlacEncodeContext s,
int  nb_samples 
)
static

Definition at line 437 of file flacenc.c.

Referenced by decode_frame(), and flac_encode_frame().

static void copy_samples ( FlacEncodeContext s,
const void samples 
)
static

Copy channel-interleaved input samples into separate subframes.

Definition at line 482 of file flacenc.c.

Referenced by flac_encode_frame().

static uint64_t rice_count_exact ( int32_t res,
int  n,
int  k 
)
static

Definition at line 504 of file flacenc.c.

Referenced by subframe_count_exact().

static uint64_t subframe_count_exact ( FlacEncodeContext s,
FlacSubframe sub,
int  pred_order 
)
static

Definition at line 518 of file flacenc.c.

Referenced by encode_residual_ch().

static int find_optimal_param ( uint64_t  sum,
int  n,
int  max_param 
)
static

Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0.

Definition at line 570 of file flacenc.c.

Referenced by calc_optimal_rice_params(), and estimate_stereo_mode().

static uint64_t calc_optimal_rice_params ( RiceContext rc,
int  porder,
uint64_t *  sums,
int  n,
int  pred_order 
)
static

Definition at line 583 of file flacenc.c.

Referenced by calc_rice_params().

static void calc_sums ( int  pmin,
int  pmax,
uint32_t *  data,
int  n,
int  pred_order,
uint64_t  sums[][MAX_PARTITIONS] 
)
static

Definition at line 609 of file flacenc.c.

Referenced by calc_rice_params().

static uint64_t calc_rice_params ( RiceContext rc,
int  pmin,
int  pmax,
int32_t data,
int  n,
int  pred_order 
)
static

Definition at line 636 of file flacenc.c.

Referenced by find_subframe_rice_params().

static int get_max_p_order ( int  max_porder,
int  n,
int  order 
)
static

Definition at line 673 of file flacenc.c.

Referenced by find_subframe_rice_params().

static uint64_t find_subframe_rice_params ( FlacEncodeContext s,
FlacSubframe sub,
int  pred_order 
)
static

Definition at line 682 of file flacenc.c.

Referenced by encode_residual_ch().

static void encode_residual_fixed ( int32_t res,
const int32_t smp,
int  n,
int  order 
)
static

Definition at line 699 of file flacenc.c.

Referenced by encode_residual_ch().

static int encode_residual_ch ( FlacEncodeContext s,
int  ch 
)
static

Definition at line 750 of file flacenc.c.

Referenced by encode_frame().

static int count_frame_header ( FlacEncodeContext s)
static

Definition at line 889 of file flacenc.c.

Referenced by encode_frame().

static int encode_frame ( FlacEncodeContext s)
static

Definition at line 925 of file flacenc.c.

static void remove_wasted_bits ( FlacEncodeContext s)
static

Definition at line 945 of file flacenc.c.

Referenced by flac_encode_frame().

static int estimate_stereo_mode ( int32_t left_ch,
int32_t right_ch,
int  n,
int  max_rice_param 
)
static

Definition at line 977 of file flacenc.c.

Referenced by channel_decorrelation().

static void channel_decorrelation ( FlacEncodeContext s)
static

Perform stereo channel decorrelation.

Definition at line 1021 of file flacenc.c.

Referenced by flac_encode_frame().

static void write_utf8 ( PutBitContext pb,
uint32_t  val 
)
static

Definition at line 1066 of file flacenc.c.

Referenced by write_frame_header().

static void write_frame_header ( FlacEncodeContext s)
static

Definition at line 1073 of file flacenc.c.

Referenced by write_frame().

static void write_subframes ( FlacEncodeContext s)
static

Definition at line 1110 of file flacenc.c.

Referenced by write_frame().

static void write_frame_footer ( FlacEncodeContext s)
static

Definition at line 1170 of file flacenc.c.

Referenced by write_frame().

static int write_frame ( FlacEncodeContext s,
AVPacket avpkt 
)
static

Definition at line 1181 of file flacenc.c.

Referenced by flac_encode_frame().

static int update_md5_sum ( FlacEncodeContext s,
const void samples 
)
static

Definition at line 1191 of file flacenc.c.

Referenced by flac_encode_frame().

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

Definition at line 1229 of file flacenc.c.

static av_cold int flac_encode_close ( AVCodecContext avctx)
static

Definition at line 1297 of file flacenc.c.

Variable Documentation

const AVOption options[]
static
Initial value:
= {
{ "lpc_coeff_precision", "LPC coefficient precision", 0x42, AV_OPT_TYPE_INT, {.i64 = 15 }, 0, MAX_LPC_PRECISION, FLAGS },
{ "lpc_type", "LPC algorithm", 0x42, AV_OPT_TYPE_INT, {.i64 = FF_LPC_TYPE_DEFAULT }, FF_LPC_TYPE_DEFAULT, FF_LPC_TYPE_NB-1, FLAGS, "lpc_type" },
{ "none", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_NONE }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
{ "fixed", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_FIXED }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
{ "levinson", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_LEVINSON }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
{ "cholesky", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_CHOLESKY }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
{ "lpc_passes", "Number of passes to use for Cholesky factorization during LPC analysis", 0x42, AV_OPT_TYPE_INT, {.i64 = 2 }, 1, INT_MAX, FLAGS },
{ "min_partition_order", NULL, 0x42, AV_OPT_TYPE_INT, {.i64 = -1 }, -1, MAX_PARTITION_ORDER, FLAGS },
{ "max_partition_order", NULL, 0x42, AV_OPT_TYPE_INT, {.i64 = -1 }, -1, MAX_PARTITION_ORDER, FLAGS },
{ "prediction_order_method", "Search method for selecting prediction order", 0x42, AV_OPT_TYPE_INT, {.i64 = -1 }, -1, ORDER_METHOD_LOG, FLAGS, "predm" },
{ "estimation", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_EST }, INT_MIN, INT_MAX, FLAGS, "predm" },
{ "2level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_2LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" },
{ "4level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_4LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" },
{ "8level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_8LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" },
{ "search", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_SEARCH }, INT_MIN, INT_MAX, FLAGS, "predm" },
{ "log", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_LOG }, INT_MIN, INT_MAX, FLAGS, "predm" },
{ "ch_mode", "Stereo decorrelation mode", 0x42, AV_OPT_TYPE_INT, { .i64 = -1 }, -1, FLAC_CHMODE_MID_SIDE, FLAGS, "ch_mode" },
{ "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
{ "indep", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_INDEPENDENT }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
{ "left_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_LEFT_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
{ "right_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_RIGHT_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
{ "mid_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_MID_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
{ NULL },
}

Definition at line 1311 of file flacenc.c.

const AVClass flac_encoder_class
static
Initial value:

Definition at line 1337 of file flacenc.c.

AVCodec ff_flac_encoder
Initial value:
= {
.name = "flac",
.long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
.priv_data_size = sizeof(FlacEncodeContext),
.encode2 = flac_encode_frame,
.priv_class = &flac_encoder_class,
}

Definition at line 1344 of file flacenc.c.