Files
AsminVoicechat/source/decompiled/de/maxhenkel/voicechat/concentus/DecodeAPI.java
T
asminme bbccd4a815
Build AsminVoicechat / prepare-release (push) Successful in 14s
Build AsminVoicechat / build-and-test (17) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (18) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (19) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (20) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (21) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (22) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (23) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (24) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (25) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (26) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (27-ea) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (16) (push) Canceled after 38s
first commit
2026-10-24 15:18:03 +02:00

246 lines
13 KiB
Java

/*
* Decompiled with CFR 0.152.
*/
package de.maxhenkel.voicechat.concentus;
import de.maxhenkel.voicechat.concentus.Arrays;
import de.maxhenkel.voicechat.concentus.BoxedValueInt;
import de.maxhenkel.voicechat.concentus.DecControlState;
import de.maxhenkel.voicechat.concentus.DecodeIndices;
import de.maxhenkel.voicechat.concentus.DecodePulses;
import de.maxhenkel.voicechat.concentus.EntropyCoder;
import de.maxhenkel.voicechat.concentus.Inlines;
import de.maxhenkel.voicechat.concentus.Resampler;
import de.maxhenkel.voicechat.concentus.SilkChannelDecoder;
import de.maxhenkel.voicechat.concentus.SilkDecoder;
import de.maxhenkel.voicechat.concentus.SilkError;
import de.maxhenkel.voicechat.concentus.SilkTables;
import de.maxhenkel.voicechat.concentus.Stereo;
class DecodeAPI {
DecodeAPI() {
}
static int silk_InitDecoder(SilkDecoder decState) {
decState.Reset();
int ret = SilkError.SILK_NO_ERROR;
SilkChannelDecoder[] channel_states = decState.channel_state;
for (int n = 0; n < 2; ++n) {
ret = channel_states[n].silk_init_decoder();
}
decState.sStereo.Reset();
decState.prev_decode_only_middle = 0;
return ret;
}
static int silk_Decode(SilkDecoder psDec, DecControlState decControl, int lostFlag, int newPacketFlag, EntropyCoder psRangeDec, short[] samplesOut, int samplesOut_ptr, BoxedValueInt nSamplesOut) {
int resample_out_ptr;
short[] resample_out;
short[] samplesOut_tmp;
boolean delay_stack_alloc;
int condCoding;
int i;
boolean stereo_to_mono;
int n;
int decode_only_middle = 0;
int ret = SilkError.SILK_NO_ERROR;
BoxedValueInt nSamplesOutDec = new BoxedValueInt(0);
int[] samplesOut_tmp_ptrs = new int[2];
int[] MS_pred_Q13 = new int[]{0, 0};
SilkChannelDecoder[] channel_state = psDec.channel_state;
nSamplesOut.Val = 0;
Inlines.OpusAssert(decControl.nChannelsInternal == 1 || decControl.nChannelsInternal == 2);
if (newPacketFlag != 0) {
for (n = 0; n < decControl.nChannelsInternal; ++n) {
channel_state[n].nFramesDecoded = 0;
}
}
if (decControl.nChannelsInternal > psDec.nChannelsInternal) {
ret += channel_state[1].silk_init_decoder();
}
boolean bl = stereo_to_mono = decControl.nChannelsInternal == 1 && psDec.nChannelsInternal == 2 && decControl.internalSampleRate == 1000 * channel_state[0].fs_kHz;
if (channel_state[0].nFramesDecoded == 0) {
for (n = 0; n < decControl.nChannelsInternal; ++n) {
if (decControl.payloadSize_ms == 0) {
channel_state[n].nFramesPerPacket = 1;
channel_state[n].nb_subfr = 2;
} else if (decControl.payloadSize_ms == 10) {
channel_state[n].nFramesPerPacket = 1;
channel_state[n].nb_subfr = 2;
} else if (decControl.payloadSize_ms == 20) {
channel_state[n].nFramesPerPacket = 1;
channel_state[n].nb_subfr = 4;
} else if (decControl.payloadSize_ms == 40) {
channel_state[n].nFramesPerPacket = 2;
channel_state[n].nb_subfr = 4;
} else if (decControl.payloadSize_ms == 60) {
channel_state[n].nFramesPerPacket = 3;
channel_state[n].nb_subfr = 4;
} else {
Inlines.OpusAssert(false);
return SilkError.SILK_DEC_INVALID_FRAME_SIZE;
}
int fs_kHz_dec = (decControl.internalSampleRate >> 10) + 1;
if (fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16) {
Inlines.OpusAssert(false);
return SilkError.SILK_DEC_INVALID_SAMPLING_FREQUENCY;
}
ret += channel_state[n].silk_decoder_set_fs(fs_kHz_dec, decControl.API_sampleRate);
}
}
if (decControl.nChannelsAPI == 2 && decControl.nChannelsInternal == 2 && (psDec.nChannelsAPI == 1 || psDec.nChannelsInternal == 1)) {
Arrays.MemSet(psDec.sStereo.pred_prev_Q13, (short)0, 2);
Arrays.MemSet(psDec.sStereo.sSide, (short)0, 2);
channel_state[1].resampler_state.Assign(channel_state[0].resampler_state);
}
psDec.nChannelsAPI = decControl.nChannelsAPI;
psDec.nChannelsInternal = decControl.nChannelsInternal;
if (decControl.API_sampleRate > 48000 || decControl.API_sampleRate < 8000) {
ret = SilkError.SILK_DEC_INVALID_SAMPLING_FREQUENCY;
return ret;
}
if (lostFlag != 1 && channel_state[0].nFramesDecoded == 0) {
for (n = 0; n < decControl.nChannelsInternal; ++n) {
for (i = 0; i < channel_state[n].nFramesPerPacket; ++i) {
channel_state[n].VAD_flags[i] = psRangeDec.dec_bit_logp(1L);
}
channel_state[n].LBRR_flag = psRangeDec.dec_bit_logp(1L);
}
for (n = 0; n < decControl.nChannelsInternal; ++n) {
Arrays.MemSet(channel_state[n].LBRR_flags, 0, 3);
if (channel_state[n].LBRR_flag == 0) continue;
if (channel_state[n].nFramesPerPacket == 1) {
channel_state[n].LBRR_flags[0] = 1;
continue;
}
int LBRR_symbol = psRangeDec.dec_icdf(SilkTables.silk_LBRR_flags_iCDF_ptr[channel_state[n].nFramesPerPacket - 2], 8) + 1;
for (i = 0; i < channel_state[n].nFramesPerPacket; ++i) {
channel_state[n].LBRR_flags[i] = Inlines.silk_RSHIFT(LBRR_symbol, i) & 1;
}
}
if (lostFlag == 0) {
for (i = 0; i < channel_state[0].nFramesPerPacket; ++i) {
for (n = 0; n < decControl.nChannelsInternal; ++n) {
if (channel_state[n].LBRR_flags[i] == 0) continue;
short[] pulses = new short[320];
if (decControl.nChannelsInternal == 2 && n == 0) {
Stereo.silk_stereo_decode_pred(psRangeDec, MS_pred_Q13);
if (channel_state[1].LBRR_flags[i] == 0) {
BoxedValueInt decodeOnlyMiddleBoxed = new BoxedValueInt(decode_only_middle);
Stereo.silk_stereo_decode_mid_only(psRangeDec, decodeOnlyMiddleBoxed);
decode_only_middle = decodeOnlyMiddleBoxed.Val;
}
}
condCoding = i > 0 && channel_state[n].LBRR_flags[i - 1] != 0 ? 2 : 0;
DecodeIndices.silk_decode_indices(channel_state[n], psRangeDec, i, 1, condCoding);
DecodePulses.silk_decode_pulses(psRangeDec, pulses, channel_state[n].indices.signalType, channel_state[n].indices.quantOffsetType, channel_state[n].frame_length);
}
}
}
}
if (decControl.nChannelsInternal == 2) {
if (lostFlag == 0 || lostFlag == 2 && channel_state[0].LBRR_flags[channel_state[0].nFramesDecoded] == 1) {
Stereo.silk_stereo_decode_pred(psRangeDec, MS_pred_Q13);
if (lostFlag == 0 && channel_state[1].VAD_flags[channel_state[0].nFramesDecoded] == 0 || lostFlag == 2 && channel_state[1].LBRR_flags[channel_state[0].nFramesDecoded] == 0) {
BoxedValueInt decodeOnlyMiddleBoxed = new BoxedValueInt(decode_only_middle);
Stereo.silk_stereo_decode_mid_only(psRangeDec, decodeOnlyMiddleBoxed);
decode_only_middle = decodeOnlyMiddleBoxed.Val;
} else {
decode_only_middle = 0;
}
} else {
for (n = 0; n < 2; ++n) {
MS_pred_Q13[n] = psDec.sStereo.pred_prev_Q13[n];
}
}
}
if (decControl.nChannelsInternal == 2 && decode_only_middle == 0 && psDec.prev_decode_only_middle == 1) {
Arrays.MemSet(psDec.channel_state[1].outBuf, (short)0, 480);
Arrays.MemSet(psDec.channel_state[1].sLPC_Q14_buf, 0, 16);
psDec.channel_state[1].lagPrev = 100;
psDec.channel_state[1].LastGainIndex = (byte)10;
psDec.channel_state[1].prevSignalType = 0;
psDec.channel_state[1].first_frame_after_reset = 1;
}
boolean bl2 = delay_stack_alloc = decControl.internalSampleRate * decControl.nChannelsInternal < decControl.API_sampleRate * decControl.nChannelsAPI;
if (delay_stack_alloc) {
samplesOut_tmp = samplesOut;
samplesOut_tmp_ptrs[0] = samplesOut_ptr;
samplesOut_tmp_ptrs[1] = samplesOut_ptr + channel_state[0].frame_length + 2;
} else {
short[] samplesOut1_tmp_storage1 = new short[decControl.nChannelsInternal * (channel_state[0].frame_length + 2)];
samplesOut_tmp = samplesOut1_tmp_storage1;
samplesOut_tmp_ptrs[0] = 0;
samplesOut_tmp_ptrs[1] = channel_state[0].frame_length + 2;
}
boolean has_side = lostFlag == 0 ? decode_only_middle == 0 : psDec.prev_decode_only_middle == 0 || decControl.nChannelsInternal == 2 && lostFlag == 2 && channel_state[1].LBRR_flags[channel_state[1].nFramesDecoded] == 1;
for (n = 0; n < decControl.nChannelsInternal; ++n) {
if (n == 0 || has_side) {
int FrameIndex = channel_state[0].nFramesDecoded - n;
condCoding = FrameIndex <= 0 ? 0 : (lostFlag == 2 ? (channel_state[n].LBRR_flags[FrameIndex - 1] != 0 ? 2 : 0) : (n > 0 && psDec.prev_decode_only_middle != 0 ? 1 : 2));
ret += channel_state[n].silk_decode_frame(psRangeDec, samplesOut_tmp, samplesOut_tmp_ptrs[n] + 2, nSamplesOutDec, lostFlag, condCoding);
} else {
Arrays.MemSetWithOffset(samplesOut_tmp, (short)0, samplesOut_tmp_ptrs[n] + 2, nSamplesOutDec.Val);
}
++channel_state[n].nFramesDecoded;
}
if (decControl.nChannelsAPI == 2 && decControl.nChannelsInternal == 2) {
Stereo.silk_stereo_MS_to_LR(psDec.sStereo, samplesOut_tmp, samplesOut_tmp_ptrs[0], samplesOut_tmp, samplesOut_tmp_ptrs[1], MS_pred_Q13, channel_state[0].fs_kHz, nSamplesOutDec.Val);
} else {
System.arraycopy(psDec.sStereo.sMid, 0, samplesOut_tmp, samplesOut_tmp_ptrs[0], 2);
System.arraycopy(samplesOut_tmp, samplesOut_tmp_ptrs[0] + nSamplesOutDec.Val, psDec.sStereo.sMid, 0, 2);
}
nSamplesOut.Val = Inlines.silk_DIV32(nSamplesOutDec.Val * decControl.API_sampleRate, Inlines.silk_SMULBB(channel_state[0].fs_kHz, 1000));
if (decControl.nChannelsAPI == 2) {
short[] samplesOut2_tmp = new short[nSamplesOut.Val];
resample_out = samplesOut2_tmp;
resample_out_ptr = 0;
} else {
resample_out = samplesOut;
resample_out_ptr = samplesOut_ptr;
}
if (delay_stack_alloc) {
short[] samplesOut1_tmp_storage2 = new short[decControl.nChannelsInternal * (channel_state[0].frame_length + 2)];
System.arraycopy(samplesOut, samplesOut_ptr, samplesOut1_tmp_storage2, 0, decControl.nChannelsInternal * (channel_state[0].frame_length + 2));
samplesOut_tmp = samplesOut1_tmp_storage2;
samplesOut_tmp_ptrs[0] = 0;
samplesOut_tmp_ptrs[1] = channel_state[0].frame_length + 2;
}
for (n = 0; n < Inlines.silk_min(decControl.nChannelsAPI, decControl.nChannelsInternal); ++n) {
ret += Resampler.silk_resampler(channel_state[n].resampler_state, resample_out, resample_out_ptr, samplesOut_tmp, samplesOut_tmp_ptrs[n] + 1, nSamplesOutDec.Val);
if (decControl.nChannelsAPI != 2) continue;
int nptr = samplesOut_ptr + n;
for (i = 0; i < nSamplesOut.Val; ++i) {
samplesOut[nptr + 2 * i] = resample_out[resample_out_ptr + i];
}
}
if (decControl.nChannelsAPI == 2 && decControl.nChannelsInternal == 1) {
if (stereo_to_mono) {
ret += Resampler.silk_resampler(channel_state[1].resampler_state, resample_out, resample_out_ptr, samplesOut_tmp, samplesOut_tmp_ptrs[0] + 1, nSamplesOutDec.Val);
for (i = 0; i < nSamplesOut.Val; ++i) {
samplesOut[samplesOut_ptr + 1 + 2 * i] = resample_out[resample_out_ptr + i];
}
} else {
for (i = 0; i < nSamplesOut.Val; ++i) {
samplesOut[samplesOut_ptr + 1 + 2 * i] = samplesOut[samplesOut_ptr + 2 * i];
}
}
}
if (channel_state[0].prevSignalType == 2) {
int[] mult_tab = new int[]{6, 4, 3};
decControl.prevPitchLag = channel_state[0].lagPrev * mult_tab[channel_state[0].fs_kHz - 8 >> 2];
} else {
decControl.prevPitchLag = 0;
}
if (lostFlag == 1) {
for (i = 0; i < psDec.nChannelsInternal; ++i) {
psDec.channel_state[i].LastGainIndex = (byte)10;
}
} else {
psDec.prev_decode_only_middle = decode_only_middle;
}
return ret;
}
}