Go to the documentation of this file.
36 #define ROUND_MULL(a,b,s) (((MUL64(a, b) >> ((s) - 1)) + 1) >> 1)
74 for (pass = 0; pass < 20; pass++) {
76 for (
i = 0;
i < order+1;
i++) {
77 int low =
i != 0 ? nlsf[
i-1] : 0;
78 int high =
i != order ? nlsf[
i] : 32768;
81 if (
diff < min_diff) {
95 nlsf[0] = min_delta[0];
96 }
else if (k == order) {
98 nlsf[order-1] = 32768 - min_delta[order];
101 int min_center = 0, max_center = 32768, center_val;
104 for (
i = 0;
i < k;
i++)
105 min_center += min_delta[
i];
106 min_center += min_delta[k] >> 1;
109 for (
i = order;
i > k;
i--)
110 max_center -= min_delta[
i];
111 max_center -= min_delta[k] >> 1;
114 center_val = nlsf[k - 1] + nlsf[k];
115 center_val = (center_val >> 1) + (center_val & 1);
116 center_val =
FFMIN(max_center,
FFMAX(min_center, center_val));
118 nlsf[k - 1] = center_val - (min_delta[k] >> 1);
119 nlsf[k] = nlsf[k - 1] + min_delta[k];
126 for (
i = 1;
i < order;
i++) {
128 for (j =
i - 1; j >= 0 && nlsf[j] >
value; j--)
129 nlsf[j + 1] = nlsf[j];
134 if (nlsf[0] < min_delta[0])
135 nlsf[0] = min_delta[0];
136 for (
i = 1;
i < order;
i++)
137 nlsf[
i] =
FFMAX(nlsf[
i],
FFMIN(nlsf[
i - 1] + min_delta[
i], 32767));
140 if (nlsf[order-1] > 32768 - min_delta[order])
141 nlsf[order-1] = 32768 - min_delta[order];
142 for (
i = order-2;
i >= 0;
i--)
143 if (nlsf[
i] > nlsf[
i + 1] - min_delta[
i+1])
144 nlsf[
i] = nlsf[
i + 1] - min_delta[
i+1];
151 int k, j, DC_resp = 0;
153 int totalinvgain = 1 << 30;
154 int32_t *row = lpc32[0], *prevrow;
157 for (k = 0; k < order; k++) {
159 row[k] = lpc[k] * 4096;
166 for (k = order - 1; 1; k--) {
173 if (
FFABS(row[k]) > 16773022)
176 rc = -(row[k] * 128);
177 gaindiv = (1 << 30) -
MULH(rc, rc);
179 totalinvgain =
MULH(totalinvgain, gaindiv) << 2;
181 return (totalinvgain >= 107374);
185 gain = ((1 << 29) - 1) / (gaindiv >> (fbits + 1 - 16));
186 error = (1 << 29) -
MULL(gaindiv << (15 + 16 - fbits), gain, 16);
187 gain = ((gain << 16) + (
error * gain >> 13));
193 for (j = 0; j < k; j++) {
199 if (tmp < INT32_MIN || tmp > INT32_MAX)
215 for (
i = 1;
i < half_order;
i++) {
217 for (j =
i; j > 1; j--)
218 pol[j] += pol[j - 2] -
ROUND_MULL(lsp[2 *
i], pol[j - 1], 16);
220 pol[1] -= lsp[2 *
i];
224 static void silk_lsf2lpc(
const int16_t nlsf[16],
float lpcf[16],
int order)
233 for (k = 0; k < order; k++) {
234 int index = nlsf[k] >> 8;
235 int offset = nlsf[k] & 255;
241 lsp[k2] = (lsp[k2] + 4) >> 3;
248 for (k = 0; k < order>>1; k++) {
250 int32_t q_tmp = q[k + 1] - q[k];
251 lpc32[k] = -q_tmp - p_tmp;
252 lpc32[order-k-1] = q_tmp - p_tmp;
256 for (
i = 0;
i < 10;
i++) {
258 unsigned int maxabs = 0;
259 for (j = 0, k = 0; j < order; j++) {
260 unsigned int x =
FFABS(lpc32[k]);
267 maxabs = (maxabs + 16) >> 5;
269 if (maxabs > 32767) {
271 unsigned int chirp, chirp_base;
272 maxabs =
FFMIN(maxabs, 163838);
273 chirp_base = chirp = 65470 - ((maxabs - 32767) << 14) / ((maxabs * (k+1)) >> 2);
275 for (k = 0; k < order; k++) {
277 chirp = (chirp_base * chirp + 32768) >> 16;
284 for (k = 0; k < order; k++) {
285 int x = (lpc32[k] + 16) >> 5;
287 lpc32[k] = lpc[k] << 5;
290 for (k = 0; k < order; k++)
291 lpc[k] = (lpc32[k] + 16) >> 5;
297 unsigned int chirp, chirp_base;
298 chirp_base = chirp = 65536 - (1 <<
i);
300 for (k = 0; k < order; k++) {
302 lpc[k] = (lpc32[k] + 16) >> 5;
303 chirp = (chirp_base * chirp + 32768) >> 16;
307 for (
i = 0;
i < order;
i++)
308 lpcf[
i] = lpc[
i] / 4096.0
f;
313 float lpc_leadin[16],
float lpc[16],
314 int *lpc_order,
int *has_lpc_leadin,
int voiced)
318 int8_t lsf_i1, lsf_i2[16];
322 *lpc_order = order =
s->wb ? 16 : 10;
326 for (
i = 0;
i < order;
i++) {
332 else if (lsf_i2[
i] == 4)
337 for (
i = order - 1;
i >= 0;
i--) {
338 int qstep =
s->wb ? 9830 : 11796;
340 lsf_res[
i] = lsf_i2[
i] * 1024;
341 if (lsf_i2[
i] < 0) lsf_res[
i] += 102;
342 else if (lsf_i2[
i] > 0) lsf_res[
i] -= 102;
343 lsf_res[
i] = (lsf_res[
i] * qstep) >> 16;
348 lsf_res[
i] += (lsf_res[
i+1] *
weight) >> 8;
353 for (
i = 0;
i < order;
i++) {
374 if (
s->subframes == 4) {
379 int16_t nlsf_leadin[16];
380 for (
i = 0;
i < order;
i++)
381 nlsf_leadin[
i] =
frame->nlsf[
i] +
385 memcpy(lpc_leadin,
frame->lpc, 16 *
sizeof(
float));
388 s->nlsf_interp_factor =
offset;
392 s->nlsf_interp_factor = 4;
396 memcpy(
frame->nlsf, nlsf, order *
sizeof(nlsf[0]));
397 memcpy(
frame->lpc, lpc, order *
sizeof(lpc[0]));
406 child[1] = total - child[0];
415 int qoffset_high,
int active,
int voiced)
421 uint8_t pulsecount[20];
422 uint8_t lsbcount[20] = {0};
430 for (
i = 0;
i < shellblocks;
i++) {
432 if (pulsecount[
i] == 17) {
433 while (pulsecount[
i] == 17 && ++lsbcount[
i] != 10)
435 if (lsbcount[
i] == 10)
441 for (
i = 0;
i < shellblocks;
i++) {
442 if (pulsecount[
i] != 0) {
444 int32_t * location = excitation + 16*
i;
446 branch[0][0] = pulsecount[
i];
449 for (
a = 0;
a < 1;
a++) {
451 for (
b = 0;
b < 2;
b++) {
453 for (
c = 0;
c < 2;
c++) {
455 for (d = 0; d < 2; d++) {
463 memset(excitation + 16*
i, 0, 16*
sizeof(
int32_t));
467 for (
i = 0;
i < shellblocks << 4;
i++) {
469 for (
bit = 0; bit < lsbcount[i >> 4];
bit++)
470 excitation[
i] = (excitation[
i] << 1) |
475 for (
i = 0;
i < shellblocks << 4;
i++) {
476 if (excitation[
i] != 0) {
478 voiced][qoffset_high][
FFMIN(pulsecount[
i >> 4], 6)]);
485 for (
i = 0;
i < shellblocks << 4;
i++) {
486 int value = excitation[
i];
488 if (
value < 0) excitation[
i] += 20;
489 else if (
value > 0) excitation[
i] -= 20;
492 seed = 196314165 *
seed + 907633515;
493 if (
seed & 0x80000000)
497 excitationf[
i] = excitation[
i] / 8388608.0f;
502 #define SILK_MAX_LAG (288 + LTP_ORDER / 2)
508 int frame_num,
int channel,
int coded_channels,
509 int active,
int active1,
int redundant)
531 if (coded_channels == 2 &&
channel == 0) {
532 int n, wi[2], ws[2],
w[2];
539 for (
i = 0;
i < 2;
i++)
544 s->stereo_weights[0] = (
w[0] -
w[1]) / 8192.0;
545 s->stereo_weights[1] =
w[1] / 8192.0;
557 qoffset_high =
type & 1;
562 for (
i = 0;
i <
s->subframes;
i++) {
564 int ipart, fpart, lingain;
566 if (
i == 0 && (frame_num == 0 || !
frame->coded)) {
572 log_gain =
FFMAX(log_gain,
frame->log_gain - 16);
577 frame->log_gain + delta_gain - 4), 6);
580 frame->log_gain = log_gain;
583 log_gain = (log_gain * 0x1D1C71 >> 16) + 2090;
584 ipart = log_gain >> 7;
585 fpart = log_gain & 127;
586 lingain = (1 << ipart) + ((-174 * fpart * (128-fpart) >>16) + fpart) * ((1<<ipart) >> 7);
587 sf[
i].gain = lingain / 65536.0f;
595 int lag_absolute = (!frame_num || !
frame->prev_voiced);
610 int highbits, lowbits;
611 static const uint16_t *
const model[] = {
621 frame->primarylag = primarylag;
623 if (
s->subframes == 2)
636 for (
i = 0;
i <
s->subframes;
i++)
643 for (
i = 0;
i <
s->subframes;
i++) {
645 static const uint16_t *
const filter_sel[] = {
649 static const int8_t (*
const filter_taps[])[5] = {
653 for (j = 0; j < 5; j++)
654 sf[
i].ltptaps[j] = filter_taps[ltpfilter][
index][j] / 128.0
f;
659 if (voiced && frame_num == 0)
662 else ltpscale = 15565.0f/16384.0f;
670 if (
s->output_channels ==
channel || redundant)
674 for (
i = 0;
i <
s->subframes;
i++) {
675 const float * lpc_coeff = (
i < 2 && has_lpc_leadin) ? lpc_leadin : lpc_body;
686 if (i < 2 || s->nlsf_interp_factor == 4) {
687 out_end = -
i *
s->sflength;
690 out_end = -(
i - 2) *
s->sflength;
696 for (j = - sf[
i].pitchlag -
LTP_ORDER/2; j < out_end; j++) {
698 for (k = 0; k < order; k++)
699 sum -= lpc_coeff[k] *
dst[j - k - 1];
704 float rescale = sf[
i-1].gain / sf[
i].gain;
705 for (j = out_end; j < 0; j++)
710 for (j = 0; j <
s->sflength; j++) {
713 sum += sf[
i].ltptaps[k] * resptr[j - sf[
i].pitchlag +
LTP_ORDER/2 - k];
719 for (j = 0; j <
s->sflength; j++) {
720 sum = resptr[j] * sf[
i].gain;
721 for (k = 1; k <= order; k++)
722 sum += lpc_coeff[k - 1] * lpc[j - k];
729 frame->prev_voiced = voiced;
740 float w0_prev =
s->prev_stereo_weights[0];
741 float w1_prev =
s->prev_stereo_weights[1];
742 float w0 =
s->stereo_weights[0];
743 float w1 =
s->stereo_weights[1];
747 for (
i = 0;
i < n1;
i++) {
748 float interp0 = w0_prev +
i * (w0 - w0_prev) / n1;
749 float interp1 = w1_prev +
i * (w1 - w1_prev) / n1;
750 float p0 = 0.25 * (mid[
i - 2] + 2 * mid[
i - 1] + mid[
i]);
752 l[
i] =
av_clipf((1 + interp1) * mid[
i - 1] + side[
i - 1] + interp0 * p0, -1.0, 1.0);
753 r[
i] =
av_clipf((1 - interp1) * mid[
i - 1] - side[
i - 1] - interp0 * p0, -1.0, 1.0);
756 for (;
i <
s->flength;
i++) {
757 float p0 = 0.25 * (mid[
i - 2] + 2 * mid[
i - 1] + mid[
i]);
759 l[
i] =
av_clipf((1 + w1) * mid[
i - 1] + side[
i - 1] + w0 * p0, -1.0, 1.0);
760 r[
i] =
av_clipf((1 - w1) * mid[
i - 1] - side[
i - 1] - w0 * p0, -1.0, 1.0);
763 memcpy(
s->prev_stereo_weights,
s->stereo_weights,
sizeof(
s->stereo_weights));
771 memset(
frame->output, 0,
sizeof(
frame->output));
772 memset(
frame->lpc_history, 0,
sizeof(
frame->lpc_history));
779 frame->primarylag = 0;
780 frame->prev_voiced = 0;
790 int active[2][6], redundancy[2];
794 coded_channels > 2 || duration_ms > 60) {
796 "to the SILK decoder.\n");
800 nb_frames = 1 + (duration_ms > 20) + (duration_ms > 40);
801 s->subframes = duration_ms / nb_frames / 5;
802 s->sflength = 20 * (bandwidth + 2);
803 s->flength =
s->sflength *
s->subframes;
804 s->bandwidth = bandwidth;
808 if (coded_channels >
s->prev_coded_channels)
810 s->prev_coded_channels = coded_channels;
813 for (
i = 0;
i < coded_channels;
i++) {
814 for (j = 0; j < nb_frames; j++)
821 for (
i = 0;
i < coded_channels;
i++)
822 if (redundancy[
i] && duration_ms > 20) {
828 for (
i = 0;
i < nb_frames;
i++) {
829 for (j = 0; j < coded_channels; j++)
830 if (redundancy[j] & (1 <<
i)) {
831 int active1 = (j == 0 && !(redundancy[1] & (1 <<
i))) ? 0 : 1;
838 for (
i = 0;
i < nb_frames;
i++) {
839 for (j = 0; j < coded_channels && !
s->midonly; j++) {
840 int active1 = coded_channels > 1 ? active[1][
i] : 0;
845 if (
s->midonly &&
s->frame[1].coded)
848 if (coded_channels == 1 ||
s->output_channels == 1) {
849 for (j = 0; j <
s->output_channels; j++) {
852 s->flength *
sizeof(
float));
861 return nb_frames *
s->flength;
874 memset(
s->prev_stereo_weights, 0,
sizeof(
s->prev_stereo_weights));
881 if (output_channels != 1 && output_channels != 2) {
892 s->output_channels = output_channels;
static void error(const char *err)
const uint8_t ff_silk_lsf_codebook_wb[32][16]
const uint16_t ff_silk_model_gain_highbits[3][9]
float lpc_history[2 *SILK_HISTORY]
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
const int16_t ff_silk_cosine[]
@ OPUS_BANDWIDTH_NARROWBAND
const uint16_t ff_silk_model_stereo_s1[]
float prev_stereo_weights[2]
const uint16_t ff_silk_model_gain_lowbits[]
static void silk_stabilize_lsf(int16_t nlsf[16], int order, const uint16_t min_delta[17])
#define ROUND_MULL(a, b, s)
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 output
static int silk_is_lpc_stable(const int16_t lpc[16], int order)
const uint8_t ff_silk_lsf_weight_sel_nbmb[32][9]
static void silk_count_children(OpusRangeCoder *rc, int model, int32_t total, int32_t child[2])
const uint16_t ff_silk_model_pitch_delta[]
float output[2 *SILK_HISTORY]
const int8_t ff_silk_pitch_offset_mbwb20ms[34][4]
static void silk_lsf2lpc(const int16_t nlsf[16], float lpcf[16], int order)
const uint8_t ff_silk_lsf_weight_sel_wb[32][15]
#define ff_silk_model_pitch_lowbits_nb
#define bit(string, value)
const uint16_t ff_silk_lsf_min_spacing_wb[]
enum OpusBandwidth bandwidth
const uint16_t ff_silk_model_lsf_s2_ext[]
const h264_weight_func weight
void ff_silk_free(SilkContext **ps)
const uint16_t ff_silk_model_excitation_sign[3][2][7][3]
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 type
#define ff_silk_model_pitch_lowbits_wb
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const uint16_t ff_silk_model_pitch_contour_mbwb20ms[]
const uint16_t ff_silk_model_lsf_interpolation_offset[]
const uint8_t ff_silk_lsf_codebook_nbmb[32][10]
const uint8_t ff_silk_lsf_s2_model_sel_wb[32][16]
const uint8_t ff_silk_lsf_s2_model_sel_nbmb[32][10]
static const int offsets[]
const uint8_t ff_silk_lsf_pred_weights_wb[2][15]
const uint16_t ff_silk_model_lcg_seed[]
const int8_t ff_silk_pitch_offset_nb10ms[3][2]
const uint16_t ff_silk_model_excitation_lsb[]
const uint8_t ff_silk_lsf_ordering_nbmb[]
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
@ OPUS_BANDWIDTH_WIDEBAND
const int8_t ff_silk_pitch_offset_nb20ms[11][4]
const uint16_t ff_silk_model_ltp_filter0_sel[]
const int16_t ff_silk_stereo_weights[]
const uint16_t ff_silk_model_lbrr_flags_40[]
const uint16_t ff_silk_model_lsf_s1[2][2][33]
#define LTP_ORDER
Order of the LTP filter.
const uint16_t ff_silk_model_pitch_highbits[]
uint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits)
const uint16_t ff_silk_model_mid_only[]
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int ff_silk_init(void *logctx, SilkContext **ps, int output_channels)
void ff_silk_flush(SilkContext *s)
const uint8_t ff_silk_shell_blocks[3][2]
const uint16_t ff_silk_model_gain_delta[]
static void rescale(GDVContext *gdv, uint8_t *dst, int w, int h, int scale_v, int scale_h)
static void silk_unmix_ms(SilkContext *s, float *l, float *r)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
#define i(width, name, range_min, range_max)
const uint8_t ff_silk_lsf_ordering_wb[]
const uint16_t ff_silk_model_pulse_location[4][168]
const uint16_t ff_silk_model_lsf_weight_wb[32][16]
#define SILK_MAX_LAG
Maximum residual history according to 4.2.7.6.1.
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
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
static void silk_flush_frame(SilkFrame *frame)
const int8_t ff_silk_ltp_filter2_taps[32][5]
uint32_t ff_opus_rc_dec_cdf(OpusRangeCoder *rc, const uint16_t *cdf)
const uint16_t ff_silk_model_pitch_contour_nb10ms[]
const uint16_t ff_silk_model_pitch_contour_nb20ms[]
const uint16_t ff_silk_model_ltp_filter1_sel[]
const uint16_t ff_silk_model_lsf_weight_nbmb[32][10]
static void silk_decode_excitation(SilkContext *s, OpusRangeCoder *rc, float *excitationf, int qoffset_high, int active, int voiced)
const int8_t ff_silk_ltp_filter1_taps[16][5]
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 default value
const uint16_t ff_silk_model_lbrr_flags_60[]
const uint16_t ff_silk_model_exc_rate[2][10]
const uint16_t ff_silk_model_frame_type_inactive[]
const uint16_t ff_silk_lsf_min_spacing_nbmb[]
const int8_t ff_silk_pitch_offset_mbwb10ms[12][2]
const uint16_t ff_silk_model_ltp_filter2_sel[]
const uint16_t ff_silk_model_pitch_lowbits_mb[]
const uint16_t ff_silk_model_stereo_s2[]
const uint16_t ff_silk_pitch_scale[]
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
const uint16_t ff_silk_pitch_max_lag[]
static void silk_decode_frame(SilkContext *s, OpusRangeCoder *rc, int frame_num, int channel, int coded_channels, int active, int active1, int redundant)
const uint8_t ff_silk_lsf_pred_weights_nbmb[2][9]
const uint16_t ff_silk_model_ltp_filter[]
int ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc, float *output[2], enum OpusBandwidth bandwidth, int coded_channels, int duration_ms)
Decode the LP layer of one Opus frame (which may correspond to several SILK frames).
const int ff_silk_stereo_interp_len[3]
const int8_t ff_silk_ltp_filter0_taps[8][5]
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
const uint16_t ff_silk_model_frame_type_active[]
const uint16_t ff_silk_model_ltp_scale_index[]
const uint16_t ff_silk_model_lsf_s2[32][10]
static void scale(int *out, const int *in, const int w, const int h, const int shift)
const uint16_t ff_silk_pitch_min_lag[]
static void silk_lsp2poly(const int32_t lsp[], int32_t pol[], int half_order)
const uint16_t ff_silk_model_pulse_count[11][19]
const uint8_t ff_silk_quant_offset[2][2]
static void silk_decode_lpc(SilkContext *s, SilkFrame *frame, OpusRangeCoder *rc, float lpc_leadin[16], float lpc[16], int *lpc_order, int *has_lpc_leadin, int voiced)
const uint16_t ff_silk_ltp_scale_factor[]
static const unsigned codebook[256][2]
const uint16_t ff_silk_model_pitch_contour_mbwb10ms[]
const uint16_t ff_silk_model_stereo_s3[]