Go to the documentation of this file.
23 #include "config_components.h"
40 #define MAJOR_HEADER_INTERVAL 16
42 #define MLP_MIN_LPC_ORDER 1
43 #define MLP_MAX_LPC_ORDER 8
44 #define MLP_MIN_LPC_SHIFT 8
45 #define MLP_MAX_LPC_SHIFT 15
104 #define HUFF_OFFSET_MIN (-16384)
105 #define HUFF_OFFSET_MAX ( 16383)
108 #define NUM_CODEBOOKS 4
218 #define SYNC_MAJOR 0xf8726f
219 #define MAJOR_SYNC_INFO_SIGNATURE 0xB752
222 #define FLAGS_DVDA 0x4000
224 #define FLAGS_CONST 0x8000
226 #define SUBSTREAM_INFO_MAX_2_CHAN 0x01
227 #define SUBSTREAM_INFO_HIGH_RATE 0x02
228 #define SUBSTREAM_INFO_ALWAYS_SET 0x04
229 #define SUBSTREAM_INFO_2_SUBSTREAMS 0x08
252 for (
int i = 0;
i <
fp->order;
i++)
276 for (
unsigned int mat = 0; mat <
mp->count; mat++) {
277 if (prev->
outch[mat] !=
mp->outch[mat])
310 if (prev_mp->
shift[ch] !=
mp->shift[ch]) {
315 for (
unsigned int ch = 0; ch <= rh->
max_channel; ch++)
321 for (
unsigned int ch = rh->
min_channel; ch <= rh->max_channel; ch++) {
358 for (
unsigned int order = 0; order < dst->
order; order++)
372 for (
unsigned int count = 0; count <
MAX_MATRICES; count++)
376 for (
unsigned int count = 0; count <
MAX_MATRICES; count++)
377 dst->
outch[count] =
src->outch[count];
432 uint8_t param_presence_flags = 0;
484 uint64_t channels_present;
485 unsigned int sum = 0;
494 ctx->coded_sample_rate[0] = 0x08 + 0;
499 ctx->coded_sample_rate[0] = 0x08 + 1;
505 ctx->coded_sample_rate[0] = 0x08 + 2;
510 ctx->coded_sample_rate[0] = 0x00 + 0;
515 ctx->coded_sample_rate[0] = 0x00 + 1;
521 ctx->coded_sample_rate[0] = 0x00 + 2;
526 "sample rates are 44100, 88200, 176400, 48000, "
530 ctx->coded_sample_rate[1] = -1 & 0xf;
538 "Only mono and stereo are supported at the moment.\n");
548 ctx->wordlength = 16;
554 ctx->wordlength = 24;
559 "Only 16- and 24-bit samples are supported.\n");
562 ctx->coded_sample_fmt[1] = -1 & 0xf;
572 ctx->max_codebook_search = 3;
574 ctx->restart_intervals =
ctx->max_restart_interval /
ctx->min_restart_interval;
580 if (!
ctx->lpc_sample_buffer)
583 size =
ctx->one_sample_buffer_size *
ctx->max_restart_interval;
585 if (!
ctx->major_scratch_buffer)
589 if (!
ctx->major_inout_buffer)
592 ctx->num_substreams = 1;
596 static const uint64_t layout_arrangement[] = {
608 !
"Impossible channel layout");
609 if (channels_present == layout_arrangement[
i])
612 ctx->channel_arrangement =
i;
619 ctx->ch_modifier_thd0 = 3;
620 ctx->ch_modifier_thd1 = 3;
621 ctx->ch_modifier_thd2 = 3;
622 ctx->channel_arrangement = 2;
623 ctx->thd_substream_info = 0x14;
625 ctx->ch_modifier_thd0 = 1;
626 ctx->ch_modifier_thd1 = 1;
627 ctx->ch_modifier_thd2 = 1;
628 ctx->channel_arrangement = 1;
629 ctx->thd_substream_info = 0x14;
631 ctx->ch_modifier_thd0 = 1;
632 ctx->ch_modifier_thd1 = 1;
633 ctx->ch_modifier_thd2 = 1;
634 ctx->channel_arrangement = 11;
635 ctx->thd_substream_info = 0x104;
637 ctx->ch_modifier_thd0 = 2;
638 ctx->ch_modifier_thd1 = 1;
639 ctx->ch_modifier_thd2 = 2;
640 ctx->channel_arrangement = 15;
641 ctx->thd_substream_info = 0x104;
643 av_assert1(!
"AVCodec.ch_layouts needs to be updated");
646 ctx->channel_occupancy = 0;
647 ctx->summary_info = 0;
650 size =
ctx->max_restart_interval;
652 if (!
ctx->max_output_bits)
655 size =
ctx->max_restart_interval;
657 if (!
ctx->lossless_check_data)
665 ctx->sequence_size = sum;
666 size =
ctx->restart_intervals *
ctx->sequence_size *
ctx->avctx->ch_layout.nb_channels;
668 if (!
ctx->channel_params)
671 size =
ctx->restart_intervals *
ctx->sequence_size;
673 if (!
ctx->decoding_params)
690 sizeof(*
ctx->filter_state_buffer[0]));
691 if (!
ctx->filter_state_buffer[
i])
832 for (
unsigned int mat = 0; mat <
mp->count; mat++) {
868 for (
int i = 0;
i <
fp->order;
i++) {
926 for (
unsigned int ch = 0; ch <= rh->
max_channel; ch++)
933 for (
unsigned int ch = rh->
min_channel; ch <= rh->max_channel; ch++) {
989 for (
unsigned int ch = rh->
min_channel; ch <= rh->max_channel; ch++) {
994 codebook_index [ch] = cp->
codebook - 1;
1000 sign_huff_offset[ch] -= 7 << lsb_bits[ch];
1003 if (sign_shift >= 0)
1004 sign_huff_offset[ch] -= 1 << sign_shift;
1008 for (
unsigned int ch = rh->
min_channel; ch <= rh->max_channel; ch++) {
1010 sample -= sign_huff_offset[ch];
1012 if (codebook_index[ch] >= 0) {
1013 int vlc =
sample >> lsb_bits[ch];
1023 ctx->write_buffer = sample_buffer;
1031 int32_t *lossless_check_data =
ctx->lossless_check_data;
1032 unsigned int cur_subblock_index =
ctx->major_cur_subblock_index;
1033 unsigned int num_subblocks =
ctx->major_filter_state_subblock;
1035 int substr_restart_frame = restart_frame;
1036 uint8_t
parity, checksum;
1041 lossless_check_data +=
ctx->frame_index;
1042 ctx->cur_restart_header = rh;
1046 for (
unsigned int subblock = 0; subblock <= num_subblocks; subblock++) {
1047 unsigned int subblock_index;
1049 subblock_index = cur_subblock_index++;
1051 ctx->cur_decoding_params = &
ctx->major_decoding_params[subblock_index];
1052 ctx->cur_channel_params =
ctx->major_channel_params[subblock_index];
1054 params_changed =
ctx->major_params_changed[subblock_index];
1056 if (substr_restart_frame || params_changed) {
1059 if (substr_restart_frame) {
1075 put_bits(&pb, 1, !substr_restart_frame);
1077 substr_restart_frame = 0;
1084 if (
ctx->last_frames == 0 &&
ctx->shorten_by) {
1087 put_bits(&pb, 16, (
ctx->shorten_by & 0x1FFF) | 0x2000);
1106 substream_data_len[0] = end;
1110 ctx->major_cur_subblock_index +=
ctx->major_filter_state_subblock + 1;
1111 ctx->major_filter_state_subblock = 0;
1118 uint8_t *substream_headers,
unsigned int length,
1120 uint16_t substream_data_len[1])
1122 uint16_t access_unit_header = 0;
1123 uint16_t parity_nibble = 0;
1125 parity_nibble =
ctx->input_timing;
1126 parity_nibble ^= length;
1128 for (
unsigned int substr = 0; substr <
ctx->num_substreams; substr++) {
1129 uint16_t substr_hdr = 0;
1131 substr_hdr |= (0 << 15);
1132 substr_hdr |= (!restart_frame << 14);
1133 substr_hdr |= (1 << 13);
1134 substr_hdr |= (0 << 12);
1135 substr_hdr |= (substream_data_len[substr] / 2) & 0x0FFF;
1137 AV_WB16(substream_headers, substr_hdr);
1139 parity_nibble ^= *substream_headers++;
1140 parity_nibble ^= *substream_headers++;
1143 parity_nibble ^= parity_nibble >> 8;
1144 parity_nibble ^= parity_nibble >> 4;
1145 parity_nibble &= 0xF;
1147 access_unit_header |= (parity_nibble ^ 0xF) << 12;
1148 access_unit_header |= length & 0xFFF;
1156 int buf_size,
int restart_frame)
1159 uint8_t *buf1, *buf0 = buf;
1166 if (restart_frame) {
1175 for (
unsigned int substr = 0; substr <
ctx->num_substreams; substr++) {
1180 buf =
write_substr(
ctx, buf, buf_size, restart_frame, &substream_data_len[0]);
1182 total_length = buf - buf0;
1186 return total_length;
1201 int32_t *lossless_check_data =
ctx->lossless_check_data;
1203 const int16_t *samples_16 = (
const int16_t *)
samples;
1206 int32_t temp_lossless_check_data = 0;
1207 uint32_t greatest = 0;
1209 lossless_check_data +=
ctx->frame_index;
1211 for (
int i = 0;
i < nb_samples;
i++) {
1213 uint32_t abs_sample;
1216 sample = is24 ? *samples_32++ >> 8 : *samples_16++ * 256;
1220 greatest =
FFMAX(greatest, abs_sample);
1222 temp_lossless_check_data ^= (
sample & 0x00ffffff) <<
channel;
1223 *sample_buffer++ =
sample;
1231 *lossless_check_data++ = temp_lossless_check_data;
1245 unsigned int cur_index = (
ctx->frame_index +
index + 1) %
ctx->max_restart_interval;
1246 int32_t *input_buffer =
ctx->inout_buffer + cur_index *
ctx->one_sample_buffer_size;
1248 for (
unsigned int i = 0;
i <
ctx->avctx->frame_size;
i++) {
1250 *sample_buffer++ = *input_buffer++;
1285 memset(sample_mask, 0x00,
sizeof(sample_mask));
1287 for (
unsigned int i = 0;
i <
ctx->number_of_samples;
i++) {
1289 sample_mask[
channel] |= *sample_buffer++;
1304 int min = INT_MAX,
max = INT_MIN;
1308 for (
int order = 0; order <
fp->order; order++) {
1309 int coeff = fcoeff[order];
1316 coeff_mask |=
coeff;
1348 int32_t *lpc_samples =
ctx->lpc_sample_buffer;
1353 for (
unsigned int i = 0;
i <
ctx->number_of_samples;
i++) {
1354 *lpc_samples++ = *sample_buffer;
1355 sample_buffer +=
ctx->num_channels;
1367 for (
unsigned int i = 0;
i < order;
i++)
1368 fcoeff[
i] = coefs[order-1][
i];
1397 uint64_t score[4], sum[4] = { 0, 0, 0, 0, };
1403 for(
i = 2;
i <
ctx->number_of_samples;
i++) {
1404 int32_t left = left_ch [
i *
ctx->num_channels] - 2 * left_ch [(
i - 1) *
ctx->num_channels] + left_ch [(
i - 2) *
ctx->num_channels];
1405 int32_t right = right_ch[
i *
ctx->num_channels] - 2 * right_ch[(
i - 1) *
ctx->num_channels] + right_ch[(
i - 2) *
ctx->num_channels];
1408 sum[1] +=
FFABS( right);
1418 for(
i = 1;
i < 3;
i++)
1419 if(score[
i] < score[best])
1437 coeff_mask |=
coeff;
1442 mp->fbits [mat] = 14 -
bits;
1450 unsigned int shift = 0;
1454 if (
ctx->num_channels - 2 != 2) {
1470 mp->coeff[0][0] = 1 << 14;
mp->coeff[0][1] = -(1 << 14);
1471 mp->coeff[0][2] = 0 << 14;
mp->coeff[0][2] = 0 << 14;
1472 mp->forco[0][0] = 1 << 14;
mp->forco[0][1] = -(1 << 14);
1473 mp->forco[0][2] = 0 << 14;
mp->forco[0][2] = 0 << 14;
1478 mp->coeff[0][0] = 1 << 14;
mp->coeff[0][1] = 1 << 14;
1479 mp->coeff[0][2] = 0 << 14;
mp->coeff[0][2] = 0 << 14;
1480 mp->forco[0][0] = 1 << 14;
mp->forco[0][1] = -(1 << 14);
1481 mp->forco[0][2] = 0 << 14;
mp->forco[0][2] = 0 << 14;
1485 for (
int mat = 0; mat <
mp->count; mat++)
1498 {-9, 8}, {-8, 7}, {-15, 14},
1518 lsb_bits += !!lsb_bits;
1521 unsign = 1 << (lsb_bits - 1);
1557 unsign = 1 << (lsb_bits - 1);
1566 bo->
min =
max - unsign + 1;
1582 int codebook_offset = 7 + (2 -
codebook);
1584 int lsb_bits = 0, bitcount = 0;
1585 int offset_min = INT_MAX, offset_max = INT_MAX;
1591 while (sample_min < codebook_min || sample_max > codebook_max) {
1597 unsign = 1 << lsb_bits;
1601 unsign_offset -= unsign;
1607 int temp_min, temp_max;
1612 if (temp_min < offset_min)
1613 offset_min = temp_min;
1615 temp_max = unsign - temp_min - 1;
1616 if (temp_max < offset_max)
1617 offset_max = temp_max;
1623 sample_buffer +=
ctx->num_channels;
1641 int previous_count = INT_MAX;
1642 int offset_min, offset_max;
1648 while (offset <= offset_max && offset >= offset_min) {
1655 if (temp_bo.
bitcount < previous_count) {
1660 }
else if (++is_greater >=
ctx->max_codebook_search)
1697 sample_buffer +=
ctx->num_channels;
1703 if (no_filters_used) {
1711 BestOffset temp_bo = { 0, INT_MAX, 0, 0, 0, };
1718 if (no_filters_used) {
1719 offset_max = temp_bo.
max;
1736 #define SAMPLE_MAX(bitdepth) ((1 << (bitdepth - 1)) - 1)
1737 #define SAMPLE_MIN(bitdepth) (~SAMPLE_MAX(bitdepth))
1739 #define MSB_MASK(bits) (-(int)(1u << (bits)))
1752 unsigned int number_of_samples =
ctx->number_of_samples;
1753 unsigned int filter_shift =
fp[
FIR]->shift;
1756 for (
int i = 0;
i < 8;
i++) {
1757 ctx->filter_state_buffer[
FIR][
i] = *sample_buffer;
1758 ctx->filter_state_buffer[
IIR][
i] = *sample_buffer;
1760 sample_buffer +=
ctx->num_channels;
1763 for (
int i = 8;
i < number_of_samples;
i++) {
1770 for (
unsigned int order = 0; order <
fp[
filter]->order; order++)
1771 accum += (int64_t)
ctx->filter_state_buffer[
filter][
i - 1 - order] *
1775 accum >>= filter_shift;
1786 sample_buffer +=
ctx->num_channels;
1789 sample_buffer =
ctx->sample_buffer +
channel;
1790 for (
int i = 0;
i < number_of_samples;
i++) {
1791 *sample_buffer =
ctx->filter_state_buffer[
IIR][
i];
1793 sample_buffer +=
ctx->num_channels;
1817 int32_t *sample_buffer =
ctx->sample_buffer +
ctx->num_channels - 2;
1821 for (
unsigned int i = 0;
i <
ctx->number_of_samples;
i++) {
1822 uint16_t seed_shr7 =
seed >> 7;
1824 *sample_buffer++ = ((int8_t) seed_shr7) * (1 << rh->
noise_shift);
1826 seed = (
seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
1828 sample_buffer +=
ctx->num_channels - 2;
1840 unsigned int maxchan =
ctx->num_channels;
1842 for (
unsigned int mat = 0; mat <
mp->count; mat++) {
1845 unsigned int outch =
mp->outch[mat];
1847 sample_buffer =
ctx->sample_buffer;
1848 for (
unsigned int i = 0;
i <
ctx->number_of_samples;
i++) {
1851 for (
unsigned int src_ch = 0; src_ch < maxchan; src_ch++) {
1853 accum += (int64_t)
sample *
mp->forco[mat][src_ch];
1855 sample_buffer[outch] = (accum >> 14) &
mask;
1857 sample_buffer +=
ctx->num_channels;
1872 #define CODEBOOK_CHANGE_BITS 21
1876 memset(path_counter, 0, (
NUM_CODEBOOKS + 1) *
sizeof(*path_counter));
1887 int idx =
src->cur_idx;
1889 *prev_bo = idx ?
ctx->best_offset[idx - 1][
channel] :
1891 int bitcount =
src->bitcount;
1892 int prev_codebook =
src->path[idx];
1894 bitcount += cur_bo[cur_codebook].
bitcount;
1896 if (prev_codebook != cur_codebook ||
1912 unsigned int best_codebook;
1918 unsigned int best_bitcount = INT_MAX;
1923 int prev_best_bitcount = INT_MAX;
1925 for (
unsigned int last_best = 0; last_best < 2; last_best++) {
1938 src_path = &path_counter[
codebook];
1943 if (temp_bitcount < best_bitcount) {
1944 best_bitcount = temp_bitcount;
1948 if (temp_bitcount < prev_best_bitcount) {
1949 prev_best_bitcount = temp_bitcount;
1950 if (src_path != dst_path)
1954 dst_path->
bitcount = temp_bitcount;
1970 best_codebook = *best_path++;
1987 uint8_t max_huff_lsbs = 0;
1988 uint8_t max_output_bits = 0;
1997 if (max_huff_lsbs < huff_lsbs)
1998 max_huff_lsbs = huff_lsbs;
2008 if (max_output_bits < ctx->max_output_bits[
index])
2009 max_output_bits =
ctx->max_output_bits[
index];
2012 ctx->cur_restart_header = &
ctx->restart_header;
2018 ctx->cur_decoding_params = &
ctx->major_decoding_params[
index];
2019 ctx->cur_channel_params =
ctx->major_channel_params[
index];
2023 ctx->prev_decoding_params =
ctx->cur_decoding_params;
2024 ctx->prev_channel_params =
ctx->cur_channel_params;
2027 ctx->major_number_of_subblocks =
ctx->number_of_subblocks;
2028 ctx->major_filter_state_subblock = 1;
2029 ctx->major_cur_subblock_index = 0;
2037 ctx->cur_restart_header = &
ctx->restart_header;
2038 ctx->cur_decoding_params = seq_dp + 1;
2039 ctx->cur_channel_params = seq_cp +
ctx->avctx->ch_layout.nb_channels;
2061 (seq_dp + 0)->blocksize = 8;
2062 (seq_dp + 1)->blocksize -= 8;
2065 ctx->cur_decoding_params = seq_dp +
index;
2066 ctx->cur_channel_params = seq_cp +
index*(
ctx->avctx->ch_layout.nb_channels);
2069 ctx->sample_buffer +=
ctx->cur_decoding_params->blocksize *
ctx->num_channels;
2077 ctx->sample_buffer =
ctx->major_inout_buffer;
2079 ctx->number_of_frames =
ctx->major_number_of_frames;
2080 ctx->number_of_samples =
ctx->major_frame_size;
2082 ctx->cur_restart_header = &
ctx->restart_header;
2084 ctx->cur_decoding_params = &
ctx->major_decoding_params[1];
2085 ctx->cur_channel_params =
ctx->major_channel_params[1];
2099 int bytes_written = 0;
2101 int restart_frame,
ret;
2102 const uint8_t *
data;
2123 ctx->inout_buffer =
ctx->major_inout_buffer
2124 +
ctx->frame_index *
ctx->one_sample_buffer_size;
2126 ctx->sample_buffer =
ctx->major_scratch_buffer
2127 +
ctx->frame_index *
ctx->one_sample_buffer_size;
2129 ctx->write_buffer =
ctx->inout_buffer;
2133 goto input_and_return;
2136 restart_frame = !
ctx->frame_index;
2138 if (restart_frame) {
2141 if (
ctx->min_restart_interval !=
ctx->max_restart_interval)
2145 if (
ctx->min_restart_interval ==
ctx->max_restart_interval)
2146 ctx->write_buffer =
ctx->sample_buffer;
2158 ctx->next_major_number_of_frames++;
2163 restart_frame = (
ctx->frame_index + 1) %
ctx->min_restart_interval;
2165 if (!restart_frame) {
2166 for (
unsigned int seq_index = 0; seq_index <
ctx->restart_intervals; seq_index++) {
2167 unsigned int number_of_samples;
2169 ctx->sample_buffer =
ctx->major_scratch_buffer;
2170 ctx->inout_buffer =
ctx->major_inout_buffer;
2172 ctx->number_of_frames =
ctx->next_major_number_of_frames;
2173 ctx->number_of_subblocks =
ctx->next_major_number_of_frames + 1;
2175 ctx->seq_channel_params =
ctx->channel_params +
ctx->seq_offset[seq_index] *
channels;
2177 ctx->seq_decoding_params =
ctx->decoding_params +
ctx->seq_offset[seq_index];
2179 number_of_samples = avctx->
frame_size *
ctx->number_of_frames;
2180 ctx->number_of_samples = number_of_samples;
2189 if (number_of_samples > 0)
2193 if (
ctx->frame_index == (
ctx->max_restart_interval - 1)) {
2194 ctx->major_frame_size =
ctx->next_major_frame_size;
2195 ctx->next_major_frame_size = 0;
2196 ctx->major_number_of_frames =
ctx->next_major_number_of_frames;
2197 ctx->next_major_number_of_frames = 0;
2201 if (!
frame &&
ctx->last_frames <
ctx->max_restart_interval - 1)
2204 if (bytes_written > 0) {
2241 #if CONFIG_MLP_ENCODER
2254 .p.supported_samplerates = (
const int[]) {44100, 48000, 88200, 96000, 176400, 192000, 0},
2260 #if CONFIG_TRUEHD_ENCODER
2274 .p.supported_samplerates = (
const int[]) {44100, 48000, 88200, 96000, 176400, 192000, 0},
uint8_t fbits[MAX_CHANNELS]
fraction bits
static void clear_decoding_params(DecodingParams *decoding_params)
Clears a DecodingParams struct the way it should be after a restart header.
int frame_size
Number of samples per channel in an audio frame.
static void set_best_codebook(MLPEncodeContext *ctx)
#define AV_LOG_WARNING
Something somehow does not look correct.
static void no_codebook_bits(MLPEncodeContext *ctx, unsigned int channel, int32_t min, int32_t max, BestOffset *bo)
Determines the least amount of bits needed to encode the samples using no codebooks.
#define AV_CH_LAYOUT_5POINT0_BACK
int coded_sample_fmt[2]
sample format encoded for MLP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define MLP_MIN_LPC_ORDER
unsigned int major_cur_subblock_index
uint8_t codebook
Which VLC codebook to use to read residuals.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
uint8_t ch_modifier_thd1
channel modifier for TrueHD stream 1
static av_cold void mlp_encode_init_static(void)
static uint8_t xor_32_to_8(uint32_t value)
XOR four bytes into one.
static ChannelParams restart_channel_params[MAX_CHANNELS]
static void write_decoding_params(MLPEncodeContext *ctx, PutBitContext *pb, int params_changed)
Writes decoding parameters to the bitstream.
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
#define AV_CHANNEL_LAYOUT_STEREO
static int put_bytes_output(const PutBitContext *s)
int sample_rate
samples per second
static enum MLPChMode estimate_stereo_mode(MLPEncodeContext *ctx)
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
int32_t * major_scratch_buffer
Scratch buffer big enough to fit all data for one entire major frame interval.
static void write_major_sync(MLPEncodeContext *ctx, uint8_t *buf, int buf_size)
Writes a major sync header to the bitstream.
static av_cold int mlp_encode_close(AVCodecContext *avctx)
uint16_t blocksize
number of PCM samples in current audio block
#define SAMPLE_MAX(bitdepth)
int coded_peak_bitrate
peak bitrate for this major sync header
#define AV_CH_LAYOUT_MONO
int ff_lpc_calc_coefs(LPCContext *s, const int32_t *samples, int blocksize, int min_order, int max_order, int precision, int32_t coefs[][MAX_LPC_ORDER], int *shift, enum FFLPCType lpc_type, int lpc_passes, int omethod, int min_shift, int max_shift, int zero_shift)
Calculate LPC coefficients for multiple orders.
int32_t * lpc_sample_buffer
static void put_sbits(PutBitContext *pb, int n, int32_t value)
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order, enum FFLPCType lpc_type)
Initialize LPCContext.
static double mp(int i, double w0, double r)
#define SUBSTREAM_INFO_HIGH_RATE
int8_t shift[MAX_CHANNELS]
Left shift to apply to decoded PCM values to get final 24-bit output.
This structure describes decoded (raw) audio or video data.
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
static const BestOffset restart_best_offset[NUM_CODEBOOKS]
static void clear_path_counter(PathCounter *path_counter)
unsigned int number_of_subblocks
uint8_t ff_mlp_calculate_parity(const uint8_t *buf, unsigned int buf_size)
XOR together all the bytes of a buffer.
unsigned int number_of_frames
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
const ChannelInformation ff_mlp_ch_info[21]
Tables defining channel information.
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
int nb_channels
Number of channels in this layout.
static void set_major_params(MLPEncodeContext *ctx)
Analyzes all collected bitcounts and selects the best parameters for each individual access unit.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
unsigned int min_restart_interval
Min interval of access units in between two major frames.
unsigned int sequence_size
uint16_t output_timing
Timestamp of current access unit.
static void write_block_data(MLPEncodeContext *ctx, PutBitContext *pb)
Writes the residuals to the bitstream.
uint16_t ff_mlp_checksum16(const uint8_t *buf, unsigned int buf_size)
AVCodec p
The public AVCodec.
FilterParams filter_params[NUM_FILTERS]
int32_t * filter_state_buffer[NUM_FILTERS]
uint8_t ff_mlp_checksum8(const uint8_t *buf, unsigned int buf_size)
MLP uses checksums that seem to be based on the standard CRC algorithm, but are not (in implementatio...
AVChannelLayout ch_layout
Audio channel layout.
uint8_t huff_lsbs
Size of residual suffix not encoded using VLC.
static int mlp_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet)
void av_shrink_packet(AVPacket *pkt, int size)
Reduce packet size, correctly zeroing padding.
unsigned int major_number_of_frames
#define MLP_MAX_LPC_ORDER
static void input_data_internal(MLPEncodeContext *ctx, const uint8_t *samples, int nb_samples, int is24)
Inputs data from the samples passed by lavc into the context, shifts them appropriately depending on ...
static void copy_restart_frame_params(MLPEncodeContext *ctx)
static int compare_matrix_params(MLPEncodeContext *ctx, const MatrixParams *prev, const MatrixParams *mp)
Compare two primitive matrices and returns 1 if anything has changed.
unsigned int next_major_frame_size
Counter of number of samples for next major frame.
ChannelParams major_channel_params[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS]
ChannelParams to be written to bitstream.
#define FF_CODEC_ENCODE_CB(func)
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
#define AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_QUAD
static uint8_t * write_substr(MLPEncodeContext *ctx, uint8_t *buf, int buf_size, int restart_frame, uint16_t substream_data_len[MAX_SUBSTREAMS])
Writes the substream data to the bitstream.
int32_t * sample_buffer
Pointer to current access unit samples.
static void set_filter_params(MLPEncodeContext *ctx, unsigned int channel, unsigned int filter, int clear_filter)
Determines the best filter parameters for the given data and writes the necessary information to the ...
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define SUBSTREAM_INFO_MAX_2_CHAN
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
#define FF_ARRAY_ELEMS(a)
const ChannelParams * prev_channel_params
unsigned int major_filter_state_subblock
static const uint16_t mask[17]
ChannelParams * seq_channel_params
uint8_t ch_modifier_thd2
channel modifier for TrueHD stream 2
static void copy_matrix_params(MatrixParams *dst, MatrixParams *src)
static int write_access_unit(MLPEncodeContext *ctx, uint8_t *buf, int buf_size, int restart_frame)
Writes an entire access unit to the bitstream.
int flags
Flags modifying the (de)muxer behaviour.
int num_channels
Number of channels in major_scratch_buffer.
int(* init)(AVBSFContext *ctx)
#define CODEC_OLD_CHANNEL_LAYOUTS(...)
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
static int mlp_peak_bitrate(int peak_bitrate, int sample_rate)
static void code_matrix_coeffs(MLPEncodeContext *ctx, unsigned int mat)
Determines how many fractional bits are needed to encode matrix coefficients.
char path[MAJOR_HEADER_INTERVAL+2]
static void write_frame_headers(MLPEncodeContext *ctx, uint8_t *frame_header, uint8_t *substream_headers, unsigned int length, int restart_frame, uint16_t substream_data_len[1])
Writes the access unit and substream headers to the bitstream.
#define CODEC_LONG_NAME(str)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static void determine_bits(MLPEncodeContext *ctx)
Determines the least amount of bits needed to encode the samples using any or no codebook.
static void input_data(MLPEncodeContext *ctx, const void *samples, int nb_samples)
Wrapper function for inputting data in two different bit-depths.
int flags
major sync info flags
static void lossless_matrix_coeffs(MLPEncodeContext *ctx)
Determines best coefficients to use for the lossless matrix.
static void codebook_bits(MLPEncodeContext *ctx, unsigned int channel, int codebook, int offset, int32_t min, int32_t max, BestOffset *bo, int direction)
Determines the least amount of bits needed to encode the samples using a given codebook.
int32_t last_frames
Signal last frames.
RestartHeader * cur_restart_header
static const int codebook_extremes[3][2]
Min and max values that can be encoded with each codebook.
static void apply_filters(MLPEncodeContext *ctx)
unsigned int major_frame_size
Number of samples in current major frame being encoded.
int num_substreams
Number of substreams contained within this stream.
int32_t * lossless_check_data
Array with lossless_check_data for each access unit.
static int apply_filter(MLPEncodeContext *ctx, unsigned int channel)
Applies the filter to the current samples, and saves the residual back into the samples buffer.
av_cold void ff_lpc_end(LPCContext *s)
Uninitialize LPCContext.
static const float quant_step_size[]
#define AV_CH_LAYOUT_5POINT1
static void copy_filter_params(ChannelParams *dst_cp, ChannelParams *src_cp, int filter)
static void input_to_sample_buffer(MLPEncodeContext *ctx)
static void rematrix_channels(MLPEncodeContext *ctx)
Rematrixes all channels using chosen coefficients.
static void default_decoding_params(MLPEncodeContext *ctx, DecodingParams *decoding_params)
Sets default vales in our encoder for a DecodingParams struct.
int32_t coeff[NUM_FILTERS][MAX_FIR_ORDER]
unsigned int * max_output_bits
largest output bit-depth
static int number_sbits(int number)
Calculates the smallest number of bits it takes to encode a given signed value in two's complement.
int coded_sample_rate[2]
sample rate encoded for MLP
unsigned int number_of_samples
unsigned int major_number_of_subblocks
uint8_t channel_arrangement
channel arrangement for MLP streams
uint8_t ff_mlp_restart_checksum(const uint8_t *buf, unsigned int bit_size)
Calculate an 8-bit checksum over a restart header – a non-multiple-of-8 number of bits,...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
static void code_filter_coeffs(MLPEncodeContext *ctx, FilterParams *fp, int32_t *fcoeff)
Determines the smallest number of bits needed to encode the filter coefficients, and if it's possible...
An AVChannelLayout holds information about the channel layout of audio data.
static int shift(int a, int b)
unsigned int max_restart_interval
Max interval of access units in between two major frames.
enum AVSampleFormat sample_fmt
audio sample format
#define MAX_SUBSTREAMS
Maximum number of substreams that can be decoded.
int32_t * write_buffer
Pointer to data currently being written to bitstream.
uint8_t ch_modifier_thd0
channel modifier for TrueHD stream 0
const FFCodec ff_truehd_encoder
BestOffset(* cur_best_offset)[NUM_CODEBOOKS]
#define NUM_FILTERS
number of allowed filters
DecodingParams * cur_decoding_params
uint8_t order
number of taps in filter
static void generate_2_noise_channels(MLPEncodeContext *ctx)
Generates two noise channels worth of data.
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
uint8_t quant_step_size[MAX_CHANNELS]
left shift to apply to Huffman-decoded residuals
#define AV_CH_LAYOUT_5POINT1_BACK
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
int16_t huff_offset
Offset to apply to residual values.
int flags
A combination of AV_PKT_FLAG values.
static int number_trailing_zeroes(int32_t sample)
Counts the number of trailing zeroes in a value.
#define AV_CH_LAYOUT_3POINT1
static int compare_filter_params(const ChannelParams *prev_cp, const ChannelParams *cp, int filter)
Compares two FilterParams structures and returns 1 if anything has changed.
#define AV_CH_LAYOUT_5POINT0
#define CODEC_OLD_CHANNEL_LAYOUTS_ARRAY(array)
DecodingParams * decoding_params
unsigned int restart_intervals
Number of possible major frame sizes.
uint8_t outch[MAX_MATRICES]
output channel for each matrix
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int put_bits_count(PutBitContext *s)
int32_t * inout_buffer
Pointer to data currently being read from lavc or written to bitstream.
#define AV_CH_LAYOUT_2POINT1
#define SUBSTREAM_INFO_ALWAYS_SET
static DecodingParams restart_decoding_params[MAX_SUBSTREAMS]
BestOffset best_offset[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS][NUM_CODEBOOKS]
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
AVSampleFormat
Audio sample formats.
#define AV_CH_LAYOUT_4POINT1
unsigned int max_codebook_search
uint16_t input_timing
Decoding timestamp of current access unit.
@ AV_SAMPLE_FMT_S16
signed 16 bits
const char * name
Name of the codec implementation.
const AVChannelLayout ff_mlp_ch_layouts[12]
sample data coding information
av_cold void ff_mlp_init_crc(void)
void * av_calloc(size_t nmemb, size_t size)
#define MAJOR_SYNC_INFO_SIGNATURE
ChannelParams * cur_channel_params
int64_t frame_num
Frame counter, set by libavcodec.
#define NUM_CODEBOOKS
Number of possible codebooks (counting "no codebooks")
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
#define AV_CH_LAYOUT_SURROUND
DecodingParams major_decoding_params[MAJOR_HEADER_INTERVAL+1]
DecodingParams to be written to bitstream.
int32_t coeff[MAX_MATRICES][MAX_CHANNELS+2]
decoding coefficients
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
static int best_codebook_path_cost(MLPEncodeContext *ctx, unsigned int channel, PathCounter *src, int cur_codebook)
static void no_codebook_bits_offset(MLPEncodeContext *ctx, unsigned int channel, int16_t offset, int32_t min, int32_t max, BestOffset *bo)
Determines the amount of bits needed to encode the samples using no codebooks and a specified offset.
static int compare_decoding_params(MLPEncodeContext *ctx)
Compares two DecodingParams and ChannelParams structures to decide if a new decoding params header ha...
static void determine_quant_step_size(MLPEncodeContext *ctx)
Determines how many bits are zero at the end of all samples so they can be shifted out.
static int compare_best_offset(const BestOffset *prev, const BestOffset *cur)
main external API structure.
int major_params_changed[MAJOR_HEADER_INTERVAL+1]
params_changed to be written to bitstream.
uint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout, uint64_t mask)
Find out what channels from a given set are present in a channel layout, without regard for their pos...
static void write_filter_params(MLPEncodeContext *ctx, PutBitContext *pb, unsigned int channel, unsigned int filter)
Writes filter parameters for one filter to the bitstream.
const FFCodec ff_mlp_encoder
static void clear_channel_params(ChannelParams channel_params[MAX_CHANNELS], int nb_channels)
Clears a ChannelParams struct the way it should be after a restart header.
int32_t * major_inout_buffer
Buffer with all in/out data for one entire major frame interval.
ChannelParams * channel_params
unsigned int next_major_number_of_frames
MatrixParams matrix_params
static void analyze_sample_buffer(MLPEncodeContext *ctx)
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Filter the word “frame” indicates either a video frame or a group of audio samples
#define SAMPLE_MIN(bitdepth)
unsigned int one_sample_buffer_size
Number of samples*channel for one access unit.
static void codebook_bits_offset(MLPEncodeContext *ctx, unsigned int channel, int codebook, int32_t sample_min, int32_t sample_max, int16_t offset, BestOffset *bo)
Determines the least amount of bits needed to encode the samples using a given codebook and a given o...
RestartHeader restart_header
unsigned int seq_index
Sequence index for high compression levels.
unsigned int frame_index
Index of current frame being encoded.
static void process_major_frame(MLPEncodeContext *ctx)
const DecodingParams * prev_decoding_params
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
unsigned int seq_size[MAJOR_HEADER_INTERVAL]
#define AV_CHANNEL_LAYOUT_MONO
const uint8_t ff_mlp_huffman_tables[3][18][2]
Tables defining the Huffman codes.
static av_cold int mlp_encode_init(AVCodecContext *avctx)
This structure stores compressed data.
DecodingParams * seq_decoding_params
#define AV_CH_LAYOUT_4POINT0
unsigned int seq_offset[MAJOR_HEADER_INTERVAL]
#define CODEBOOK_CHANGE_BITS
static const double coeff[2][5]
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static void write_matrix_params(MLPEncodeContext *ctx, PutBitContext *pb)
Writes matrix params for all primitive matrices to the bitstream.
#define AV_CHANNEL_LAYOUT_5POINT0
#define MLP_MIN_LPC_SHIFT
uint8_t count
number of matrices to apply
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define AV_CHANNEL_LAYOUT_5POINT1
static void determine_filters(MLPEncodeContext *ctx)
Tries to determine a good prediction filter, and applies it to the samples buffer if the filter is go...
uint8_t shift
Right shift to apply to output of filter.
@ AV_SAMPLE_FMT_S32
signed 32 bits
#define MLP_MAX_LPC_SHIFT
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
@ FF_LPC_TYPE_LEVINSON
Levinson-Durbin recursion.
uint8_t param_presence_flags
Bitmask of which parameter sets are conveyed in a decoding parameter block.
#define MAJOR_HEADER_INTERVAL
MLP encoder Copyright (c) 2008 Ramiro Polla Copyright (c) 2016-2019 Jai Luthra.
static const unsigned codebook[256][2]
static void write_restart_header(MLPEncodeContext *ctx, PutBitContext *pb)
Writes a restart header to the bitstream.