mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-25 16:52:31 +00:00
avcodec/mlpenc: export max_interval option
This commit is contained in:
parent
ee9fb28429
commit
78fa1cff70
@ -38,7 +38,8 @@
|
||||
#include "mlp.h"
|
||||
#include "lpc.h"
|
||||
|
||||
#define MAJOR_HEADER_INTERVAL 16
|
||||
#define MIN_HEADER_INTERVAL 8
|
||||
#define MAX_HEADER_INTERVAL 128
|
||||
|
||||
#define MLP_MIN_LPC_ORDER 1
|
||||
#define MLP_MAX_LPC_ORDER 8
|
||||
@ -124,6 +125,8 @@ typedef struct MLPEncodeContext {
|
||||
AVClass *class;
|
||||
AVCodecContext *avctx;
|
||||
|
||||
int max_restart_interval; ///< Max interval of access units in between two major frames.
|
||||
int min_restart_interval; ///< Min interval of access units in between two major frames.
|
||||
int lpc_type;
|
||||
int lpc_passes;
|
||||
int prediction_order;
|
||||
@ -165,8 +168,6 @@ typedef struct MLPEncodeContext {
|
||||
|
||||
unsigned int one_sample_buffer_size; ///< Number of samples*channel for one access unit.
|
||||
|
||||
unsigned int max_restart_interval; ///< Max interval of access units in between two major frames.
|
||||
unsigned int min_restart_interval; ///< Min interval of access units in between two major frames.
|
||||
unsigned int restart_intervals; ///< Number of possible major frame sizes.
|
||||
|
||||
uint16_t output_timing; ///< Timestamp of current access unit.
|
||||
@ -182,9 +183,9 @@ typedef struct MLPEncodeContext {
|
||||
uint8_t ch8_presentation_mod; ///< channel modifier for TrueHD stream 2
|
||||
RestartHeader restart_header;
|
||||
|
||||
MLPBlock b[MAJOR_HEADER_INTERVAL + 1];
|
||||
int32_t lpc_sample_buffer[MAJOR_HEADER_INTERVAL * MAX_BLOCKSIZE];
|
||||
int32_t filter_state_buffer[NUM_FILTERS][MAX_BLOCKSIZE * MAJOR_HEADER_INTERVAL];
|
||||
MLPBlock b[MAX_HEADER_INTERVAL + 1];
|
||||
int32_t lpc_sample_buffer[MAX_HEADER_INTERVAL * MAX_BLOCKSIZE];
|
||||
int32_t filter_state_buffer[NUM_FILTERS][MAX_BLOCKSIZE * MAX_HEADER_INTERVAL];
|
||||
|
||||
unsigned int major_cur_subblock_index;
|
||||
unsigned int major_filter_state_subblock;
|
||||
@ -555,10 +556,8 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
|
||||
ctx->num_channels = avctx->ch_layout.nb_channels + 2; /* +2 noise channels */
|
||||
ctx->one_sample_buffer_size = avctx->frame_size
|
||||
* ctx->num_channels;
|
||||
/* TODO Let user pass major header interval as parameter. */
|
||||
ctx->max_restart_interval = MAJOR_HEADER_INTERVAL;
|
||||
|
||||
ctx->min_restart_interval = MAJOR_HEADER_INTERVAL;
|
||||
ctx->min_restart_interval = ctx->max_restart_interval;
|
||||
ctx->restart_intervals = ctx->max_restart_interval / ctx->min_restart_interval;
|
||||
|
||||
size = ctx->one_sample_buffer_size * ctx->max_restart_interval;
|
||||
@ -643,7 +642,7 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
|
||||
/* FIXME: this works for 1 and 2 channels, but check for more */
|
||||
rh->max_matrix_channel = rh->max_channel;
|
||||
|
||||
ctx->number_of_samples = avctx->frame_size * MAJOR_HEADER_INTERVAL;
|
||||
ctx->number_of_samples = avctx->frame_size * ctx->max_restart_interval;
|
||||
|
||||
if ((ret = ff_lpc_init(&ctx->lpc_ctx, ctx->number_of_samples,
|
||||
MLP_MAX_LPC_ORDER, ctx->lpc_type)) < 0)
|
||||
@ -1800,7 +1799,7 @@ static void rematrix_channels(MLPEncodeContext *ctx)
|
||||
****************************************************************************/
|
||||
|
||||
typedef struct PathCounter {
|
||||
char path[MAJOR_HEADER_INTERVAL + 2];
|
||||
char path[MAX_HEADER_INTERVAL + 2];
|
||||
int cur_idx;
|
||||
uint32_t bitcount;
|
||||
} PathCounter;
|
||||
@ -1948,7 +1947,7 @@ static void set_major_params(MLPEncodeContext *ctx)
|
||||
ctx->prev_decoding_params = restart_decoding_params;
|
||||
ctx->prev_channel_params = restart_channel_params;
|
||||
|
||||
for (unsigned int index = 0; index < MAJOR_HEADER_INTERVAL + 1; index++) {
|
||||
for (unsigned int index = 0; index < MAX_HEADER_INTERVAL + 1; index++) {
|
||||
ctx->cur_decoding_params = &ctx->b[index].major_decoding_params;
|
||||
ctx->cur_channel_params = ctx->b[index].major_channel_params;
|
||||
|
||||
@ -2160,6 +2159,7 @@ static av_cold int mlp_encode_close(AVCodecContext *avctx)
|
||||
#define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
|
||||
#define OFFSET(x) offsetof(MLPEncodeContext, x)
|
||||
static const AVOption mlp_options[] = {
|
||||
{ "max_interval", "Max number of frames between each new header", OFFSET(max_restart_interval), AV_OPT_TYPE_INT, {.i64 = 16 }, MIN_HEADER_INTERVAL, MAX_HEADER_INTERVAL, FLAGS },
|
||||
{ "lpc_type", "LPC algorithm", OFFSET(lpc_type), AV_OPT_TYPE_INT, {.i64 = FF_LPC_TYPE_LEVINSON }, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_CHOLESKY, FLAGS, "lpc_type" },
|
||||
{ "levinson", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_LEVINSON }, 0, 0, FLAGS, "lpc_type" },
|
||||
{ "cholesky", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_CHOLESKY }, 0, 0, FLAGS, "lpc_type" },
|
||||
|
Loading…
Reference in New Issue
Block a user