@ -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 " } ,