34 #define DSS_SP_FRAME_SIZE 42 35 #define DSS_SP_SAMPLE_COUNT (66 * SUBFRAMES) 36 #define DSS_SP_FORMULA(a, b, c) ((((a) << 15) + (b) * (c)) + 0x4000) >> 15 46 int16_t filter_idx[14];
89 12, 13, 14, 15, 16, 17,
90 18, 19, 20, 21, 22, 23,
91 24, 25, 26, 27, 28, 29,
92 30, 31, 32, 33, 34, 35,
93 36, 37, 38, 39, 40, 41,
94 42, 43, 44, 45, 46, 47,
95 48, 49, 50, 51, 52, 53,
96 54, 55, 56, 57, 58, 59,
97 60, 61, 62, 63, 64, 65,
98 66, 67, 68, 69, 70, 71 },
100 15, 21, 28, 36, 45, 55,
101 66, 78, 91, 105, 120, 136,
102 153, 171, 190, 210, 231, 253,
103 276, 300, 325, 351, 378, 406,
104 435, 465, 496, 528, 561, 595,
105 630, 666, 703, 741, 780, 820,
106 861, 903, 946, 990, 1035, 1081,
107 1128, 1176, 1225, 1275, 1326, 1378,
108 1431, 1485, 1540, 1596, 1653, 1711,
109 1770, 1830, 1891, 1953, 2016, 2080,
110 2145, 2211, 2278, 2346, 2415, 2485 },
112 20, 35, 56, 84, 120, 165,
113 220, 286, 364, 455, 560, 680,
114 816, 969, 1140, 1330, 1540, 1771,
115 2024, 2300, 2600, 2925, 3276, 3654,
116 4060, 4495, 4960, 5456, 5984, 6545,
117 7140, 7770, 8436, 9139, 9880, 10660,
118 11480, 12341, 13244, 14190, 15180, 16215,
119 17296, 18424, 19600, 20825, 22100, 23426,
120 24804, 26235, 27720, 29260, 30856, 32509,
121 34220, 35990, 37820, 39711, 41664, 43680,
122 45760, 47905, 50116, 52394, 54740, 57155 },
124 15, 35, 70, 126, 210, 330,
125 495, 715, 1001, 1365, 1820, 2380,
126 3060, 3876, 4845, 5985, 7315, 8855,
127 10626, 12650, 14950, 17550, 20475, 23751,
128 27405, 31465, 35960, 40920, 46376, 52360,
129 58905, 66045, 73815, 82251, 91390, 101270,
130 111930, 123410, 135751, 148995, 163185, 178365,
131 194580, 211876, 230300, 249900, 270725, 292825,
132 316251, 341055, 367290, 395010, 424270, 455126,
133 487635, 521855, 557845, 595665, 635376, 677040,
134 720720, 766480, 814385, 864501, 916895, 971635 },
136 6, 21, 56, 126, 252, 462,
137 792, 1287, 2002, 3003, 4368, 6188,
138 8568, 11628, 15504, 20349, 26334, 33649,
139 42504, 53130, 65780, 80730, 98280, 118755,
140 142506, 169911, 201376, 237336, 278256, 324632,
141 376992, 435897, 501942, 575757, 658008, 749398,
142 850668, 962598, 1086008, 1221759, 1370754, 1533939,
143 1712304, 1906884, 2118760, 2349060, 2598960, 2869685,
144 3162510, 3478761, 3819816, 4187106, 4582116, 5006386,
145 5461512, 5949147, 6471002, 7028847, 7624512, 8259888,
146 8936928, 9657648, 10424128, 11238513, 12103014, 13019909 },
148 1, 7, 28, 84, 210, 462,
149 924, 1716, 3003, 5005, 8008, 12376,
150 18564, 27132, 38760, 54264, 74613, 100947,
151 134596, 177100, 230230, 296010, 376740, 475020,
152 593775, 736281, 906192, 1107568, 1344904, 1623160,
153 1947792, 2324784, 2760681, 3262623, 3838380, 4496388,
154 5245786, 6096454, 7059052, 8145060, 9366819, 10737573,
155 12271512, 13983816, 15890700, 18009460, 20358520, 22957480,
156 25827165, 28989675, 32468436, 36288252, 40475358, 45057474,
157 50063860, 55525372, 61474519, 67945521, 74974368, 82598880,
158 90858768, 99795696, 109453344, 119877472, 131115985, 143218999 },
160 0, 1, 8, 36, 120, 330,
161 792, 1716, 3432, 6435, 11440, 19448,
162 31824, 50388, 77520, 116280, 170544, 245157,
163 346104, 480700, 657800, 888030, 1184040, 1560780,
164 2035800, 2629575, 3365856, 4272048, 5379616, 6724520,
165 8347680, 10295472, 12620256, 15380937, 18643560, 22481940,
166 26978328, 32224114, 38320568, 45379620, 53524680, 62891499,
167 73629072, 85900584, 99884400, 115775100, 133784560, 154143080,
168 177100560, 202927725, 231917400, 264385836, 300674088, 341149446,
169 386206920, 436270780, 491796152, 553270671, 621216192, 696190560,
170 778789440, 869648208, 969443904, 1078897248, 1198774720, 1329890705 },
174 { -32653, -32587, -32515, -32438, -32341, -32216, -32062, -31881,
175 -31665, -31398, -31080, -30724, -30299, -29813, -29248, -28572,
176 -27674, -26439, -24666, -22466, -19433, -16133, -12218, -7783,
177 -2834, 1819, 6544, 11260, 16050, 20220, 24774, 28120 },
179 { -27503, -24509, -20644, -17496, -14187, -11277, -8420, -5595,
180 -3013, -624, 1711, 3880, 5844, 7774, 9739, 11592,
181 13364, 14903, 16426, 17900, 19250, 20586, 21803, 23006,
182 24142, 25249, 26275, 27300, 28359, 29249, 30118, 31183 },
184 { -27827, -24208, -20943, -17781, -14843, -11848, -9066, -6297,
185 -3660, -910, 1918, 5025, 8223, 11649, 15086, 18423,
186 0, 0, 0, 0, 0, 0, 0, 0,
187 0, 0, 0, 0, 0, 0, 0, 0 },
189 { -17128, -11975, -8270, -5123, -2296, 183, 2503, 4707,
190 6798, 8945, 11045, 13239, 15528, 18248, 21115, 24785,
191 0, 0, 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0 },
194 { -21557, -17280, -14286, -11644, -9268, -7087, -4939, -2831,
195 -691, 1407, 3536, 5721, 8125, 10677, 13721, 17731,
196 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0 },
199 { -15030, -10377, -7034, -4327, -1900, 364, 2458, 4450,
200 6422, 8374, 10374, 12486, 14714, 16997, 19626, 22954,
201 0, 0, 0, 0, 0, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0 },
204 { -16155, -12362, -9698, -7460, -5258, -3359, -1547, 219,
205 1916, 3599, 5299, 6994, 8963, 11226, 13716, 16982,
206 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0 },
209 { -14742, -9848, -6921, -4648, -2769, -1065, 499, 2083,
210 3633, 5219, 6857, 8580, 10410, 12672, 15561, 20101,
211 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0 },
214 { -11099, -7014, -3855, -1025, 1680, 4544, 7807, 11932,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0 },
219 { -9060, -4570, -1381, 1419, 4034, 6728, 9865, 14149,
220 0, 0, 0, 0, 0, 0, 0, 0,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0 },
224 { -12450, -7985, -4596, -1734, 961, 3629, 6865, 11142,
225 0, 0, 0, 0, 0, 0, 0, 0,
226 0, 0, 0, 0, 0, 0, 0, 0,
227 0, 0, 0, 0, 0, 0, 0, 0 },
229 { -11831, -7404, -4010, -1096, 1606, 4291, 7386, 11482,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0 },
234 { -13404, -9250, -5995, -3312, -890, 1594, 4464, 8198,
235 0, 0, 0, 0, 0, 0, 0, 0,
236 0, 0, 0, 0, 0, 0, 0, 0,
237 0, 0, 0, 0, 0, 0, 0, 0 },
239 { -11239, -7220, -4040, -1406, 971, 3321, 6006, 9697,
240 0, 0, 0, 0, 0, 0, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0 },
246 0, 4, 8, 13, 17, 22, 26, 31,
247 35, 40, 44, 48, 53, 58, 63, 69,
248 76, 83, 91, 99, 109, 119, 130, 142,
249 155, 170, 185, 203, 222, 242, 265, 290,
250 317, 346, 378, 414, 452, 494, 540, 591,
251 646, 706, 771, 843, 922, 1007, 1101, 1204,
252 1316, 1438, 1572, 1719, 1879, 2053, 2244, 2453,
253 2682, 2931, 3204, 3502, 3828, 4184, 4574, 5000,
257 -31182, -22273, -13364, -4455, 4455, 13364, 22273, 31182
261 32767, 16384, 8192, 4096, 2048, 1024, 512, 256,
262 128, 64, 32, 16, 8, 4, 2,
266 32767, 26214, 20972, 16777, 13422, 10737, 8590, 6872,
267 5498, 4398, 3518, 2815, 2252, 1801, 1441,
271 102, 231, 360, 488, 617, 746, 875, 1004,
272 1133, 1261, 1390, 1519, 1648, 1777, 1905, 2034,
273 2163, 2292, 2421, 2550, 2678, 2807, 2936, 3065,
274 3194, 3323, 3451, 3580, 3709, 3838, 3967, 4096,
278 262, 293, 323, 348, 356, 336, 269, 139,
279 -67, -358, -733, -1178, -1668, -2162, -2607, -2940,
280 -3090, -2986, -2562, -1760, -541, 1110, 3187, 5651,
281 8435, 11446, 14568, 17670, 20611, 23251, 25460, 27125,
283 27125, 25460, 23251, 20611, 17670, 14568, 11446, 8435,
284 5651, 3187, 1110, -541, -1760, -2562, -2986, -3090,
285 -2940, -2607, -2162, -1668, -1178, -733, -358, -67,
286 139, 269, 336, 356, 348, 323, 293, 262,
309 uint32_t combined_pitch;
314 p->
bits[i] = src[i + 1];
315 p->
bits[i + 1] = src[i];
320 for (i = 0; i < 2; i++)
327 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
334 for (i = 0; i < 7; i++)
338 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
339 unsigned int C72_binomials[
PULSE_MAX] = {
340 72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
347 if (combined_pulse_pos < C72_binomials[
PULSE_MAX - 1]) {
349 int pulse, pulse_idx;
359 for (i = 0; i < 7; i++) {
365 combined_pulse_pos -=
366 dss_sp_combinatorial_table[pulse][pulse_idx];
377 for (i = 71; i >= 0; i--) {
378 if (C72_binomials[index] <= combined_pulse_pos) {
379 combined_pulse_pos -= C72_binomials[
index];
381 fparam->
sf[subframe_idx].
pulse_pos[(index ^ 7) - 1] = i;
390 for (a = 0; a <
index; a++)
391 C72_binomials[a + 1] -= C72_binomials[a];
399 fparam->
pitch_lag[0] = (combined_pitch % 151) + 36;
401 combined_pitch /= 151;
404 fparam->
pitch_lag[i] = combined_pitch % 48;
405 combined_pitch /= 48;
410 if (pitch_lag > 162) {
413 tmp = pitch_lag - 23;
426 for (i = 0; i < 14; i++)
435 for (a = 0; a < 14; a++) {
437 coeffs[a_plus] = lpc_filter[
a] >> 2;
438 if (a_plus / 2 >= 1) {
439 for (i = 1; i <= a_plus / 2; i++) {
440 int coeff_1, coeff_2,
tmp;
443 coeff_2 = coeffs[a_plus - i];
446 coeffs[i] = av_clip_int16(tmp);
449 coeffs[a_plus - i] = av_clip_int16(tmp);
460 for (i = 0; i < 7; i++)
467 int pitch_lag,
int gain)
474 for (i = 0; i < 72; i++)
475 vector[i] = prev_exc[pitch_lag - i % pitch_lag];
477 for (i = 0; i < 72; i++)
478 vector[i] = prev_exc[pitch_lag - i];
480 for (i = 0; i < 72; i++) {
481 int tmp = gain * vector[i] >> 11;
482 vector[i] = av_clip_int16(tmp);
491 for (i = 0; i <
size; i++)
492 vec[i] = vec[i] >> -bits;
494 for (i = 0; i <
size; i++)
495 vec[i] = vec[i] << bits;
502 for (i = 114; i > 0; i--)
503 vector[i + 72] = vector[i];
505 for (i = 0; i < 72; i++)
506 vector[72 - i] = hist[i];
514 for (a = 0; a < 72; a++) {
517 tmp = dst[
a] * filter_buf[0];
519 for (i = 14; i > 0; i--)
520 tmp -= error_buf[i] * filter_buf[i];
522 for (i = 14; i > 0; i--)
523 error_buf[i] = error_buf[i - 1];
525 tmp = (tmp + 4096) >> 13;
529 dst[
a] = av_clip_int16(tmp);
538 for (a = 0; a < 72; a++) {
541 audio_buf[0] = dst[
a];
543 for (i = 14; i >= 0; i--)
544 tmp += audio_buf[i] * filter_buf[i];
546 for (i = 14; i > 0; i--)
547 audio_buf[i] = audio_buf[i - 1];
549 tmp = (tmp + 4096) >> 13;
551 dst[
a] = av_clip_int16(tmp);
562 for (i = 1; i < 15; i++)
563 dst[i] = (src[i] * mult[i] + 0x4000) >> 15;
573 for (i = 0; i <
size; i++)
574 val |=
FFABS(vector_buf[i]);
576 for (max_val = 0; val <= 0x4000; ++max_val)
584 for (i = 0; i <
size; i++)
594 int bias, vsum_2 = 0, vsum_1 = 0, v36, normalize_bits;
600 if (vsum_1 > 0xFFFFF)
619 lpc_filter = lpc_filter >> 1;
624 for (i = size - 1; i > 0; i--) {
642 tmp = (vsum_1 << 11) / vsum_2;
646 bias = 409 * tmp >> 15 << 15;
648 noise[0] = av_clip_int16(tmp);
650 for (i = 1; i <
size; i++) {
651 tmp = (bias + 32358 * noise[i - 1]) >> 15;
652 noise[i] = av_clip_int16(tmp);
656 for (i = 0; i <
size; i++) {
658 dst[i] = av_clip_int16(tmp);
664 int i, offset = 6, counter = 0,
a = 0;
666 for (i = 0; i < 6; i++)
675 for (i = 0; i < 6; i++)
681 dst[counter] = av_clip_int16(
tmp);
695 for (i = 0; i <
size; i++)
696 dst[i] = av_clip_int16(src[i]);
700 int16_t *abuf_dst,
const uint8_t *abuf_src)
719 for (i = 0; i < 72; i++)
737 int *got_frame_ptr,
AVPacket *avpkt)
742 int buf_size = avpkt->
size;
750 "Expected %d bytes, got %d - skipping packet.\n",
762 out = (int16_t *)frame->
data[0];
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
static int noise(AVBSFContext *ctx, AVPacket *out)
AVCodec ff_dss_sp_decoder
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
memory handling functions
static const uint16_t dss_sp_adaptive_gain[]
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
#define DECLARE_ALIGNED(n, t, v)
static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
static void dss_sp_gen_exc(int32_t *vector, int32_t *prev_exc, int pitch_lag, int gain)
static const uint32_t dss_sp_combinatorial_table[PULSE_MAX][72]
#define FF_ARRAY_ELEMS(a)
int32_t combined_pulse_pos
static void dss_sp_unpack_filter(DssSpContext *p)
#define DSS_SP_FRAME_SIZE
enum AVSampleFormat sample_fmt
audio sample format
static void dss_sp_shift_sq_add(const int32_t *filter_buf, int32_t *audio_buf, int32_t *dst)
static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
bitstream reader API header.
int32_t excitation[288+6]
uint8_t bits[DSS_SP_FRAME_SIZE+AV_INPUT_BUFFER_PADDING_SIZE]
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int dss_sp_vector_sum(DssSpContext *p, int size)
static void dss_sp_add_pulses(int32_t *vector_buf, const struct DssSpSubframe *sf)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
const char * name
Name of the codec implementation.
static int dss_sp_get_normalize_bits(int32_t *vector_buf, int16_t size)
static const int16_t dss_sp_filter_cb[14][32]
#define DSS_SP_SAMPLE_COUNT
static av_cold int dss_sp_decode_init(AVCodecContext *avctx)
uint64_t channel_layout
Audio channel layout.
static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
audio channel layout utility functions
#define DSS_SP_FORMULA(a, b, c)
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
struct DssSpSubframe sf[SUBFRAMES]
static const int32_t dss_sp_sinc[67]
static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
Libavcodec external API header.
static const uint16_t dss_sp_unc_decreasing_array[]
int sample_rate
samples per second
main external API structure.
static void dss_sp_vec_mult(const int32_t *src, int32_t *dst, const int16_t *mult)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static int16_t mult(Float11 *f1, Float11 *f2)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
static void dss_sp_sf_synthesis(DssSpContext *p, int32_t lpc_filter, int32_t *dst, int size)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
int16_t sf_adaptive_gain[SUBFRAMES]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
static int dss_sp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
common internal api header.
common internal and external API header
static av_cold int init(AVCodecParserContext *s)
int32_t working_buffer[SUBFRAMES][72]
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int channels
number of audio channels
int16_t pitch_lag[SUBFRAMES]
static void dss_sp_shift_sq_sub(const int32_t *filter_buf, int32_t *error_buf, int32_t *dst)
static int dss_sp_decode_one_frame(DssSpContext *p, int16_t *abuf_dst, const uint8_t *abuf_src)
static const uint16_t dss_sp_fixed_cb_gain[64]
#define AV_CH_LAYOUT_MONO
static const int16_t dss_sp_pulse_val[8]
This structure stores compressed data.
static const uint16_t binary_decreasing_array[]
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.