avcodec/mlpenc: remove convoluted incomplete multiple substreams support code
It is very hard to follow data structures indirections in current code, so just remove it for now.
This commit is contained in:
parent
e811b0080e
commit
b9426f371a
|
@ -169,11 +169,11 @@ typedef struct MLPEncodeContext {
|
||||||
BestOffset best_offset[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS][NUM_CODEBOOKS];
|
BestOffset best_offset[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS][NUM_CODEBOOKS];
|
||||||
|
|
||||||
DecodingParams *decoding_params;
|
DecodingParams *decoding_params;
|
||||||
RestartHeader restart_header [MAX_SUBSTREAMS];
|
RestartHeader restart_header;
|
||||||
|
|
||||||
ChannelParams major_channel_params[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS]; ///< ChannelParams to be written to bitstream.
|
ChannelParams major_channel_params[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS]; ///< ChannelParams to be written to bitstream.
|
||||||
DecodingParams major_decoding_params[MAJOR_HEADER_INTERVAL+1][MAX_SUBSTREAMS]; ///< DecodingParams to be written to bitstream.
|
DecodingParams major_decoding_params[MAJOR_HEADER_INTERVAL+1]; ///< DecodingParams to be written to bitstream.
|
||||||
int major_params_changed[MAJOR_HEADER_INTERVAL+1][MAX_SUBSTREAMS]; ///< params_changed to be written to bitstream.
|
int major_params_changed[MAJOR_HEADER_INTERVAL+1]; ///< params_changed to be written to bitstream.
|
||||||
|
|
||||||
unsigned int major_cur_subblock_index;
|
unsigned int major_cur_subblock_index;
|
||||||
unsigned int major_filter_state_subblock;
|
unsigned int major_filter_state_subblock;
|
||||||
|
@ -375,11 +375,10 @@ static void copy_matrix_params(MatrixParams *dst, MatrixParams *src)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copy_restart_frame_params(MLPEncodeContext *ctx,
|
static void copy_restart_frame_params(MLPEncodeContext *ctx)
|
||||||
unsigned int substr)
|
|
||||||
{
|
{
|
||||||
for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
|
for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
|
||||||
DecodingParams *dp = ctx->seq_decoding_params + index*(ctx->num_substreams) + substr;
|
DecodingParams *dp = ctx->seq_decoding_params + index;
|
||||||
|
|
||||||
copy_matrix_params(&dp->matrix_params, &ctx->cur_decoding_params->matrix_params);
|
copy_matrix_params(&dp->matrix_params, &ctx->cur_decoding_params->matrix_params);
|
||||||
|
|
||||||
|
@ -397,17 +396,15 @@ static void copy_restart_frame_params(MLPEncodeContext *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Clears a DecodingParams struct the way it should be after a restart header. */
|
/** Clears a DecodingParams struct the way it should be after a restart header. */
|
||||||
static void clear_decoding_params(DecodingParams decoding_params[MAX_SUBSTREAMS], int num_substreams)
|
static void clear_decoding_params(DecodingParams *decoding_params)
|
||||||
{
|
{
|
||||||
for (unsigned substr = 0; substr < num_substreams; substr++) {
|
DecodingParams *dp = decoding_params;
|
||||||
DecodingParams *dp = &decoding_params[substr];
|
|
||||||
|
|
||||||
dp->param_presence_flags = 0xff;
|
dp->param_presence_flags = 0xff;
|
||||||
dp->blocksize = 8;
|
dp->blocksize = 8;
|
||||||
|
|
||||||
memset(&dp->matrix_params , 0, sizeof(MatrixParams ));
|
memset(&dp->matrix_params , 0, sizeof(MatrixParams ));
|
||||||
memset(dp->quant_step_size, 0, sizeof(dp->quant_step_size));
|
memset(dp->quant_step_size, 0, sizeof(dp->quant_step_size));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Clears a ChannelParams struct the way it should be after a restart header. */
|
/** Clears a ChannelParams struct the way it should be after a restart header. */
|
||||||
|
@ -426,26 +423,23 @@ static void clear_channel_params(ChannelParams channel_params[MAX_CHANNELS], int
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets default vales in our encoder for a DecodingParams struct. */
|
/** Sets default vales in our encoder for a DecodingParams struct. */
|
||||||
static void default_decoding_params(MLPEncodeContext *ctx,
|
static void default_decoding_params(MLPEncodeContext *ctx, DecodingParams *decoding_params)
|
||||||
DecodingParams decoding_params[MAX_SUBSTREAMS])
|
|
||||||
{
|
{
|
||||||
clear_decoding_params(decoding_params, ctx->num_substreams);
|
DecodingParams *dp = decoding_params;
|
||||||
|
uint8_t param_presence_flags = 0;
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
clear_decoding_params(decoding_params);
|
||||||
DecodingParams *dp = &decoding_params[substr];
|
|
||||||
uint8_t param_presence_flags = 0;
|
|
||||||
|
|
||||||
param_presence_flags |= PARAM_BLOCKSIZE;
|
param_presence_flags |= PARAM_BLOCKSIZE;
|
||||||
param_presence_flags |= PARAM_MATRIX;
|
param_presence_flags |= PARAM_MATRIX;
|
||||||
param_presence_flags |= PARAM_OUTSHIFT;
|
param_presence_flags |= PARAM_OUTSHIFT;
|
||||||
param_presence_flags |= PARAM_QUANTSTEP;
|
param_presence_flags |= PARAM_QUANTSTEP;
|
||||||
param_presence_flags |= PARAM_FIR;
|
param_presence_flags |= PARAM_FIR;
|
||||||
/* param_presence_flags |= PARAM_IIR; */
|
/*param_presence_flags |= PARAM_IIR; */
|
||||||
param_presence_flags |= PARAM_HUFFOFFSET;
|
param_presence_flags |= PARAM_HUFFOFFSET;
|
||||||
param_presence_flags |= PARAM_PRESENT;
|
param_presence_flags |= PARAM_PRESENT;
|
||||||
|
|
||||||
dp->param_presence_flags = param_presence_flags;
|
dp->param_presence_flags = param_presence_flags;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
@ -475,7 +469,7 @@ static int mlp_peak_bitrate(int peak_bitrate, int sample_rate)
|
||||||
static av_cold void mlp_encode_init_static(void)
|
static av_cold void mlp_encode_init_static(void)
|
||||||
{
|
{
|
||||||
clear_channel_params (restart_channel_params, MAX_CHANNELS);
|
clear_channel_params (restart_channel_params, MAX_CHANNELS);
|
||||||
clear_decoding_params(restart_decoding_params, MAX_SUBSTREAMS);
|
clear_decoding_params(restart_decoding_params);
|
||||||
ff_mlp_init_crc();
|
ff_mlp_init_crc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -660,7 +654,7 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
|
||||||
if (!ctx->max_output_bits)
|
if (!ctx->max_output_bits)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
size = ctx->num_substreams * ctx->max_restart_interval;
|
size = ctx->max_restart_interval;
|
||||||
ctx->lossless_check_data = av_calloc(size, sizeof(*ctx->lossless_check_data));
|
ctx->lossless_check_data = av_calloc(size, sizeof(*ctx->lossless_check_data));
|
||||||
if (!ctx->lossless_check_data)
|
if (!ctx->lossless_check_data)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
@ -676,22 +670,20 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
|
||||||
if (!ctx->channel_params)
|
if (!ctx->channel_params)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
size = ctx->restart_intervals * ctx->sequence_size * ctx->num_substreams;
|
size = ctx->restart_intervals * ctx->sequence_size;
|
||||||
ctx->decoding_params = av_calloc(size, sizeof(*ctx->decoding_params));
|
ctx->decoding_params = av_calloc(size, sizeof(*ctx->decoding_params));
|
||||||
if (!ctx->decoding_params)
|
if (!ctx->decoding_params)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
RestartHeader *rh = &ctx->restart_header;
|
||||||
RestartHeader *rh = &ctx->restart_header [substr];
|
|
||||||
|
|
||||||
/* TODO see if noisegen_seed is really worth it. */
|
/* TODO see if noisegen_seed is really worth it. */
|
||||||
rh->noisegen_seed = 0;
|
rh->noisegen_seed = 0;
|
||||||
|
|
||||||
rh->min_channel = 0;
|
rh->min_channel = 0;
|
||||||
rh->max_channel = avctx->channels - 1;
|
rh->max_channel = avctx->channels - 1;
|
||||||
/* FIXME: this works for 1 and 2 channels, but check for more */
|
/* FIXME: this works for 1 and 2 channels, but check for more */
|
||||||
rh->max_matrix_channel = rh->max_channel;
|
rh->max_matrix_channel = rh->max_channel;
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = ff_lpc_init(&ctx->lpc_ctx, ctx->number_of_samples,
|
if ((ret = ff_lpc_init(&ctx->lpc_ctx, ctx->number_of_samples,
|
||||||
MLP_MAX_LPC_ORDER, FF_LPC_TYPE_LEVINSON)) < 0)
|
MLP_MAX_LPC_ORDER, FF_LPC_TYPE_LEVINSON)) < 0)
|
||||||
|
@ -1012,94 +1004,90 @@ static void write_block_data(MLPEncodeContext *ctx, PutBitContext *pb)
|
||||||
ctx->write_buffer = sample_buffer;
|
ctx->write_buffer = sample_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Writes the substreams data to the bitstream. */
|
/** Writes the substream data to the bitstream. */
|
||||||
static uint8_t *write_substrs(MLPEncodeContext *ctx, uint8_t *buf, int buf_size,
|
static uint8_t *write_substr(MLPEncodeContext *ctx, uint8_t *buf, int buf_size,
|
||||||
int restart_frame,
|
int restart_frame,
|
||||||
uint16_t substream_data_len[MAX_SUBSTREAMS])
|
uint16_t substream_data_len[MAX_SUBSTREAMS])
|
||||||
{
|
{
|
||||||
int32_t *lossless_check_data = ctx->lossless_check_data;
|
int32_t *lossless_check_data = ctx->lossless_check_data;
|
||||||
|
unsigned int cur_subblock_index = ctx->major_cur_subblock_index;
|
||||||
|
unsigned int num_subblocks = ctx->major_filter_state_subblock;
|
||||||
|
RestartHeader *rh = &ctx->restart_header;
|
||||||
|
int substr_restart_frame = restart_frame;
|
||||||
|
uint8_t parity, checksum;
|
||||||
|
PutBitContext pb;
|
||||||
|
int params_changed;
|
||||||
int end = 0;
|
int end = 0;
|
||||||
|
|
||||||
lossless_check_data += ctx->frame_index * ctx->num_substreams;
|
lossless_check_data += ctx->frame_index;
|
||||||
|
ctx->cur_restart_header = rh;
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
init_put_bits(&pb, buf, buf_size);
|
||||||
unsigned int cur_subblock_index = ctx->major_cur_subblock_index;
|
|
||||||
unsigned int num_subblocks = ctx->major_filter_state_subblock;
|
|
||||||
RestartHeader *rh = &ctx->restart_header [substr];
|
|
||||||
int substr_restart_frame = restart_frame;
|
|
||||||
uint8_t parity, checksum;
|
|
||||||
PutBitContext pb;
|
|
||||||
int params_changed;
|
|
||||||
|
|
||||||
ctx->cur_restart_header = rh;
|
for (unsigned int subblock = 0; subblock <= num_subblocks; subblock++) {
|
||||||
|
unsigned int subblock_index;
|
||||||
|
|
||||||
init_put_bits(&pb, buf, buf_size);
|
subblock_index = cur_subblock_index++;
|
||||||
|
|
||||||
for (unsigned int subblock = 0; subblock <= num_subblocks; subblock++) {
|
ctx->cur_decoding_params = &ctx->major_decoding_params[subblock_index];
|
||||||
unsigned int subblock_index;
|
ctx->cur_channel_params = ctx->major_channel_params[subblock_index];
|
||||||
|
|
||||||
subblock_index = cur_subblock_index++;
|
params_changed = ctx->major_params_changed[subblock_index];
|
||||||
|
|
||||||
ctx->cur_decoding_params = &ctx->major_decoding_params[subblock_index][substr];
|
if (substr_restart_frame || params_changed) {
|
||||||
ctx->cur_channel_params = ctx->major_channel_params[subblock_index];
|
put_bits(&pb, 1, 1);
|
||||||
|
|
||||||
params_changed = ctx->major_params_changed[subblock_index][substr];
|
if (substr_restart_frame) {
|
||||||
|
|
||||||
if (substr_restart_frame || params_changed) {
|
|
||||||
put_bits(&pb, 1, 1);
|
put_bits(&pb, 1, 1);
|
||||||
|
|
||||||
if (substr_restart_frame) {
|
write_restart_header(ctx, &pb);
|
||||||
put_bits(&pb, 1, 1);
|
rh->lossless_check_data = 0;
|
||||||
|
|
||||||
write_restart_header(ctx, &pb);
|
|
||||||
rh->lossless_check_data = 0;
|
|
||||||
} else {
|
|
||||||
put_bits(&pb, 1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
write_decoding_params(ctx, &pb, params_changed);
|
|
||||||
} else {
|
} else {
|
||||||
put_bits(&pb, 1, 0);
|
put_bits(&pb, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_block_data(ctx, &pb);
|
write_decoding_params(ctx, &pb, params_changed);
|
||||||
|
} else {
|
||||||
put_bits(&pb, 1, !substr_restart_frame);
|
put_bits(&pb, 1, 0);
|
||||||
|
|
||||||
substr_restart_frame = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
put_bits(&pb, (-put_bits_count(&pb)) & 15, 0);
|
write_block_data(ctx, &pb);
|
||||||
|
|
||||||
rh->lossless_check_data ^= *lossless_check_data++;
|
put_bits(&pb, 1, !substr_restart_frame);
|
||||||
|
|
||||||
if (ctx->last_frames == 0 && ctx->shorten_by) {
|
substr_restart_frame = 0;
|
||||||
if (ctx->avctx->codec_id == AV_CODEC_ID_TRUEHD) {
|
|
||||||
put_bits(&pb, 16, END_OF_STREAM & 0xFFFF);
|
|
||||||
put_bits(&pb, 16, (ctx->shorten_by & 0x1FFF) | 0x2000);
|
|
||||||
} else {
|
|
||||||
put_bits(&pb, 32, END_OF_STREAM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data must be flushed for the checksum and parity to be correct;
|
|
||||||
* notice that we already are word-aligned here. */
|
|
||||||
flush_put_bits(&pb);
|
|
||||||
|
|
||||||
parity = ff_mlp_calculate_parity(buf, put_bytes_output(&pb)) ^ 0xa9;
|
|
||||||
checksum = ff_mlp_checksum8 (buf, put_bytes_output(&pb));
|
|
||||||
|
|
||||||
put_bits(&pb, 8, parity );
|
|
||||||
put_bits(&pb, 8, checksum);
|
|
||||||
|
|
||||||
flush_put_bits(&pb);
|
|
||||||
|
|
||||||
end += put_bytes_output(&pb);
|
|
||||||
substream_data_len[substr] = end;
|
|
||||||
|
|
||||||
buf += put_bytes_output(&pb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put_bits(&pb, (-put_bits_count(&pb)) & 15, 0);
|
||||||
|
|
||||||
|
rh->lossless_check_data ^= *lossless_check_data++;
|
||||||
|
|
||||||
|
if (ctx->last_frames == 0 && ctx->shorten_by) {
|
||||||
|
if (ctx->avctx->codec_id == AV_CODEC_ID_TRUEHD) {
|
||||||
|
put_bits(&pb, 16, END_OF_STREAM & 0xFFFF);
|
||||||
|
put_bits(&pb, 16, (ctx->shorten_by & 0x1FFF) | 0x2000);
|
||||||
|
} else {
|
||||||
|
put_bits(&pb, 32, END_OF_STREAM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Data must be flushed for the checksum and parity to be correct;
|
||||||
|
* notice that we already are word-aligned here. */
|
||||||
|
flush_put_bits(&pb);
|
||||||
|
|
||||||
|
parity = ff_mlp_calculate_parity(buf, put_bytes_output(&pb)) ^ 0xa9;
|
||||||
|
checksum = ff_mlp_checksum8 (buf, put_bytes_output(&pb));
|
||||||
|
|
||||||
|
put_bits(&pb, 8, parity );
|
||||||
|
put_bits(&pb, 8, checksum);
|
||||||
|
|
||||||
|
flush_put_bits(&pb);
|
||||||
|
|
||||||
|
end += put_bytes_output(&pb);
|
||||||
|
substream_data_len[0] = end;
|
||||||
|
|
||||||
|
buf += put_bytes_output(&pb);
|
||||||
|
|
||||||
ctx->major_cur_subblock_index += ctx->major_filter_state_subblock + 1;
|
ctx->major_cur_subblock_index += ctx->major_filter_state_subblock + 1;
|
||||||
ctx->major_filter_state_subblock = 0;
|
ctx->major_filter_state_subblock = 0;
|
||||||
|
|
||||||
|
@ -1110,7 +1098,7 @@ static uint8_t *write_substrs(MLPEncodeContext *ctx, uint8_t *buf, int buf_size,
|
||||||
static void write_frame_headers(MLPEncodeContext *ctx, uint8_t *frame_header,
|
static void write_frame_headers(MLPEncodeContext *ctx, uint8_t *frame_header,
|
||||||
uint8_t *substream_headers, unsigned int length,
|
uint8_t *substream_headers, unsigned int length,
|
||||||
int restart_frame,
|
int restart_frame,
|
||||||
uint16_t substream_data_len[MAX_SUBSTREAMS])
|
uint16_t substream_data_len[1])
|
||||||
{
|
{
|
||||||
uint16_t access_unit_header = 0;
|
uint16_t access_unit_header = 0;
|
||||||
uint16_t parity_nibble = 0;
|
uint16_t parity_nibble = 0;
|
||||||
|
@ -1170,7 +1158,7 @@ static int write_access_unit(MLPEncodeContext *ctx, uint8_t *buf,
|
||||||
buf_size -= 2;
|
buf_size -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = write_substrs(ctx, buf, buf_size, restart_frame, substream_data_len);
|
buf = write_substr(ctx, buf, buf_size, restart_frame, &substream_data_len[0]);
|
||||||
|
|
||||||
total_length = buf - buf0;
|
total_length = buf - buf0;
|
||||||
|
|
||||||
|
@ -1193,38 +1181,35 @@ static void input_data_internal(MLPEncodeContext *ctx, const uint8_t *samples,
|
||||||
int32_t *lossless_check_data = ctx->lossless_check_data;
|
int32_t *lossless_check_data = ctx->lossless_check_data;
|
||||||
const int32_t *samples_32 = (const int32_t *) samples;
|
const int32_t *samples_32 = (const int32_t *) samples;
|
||||||
const int16_t *samples_16 = (const int16_t *) samples;
|
const int16_t *samples_16 = (const int16_t *) samples;
|
||||||
|
RestartHeader *rh = &ctx->restart_header;
|
||||||
|
int32_t *sample_buffer = ctx->inout_buffer;
|
||||||
|
int32_t temp_lossless_check_data = 0;
|
||||||
|
uint32_t greatest = 0;
|
||||||
|
|
||||||
lossless_check_data += ctx->frame_index * ctx->num_substreams;
|
lossless_check_data += ctx->frame_index;
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
for (int i = 0; i < ctx->avctx->frame_size; i++) {
|
||||||
RestartHeader *rh = &ctx->restart_header [substr];
|
for (unsigned int channel = 0; channel <= rh->max_channel; channel++) {
|
||||||
int32_t *sample_buffer = ctx->inout_buffer;
|
uint32_t abs_sample;
|
||||||
int32_t temp_lossless_check_data = 0;
|
int32_t sample;
|
||||||
uint32_t greatest = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < ctx->avctx->frame_size; i++) {
|
sample = is24 ? *samples_32++ >> 8 : *samples_16++ * 256;
|
||||||
for (unsigned int channel = 0; channel <= rh->max_channel; channel++) {
|
|
||||||
uint32_t abs_sample;
|
|
||||||
int32_t sample;
|
|
||||||
|
|
||||||
sample = is24 ? *samples_32++ >> 8 : *samples_16++ * 256;
|
/* TODO Find out if number_sbits can be used for negative values. */
|
||||||
|
abs_sample = FFABS(sample);
|
||||||
|
if (greatest < abs_sample)
|
||||||
|
greatest = abs_sample;
|
||||||
|
|
||||||
/* TODO Find out if number_sbits can be used for negative values. */
|
temp_lossless_check_data ^= (sample & 0x00ffffff) << channel;
|
||||||
abs_sample = FFABS(sample);
|
*sample_buffer++ = sample;
|
||||||
if (greatest < abs_sample)
|
|
||||||
greatest = abs_sample;
|
|
||||||
|
|
||||||
temp_lossless_check_data ^= (sample & 0x00ffffff) << channel;
|
|
||||||
*sample_buffer++ = sample;
|
|
||||||
}
|
|
||||||
|
|
||||||
sample_buffer += 2; /* noise channels */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->max_output_bits[ctx->frame_index] = number_sbits(greatest);
|
sample_buffer += 2; /* noise channels */
|
||||||
|
|
||||||
*lossless_check_data++ = temp_lossless_check_data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx->max_output_bits[ctx->frame_index] = number_sbits(greatest);
|
||||||
|
|
||||||
|
*lossless_check_data++ = temp_lossless_check_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Wrapper function for inputting data in two different bit-depths. */
|
/** Wrapper function for inputting data in two different bit-depths. */
|
||||||
|
@ -1985,25 +1970,22 @@ static void set_major_params(MLPEncodeContext *ctx)
|
||||||
RestartHeader *rh = ctx->cur_restart_header;
|
RestartHeader *rh = ctx->cur_restart_header;
|
||||||
uint8_t max_huff_lsbs = 0;
|
uint8_t max_huff_lsbs = 0;
|
||||||
uint8_t max_output_bits = 0;
|
uint8_t max_output_bits = 0;
|
||||||
|
DecodingParams *seq_dp = (DecodingParams *) ctx->decoding_params+
|
||||||
|
(ctx->restart_intervals - 1)*(ctx->sequence_size)*(ctx->avctx->channels) +
|
||||||
|
(ctx->seq_offset[ctx->restart_intervals - 1])*(ctx->avctx->channels);
|
||||||
|
ChannelParams *seq_cp = (ChannelParams *) ctx->channel_params +
|
||||||
|
(ctx->restart_intervals - 1)*(ctx->sequence_size)*(ctx->avctx->channels) +
|
||||||
|
(ctx->seq_offset[ctx->restart_intervals - 1])*(ctx->avctx->channels);
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
for (unsigned int index = 0; index < ctx->seq_size[ctx->restart_intervals-1]; index++) {
|
||||||
DecodingParams *seq_dp = (DecodingParams *) ctx->decoding_params+
|
memcpy(&ctx->major_decoding_params[index], seq_dp + index, sizeof(DecodingParams));
|
||||||
(ctx->restart_intervals - 1)*(ctx->sequence_size)*(ctx->avctx->channels) +
|
for (unsigned int channel = 0; channel < ctx->avctx->channels; channel++) {
|
||||||
(ctx->seq_offset[ctx->restart_intervals - 1])*(ctx->avctx->channels);
|
uint8_t huff_lsbs = (seq_cp + index*(ctx->avctx->channels) + channel)->huff_lsbs;
|
||||||
|
if (max_huff_lsbs < huff_lsbs)
|
||||||
ChannelParams *seq_cp = (ChannelParams *) ctx->channel_params +
|
max_huff_lsbs = huff_lsbs;
|
||||||
(ctx->restart_intervals - 1)*(ctx->sequence_size)*(ctx->avctx->channels) +
|
memcpy(&ctx->major_channel_params[index][channel],
|
||||||
(ctx->seq_offset[ctx->restart_intervals - 1])*(ctx->avctx->channels);
|
(seq_cp + index*(ctx->avctx->channels) + channel),
|
||||||
for (unsigned int index = 0; index < ctx->seq_size[ctx->restart_intervals-1]; index++) {
|
sizeof(ChannelParams));
|
||||||
memcpy(&ctx->major_decoding_params[index][substr], seq_dp + index*(ctx->num_substreams) + substr, sizeof(DecodingParams));
|
|
||||||
for (unsigned int channel = 0; channel < ctx->avctx->channels; channel++) {
|
|
||||||
uint8_t huff_lsbs = (seq_cp + index*(ctx->avctx->channels) + channel)->huff_lsbs;
|
|
||||||
if (max_huff_lsbs < huff_lsbs)
|
|
||||||
max_huff_lsbs = huff_lsbs;
|
|
||||||
memcpy(&ctx->major_channel_params[index][channel],
|
|
||||||
(seq_cp + index*(ctx->avctx->channels) + channel),
|
|
||||||
sizeof(ChannelParams));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2014,22 +1996,19 @@ static void set_major_params(MLPEncodeContext *ctx)
|
||||||
max_output_bits = ctx->max_output_bits[index];
|
max_output_bits = ctx->max_output_bits[index];
|
||||||
rh->max_output_bits = max_output_bits;
|
rh->max_output_bits = max_output_bits;
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
ctx->cur_restart_header = &ctx->restart_header;
|
||||||
|
|
||||||
ctx->cur_restart_header = &ctx->restart_header[substr];
|
ctx->prev_decoding_params = restart_decoding_params;
|
||||||
|
ctx->prev_channel_params = restart_channel_params;
|
||||||
|
|
||||||
ctx->prev_decoding_params = &restart_decoding_params[substr];
|
for (unsigned int index = 0; index < MAJOR_HEADER_INTERVAL + 1; index++) {
|
||||||
ctx->prev_channel_params = restart_channel_params;
|
ctx->cur_decoding_params = &ctx->major_decoding_params[index];
|
||||||
|
ctx->cur_channel_params = ctx->major_channel_params[index];
|
||||||
|
|
||||||
for (unsigned int index = 0; index < MAJOR_HEADER_INTERVAL + 1; index++) {
|
ctx->major_params_changed[index] = compare_decoding_params(ctx);
|
||||||
ctx->cur_decoding_params = &ctx->major_decoding_params[index][substr];
|
|
||||||
ctx->cur_channel_params = ctx->major_channel_params[index];
|
|
||||||
|
|
||||||
ctx->major_params_changed[index][substr] = compare_decoding_params(ctx);
|
ctx->prev_decoding_params = ctx->cur_decoding_params;
|
||||||
|
ctx->prev_channel_params = ctx->cur_channel_params;
|
||||||
ctx->prev_decoding_params = ctx->cur_decoding_params;
|
|
||||||
ctx->prev_channel_params = ctx->cur_channel_params;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->major_number_of_subblocks = ctx->number_of_subblocks;
|
ctx->major_number_of_subblocks = ctx->number_of_subblocks;
|
||||||
|
@ -2042,44 +2021,42 @@ static void analyze_sample_buffer(MLPEncodeContext *ctx)
|
||||||
ChannelParams *seq_cp = ctx->seq_channel_params;
|
ChannelParams *seq_cp = ctx->seq_channel_params;
|
||||||
DecodingParams *seq_dp = ctx->seq_decoding_params;
|
DecodingParams *seq_dp = ctx->seq_decoding_params;
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
ctx->cur_restart_header = &ctx->restart_header;
|
||||||
ctx->cur_restart_header = &ctx->restart_header[substr];
|
ctx->cur_decoding_params = seq_dp + 1;
|
||||||
ctx->cur_decoding_params = seq_dp + 1*(ctx->num_substreams) + substr;
|
ctx->cur_channel_params = seq_cp + ctx->avctx->channels;
|
||||||
ctx->cur_channel_params = seq_cp + 1*(ctx->avctx->channels);
|
|
||||||
|
|
||||||
determine_quant_step_size(ctx);
|
determine_quant_step_size(ctx);
|
||||||
generate_2_noise_channels(ctx);
|
generate_2_noise_channels(ctx);
|
||||||
lossless_matrix_coeffs (ctx);
|
lossless_matrix_coeffs (ctx);
|
||||||
rematrix_channels (ctx);
|
rematrix_channels (ctx);
|
||||||
determine_filters (ctx);
|
determine_filters (ctx);
|
||||||
apply_filters (ctx);
|
apply_filters (ctx);
|
||||||
|
|
||||||
copy_restart_frame_params(ctx, substr);
|
copy_restart_frame_params(ctx);
|
||||||
|
|
||||||
/* Copy frame_size from frames 0...max to decoding_params 1...max + 1
|
/* Copy frame_size from frames 0...max to decoding_params 1...max + 1
|
||||||
* decoding_params[0] is for the filter state subblock.
|
* decoding_params[0] is for the filter state subblock.
|
||||||
*/
|
*/
|
||||||
for (unsigned int index = 0; index < ctx->number_of_frames; index++) {
|
for (unsigned int index = 0; index < ctx->number_of_frames; index++) {
|
||||||
DecodingParams *dp = seq_dp + (index + 1)*(ctx->num_substreams) + substr;
|
DecodingParams *dp = seq_dp + (index + 1);
|
||||||
dp->blocksize = ctx->avctx->frame_size;
|
dp->blocksize = ctx->avctx->frame_size;
|
||||||
}
|
|
||||||
/* The official encoder seems to always encode a filter state subblock
|
|
||||||
* even if there are no filters. TODO check if it is possible to skip
|
|
||||||
* the filter state subblock for no filters.
|
|
||||||
*/
|
|
||||||
(seq_dp + substr)->blocksize = 8;
|
|
||||||
(seq_dp + 1*(ctx->num_substreams) + substr)->blocksize -= 8;
|
|
||||||
|
|
||||||
for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
|
|
||||||
ctx->cur_decoding_params = seq_dp + index*(ctx->num_substreams) + substr;
|
|
||||||
ctx->cur_channel_params = seq_cp + index*(ctx->avctx->channels);
|
|
||||||
ctx->cur_best_offset = ctx->best_offset[index];
|
|
||||||
determine_bits(ctx);
|
|
||||||
ctx->sample_buffer += ctx->cur_decoding_params->blocksize * ctx->num_channels;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_best_codebook(ctx);
|
|
||||||
}
|
}
|
||||||
|
/* The official encoder seems to always encode a filter state subblock
|
||||||
|
* even if there are no filters. TODO check if it is possible to skip
|
||||||
|
* the filter state subblock for no filters.
|
||||||
|
*/
|
||||||
|
(seq_dp + 0)->blocksize = 8;
|
||||||
|
(seq_dp + 1)->blocksize -= 8;
|
||||||
|
|
||||||
|
for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
|
||||||
|
ctx->cur_decoding_params = seq_dp + index;
|
||||||
|
ctx->cur_channel_params = seq_cp + index*(ctx->avctx->channels);
|
||||||
|
ctx->cur_best_offset = ctx->best_offset[index];
|
||||||
|
determine_bits(ctx);
|
||||||
|
ctx->sample_buffer += ctx->cur_decoding_params->blocksize * ctx->num_channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_best_codebook(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_major_frame(MLPEncodeContext *ctx)
|
static void process_major_frame(MLPEncodeContext *ctx)
|
||||||
|
@ -2090,17 +2067,15 @@ static void process_major_frame(MLPEncodeContext *ctx)
|
||||||
ctx->number_of_frames = ctx->major_number_of_frames;
|
ctx->number_of_frames = ctx->major_number_of_frames;
|
||||||
ctx->number_of_samples = ctx->major_frame_size;
|
ctx->number_of_samples = ctx->major_frame_size;
|
||||||
|
|
||||||
for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
|
ctx->cur_restart_header = &ctx->restart_header;
|
||||||
ctx->cur_restart_header = &ctx->restart_header[substr];
|
|
||||||
|
|
||||||
ctx->cur_decoding_params = &ctx->major_decoding_params[1][substr];
|
ctx->cur_decoding_params = &ctx->major_decoding_params[1];
|
||||||
ctx->cur_channel_params = ctx->major_channel_params[1];
|
ctx->cur_channel_params = ctx->major_channel_params[1];
|
||||||
|
|
||||||
generate_2_noise_channels(ctx);
|
generate_2_noise_channels(ctx);
|
||||||
rematrix_channels (ctx);
|
rematrix_channels (ctx);
|
||||||
|
|
||||||
apply_filters(ctx);
|
apply_filters(ctx);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
@ -2190,15 +2165,15 @@ input_and_return:
|
||||||
(ctx->seq_offset[seq_index])*(ctx->avctx->channels);
|
(ctx->seq_offset[seq_index])*(ctx->avctx->channels);
|
||||||
|
|
||||||
ctx->seq_decoding_params = (DecodingParams *) ctx->decoding_params +
|
ctx->seq_decoding_params = (DecodingParams *) ctx->decoding_params +
|
||||||
(ctx->frame_index / ctx->min_restart_interval)*(ctx->sequence_size)*(ctx->num_substreams) +
|
(ctx->frame_index / ctx->min_restart_interval)*(ctx->sequence_size) +
|
||||||
(ctx->seq_offset[seq_index])*(ctx->num_substreams);
|
(ctx->seq_offset[seq_index]);
|
||||||
|
|
||||||
number_of_samples = avctx->frame_size * ctx->number_of_frames;
|
number_of_samples = avctx->frame_size * ctx->number_of_frames;
|
||||||
ctx->number_of_samples = number_of_samples;
|
ctx->number_of_samples = number_of_samples;
|
||||||
|
|
||||||
for (unsigned int index = 0; index < ctx->seq_size[seq_index]; index++) {
|
for (unsigned int index = 0; index < ctx->seq_size[seq_index]; index++) {
|
||||||
clear_channel_params(ctx->seq_channel_params + index * ctx->avctx->channels, ctx->avctx->channels);
|
clear_channel_params(ctx->seq_channel_params + index * ctx->avctx->channels, ctx->avctx->channels);
|
||||||
default_decoding_params(ctx, ctx->seq_decoding_params + index*(ctx->num_substreams));
|
default_decoding_params(ctx, ctx->seq_decoding_params + index);
|
||||||
}
|
}
|
||||||
|
|
||||||
input_to_sample_buffer(ctx);
|
input_to_sample_buffer(ctx);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user