#include "libavutil/avassert.h"#include "libavutil/crc.h"#include "libavutil/md5.h"#include "libavutil/opt.h"#include "avcodec.h"#include "get_bits.h"#include "golomb.h"#include "internal.h"#include "lpc.h"#include "flac.h"#include "flacdata.h"Go to the source code of this file.
| Data Structures | |
| struct | CompressionOptions | 
| struct | RiceContext | 
| struct | FlacSubframe | 
| struct | FlacFrame | 
| struct | FlacEncodeContext | 
| Defines | |
| #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 | MAX_RICE_PARAM 14 | 
| #define | rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k))) | 
| #define | LPC1(x) | 
| #define | FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM | 
| 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 int16_t *samples) | 
| Copy channel-interleaved input samples into separate subframes. | |
| static int | rice_count_exact (int32_t *res, int n, int k) | 
| static int | subframe_count_exact (FlacEncodeContext *s, FlacSubframe *sub, int pred_order) | 
| static int | find_optimal_param (uint32_t sum, int n) | 
| Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0. | |
| static uint32_t | calc_optimal_rice_params (RiceContext *rc, int porder, uint32_t *sums, int n, int pred_order) | 
| static void | calc_sums (int pmin, int pmax, uint32_t *data, int n, int pred_order, uint32_t sums[][MAX_PARTITIONS]) | 
| static uint32_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 uint32_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 av_always_inline void | encode_residual_lpc_unrolled (int32_t *res, const int32_t *smp, int n, int order, const int32_t *coefs, int shift, int big) | 
| static void | encode_residual_lpc (int32_t *res, const int32_t *smp, int n, int order, const int32_t *coefs, int shift) | 
| static int | encode_residual_ch (FlacEncodeContext *s, int ch) | 
| static int | count_frame_header (FlacEncodeContext *s) | 
| static int | encode_frame (FlacEncodeContext *s) | 
| static int | estimate_stereo_mode (int32_t *left_ch, int32_t *right_ch, int n) | 
| 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 void | update_md5_sum (FlacEncodeContext *s, const int16_t *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 | 
| #define FLAC_SUBFRAME_CONSTANT 0 | 
Definition at line 34 of file flacenc.c.
Referenced by encode_residual_ch(), subframe_count_exact(), and write_subframes().
| #define FLAC_SUBFRAME_FIXED 8 | 
| #define FLAC_SUBFRAME_LPC 32 | 
Definition at line 37 of file flacenc.c.
Referenced by encode_residual_ch(), find_subframe_rice_params(), subframe_count_exact(), and write_subframes().
| #define FLAC_SUBFRAME_VERBATIM 1 | 
Definition at line 35 of file flacenc.c.
Referenced by encode_residual_ch(), subframe_count_exact(), and write_subframes().
| #define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM | 
| #define LPC1 | ( | x | ) | 
Value:
{\
    int c = coefs[(x)-1];\
    p0   += c * s;\
    s     = smp[i-(x)+1];\
    p1   += c * s;\
}
Definition at line 700 of file flacenc.c.
Referenced by encode_residual_lpc_unrolled().
| #define MAX_FIXED_ORDER 4 | 
Definition at line 39 of file flacenc.c.
Referenced by encode_residual_ch(), and flac_encode_init().
| #define MAX_LPC_SHIFT 15 | 
| #define MAX_PARTITION_ORDER 8 | 
| #define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER) | 
| #define MAX_RICE_PARAM 14 | 
| #define rice_encode_count | ( | sum, | |||
| n, | |||||
| k | ) | (((n)*((k)+1))+((sum-(n>>1))>>(k))) | 
Definition at line 519 of file flacenc.c.
Referenced by calc_optimal_rice_params(), and estimate_stereo_mode().
| static uint32_t calc_optimal_rice_params | ( | RiceContext * | rc, | |
| int | porder, | |||
| uint32_t * | sums, | |||
| int | n, | |||
| int | pred_order | |||
| ) |  [static] | 
| static uint32_t calc_rice_params | ( | RiceContext * | rc, | |
| int | pmin, | |||
| int | pmax, | |||
| int32_t * | data, | |||
| int | n, | |||
| int | pred_order | |||
| ) |  [static] | 
| static void channel_decorrelation | ( | FlacEncodeContext * | s | ) |  [static] | 
Perform stereo channel decorrelation.
Definition at line 1035 of file flacenc.c.
Referenced by flac_encode_frame().
| static void copy_samples | ( | FlacEncodeContext * | s, | |
| const int16_t * | samples | |||
| ) |  [static] | 
Copy channel-interleaved input samples into separate subframes.
Definition at line 446 of file flacenc.c.
Referenced by flac_encode_frame().
| static int count_frame_header | ( | FlacEncodeContext * | s | ) |  [static] | 
| static av_cold void dprint_compression_options | ( | FlacEncodeContext * | s | ) |  [static] | 
| static int encode_frame | ( | FlacEncodeContext * | s | ) |  [static] | 
| static int encode_residual_ch | ( | FlacEncodeContext * | s, | |
| int | ch | |||
| ) |  [static] | 
Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0.
Definition at line 524 of file flacenc.c.
Referenced by calc_optimal_rice_params(), and estimate_stereo_mode().
| static uint32_t find_subframe_rice_params | ( | FlacEncodeContext * | s, | |
| FlacSubframe * | sub, | |||
| int | pred_order | |||
| ) |  [static] | 
| static av_cold int flac_encode_close | ( | AVCodecContext * | avctx | ) |  [static] | 
| static int flac_encode_frame | ( | AVCodecContext * | avctx, | |
| AVPacket * | avpkt, | |||
| const AVFrame * | frame, | |||
| int * | got_packet_ptr | |||
| ) |  [static] | 
| static av_cold int flac_encode_init | ( | AVCodecContext * | avctx | ) |  [static] | 
| static void init_frame | ( | FlacEncodeContext * | s, | |
| int | nb_samples | |||
| ) |  [static] | 
Set blocksize based on samplerate.
Choose the closest predefined blocksize >= BLOCK_TIME_MS milliseconds.
Definition at line 137 of file flacenc.c.
Referenced by flac_encode_init().
| static int subframe_count_exact | ( | FlacEncodeContext * | s, | |
| FlacSubframe * | sub, | |||
| int | pred_order | |||
| ) |  [static] | 
| static void update_md5_sum | ( | FlacEncodeContext * | s, | |
| const int16_t * | samples | |||
| ) |  [static] | 
| static int write_frame | ( | FlacEncodeContext * | s, | |
| AVPacket * | avpkt | |||
| ) |  [static] | 
| static void write_frame_footer | ( | FlacEncodeContext * | s | ) |  [static] | 
| static void write_frame_header | ( | FlacEncodeContext * | s | ) |  [static] | 
| static void write_streaminfo | ( | FlacEncodeContext * | s, | |
| uint8_t * | header | |||
| ) |  [static] | 
Write streaminfo metadata block to byte array.
Definition at line 110 of file flacenc.c.
Referenced by flac_encode_frame(), flac_encode_init(), and write_headers().
| static void write_subframes | ( | FlacEncodeContext * | s | ) |  [static] | 
| static void write_utf8 | ( | PutBitContext * | pb, | |
| uint32_t | val | |||
| ) |  [static] | 
Initial value:
 {
    .name           = "flac",
    .type           = AVMEDIA_TYPE_AUDIO,
    .id             = AV_CODEC_ID_FLAC,
    .priv_data_size = sizeof(FlacEncodeContext),
    .init           = flac_encode_init,
    .encode2        = flac_encode_frame,
    .close          = flac_encode_close,
    .capabilities   = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_LOSSLESS,
    .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                     AV_SAMPLE_FMT_NONE },
    .long_name      = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
    .priv_class     = &flac_encoder_class,
}
| const AVClass flac_encoder_class  [static] | 
Initial value:
 {
    "FLAC encoder",
    av_default_item_name,
    options,
    LIBAVUTIL_VERSION_INT,
}
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 = -1 }, INT_MIN, 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 },
}
 1.5.8
 1.5.8