// 8 -> 48 resampler void WebRtcSpl_Resample8khzTo48khz(const WebRtc_Word16* in, WebRtc_Word16* out, WebRtcSpl_State8khzTo48khz* state, WebRtc_Word32* tmpmem) { ///// 8 --> 16 ///// // WebRtc_Word16 in[80] // WebRtc_Word32 out[160] ///// WebRtcSpl_UpBy2ShortToInt(in, 80, tmpmem + 264, state->S_8_16); ///// 16 --> 12 ///// // WebRtc_Word32 in[160] // WebRtc_Word32 out[120] ///// // copy state to and from input array memcpy(tmpmem + 256, state->S_16_12, 8 * sizeof(WebRtc_Word32)); memcpy(state->S_16_12, tmpmem + 416, 8 * sizeof(WebRtc_Word32)); WebRtcSpl_Resample32khzTo24khz(tmpmem + 256, tmpmem + 240, 40); ///// 12 --> 24 ///// // WebRtc_Word32 in[120] // WebRtc_Word16 out[240] ///// WebRtcSpl_UpBy2IntToInt(tmpmem + 240, 120, tmpmem, state->S_12_24); ///// 24 --> 48 ///// // WebRtc_Word32 in[240] // WebRtc_Word16 out[480] ///// WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48); }
int16_t WebRtcOpus_Encode(OpusEncInst *inst, int16_t *audioIn, uint8_t *encoded, int16_t encodedLenByte, int16_t len) { int16_t buffer16[48*WEBRTC_OPUS_MAX_ENCODE_FRAME_SIZE_MS]; int32_t buffer32[64*WEBRTC_OPUS_MAX_ENCODE_FRAME_SIZE_MS+7]; int i; if (len > 32*WEBRTC_OPUS_MAX_ENCODE_FRAME_SIZE_MS) { return -1; } /* Resample 32 kHz to 64 kHz. */ for(i = 0; i < 7; i++) { buffer32[i] = inst->state_64_48[i]; } WebRtcSpl_UpBy2ShortToInt(audioIn, len, buffer32+7, inst->state_32_64); /* Resample 64 kHz to 48 kHz. */ for(i = 0; i < 7; i++) { inst->state_64_48[i] = buffer32[2*len+i]; } len >>= 1; WebRtcSpl_Resample32khzTo24khz(buffer32, buffer32, len); len *= 3; WebRtcSpl_VectorBitShiftW32ToW16(buffer16, len, buffer32, 15); return WebRtcOpus_EncodeNative(inst, buffer16, encoded, encodedLenByte, len); }
// 22 -> 16 resampler void WebRtcSpl_Resample22khzTo16khz(const int16_t* in, int16_t* out, WebRtcSpl_State22khzTo16khz* state, int32_t* tmpmem) { int k; // process two blocks of 10/SUB_BLOCKS_22_16 ms (to reduce temp buffer size) for (k = 0; k < SUB_BLOCKS_22_16; k++) { ///// 22 --> 44 ///// // int16_t in[220/SUB_BLOCKS_22_16] // int32_t out[440/SUB_BLOCKS_22_16] ///// WebRtcSpl_UpBy2ShortToInt(in, 220 / SUB_BLOCKS_22_16, tmpmem + 16, state->S_22_44); ///// 44 --> 32 ///// // int32_t in[440/SUB_BLOCKS_22_16] // int32_t out[320/SUB_BLOCKS_22_16] ///// // copy state to and from input array tmpmem[8] = state->S_44_32[0]; tmpmem[9] = state->S_44_32[1]; tmpmem[10] = state->S_44_32[2]; tmpmem[11] = state->S_44_32[3]; tmpmem[12] = state->S_44_32[4]; tmpmem[13] = state->S_44_32[5]; tmpmem[14] = state->S_44_32[6]; tmpmem[15] = state->S_44_32[7]; state->S_44_32[0] = tmpmem[440 / SUB_BLOCKS_22_16 + 8]; state->S_44_32[1] = tmpmem[440 / SUB_BLOCKS_22_16 + 9]; state->S_44_32[2] = tmpmem[440 / SUB_BLOCKS_22_16 + 10]; state->S_44_32[3] = tmpmem[440 / SUB_BLOCKS_22_16 + 11]; state->S_44_32[4] = tmpmem[440 / SUB_BLOCKS_22_16 + 12]; state->S_44_32[5] = tmpmem[440 / SUB_BLOCKS_22_16 + 13]; state->S_44_32[6] = tmpmem[440 / SUB_BLOCKS_22_16 + 14]; state->S_44_32[7] = tmpmem[440 / SUB_BLOCKS_22_16 + 15]; WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 40 / SUB_BLOCKS_22_16); ///// 32 --> 16 ///// // int32_t in[320/SUB_BLOCKS_22_16] // int32_t out[160/SUB_BLOCKS_22_16] ///// WebRtcSpl_DownBy2IntToShort(tmpmem, 320 / SUB_BLOCKS_22_16, out, state->S_32_16); // move input/output pointers 10/SUB_BLOCKS_22_16 ms seconds ahead in += 220 / SUB_BLOCKS_22_16; out += 160 / SUB_BLOCKS_22_16; } }
// 8 -> 22 resampler void WebRtcSpl_Resample8khzTo22khz(const int16_t* in, int16_t* out, WebRtcSpl_State8khzTo22khz* state, int32_t* tmpmem) { int k; // process two blocks of 10/SUB_BLOCKS_8_22 ms (to reduce temp buffer size) for (k = 0; k < SUB_BLOCKS_8_22; k++) { ///// 8 --> 16 ///// // int16_t in[80/SUB_BLOCKS_8_22] // int32_t out[160/SUB_BLOCKS_8_22] ///// WebRtcSpl_UpBy2ShortToInt(in, 80 / SUB_BLOCKS_8_22, tmpmem + 18, state->S_8_16); ///// 16 --> 11 ///// // int32_t in[160/SUB_BLOCKS_8_22] // int32_t out[110/SUB_BLOCKS_8_22] ///// // copy state to and from input array tmpmem[10] = state->S_16_11[0]; tmpmem[11] = state->S_16_11[1]; tmpmem[12] = state->S_16_11[2]; tmpmem[13] = state->S_16_11[3]; tmpmem[14] = state->S_16_11[4]; tmpmem[15] = state->S_16_11[5]; tmpmem[16] = state->S_16_11[6]; tmpmem[17] = state->S_16_11[7]; state->S_16_11[0] = tmpmem[160 / SUB_BLOCKS_8_22 + 10]; state->S_16_11[1] = tmpmem[160 / SUB_BLOCKS_8_22 + 11]; state->S_16_11[2] = tmpmem[160 / SUB_BLOCKS_8_22 + 12]; state->S_16_11[3] = tmpmem[160 / SUB_BLOCKS_8_22 + 13]; state->S_16_11[4] = tmpmem[160 / SUB_BLOCKS_8_22 + 14]; state->S_16_11[5] = tmpmem[160 / SUB_BLOCKS_8_22 + 15]; state->S_16_11[6] = tmpmem[160 / SUB_BLOCKS_8_22 + 16]; state->S_16_11[7] = tmpmem[160 / SUB_BLOCKS_8_22 + 17]; WebRtcSpl_32khzTo22khzIntToInt(tmpmem + 10, tmpmem, 10 / SUB_BLOCKS_8_22); ///// 11 --> 22 ///// // int32_t in[110/SUB_BLOCKS_8_22] // int16_t out[220/SUB_BLOCKS_8_22] ///// WebRtcSpl_UpBy2IntToShort(tmpmem, 110 / SUB_BLOCKS_8_22, out, state->S_11_22); // move input/output pointers 10/SUB_BLOCKS_8_22 ms seconds ahead in += 80 / SUB_BLOCKS_8_22; out += 220 / SUB_BLOCKS_8_22; } }
// 16 -> 22 resampler void WebRtcSpl_Resample16khzTo22khz(const int16_t* in, int16_t* out, WebRtcSpl_State16khzTo22khz* state, int32_t* tmpmem) { int k; // process two blocks of 10/SUB_BLOCKS_16_22 ms (to reduce temp buffer size) for (k = 0; k < SUB_BLOCKS_16_22; k++) { ///// 16 --> 32 ///// // int16_t in[160/SUB_BLOCKS_16_22] // int32_t out[320/SUB_BLOCKS_16_22] ///// WebRtcSpl_UpBy2ShortToInt(in, 160 / SUB_BLOCKS_16_22, tmpmem + 8, state->S_16_32); ///// 32 --> 22 ///// // int32_t in[320/SUB_BLOCKS_16_22] // int32_t out[220/SUB_BLOCKS_16_22] ///// // copy state to and from input array tmpmem[0] = state->S_32_22[0]; tmpmem[1] = state->S_32_22[1]; tmpmem[2] = state->S_32_22[2]; tmpmem[3] = state->S_32_22[3]; tmpmem[4] = state->S_32_22[4]; tmpmem[5] = state->S_32_22[5]; tmpmem[6] = state->S_32_22[6]; tmpmem[7] = state->S_32_22[7]; state->S_32_22[0] = tmpmem[320 / SUB_BLOCKS_16_22]; state->S_32_22[1] = tmpmem[320 / SUB_BLOCKS_16_22 + 1]; state->S_32_22[2] = tmpmem[320 / SUB_BLOCKS_16_22 + 2]; state->S_32_22[3] = tmpmem[320 / SUB_BLOCKS_16_22 + 3]; state->S_32_22[4] = tmpmem[320 / SUB_BLOCKS_16_22 + 4]; state->S_32_22[5] = tmpmem[320 / SUB_BLOCKS_16_22 + 5]; state->S_32_22[6] = tmpmem[320 / SUB_BLOCKS_16_22 + 6]; state->S_32_22[7] = tmpmem[320 / SUB_BLOCKS_16_22 + 7]; WebRtcSpl_32khzTo22khzIntToShort(tmpmem, out, 20 / SUB_BLOCKS_16_22); // move input/output pointers 10/SUB_BLOCKS_16_22 ms seconds ahead in += 160 / SUB_BLOCKS_16_22; out += 220 / SUB_BLOCKS_16_22; } }
// 16 -> 48 resampler void WebRtcSpl_Resample16khzTo48khz(const WebRtc_Word16* in, WebRtc_Word16* out, WebRtcSpl_State16khzTo48khz* state, WebRtc_Word32* tmpmem) { ///// 16 --> 32 ///// // WebRtc_Word16 in[160] // WebRtc_Word32 out[320] ///// WebRtcSpl_UpBy2ShortToInt(in, 160, tmpmem + 16, state->S_16_32); ///// 32 --> 24 ///// // WebRtc_Word32 in[320] // WebRtc_Word32 out[240] // copy state to and from input array ///// memcpy(tmpmem + 8, state->S_32_24, 8 * sizeof(WebRtc_Word32)); memcpy(state->S_32_24, tmpmem + 328, 8 * sizeof(WebRtc_Word32)); WebRtcSpl_Resample32khzTo24khz(tmpmem + 8, tmpmem, 80); ///// 24 --> 48 ///// // WebRtc_Word32 in[240] // WebRtc_Word16 out[480] ///// WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48); }