20#include <freerdp/config.h>
22#include <winpr/assert.h>
29#include <freerdp/types.h>
30#include <freerdp/log.h>
31#include <freerdp/codec/dsp.h>
35#if defined(WITH_FDK_AAC)
36#include "dsp_fdk_aac.h"
39#if !defined(WITH_DSP_FFMPEG)
51#define OPUS_MAX_FRAMES 5760ull
54#if defined(WITH_FAAD2)
67#include "dsp_ffmpeg.h"
70#if !defined(WITH_DSP_FFMPEG)
72#define TAG FREERDP_TAG("dsp")
91struct S_FREERDP_DSP_CONTEXT
100#if defined(WITH_LAME)
104#if defined(WITH_OPUS)
105 OpusDecoder* opus_decoder;
106 OpusEncoder* opus_encoder;
108#if defined(WITH_FAAD2)
113#if defined(WITH_FAAC)
115 unsigned long faacInputSamples;
116 unsigned long faacMaxOutputBytes;
119#if defined(WITH_SOXR)
124#if defined(WITH_OPUS)
125static BOOL opus_is_valid_samplerate(
const AUDIO_FORMAT* WINPR_RESTRICT format)
127 WINPR_ASSERT(format);
129 switch (format->nSamplesPerSec)
143static INT16 read_int16(
const BYTE* WINPR_RESTRICT src)
145 return (INT16)(src[0] | (src[1] << 8));
148static BOOL freerdp_dsp_channel_mix(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
149 const BYTE* WINPR_RESTRICT src,
size_t size,
151 const BYTE** WINPR_RESTRICT data,
size_t* WINPR_RESTRICT length)
153 if (!context || !data || !length)
156 if (srcFormat->wFormatTag != WAVE_FORMAT_PCM)
159 const UINT32 bpp = srcFormat->wBitsPerSample > 8 ? 2 : 1;
160 const size_t samples = size / bpp / srcFormat->nChannels;
162 if (context->common.format.nChannels == srcFormat->nChannels)
169 Stream_SetPosition(context->common.channelmix, 0);
172 if (context->common.format.nChannels > srcFormat->nChannels)
174 switch (srcFormat->nChannels)
177 if (!Stream_EnsureCapacity(context->common.channelmix, size * 2))
180 for (
size_t x = 0; x < samples; x++)
182 for (
size_t y = 0; y < bpp; y++)
183 Stream_Write_UINT8(context->common.channelmix, src[x * bpp + y]);
185 for (
size_t y = 0; y < bpp; y++)
186 Stream_Write_UINT8(context->common.channelmix, src[x * bpp + y]);
189 Stream_SealLength(context->common.channelmix);
190 *data = Stream_Buffer(context->common.channelmix);
191 *length = Stream_Length(context->common.channelmix);
201 switch (srcFormat->nChannels)
204 if (!Stream_EnsureCapacity(context->common.channelmix, size / 2))
209 for (
size_t x = 0; x < samples; x++)
211 for (
size_t y = 0; y < bpp; y++)
212 Stream_Write_UINT8(context->common.channelmix, src[2 * x * bpp + y]);
215 Stream_SealLength(context->common.channelmix);
216 *data = Stream_Buffer(context->common.channelmix);
217 *length = Stream_Length(context->common.channelmix);
233static BOOL freerdp_dsp_resample(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
234 const BYTE* WINPR_RESTRICT src,
size_t size,
236 const BYTE** WINPR_RESTRICT data,
size_t* WINPR_RESTRICT length)
238#if defined(WITH_SOXR)
241 size_t sframes, rframes;
243 size_t sbytes, rbytes;
246 size_t srcBytesPerFrame, dstBytesPerFrame;
250 if (srcFormat->wFormatTag != WAVE_FORMAT_PCM)
252 WLog_ERR(TAG,
"requires %s for sample input, got %s",
253 audio_format_get_tag_string(WAVE_FORMAT_PCM),
254 audio_format_get_tag_string(srcFormat->wFormatTag));
260 format.wFormatTag = WAVE_FORMAT_UNKNOWN;
261 format.wBitsPerSample = 0;
263 if (audio_format_compatible(&format, &context->common.format))
270#if defined(WITH_SOXR)
271 srcBytesPerFrame = (srcFormat->wBitsPerSample > 8) ? 2 : 1;
272 dstBytesPerFrame = (context->common.format.wBitsPerSample > 8) ? 2 : 1;
273 srcChannels = srcFormat->nChannels;
274 dstChannels = context->common.format.nChannels;
275 sbytes = srcChannels * srcBytesPerFrame;
276 sframes = size / sbytes;
277 rbytes = dstBytesPerFrame * dstChannels;
280 (sframes * context->common.format.nSamplesPerSec + (srcFormat->nSamplesPerSec + 1) / 2) /
281 srcFormat->nSamplesPerSec;
282 rsize = rframes * rbytes;
284 if (!Stream_EnsureCapacity(context->common.resample, rsize))
288 soxr_process(context->sox, src, sframes, &idone, Stream_Buffer(context->common.resample),
289 Stream_Capacity(context->common.resample) / rbytes, &odone);
290 Stream_SetLength(context->common.resample, odone * rbytes);
291 *data = Stream_Buffer(context->common.resample);
292 *length = Stream_Length(context->common.resample);
293 return (error == 0) != 0;
295 WLog_ERR(TAG,
"Missing resample support, recompile -DWITH_SOXR=ON or -DWITH_DSP_FFMPEG=ON");
307static const INT16 ima_step_index_table[] = {
308 -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8
311static const INT16 ima_step_size_table[] = {
312 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23,
313 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80,
314 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279,
315 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
316 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
317 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487,
318 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
321static UINT16 dsp_decode_ima_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm,
unsigned int channel,
324 const INT32 ss = ima_step_size_table[adpcm->ima.last_step[channel]];
339 d += adpcm->ima.last_sample[channel];
346 adpcm->ima.last_sample[channel] = (INT16)d;
347 adpcm->ima.last_step[channel] = adpcm->ima.last_step[channel] + ima_step_index_table[sample];
349 if (adpcm->ima.last_step[channel] < 0)
350 adpcm->ima.last_step[channel] = 0;
351 else if (adpcm->ima.last_step[channel] > 88)
352 adpcm->ima.last_step[channel] = 88;
357static BOOL freerdp_dsp_decode_ima_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
358 const BYTE* WINPR_RESTRICT src,
size_t size,
361 size_t out_size = size * 4;
362 const UINT32 block_size = context->common.format.nBlockAlign;
363 const UINT32 channels = context->common.format.nChannels;
365 if (!Stream_EnsureCapacity(out, out_size))
370 if (size % block_size == 0)
372 context->adpcm.ima.last_sample[0] =
373 (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
374 context->adpcm.ima.last_step[0] = (INT16)(*(src + 2));
381 context->adpcm.ima.last_sample[1] =
382 (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
383 context->adpcm.ima.last_step[1] = (INT16)(*(src + 2));
392 for (
size_t i = 0; i < 8; i++)
394 BYTE* dst = Stream_Pointer(out);
396 const unsigned channel = (i < 4 ? 0 : 1);
398 const BYTE sample = ((*src) & 0x0f);
399 const UINT16 decoded =
400 dsp_decode_ima_adpcm_sample(&context->adpcm, channel, sample);
401 dst[((i & 3) << 3) + (channel << 1u)] = (decoded & 0xFF);
402 dst[((i & 3) << 3) + (channel << 1u) + 1] = (decoded >> 8);
405 const BYTE sample = ((*src) >> 4);
406 const UINT16 decoded =
407 dsp_decode_ima_adpcm_sample(&context->adpcm, channel, sample);
408 dst[((i & 3) << 3) + (channel << 1u) + 4] = (decoded & 0xFF);
409 dst[((i & 3) << 3) + (channel << 1u) + 5] = (decoded >> 8);
414 if (!Stream_SafeSeek(out, 32))
420 BYTE* dst = Stream_Pointer(out);
421 if (!Stream_SafeSeek(out, 4))
425 const BYTE sample = ((*src) & 0x0f);
426 const UINT16 decoded = dsp_decode_ima_adpcm_sample(&context->adpcm, 0, sample);
427 *dst++ = (decoded & 0xFF);
428 *dst++ = (decoded >> 8);
431 const BYTE sample = ((*src) >> 4);
432 const UINT16 decoded = dsp_decode_ima_adpcm_sample(&context->adpcm, 0, sample);
433 *dst++ = (decoded & 0xFF);
434 *dst++ = (decoded >> 8);
445static BOOL freerdp_dsp_decode_gsm610(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
446 const BYTE* WINPR_RESTRICT src,
size_t size,
451 while (offset < size)
454 gsm_signal gsmBlockBuffer[160] = WINPR_C_ARRAY_INIT;
455 rc = gsm_decode(context->gsm, (gsm_byte*) &src[offset],
461 if ((offset % 65) == 0)
466 if (!Stream_EnsureRemainingCapacity(out,
sizeof(gsmBlockBuffer)))
469 Stream_Write(out, (
void*)gsmBlockBuffer,
sizeof(gsmBlockBuffer));
475static BOOL freerdp_dsp_encode_gsm610(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
476 const BYTE* WINPR_RESTRICT src,
size_t size,
481 while (offset < size)
483 const gsm_signal* signal = (
const gsm_signal*)&src[offset];
485 if (!Stream_EnsureRemainingCapacity(out,
sizeof(gsm_frame)))
488 gsm_encode(context->gsm, (gsm_signal*) signal,
489 Stream_Pointer(out));
491 if ((offset % 65) == 0)
492 Stream_Seek(out, 33);
494 Stream_Seek(out, 32);
503#if defined(WITH_LAME)
504static BOOL freerdp_dsp_decode_mp3(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
505 const BYTE* WINPR_RESTRICT src,
size_t size,
513 if (!context || !src || !out)
516 buffer_size = 2 * context->common.format.nChannels * context->common.format.nSamplesPerSec;
518 if (!Stream_EnsureCapacity(context->common.buffer, 2 * buffer_size))
521 pcm_l = Stream_BufferAs(context->common.buffer,
short);
522 pcm_r = Stream_BufferAs(context->common.buffer,
short) + buffer_size;
523 rc = hip_decode(context->hip, (
unsigned char*) src, size,
529 if (!Stream_EnsureRemainingCapacity(out, (
size_t)rc * context->common.format.nChannels * 2))
532 for (
size_t x = 0; x < rc; x++)
534 Stream_Write_UINT16(out, (UINT16)pcm_l[x]);
535 Stream_Write_UINT16(out, (UINT16)pcm_r[x]);
541static BOOL freerdp_dsp_encode_mp3(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
542 const BYTE* WINPR_RESTRICT src,
size_t size,
545 size_t samples_per_channel;
548 if (!context || !src || !out)
551 samples_per_channel =
552 size / context->common.format.nChannels / context->common.format.wBitsPerSample / 8;
555 if (!Stream_EnsureRemainingCapacity(out, 5 / 4 * samples_per_channel + 7200))
558 samples_per_channel = size / 2 / context->common.format.nChannels;
559 rc = lame_encode_buffer_interleaved(context->lame, (
short*)src, samples_per_channel,
560 Stream_Pointer(out), Stream_GetRemainingCapacity(out));
565 Stream_Seek(out, (
size_t)rc);
570#if defined(WITH_FAAC)
571static BOOL freerdp_dsp_encode_faac(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
572 const BYTE* WINPR_RESTRICT src,
size_t size,
575 const int16_t* inSamples = (
const int16_t*)src;
580 if (!context || !src || !out)
583 bpp = context->common.format.wBitsPerSample / 8;
584 nrSamples = size / bpp;
586 if (!Stream_EnsureRemainingCapacity(context->common.buffer, nrSamples *
sizeof(int16_t)))
589 for (
size_t x = 0; x < nrSamples; x++)
591 Stream_Write_INT16(context->common.buffer, inSamples[x]);
592 if (Stream_GetPosition(context->common.buffer) / bpp >= context->faacInputSamples)
594 if (!Stream_EnsureRemainingCapacity(out, context->faacMaxOutputBytes))
596 rc = faacEncEncode(context->faac, Stream_BufferAs(context->common.buffer, int32_t),
597 context->faacInputSamples, Stream_Pointer(out),
598 Stream_GetRemainingCapacity(out));
602 Stream_Seek(out, (
size_t)rc);
603 Stream_SetPosition(context->common.buffer, 0);
611#if defined(WITH_OPUS)
612static BOOL freerdp_dsp_decode_opus(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
613 const BYTE* WINPR_RESTRICT src,
size_t size,
616 if (!context || !src || !out)
620 const size_t max_size = OPUS_MAX_FRAMES * context->common.format.nChannels *
sizeof(int16_t);
621 if (!Stream_EnsureRemainingCapacity(context->common.buffer, max_size))
624 const opus_int32 frames =
625 opus_decode(context->opus_decoder, src, WINPR_ASSERTING_INT_CAST(opus_int32, size),
626 Stream_Pointer(out), OPUS_MAX_FRAMES, 0);
630 Stream_Seek(out, (
size_t)frames * context->common.format.nChannels *
sizeof(int16_t));
635static BOOL freerdp_dsp_encode_opus(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
636 const BYTE* WINPR_RESTRICT src,
size_t size,
639 if (!context || !src || !out)
643 const size_t max_size = OPUS_MAX_FRAMES * context->common.format.nChannels *
sizeof(int16_t);
644 if (!Stream_EnsureRemainingCapacity(context->common.buffer, max_size))
647 const size_t src_frames = size /
sizeof(opus_int16) / context->common.format.nChannels;
648 const opus_int16* src_data = (
const opus_int16*)src;
649 const opus_int32 frames = opus_encode(
650 context->opus_encoder, src_data, WINPR_ASSERTING_INT_CAST(opus_int32, src_frames),
651 Stream_Pointer(out), WINPR_ASSERTING_INT_CAST(opus_int32, max_size));
654 return Stream_SafeSeek(out,
655 (
size_t)frames * context->common.format.nChannels *
sizeof(int16_t));
659#if defined(WITH_FAAD2)
660static BOOL freerdp_dsp_decode_faad(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
661 const BYTE* WINPR_RESTRICT src,
size_t size,
664 NeAACDecFrameInfo info;
667 if (!context || !src || !out)
670 if (!context->faadSetup)
677 unsigned long samplerate;
678 unsigned char channels;
681 err = NeAACDecInit(context->faad, cnv.pv, size,
682 &samplerate, &channels);
687 if (channels != context->common.format.nChannels)
690 if (samplerate != context->common.format.nSamplesPerSec)
693 context->faadSetup = TRUE;
696 while (offset < size)
705 outSize = context->common.format.nSamplesPerSec * context->common.format.nChannels *
706 context->common.format.wBitsPerSample / 8;
708 if (!Stream_EnsureRemainingCapacity(out, outSize))
711 sample_buffer = Stream_Pointer(out);
713 cnv.cpv = &src[offset];
714 NeAACDecDecode2(context->faad, &info, cnv.pv, size - offset, &sample_buffer,
715 Stream_GetRemainingCapacity(out));
720 offset += info.bytesconsumed;
722 if (info.samples == 0)
725 Stream_Seek(out, info.samples * context->common.format.wBitsPerSample / 8);
744} ima_stereo_encode_map[] = { { 0, 0 }, { 4, 0 }, { 0, 4 }, { 4, 4 }, { 1, 0 }, { 5, 0 },
745 { 1, 4 }, { 5, 4 }, { 2, 0 }, { 6, 0 }, { 2, 4 }, { 6, 4 },
746 { 3, 0 }, { 7, 0 }, { 3, 4 }, { 7, 4 } };
748static BYTE dsp_encode_ima_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm,
size_t channel, INT16 sample)
750 INT32 ss = ima_step_size_table[adpcm->ima.last_step[channel]];
751 INT32 e = sample - adpcm->ima.last_sample[channel];
753 INT32 diff = ss >> 3;
789 diff += adpcm->ima.last_sample[channel];
793 else if (diff > 32767)
796 adpcm->ima.last_sample[channel] = (INT16)diff;
797 adpcm->ima.last_step[channel] = adpcm->ima.last_step[channel] + ima_step_index_table[enc];
799 if (adpcm->ima.last_step[channel] < 0)
800 adpcm->ima.last_step[channel] = 0;
801 else if (adpcm->ima.last_step[channel] > 88)
802 adpcm->ima.last_step[channel] = 88;
807static BOOL freerdp_dsp_encode_ima_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
808 const BYTE* WINPR_RESTRICT src,
size_t size,
811 if (!Stream_EnsureRemainingCapacity(out, size))
813 if (!Stream_EnsureRemainingCapacity(context->common.buffer, size + 64))
816 const size_t align = (context->common.format.nChannels > 1) ? 32 : 4;
818 while (size >= align)
820 if (Stream_GetPosition(context->common.buffer) % context->common.format.nBlockAlign == 0)
822 Stream_Write_UINT8(context->common.buffer, context->adpcm.ima.last_sample[0] & 0xFF);
823 Stream_Write_UINT8(context->common.buffer,
824 (context->adpcm.ima.last_sample[0] >> 8) & 0xFF);
825 Stream_Write_UINT8(context->common.buffer, (BYTE)context->adpcm.ima.last_step[0]);
826 Stream_Write_UINT8(context->common.buffer, 0);
828 if (context->common.format.nChannels > 1)
830 Stream_Write_UINT8(context->common.buffer,
831 context->adpcm.ima.last_sample[1] & 0xFF);
832 Stream_Write_UINT8(context->common.buffer,
833 (context->adpcm.ima.last_sample[1] >> 8) & 0xFF);
834 Stream_Write_UINT8(context->common.buffer, (BYTE)context->adpcm.ima.last_step[1]);
835 Stream_Write_UINT8(context->common.buffer, 0);
839 if (context->common.format.nChannels > 1)
841 BYTE* dst = Stream_Pointer(context->common.buffer);
844 for (
size_t i = 0; i < 16; i++)
846 const INT16 sample = (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
848 const BYTE encoded = dsp_encode_ima_adpcm_sample(&context->adpcm, i % 2, sample);
849 dst[ima_stereo_encode_map[i].byte_num] |= encoded
850 << ima_stereo_encode_map[i].byte_shift;
853 if (!Stream_SafeSeek(context->common.buffer, 8))
859 INT16 sample = (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
861 BYTE encoded = dsp_encode_ima_adpcm_sample(&context->adpcm, 0, sample);
862 sample = (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
864 encoded |= dsp_encode_ima_adpcm_sample(&context->adpcm, 0, sample) << 4;
865 Stream_Write_UINT8(context->common.buffer, encoded);
869 if (Stream_GetPosition(context->common.buffer) >= context->adpcm.ima.packet_size)
871 BYTE* bsrc = Stream_Buffer(context->common.buffer);
872 Stream_Write(out, bsrc, context->adpcm.ima.packet_size);
873 Stream_SetPosition(context->common.buffer, 0);
886static const INT32 ms_adpcm_adaptation_table[] = { 230, 230, 230, 230, 307, 409, 512, 614,
887 768, 614, 512, 409, 307, 230, 230, 230 };
889static const INT32 ms_adpcm_coeffs1[7] = { 256, 512, 0, 192, 240, 460, 392 };
891static const INT32 ms_adpcm_coeffs2[7] = { 0, -256, 0, 64, 0, -208, -232 };
893static inline INT16 freerdp_dsp_decode_ms_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm, BYTE sample,
896 const INT8 nibble = (INT8)((sample & 0x08) ? (sample - 16) : sample);
898 ((adpcm->ms.sample1[channel] * ms_adpcm_coeffs1[adpcm->ms.predictor[channel]]) +
899 (adpcm->ms.sample2[channel] * ms_adpcm_coeffs2[adpcm->ms.predictor[channel]])) /
901 presample += nibble * adpcm->ms.delta[channel];
903 if (presample > 32767)
905 else if (presample < -32768)
908 adpcm->ms.sample2[channel] = adpcm->ms.sample1[channel];
909 adpcm->ms.sample1[channel] = presample;
910 adpcm->ms.delta[channel] = adpcm->ms.delta[channel] * ms_adpcm_adaptation_table[sample] / 256;
912 if (adpcm->ms.delta[channel] < 16)
913 adpcm->ms.delta[channel] = 16;
915 return (INT16)presample;
918static BOOL freerdp_dsp_decode_ms_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
919 const BYTE* WINPR_RESTRICT src,
size_t size,
922 const size_t out_size = size * 4;
923 const UINT32 channels = context->common.format.nChannels;
924 const UINT32 block_size = context->common.format.nBlockAlign;
926 if (!Stream_EnsureCapacity(out, out_size))
931 if (size % block_size == 0)
935 context->adpcm.ms.predictor[0] = *src++;
936 context->adpcm.ms.predictor[1] = *src++;
937 context->adpcm.ms.delta[0] = read_int16(src);
939 context->adpcm.ms.delta[1] = read_int16(src);
941 context->adpcm.ms.sample1[0] = read_int16(src);
943 context->adpcm.ms.sample1[1] = read_int16(src);
945 context->adpcm.ms.sample2[0] = read_int16(src);
947 context->adpcm.ms.sample2[1] = read_int16(src);
950 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
951 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[1]);
952 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
953 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[1]);
957 context->adpcm.ms.predictor[0] = *src++;
958 context->adpcm.ms.delta[0] = read_int16(src);
960 context->adpcm.ms.sample1[0] = read_int16(src);
962 context->adpcm.ms.sample2[0] = read_int16(src);
965 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
966 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
973 const BYTE sample = *src++;
976 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample >> 4, 0));
978 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample & 0x0F, 1));
981 const BYTE sample = *src++;
984 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample >> 4, 0));
986 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample & 0x0F, 1));
991 const BYTE sample = *src++;
993 Stream_Write_INT16(out,
994 freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample >> 4, 0));
996 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample & 0x0F, 0));
1003static BYTE freerdp_dsp_encode_ms_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm, INT32 sample,
1007 ((adpcm->ms.sample1[channel] * ms_adpcm_coeffs1[adpcm->ms.predictor[channel]]) +
1008 (adpcm->ms.sample2[channel] * ms_adpcm_coeffs2[adpcm->ms.predictor[channel]])) /
1010 INT32 errordelta = (sample - presample) / adpcm->ms.delta[channel];
1012 if ((sample - presample) % adpcm->ms.delta[channel] > adpcm->ms.delta[channel] / 2)
1017 else if (errordelta < -8)
1020 presample += adpcm->ms.delta[channel] * errordelta;
1022 if (presample > 32767)
1024 else if (presample < -32768)
1027 adpcm->ms.sample2[channel] = adpcm->ms.sample1[channel];
1028 adpcm->ms.sample1[channel] = presample;
1029 adpcm->ms.delta[channel] =
1030 adpcm->ms.delta[channel] * ms_adpcm_adaptation_table[(((BYTE)errordelta) & 0x0F)] / 256;
1032 if (adpcm->ms.delta[channel] < 16)
1033 adpcm->ms.delta[channel] = 16;
1035 return ((BYTE)errordelta) & 0x0F;
1038static BOOL freerdp_dsp_encode_ms_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1039 const BYTE* WINPR_RESTRICT src,
size_t size,
1042 const size_t step = 8 + ((context->common.format.nChannels > 1) ? 4 : 0);
1044 if (!Stream_EnsureRemainingCapacity(out, size))
1047 const size_t start = Stream_GetPosition(out);
1049 if (context->adpcm.ms.delta[0] < 16)
1050 context->adpcm.ms.delta[0] = 16;
1052 if (context->adpcm.ms.delta[1] < 16)
1053 context->adpcm.ms.delta[1] = 16;
1055 while (size >= step)
1057 if ((Stream_GetPosition(out) - start) % context->common.format.nBlockAlign == 0)
1059 if (context->common.format.nChannels > 1)
1061 Stream_Write_UINT8(out, context->adpcm.ms.predictor[0]);
1062 Stream_Write_UINT8(out, context->adpcm.ms.predictor[1]);
1063 Stream_Write_UINT8(out, (context->adpcm.ms.delta[0] & 0xFF));
1064 Stream_Write_UINT8(out, ((context->adpcm.ms.delta[0] >> 8) & 0xFF));
1065 Stream_Write_UINT8(out, (context->adpcm.ms.delta[1] & 0xFF));
1066 Stream_Write_UINT8(out, ((context->adpcm.ms.delta[1] >> 8) & 0xFF));
1068 context->adpcm.ms.sample1[0] = read_int16(src + 4);
1069 context->adpcm.ms.sample1[1] = read_int16(src + 6);
1070 context->adpcm.ms.sample2[0] = read_int16(src + 0);
1071 context->adpcm.ms.sample2[1] = read_int16(src + 2);
1073 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
1074 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[1]);
1075 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
1076 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[1]);
1083 Stream_Write_UINT8(out, context->adpcm.ms.predictor[0]);
1084 Stream_Write_UINT8(out, (BYTE)(context->adpcm.ms.delta[0] & 0xFF));
1085 Stream_Write_UINT8(out, (BYTE)((context->adpcm.ms.delta[0] >> 8) & 0xFF));
1087 context->adpcm.ms.sample1[0] = read_int16(src + 2);
1088 context->adpcm.ms.sample2[0] = read_int16(src + 0);
1090 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
1091 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
1098 const INT16 sample = read_int16(src);
1101 out, (freerdp_dsp_encode_ms_adpcm_sample(&context->adpcm, sample, 0) << 4) & 0xFF);
1104 const INT16 sample = read_int16(src);
1108 Stream_Read_UINT8(out, val);
1109 val += freerdp_dsp_encode_ms_adpcm_sample(&context->adpcm, sample,
1110 context->common.format.nChannels > 1 ? 1 : 0);
1111 Stream_Write_UINT8(out, val);
1121FREERDP_DSP_CONTEXT* freerdp_dsp_context_new(BOOL encoder)
1123#if defined(WITH_DSP_FFMPEG)
1124 return freerdp_dsp_ffmpeg_context_new(encoder);
1126 FREERDP_DSP_CONTEXT* context = calloc(1,
sizeof(FREERDP_DSP_CONTEXT));
1131 if (!freerdp_dsp_common_context_init(&context->common, encoder))
1134#if defined(WITH_GSM)
1135 context->gsm = gsm_create();
1143 rc = gsm_option(context->gsm, GSM_OPT_WAV49, &val);
1149#if defined(WITH_LAME)
1153 context->lame = lame_init();
1160 context->hip = hip_decode_init();
1167#if defined(WITH_FAAD2)
1171 context->faad = NeAACDecOpen();
1180 freerdp_dsp_context_free(context);
1185void freerdp_dsp_context_free(FREERDP_DSP_CONTEXT* context)
1190#if defined(WITH_FDK_AAC)
1193 fdk_aac_dsp_uninit(ctx);
1196#if defined(WITH_DSP_FFMPEG)
1197 freerdp_dsp_ffmpeg_context_free(context);
1200 freerdp_dsp_common_context_uninit(&context->common);
1202#if defined(WITH_GSM)
1203 gsm_destroy(context->gsm);
1205#if defined(WITH_LAME)
1207 if (context->common.encoder)
1208 lame_close(context->lame);
1210 hip_decode_exit(context->hip);
1213#if defined(WITH_OPUS)
1215 if (context->opus_decoder)
1216 opus_decoder_destroy(context->opus_decoder);
1217 if (context->opus_encoder)
1218 opus_encoder_destroy(context->opus_encoder);
1221#if defined(WITH_FAAD2)
1223 if (!context->common.encoder)
1224 NeAACDecClose(context->faad);
1227#if defined(WITH_FAAC)
1230 faacEncClose(context->faac);
1233#if defined(WITH_SOXR)
1234 soxr_delete(context->sox);
1241BOOL freerdp_dsp_encode(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1243 const BYTE* WINPR_RESTRICT pdata,
size_t length,
1246#if defined(WITH_FDK_AAC)
1249 switch (ctx->format.wFormatTag)
1251 case WAVE_FORMAT_AAC_MS:
1252 return fdk_aac_dsp_encode(ctx, srcFormat, pdata, length, out);
1258#if defined(WITH_DSP_FFMPEG)
1259 return freerdp_dsp_ffmpeg_encode(context, srcFormat, pdata, length, out);
1261 if (!context || !context->common.encoder || !srcFormat || !pdata || !out)
1265 const BYTE* resampleData =
nullptr;
1266 size_t resampleLength = 0;
1268 if (!freerdp_dsp_channel_mix(context, pdata, length, srcFormat, &resampleData, &resampleLength))
1271 format.nChannels = context->common.format.nChannels;
1273 const BYTE* data =
nullptr;
1274 if (!freerdp_dsp_resample(context, resampleData, resampleLength, &format, &data, &length))
1277 switch (context->common.format.wFormatTag)
1279 case WAVE_FORMAT_PCM:
1280 if (!Stream_EnsureRemainingCapacity(out, length))
1283 Stream_Write(out, data, length);
1286 case WAVE_FORMAT_ADPCM:
1287 return freerdp_dsp_encode_ms_adpcm(context, data, length, out);
1289 case WAVE_FORMAT_DVI_ADPCM:
1290 return freerdp_dsp_encode_ima_adpcm(context, data, length, out);
1291#if defined(WITH_GSM)
1293 case WAVE_FORMAT_GSM610:
1294 return freerdp_dsp_encode_gsm610(context, data, length, out);
1296#if defined(WITH_LAME)
1298 case WAVE_FORMAT_MPEGLAYER3:
1299 return freerdp_dsp_encode_mp3(context, data, length, out);
1301#if defined(WITH_FAAC)
1303 case WAVE_FORMAT_AAC_MS:
1304 return freerdp_dsp_encode_faac(context, data, length, out);
1306#if defined(WITH_OPUS)
1308 case WAVE_FORMAT_OPUS:
1309 return freerdp_dsp_encode_opus(context, data, length, out);
1319BOOL freerdp_dsp_decode(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1321 const BYTE* WINPR_RESTRICT data,
size_t length,
wStream* WINPR_RESTRICT out)
1323#if defined(WITH_FDK_AAC)
1326 switch (ctx->format.wFormatTag)
1328 case WAVE_FORMAT_AAC_MS:
1329 return fdk_aac_dsp_decode(ctx, srcFormat, data, length, out);
1335#if defined(WITH_DSP_FFMPEG)
1336 return freerdp_dsp_ffmpeg_decode(context, srcFormat, data, length, out);
1339 if (!context || context->common.encoder || !srcFormat || !data || !out)
1342 switch (context->common.format.wFormatTag)
1344 case WAVE_FORMAT_PCM:
1345 if (!Stream_EnsureRemainingCapacity(out, length))
1348 Stream_Write(out, data, length);
1351 case WAVE_FORMAT_ADPCM:
1352 return freerdp_dsp_decode_ms_adpcm(context, data, length, out);
1354 case WAVE_FORMAT_DVI_ADPCM:
1355 return freerdp_dsp_decode_ima_adpcm(context, data, length, out);
1356#if defined(WITH_GSM)
1358 case WAVE_FORMAT_GSM610:
1359 return freerdp_dsp_decode_gsm610(context, data, length, out);
1361#if defined(WITH_LAME)
1363 case WAVE_FORMAT_MPEGLAYER3:
1364 return freerdp_dsp_decode_mp3(context, data, length, out);
1366#if defined(WITH_FAAD2)
1368 case WAVE_FORMAT_AAC_MS:
1369 return freerdp_dsp_decode_faad(context, data, length, out);
1372#if defined(WITH_OPUS)
1373 case WAVE_FORMAT_OPUS:
1374 return freerdp_dsp_decode_opus(context, data, length, out);
1384BOOL freerdp_dsp_supports_format(
const AUDIO_FORMAT* WINPR_RESTRICT format, BOOL encode)
1386#if defined(WITH_FDK_AAC)
1387 switch (format->wFormatTag)
1389 case WAVE_FORMAT_AAC_MS:
1397#if defined(WITH_DSP_FFMPEG)
1398 return freerdp_dsp_ffmpeg_supports_format(format, encode);
1401#if !defined(WITH_DSP_EXPERIMENTAL)
1402 WINPR_UNUSED(encode);
1404 switch (format->wFormatTag)
1406 case WAVE_FORMAT_PCM:
1408#if defined(WITH_DSP_EXPERIMENTAL)
1410 case WAVE_FORMAT_ADPCM:
1412 case WAVE_FORMAT_DVI_ADPCM:
1415#if defined(WITH_GSM)
1417 case WAVE_FORMAT_GSM610:
1418#if defined(WITH_DSP_EXPERIMENTAL)
1424#if defined(WITH_LAME)
1426 case WAVE_FORMAT_MPEGLAYER3:
1427#if defined(WITH_DSP_EXPERIMENTAL)
1434 case WAVE_FORMAT_AAC_MS:
1435#if defined(WITH_FAAD2)
1440#if defined(WITH_FAAC)
1446#if defined(WITH_FDK_AAC)
1452#if defined(WITH_OPUS)
1453 case WAVE_FORMAT_OPUS:
1454 return opus_is_valid_samplerate(format);
1464BOOL freerdp_dsp_context_reset(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1466 WINPR_ATTR_UNUSED UINT32 FramesPerPacket)
1468#if defined(WITH_FDK_AAC)
1469 WINPR_ASSERT(targetFormat);
1470 if (targetFormat->wFormatTag == WAVE_FORMAT_AAC_MS)
1473 fdk_aac_dsp_uninit(ctx);
1474 ctx->format = *targetFormat;
1475 return fdk_aac_dsp_init(ctx, FramesPerPacket);
1479#if defined(WITH_DSP_FFMPEG)
1480 return freerdp_dsp_ffmpeg_context_reset(context, targetFormat);
1483 if (!context || !targetFormat)
1486 context->common.format = *targetFormat;
1488 if (context->common.format.wFormatTag == WAVE_FORMAT_DVI_ADPCM)
1490 size_t min_frame_data = 1ull * context->common.format.wBitsPerSample *
1491 context->common.format.nChannels * FramesPerPacket;
1492 size_t data_per_block =
1493 (1ULL * context->common.format.nBlockAlign - 4ULL * context->common.format.nChannels) *
1495 size_t nb_block_per_packet = min_frame_data / data_per_block;
1497 if (min_frame_data % data_per_block)
1498 nb_block_per_packet++;
1500 context->adpcm.ima.packet_size = nb_block_per_packet * context->common.format.nBlockAlign;
1501 Stream_EnsureCapacity(context->common.buffer, context->adpcm.ima.packet_size);
1502 Stream_SetPosition(context->common.buffer, 0);
1505#if defined(WITH_OPUS)
1507 if (opus_is_valid_samplerate(&context->common.format))
1509 if (!context->common.encoder)
1511 int opus_error = OPUS_OK;
1513 context->opus_decoder = opus_decoder_create(
1514 WINPR_ASSERTING_INT_CAST(opus_int32, context->common.format.nSamplesPerSec),
1515 context->common.format.nChannels, &opus_error);
1516 if (opus_error != OPUS_OK)
1521 int opus_error = OPUS_OK;
1523 context->opus_encoder = opus_encoder_create(
1524 WINPR_ASSERTING_INT_CAST(opus_int32, context->common.format.nSamplesPerSec),
1525 context->common.format.nChannels, OPUS_APPLICATION_VOIP, &opus_error);
1526 if (opus_error != OPUS_OK)
1530 opus_encoder_ctl(context->opus_encoder,
1531 OPUS_SET_BITRATE(context->common.format.nAvgBytesPerSec * 8));
1532 if (opus_error != OPUS_OK)
1538#if defined(WITH_FAAD2)
1539 context->faadSetup = FALSE;
1541#if defined(WITH_FAAC)
1543 if (context->common.encoder)
1545 faacEncConfigurationPtr cfg;
1548 faacEncClose(context->faac);
1550 context->faac = faacEncOpen(targetFormat->nSamplesPerSec, targetFormat->nChannels,
1551 &context->faacInputSamples, &context->faacMaxOutputBytes);
1556 cfg = faacEncGetCurrentConfiguration(context->faac);
1557 cfg->inputFormat = FAAC_INPUT_16BIT;
1558 cfg->outputFormat = 0;
1559 cfg->mpegVersion = MPEG4;
1561 cfg->bandWidth = targetFormat->nAvgBytesPerSec;
1562 faacEncSetConfiguration(context->faac, cfg);
1566#if defined(WITH_SOXR)
1568 soxr_io_spec_t iospec = soxr_io_spec(SOXR_INT16, SOXR_INT16);
1570 soxr_delete(context->sox);
1572 soxr_create(context->common.format.nSamplesPerSec, targetFormat->nSamplesPerSec,
1573 targetFormat->nChannels, &error, &iospec,
nullptr,
nullptr);
1575 if (!context->sox || (error != 0))
1585 WINPR_ASSERT(context);
1586 context->encoder = encode;
1587 context->buffer = Stream_New(
nullptr, 1024);
1588 if (!context->buffer)
1591 context->channelmix = Stream_New(
nullptr, 1024);
1592 if (!context->channelmix)
1595 context->resample = Stream_New(
nullptr, 1024);
1596 if (!context->resample)
1602 freerdp_dsp_common_context_uninit(context);
1608 WINPR_ASSERT(context);
1610 Stream_Free(context->buffer, TRUE);
1611 Stream_Free(context->channelmix, TRUE);
1612 Stream_Free(context->resample, TRUE);
1614 context->buffer =
nullptr;
1615 context->channelmix =
nullptr;
1616 context->resample =
nullptr;