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_ResetPosition(context->common.channelmix);
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 if (!Stream_SetLength(context->common.resample, odone * rbytes))
293 *data = Stream_Buffer(context->common.resample);
294 *length = Stream_Length(context->common.resample);
295 return (error == 0) != 0;
297 WLog_ERR(TAG,
"Missing resample support, recompile -DWITH_SOXR=ON or -DWITH_DSP_FFMPEG=ON");
309static const INT16 ima_step_index_table[] = {
310 -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8
313static const INT16 ima_step_size_table[] = {
314 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23,
315 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80,
316 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279,
317 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
318 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
319 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487,
320 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
323static UINT16 dsp_decode_ima_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm,
unsigned int channel,
326 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ima.last_step));
327 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ima.last_sample));
329 const INT16 offset = adpcm->ima.last_step[channel];
330 WINPR_ASSERT(offset >= 0);
331 WINPR_ASSERT(WINPR_CXX_COMPAT_CAST(
size_t, offset) < ARRAYSIZE(ima_step_size_table));
333 const INT32 ss = ima_step_size_table[offset];
348 d += adpcm->ima.last_sample[channel];
355 adpcm->ima.last_sample[channel] = (INT16)d;
357 WINPR_ASSERT(sample < ARRAYSIZE(ima_step_index_table));
358 adpcm->ima.last_step[channel] = adpcm->ima.last_step[channel] + ima_step_index_table[sample];
360 if (adpcm->ima.last_step[channel] < 0)
361 adpcm->ima.last_step[channel] = 0;
362 else if (adpcm->ima.last_step[channel] > 88)
363 adpcm->ima.last_step[channel] = 88;
368static BOOL valid_ima_adpcm_format(
const FREERDP_DSP_CONTEXT* WINPR_RESTRICT context)
370 WINPR_ASSERT(context);
371 if (context->common.format.wFormatTag != WAVE_FORMAT_DVI_ADPCM)
373 if (context->common.format.nBlockAlign <= 4ULL)
375 if (context->common.format.nChannels < 1)
377 if (context->common.format.wBitsPerSample == 0)
382static BOOL freerdp_dsp_decode_ima_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
383 const BYTE* WINPR_RESTRICT src,
size_t size,
386 if (!valid_ima_adpcm_format(context))
389 size_t out_size = size * 4ull;
390 const UINT32 block_size = context->common.format.nBlockAlign;
391 const UINT32 channels = context->common.format.nChannels;
393 if (!Stream_EnsureCapacity(out, out_size))
398 if (size % block_size == 0)
403 context->adpcm.ima.last_sample[0] =
404 (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
405 context->adpcm.ima.last_step[0] = (INT16)(*(src + 2));
414 context->adpcm.ima.last_sample[1] =
415 (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
416 context->adpcm.ima.last_step[1] = (INT16)(*(src + 2));
427 for (
size_t i = 0; i < 8; i++)
429 BYTE* dst = Stream_Pointer(out);
431 const unsigned channel = (i < 4 ? 0 : 1);
433 const BYTE sample = ((*src) & 0x0f);
434 const UINT16 decoded =
435 dsp_decode_ima_adpcm_sample(&context->adpcm, channel, sample);
436 dst[((i & 3) << 3) + (channel << 1u)] = (decoded & 0xFF);
437 dst[((i & 3) << 3) + (channel << 1u) + 1] = (decoded >> 8);
440 const BYTE sample = ((*src) >> 4);
441 const UINT16 decoded =
442 dsp_decode_ima_adpcm_sample(&context->adpcm, channel, sample);
443 dst[((i & 3) << 3) + (channel << 1u) + 4] = (decoded & 0xFF);
444 dst[((i & 3) << 3) + (channel << 1u) + 5] = (decoded >> 8);
449 if (!Stream_SafeSeek(out, 32))
457 BYTE* dst = Stream_Pointer(out);
458 if (!Stream_SafeSeek(out, 4))
462 const BYTE sample = ((*src) & 0x0f);
463 const UINT16 decoded = dsp_decode_ima_adpcm_sample(&context->adpcm, 0, sample);
464 *dst++ = (decoded & 0xFF);
465 *dst++ = (decoded >> 8);
468 const BYTE sample = ((*src) >> 4);
469 const UINT16 decoded = dsp_decode_ima_adpcm_sample(&context->adpcm, 0, sample);
470 *dst++ = (decoded & 0xFF);
471 *dst++ = (decoded >> 8);
482static BOOL freerdp_dsp_decode_gsm610(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
483 const BYTE* WINPR_RESTRICT src,
size_t size,
488 while (offset < size)
491 gsm_signal gsmBlockBuffer[160] = WINPR_C_ARRAY_INIT;
492 rc = gsm_decode(context->gsm, (gsm_byte*) &src[offset],
498 if ((offset % 65) == 0)
503 if (!Stream_EnsureRemainingCapacity(out,
sizeof(gsmBlockBuffer)))
506 Stream_Write(out, (
void*)gsmBlockBuffer,
sizeof(gsmBlockBuffer));
512static BOOL freerdp_dsp_encode_gsm610(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
513 const BYTE* WINPR_RESTRICT src,
size_t size,
518 while (offset < size)
520 const gsm_signal* signal = (
const gsm_signal*)&src[offset];
522 if (!Stream_EnsureRemainingCapacity(out,
sizeof(gsm_frame)))
525 gsm_encode(context->gsm, (gsm_signal*) signal,
526 Stream_Pointer(out));
528 if ((offset % 65) == 0)
529 Stream_Seek(out, 33);
531 Stream_Seek(out, 32);
540#if defined(WITH_LAME)
541static BOOL valid_mp3_format(
const FREERDP_DSP_CONTEXT* WINPR_RESTRICT context)
543 WINPR_ASSERT(context);
544 if (context->common.format.wFormatTag != WAVE_FORMAT_MPEGLAYER3)
546 if (context->common.format.nChannels < 1)
548 if (context->common.format.wBitsPerSample == 0)
550 if (context->common.format.nSamplesPerSec == 0)
555static BOOL freerdp_dsp_decode_mp3(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
556 const BYTE* WINPR_RESTRICT src,
size_t size,
559 if (!context || !src || !out)
561 if (!valid_mp3_format(context))
563 const size_t buffer_size =
564 2 * context->common.format.nChannels * context->common.format.nSamplesPerSec;
566 if (!Stream_EnsureCapacity(context->common.buffer, 2 * buffer_size))
569 short* pcm_l = Stream_BufferAs(context->common.buffer,
short);
570 short* pcm_r = Stream_BufferAs(context->common.buffer,
short) + buffer_size;
571 const int rc = hip_decode(context->hip, (
unsigned char*) src,
577 if (!Stream_EnsureRemainingCapacity(out, (
size_t)rc * context->common.format.nChannels * 2))
580 for (
size_t x = 0; x < rc; x++)
582 Stream_Write_UINT16(out, (UINT16)pcm_l[x]);
583 Stream_Write_UINT16(out, (UINT16)pcm_r[x]);
589static BOOL freerdp_dsp_encode_mp3(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
590 const BYTE* WINPR_RESTRICT src,
size_t size,
593 if (!context || !src || !out)
596 if (!valid_mp3_format(context))
599 size_t samples_per_channel =
600 size / context->common.format.nChannels / context->common.format.wBitsPerSample / 8;
603 if (!Stream_EnsureRemainingCapacity(out, 5 / 4 * samples_per_channel + 7200))
606 samples_per_channel = size / 2 / context->common.format.nChannels;
608 lame_encode_buffer_interleaved(context->lame, (
short*)src, samples_per_channel,
609 Stream_Pointer(out), Stream_GetRemainingCapacity(out));
614 Stream_Seek(out, (
size_t)rc);
619#if defined(WITH_FAAC)
620static BOOL freerdp_dsp_encode_faac(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
621 const BYTE* WINPR_RESTRICT src,
size_t size,
624 const int16_t* inSamples = (
const int16_t*)src;
629 if (!context || !src || !out)
632 bpp = context->common.format.wBitsPerSample / 8;
633 nrSamples = size / bpp;
635 if (!Stream_EnsureRemainingCapacity(context->common.buffer, nrSamples *
sizeof(int16_t)))
638 for (
size_t x = 0; x < nrSamples; x++)
640 Stream_Write_INT16(context->common.buffer, inSamples[x]);
641 if (Stream_GetPosition(context->common.buffer) / bpp >= context->faacInputSamples)
643 if (!Stream_EnsureRemainingCapacity(out, context->faacMaxOutputBytes))
645 rc = faacEncEncode(context->faac, Stream_BufferAs(context->common.buffer, int32_t),
646 context->faacInputSamples, Stream_Pointer(out),
647 Stream_GetRemainingCapacity(out));
651 Stream_Seek(out, (
size_t)rc);
652 Stream_ResetPosition(context->common.buffer);
660#if defined(WITH_OPUS)
661static BOOL freerdp_dsp_decode_opus(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
662 const BYTE* WINPR_RESTRICT src,
size_t size,
665 if (!context || !src || !out)
669 const size_t max_size = OPUS_MAX_FRAMES * context->common.format.nChannels *
sizeof(int16_t);
670 if (!Stream_EnsureRemainingCapacity(context->common.buffer, max_size))
673 const opus_int32 frames =
674 opus_decode(context->opus_decoder, src, WINPR_ASSERTING_INT_CAST(opus_int32, size),
675 Stream_Pointer(out), OPUS_MAX_FRAMES, 0);
679 Stream_Seek(out, (
size_t)frames * context->common.format.nChannels *
sizeof(int16_t));
684static BOOL freerdp_dsp_encode_opus(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
685 const BYTE* WINPR_RESTRICT src,
size_t size,
688 if (!context || !src || !out)
692 const size_t max_size = OPUS_MAX_FRAMES * context->common.format.nChannels *
sizeof(int16_t);
693 if (!Stream_EnsureRemainingCapacity(context->common.buffer, max_size))
696 const size_t src_frames = size /
sizeof(opus_int16) / context->common.format.nChannels;
697 const opus_int16* src_data = (
const opus_int16*)src;
698 const opus_int32 frames = opus_encode(
699 context->opus_encoder, src_data, WINPR_ASSERTING_INT_CAST(opus_int32, src_frames),
700 Stream_Pointer(out), WINPR_ASSERTING_INT_CAST(opus_int32, max_size));
703 return Stream_SafeSeek(out,
704 (
size_t)frames * context->common.format.nChannels *
sizeof(int16_t));
708#if defined(WITH_FAAD2)
709static BOOL freerdp_dsp_decode_faad(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
710 const BYTE* WINPR_RESTRICT src,
size_t size,
713 NeAACDecFrameInfo info;
716 if (!context || !src || !out)
719 if (!context->faadSetup)
726 unsigned long samplerate;
727 unsigned char channels;
730 err = NeAACDecInit(context->faad, cnv.pv, size,
731 &samplerate, &channels);
736 if (channels != context->common.format.nChannels)
739 if (samplerate != context->common.format.nSamplesPerSec)
742 context->faadSetup = TRUE;
745 while (offset < size)
754 outSize = context->common.format.nSamplesPerSec * context->common.format.nChannels *
755 context->common.format.wBitsPerSample / 8;
757 if (!Stream_EnsureRemainingCapacity(out, outSize))
760 sample_buffer = Stream_Pointer(out);
762 cnv.cpv = &src[offset];
763 NeAACDecDecode2(context->faad, &info, cnv.pv, size - offset, &sample_buffer,
764 Stream_GetRemainingCapacity(out));
769 offset += info.bytesconsumed;
771 if (info.samples == 0)
774 Stream_Seek(out, info.samples * context->common.format.wBitsPerSample / 8);
793} ima_stereo_encode_map[] = { { 0, 0 }, { 4, 0 }, { 0, 4 }, { 4, 4 }, { 1, 0 }, { 5, 0 },
794 { 1, 4 }, { 5, 4 }, { 2, 0 }, { 6, 0 }, { 2, 4 }, { 6, 4 },
795 { 3, 0 }, { 7, 0 }, { 3, 4 }, { 7, 4 } };
797static BYTE dsp_encode_ima_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm,
size_t channel, INT16 sample)
799 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ima.last_step));
800 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ima.last_sample));
802 const INT16 offset = adpcm->ima.last_step[channel];
803 WINPR_ASSERT(offset >= 0);
804 WINPR_ASSERT(WINPR_CXX_COMPAT_CAST(
size_t, offset) < ARRAYSIZE(ima_step_size_table));
806 INT32 ss = ima_step_size_table[offset];
807 INT32 e = sample - adpcm->ima.last_sample[channel];
809 INT32 diff = ss >> 3;
845 diff += adpcm->ima.last_sample[channel];
849 else if (diff > 32767)
852 adpcm->ima.last_sample[channel] = (INT16)diff;
854 WINPR_ASSERT(enc < ARRAYSIZE(ima_step_index_table));
855 adpcm->ima.last_step[channel] = adpcm->ima.last_step[channel] + ima_step_index_table[enc];
857 if (adpcm->ima.last_step[channel] < 0)
858 adpcm->ima.last_step[channel] = 0;
859 else if (adpcm->ima.last_step[channel] > 88)
860 adpcm->ima.last_step[channel] = 88;
865static BOOL freerdp_dsp_encode_ima_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
866 const BYTE* WINPR_RESTRICT src,
size_t size,
869 if (!valid_ima_adpcm_format(context))
871 if (!Stream_EnsureRemainingCapacity(out, size))
873 if (!Stream_EnsureRemainingCapacity(context->common.buffer, size + 64))
876 const size_t align = (context->common.format.nChannels > 1) ? 32 : 4;
878 while (size >= align)
880 if (Stream_GetPosition(context->common.buffer) % context->common.format.nBlockAlign == 0)
882 Stream_Write_UINT8(context->common.buffer, context->adpcm.ima.last_sample[0] & 0xFF);
883 Stream_Write_UINT8(context->common.buffer,
884 (context->adpcm.ima.last_sample[0] >> 8) & 0xFF);
885 Stream_Write_UINT8(context->common.buffer, (BYTE)context->adpcm.ima.last_step[0]);
886 Stream_Write_UINT8(context->common.buffer, 0);
888 if (context->common.format.nChannels > 1)
890 Stream_Write_UINT8(context->common.buffer,
891 context->adpcm.ima.last_sample[1] & 0xFF);
892 Stream_Write_UINT8(context->common.buffer,
893 (context->adpcm.ima.last_sample[1] >> 8) & 0xFF);
894 Stream_Write_UINT8(context->common.buffer, (BYTE)context->adpcm.ima.last_step[1]);
895 Stream_Write_UINT8(context->common.buffer, 0);
899 if (context->common.format.nChannels > 1)
901 BYTE* dst = Stream_Pointer(context->common.buffer);
904 for (
size_t i = 0; i < 16; i++)
906 const INT16 sample = (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
908 const BYTE encoded = dsp_encode_ima_adpcm_sample(&context->adpcm, i % 2, sample);
909 dst[ima_stereo_encode_map[i].byte_num] |= encoded
910 << ima_stereo_encode_map[i].byte_shift;
913 if (!Stream_SafeSeek(context->common.buffer, 8))
919 INT16 sample = (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
921 BYTE encoded = dsp_encode_ima_adpcm_sample(&context->adpcm, 0, sample);
922 sample = (INT16)(((UINT16)(*src)) | (((UINT16)(*(src + 1))) << 8));
924 encoded |= dsp_encode_ima_adpcm_sample(&context->adpcm, 0, sample) << 4;
925 Stream_Write_UINT8(context->common.buffer, encoded);
929 if (Stream_GetPosition(context->common.buffer) >= context->adpcm.ima.packet_size)
931 BYTE* bsrc = Stream_Buffer(context->common.buffer);
932 Stream_Write(out, bsrc, context->adpcm.ima.packet_size);
933 Stream_ResetPosition(context->common.buffer);
946static const INT32 ms_adpcm_adaptation_table[] = { 230, 230, 230, 230, 307, 409, 512, 614,
947 768, 614, 512, 409, 307, 230, 230, 230 };
949static const INT32 ms_adpcm_coeffs1[7] = { 256, 512, 0, 192, 240, 460, 392 };
951static const INT32 ms_adpcm_coeffs2[7] = { 0, -256, 0, 64, 0, -208, -232 };
953static inline INT16 freerdp_dsp_decode_ms_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm, BYTE sample,
956 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.sample1));
957 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.sample2));
958 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.delta));
959 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.predictor));
961 const INT8 nibble = (INT8)((sample & 0x08) ? (sample - 16) : sample);
962 const BYTE predictor = adpcm->ms.predictor[channel];
964 if (predictor < ARRAYSIZE(ms_adpcm_coeffs1))
965 coeff1 = ms_adpcm_coeffs1[predictor];
968 if (predictor < ARRAYSIZE(ms_adpcm_coeffs2))
969 coeff2 = ms_adpcm_coeffs2[predictor];
971 ((adpcm->ms.sample1[channel] * coeff1) + (adpcm->ms.sample2[channel] * coeff2)) / 256;
972 presample += nibble * adpcm->ms.delta[channel];
974 if (presample > 32767)
976 else if (presample < -32768)
979 adpcm->ms.sample2[channel] = adpcm->ms.sample1[channel];
980 adpcm->ms.sample1[channel] = presample;
983 if (sample < ARRAYSIZE(ms_adpcm_adaptation_table))
984 tableval = ms_adpcm_adaptation_table[sample];
986 adpcm->ms.delta[channel] = adpcm->ms.delta[channel] * tableval / 256;
988 if (adpcm->ms.delta[channel] < 16)
989 adpcm->ms.delta[channel] = 16;
991 return (INT16)presample;
994static BOOL valid_ms_adpcm_format(
const FREERDP_DSP_CONTEXT* WINPR_RESTRICT context)
996 WINPR_ASSERT(context);
997 if (context->common.format.wFormatTag != WAVE_FORMAT_ADPCM)
999 if (context->common.format.nBlockAlign <= 4ULL)
1001 if (context->common.format.nChannels < 1)
1003 if (context->common.format.wBitsPerSample == 0)
1008static BOOL freerdp_dsp_decode_ms_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1009 const BYTE* WINPR_RESTRICT src,
size_t size,
1012 if (!valid_ms_adpcm_format(context))
1014 const size_t out_size = size * 4;
1015 const UINT32 channels = context->common.format.nChannels;
1016 const UINT32 block_size = context->common.format.nBlockAlign;
1018 if (!Stream_EnsureCapacity(out, out_size))
1023 if (size % block_size == 0)
1030 context->adpcm.ms.predictor[0] = *src++;
1031 context->adpcm.ms.predictor[1] = *src++;
1032 context->adpcm.ms.delta[0] = read_int16(src);
1034 context->adpcm.ms.delta[1] = read_int16(src);
1036 context->adpcm.ms.sample1[0] = read_int16(src);
1038 context->adpcm.ms.sample1[1] = read_int16(src);
1040 context->adpcm.ms.sample2[0] = read_int16(src);
1042 context->adpcm.ms.sample2[1] = read_int16(src);
1045 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
1046 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[1]);
1047 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
1048 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[1]);
1055 context->adpcm.ms.predictor[0] = *src++;
1056 context->adpcm.ms.delta[0] = read_int16(src);
1058 context->adpcm.ms.sample1[0] = read_int16(src);
1060 context->adpcm.ms.sample2[0] = read_int16(src);
1063 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
1064 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
1073 const BYTE sample = *src++;
1076 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample >> 4, 0));
1078 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample & 0x0F, 1));
1083 const BYTE sample = *src++;
1086 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample >> 4, 0));
1088 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample & 0x0F, 1));
1095 const BYTE sample = *src++;
1097 Stream_Write_INT16(out,
1098 freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample >> 4, 0));
1100 out, freerdp_dsp_decode_ms_adpcm_sample(&context->adpcm, sample & 0x0F, 0));
1107static BYTE freerdp_dsp_encode_ms_adpcm_sample(ADPCM* WINPR_RESTRICT adpcm, INT32 sample,
1110 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.sample1));
1111 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.sample2));
1112 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.delta));
1113 WINPR_ASSERT(channel < ARRAYSIZE(adpcm->ms.predictor));
1116 ((adpcm->ms.sample1[channel] * ms_adpcm_coeffs1[adpcm->ms.predictor[channel]]) +
1117 (adpcm->ms.sample2[channel] * ms_adpcm_coeffs2[adpcm->ms.predictor[channel]])) /
1119 INT32 errordelta = (sample - presample) / adpcm->ms.delta[channel];
1121 if ((sample - presample) % adpcm->ms.delta[channel] > adpcm->ms.delta[channel] / 2)
1126 else if (errordelta < -8)
1129 presample += adpcm->ms.delta[channel] * errordelta;
1131 if (presample > 32767)
1133 else if (presample < -32768)
1136 adpcm->ms.sample2[channel] = adpcm->ms.sample1[channel];
1137 adpcm->ms.sample1[channel] = presample;
1138 const size_t offset = (((BYTE)errordelta) & 0x0F);
1139 WINPR_ASSERT(offset < ARRAYSIZE(ms_adpcm_adaptation_table));
1140 adpcm->ms.delta[channel] = adpcm->ms.delta[channel] * ms_adpcm_adaptation_table[offset] / 256;
1142 if (adpcm->ms.delta[channel] < 16)
1143 adpcm->ms.delta[channel] = 16;
1145 return ((BYTE)errordelta) & 0x0F;
1148static BOOL freerdp_dsp_encode_ms_adpcm(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1149 const BYTE* WINPR_RESTRICT src,
size_t size,
1152 if (!valid_ms_adpcm_format(context))
1155 const size_t step = 8 + ((context->common.format.nChannels > 1) ? 4 : 0);
1157 if (!Stream_EnsureRemainingCapacity(out, size))
1160 const size_t start = Stream_GetPosition(out);
1162 if (context->adpcm.ms.delta[0] < 16)
1163 context->adpcm.ms.delta[0] = 16;
1165 if (context->adpcm.ms.delta[1] < 16)
1166 context->adpcm.ms.delta[1] = 16;
1168 while (size >= step)
1170 if ((Stream_GetPosition(out) - start) % context->common.format.nBlockAlign == 0)
1172 if (context->common.format.nChannels > 1)
1174 Stream_Write_UINT8(out, context->adpcm.ms.predictor[0]);
1175 Stream_Write_UINT8(out, context->adpcm.ms.predictor[1]);
1176 Stream_Write_UINT8(out, (context->adpcm.ms.delta[0] & 0xFF));
1177 Stream_Write_UINT8(out, ((context->adpcm.ms.delta[0] >> 8) & 0xFF));
1178 Stream_Write_UINT8(out, (context->adpcm.ms.delta[1] & 0xFF));
1179 Stream_Write_UINT8(out, ((context->adpcm.ms.delta[1] >> 8) & 0xFF));
1181 context->adpcm.ms.sample1[0] = read_int16(src + 4);
1182 context->adpcm.ms.sample1[1] = read_int16(src + 6);
1183 context->adpcm.ms.sample2[0] = read_int16(src + 0);
1184 context->adpcm.ms.sample2[1] = read_int16(src + 2);
1186 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
1187 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[1]);
1188 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
1189 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[1]);
1196 Stream_Write_UINT8(out, context->adpcm.ms.predictor[0]);
1197 Stream_Write_UINT8(out, (BYTE)(context->adpcm.ms.delta[0] & 0xFF));
1198 Stream_Write_UINT8(out, (BYTE)((context->adpcm.ms.delta[0] >> 8) & 0xFF));
1200 context->adpcm.ms.sample1[0] = read_int16(src + 2);
1201 context->adpcm.ms.sample2[0] = read_int16(src + 0);
1203 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample1[0]);
1204 Stream_Write_INT16(out, (INT16)context->adpcm.ms.sample2[0]);
1211 const INT16 sample = read_int16(src);
1214 out, (freerdp_dsp_encode_ms_adpcm_sample(&context->adpcm, sample, 0) << 4) & 0xFF);
1217 const INT16 sample = read_int16(src);
1221 Stream_Read_UINT8(out, val);
1222 val += freerdp_dsp_encode_ms_adpcm_sample(&context->adpcm, sample,
1223 context->common.format.nChannels > 1 ? 1 : 0);
1224 Stream_Write_UINT8(out, val);
1234FREERDP_DSP_CONTEXT* freerdp_dsp_context_new(BOOL encoder)
1236#if defined(WITH_DSP_FFMPEG)
1237 return freerdp_dsp_ffmpeg_context_new(encoder);
1239 FREERDP_DSP_CONTEXT* context = calloc(1,
sizeof(FREERDP_DSP_CONTEXT));
1244 if (!freerdp_dsp_common_context_init(&context->common, encoder))
1247#if defined(WITH_GSM)
1248 context->gsm = gsm_create();
1256 rc = gsm_option(context->gsm, GSM_OPT_WAV49, &val);
1262#if defined(WITH_LAME)
1266 context->lame = lame_init();
1273 context->hip = hip_decode_init();
1280#if defined(WITH_FAAD2)
1284 context->faad = NeAACDecOpen();
1293 freerdp_dsp_context_free(context);
1298void freerdp_dsp_context_free(FREERDP_DSP_CONTEXT* context)
1303#if defined(WITH_FDK_AAC)
1306 fdk_aac_dsp_uninit(ctx);
1309#if defined(WITH_DSP_FFMPEG)
1310 freerdp_dsp_ffmpeg_context_free(context);
1313 freerdp_dsp_common_context_uninit(&context->common);
1315#if defined(WITH_GSM)
1316 gsm_destroy(context->gsm);
1318#if defined(WITH_LAME)
1320 if (context->common.encoder)
1321 lame_close(context->lame);
1323 hip_decode_exit(context->hip);
1326#if defined(WITH_OPUS)
1328 if (context->opus_decoder)
1329 opus_decoder_destroy(context->opus_decoder);
1330 if (context->opus_encoder)
1331 opus_encoder_destroy(context->opus_encoder);
1334#if defined(WITH_FAAD2)
1336 if (!context->common.encoder)
1337 NeAACDecClose(context->faad);
1340#if defined(WITH_FAAC)
1343 faacEncClose(context->faac);
1346#if defined(WITH_SOXR)
1347 soxr_delete(context->sox);
1354BOOL freerdp_dsp_encode(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1356 const BYTE* WINPR_RESTRICT pdata,
size_t length,
1359#if defined(WITH_FDK_AAC)
1362 switch (ctx->format.wFormatTag)
1364 case WAVE_FORMAT_AAC_MS:
1365 return fdk_aac_dsp_encode(ctx, srcFormat, pdata, length, out);
1371#if defined(WITH_DSP_FFMPEG)
1372 return freerdp_dsp_ffmpeg_encode(context, srcFormat, pdata, length, out);
1374 if (!context || !context->common.encoder || !srcFormat || !pdata || !out)
1378 const BYTE* resampleData =
nullptr;
1379 size_t resampleLength = 0;
1381 if (!freerdp_dsp_channel_mix(context, pdata, length, srcFormat, &resampleData, &resampleLength))
1384 format.nChannels = context->common.format.nChannels;
1386 const BYTE* data =
nullptr;
1387 if (!freerdp_dsp_resample(context, resampleData, resampleLength, &format, &data, &length))
1390 switch (context->common.format.wFormatTag)
1392 case WAVE_FORMAT_PCM:
1393 if (!Stream_EnsureRemainingCapacity(out, length))
1396 Stream_Write(out, data, length);
1399 case WAVE_FORMAT_ADPCM:
1400 return freerdp_dsp_encode_ms_adpcm(context, data, length, out);
1402 case WAVE_FORMAT_DVI_ADPCM:
1403 return freerdp_dsp_encode_ima_adpcm(context, data, length, out);
1404#if defined(WITH_GSM)
1406 case WAVE_FORMAT_GSM610:
1407 return freerdp_dsp_encode_gsm610(context, data, length, out);
1409#if defined(WITH_LAME)
1411 case WAVE_FORMAT_MPEGLAYER3:
1412 return freerdp_dsp_encode_mp3(context, data, length, out);
1414#if defined(WITH_FAAC)
1416 case WAVE_FORMAT_AAC_MS:
1417 return freerdp_dsp_encode_faac(context, data, length, out);
1419#if defined(WITH_OPUS)
1421 case WAVE_FORMAT_OPUS:
1422 return freerdp_dsp_encode_opus(context, data, length, out);
1432BOOL freerdp_dsp_decode(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1434 const BYTE* WINPR_RESTRICT data,
size_t length,
wStream* WINPR_RESTRICT out)
1436#if defined(WITH_FDK_AAC)
1439 switch (ctx->format.wFormatTag)
1441 case WAVE_FORMAT_AAC_MS:
1442 return fdk_aac_dsp_decode(ctx, srcFormat, data, length, out);
1448#if defined(WITH_DSP_FFMPEG)
1449 return freerdp_dsp_ffmpeg_decode(context, srcFormat, data, length, out);
1452 if (!context || context->common.encoder || !srcFormat || !data || !out)
1455 switch (context->common.format.wFormatTag)
1457 case WAVE_FORMAT_PCM:
1458 if (!Stream_EnsureRemainingCapacity(out, length))
1461 Stream_Write(out, data, length);
1464 case WAVE_FORMAT_ADPCM:
1465 return freerdp_dsp_decode_ms_adpcm(context, data, length, out);
1467 case WAVE_FORMAT_DVI_ADPCM:
1468 return freerdp_dsp_decode_ima_adpcm(context, data, length, out);
1469#if defined(WITH_GSM)
1471 case WAVE_FORMAT_GSM610:
1472 return freerdp_dsp_decode_gsm610(context, data, length, out);
1474#if defined(WITH_LAME)
1476 case WAVE_FORMAT_MPEGLAYER3:
1477 return freerdp_dsp_decode_mp3(context, data, length, out);
1479#if defined(WITH_FAAD2)
1481 case WAVE_FORMAT_AAC_MS:
1482 return freerdp_dsp_decode_faad(context, data, length, out);
1485#if defined(WITH_OPUS)
1486 case WAVE_FORMAT_OPUS:
1487 return freerdp_dsp_decode_opus(context, data, length, out);
1497BOOL freerdp_dsp_supports_format(
const AUDIO_FORMAT* WINPR_RESTRICT format, BOOL encode)
1499#if defined(WITH_FDK_AAC)
1500 switch (format->wFormatTag)
1502 case WAVE_FORMAT_AAC_MS:
1510#if defined(WITH_DSP_FFMPEG)
1511 return freerdp_dsp_ffmpeg_supports_format(format, encode);
1514#if !defined(WITH_DSP_EXPERIMENTAL)
1515 WINPR_UNUSED(encode);
1517 switch (format->wFormatTag)
1519 case WAVE_FORMAT_PCM:
1521#if defined(WITH_DSP_EXPERIMENTAL)
1523 case WAVE_FORMAT_ADPCM:
1525 case WAVE_FORMAT_DVI_ADPCM:
1528#if defined(WITH_GSM)
1530 case WAVE_FORMAT_GSM610:
1531#if defined(WITH_DSP_EXPERIMENTAL)
1537#if defined(WITH_LAME)
1539 case WAVE_FORMAT_MPEGLAYER3:
1540#if defined(WITH_DSP_EXPERIMENTAL)
1547 case WAVE_FORMAT_AAC_MS:
1548#if defined(WITH_FAAD2)
1553#if defined(WITH_FAAC)
1559#if defined(WITH_FDK_AAC)
1565#if defined(WITH_OPUS)
1566 case WAVE_FORMAT_OPUS:
1567 return opus_is_valid_samplerate(format);
1577BOOL freerdp_dsp_context_reset(FREERDP_DSP_CONTEXT* WINPR_RESTRICT context,
1579 WINPR_ATTR_UNUSED UINT32 FramesPerPacket)
1581#if defined(WITH_FDK_AAC)
1582 WINPR_ASSERT(targetFormat);
1583 if (targetFormat->wFormatTag == WAVE_FORMAT_AAC_MS)
1586 fdk_aac_dsp_uninit(ctx);
1587 ctx->format = *targetFormat;
1588 return fdk_aac_dsp_init(ctx, FramesPerPacket);
1592#if defined(WITH_DSP_FFMPEG)
1593 return freerdp_dsp_ffmpeg_context_reset(context, targetFormat);
1596 if (!context || !targetFormat)
1599 context->common.format = *targetFormat;
1601 switch (context->common.format.wFormatTag)
1603#if defined(WITH_LAME)
1604 case WAVE_FORMAT_MPEGLAYER3:
1605 if (!valid_mp3_format(context))
1609 case WAVE_FORMAT_ADPCM:
1610 if (!valid_ms_adpcm_format(context))
1613 case WAVE_FORMAT_DVI_ADPCM:
1615 if (!valid_ima_adpcm_format(context))
1617 if (FramesPerPacket == 0)
1620 const size_t min_frame_data = 1ull * context->common.format.wBitsPerSample *
1621 context->common.format.nChannels * FramesPerPacket;
1622 const size_t data_per_block = (1ULL * context->common.format.nBlockAlign -
1623 4ULL * context->common.format.nChannels) *
1625 size_t nb_block_per_packet = min_frame_data / data_per_block;
1627 if (min_frame_data % data_per_block)
1628 nb_block_per_packet++;
1630 context->adpcm.ima.packet_size =
1631 nb_block_per_packet * context->common.format.nBlockAlign;
1632 if (!Stream_EnsureCapacity(context->common.buffer, context->adpcm.ima.packet_size))
1634 Stream_ResetPosition(context->common.buffer);
1641#if defined(WITH_OPUS)
1643 if (opus_is_valid_samplerate(&context->common.format))
1645 if (!context->common.encoder)
1647 int opus_error = OPUS_OK;
1649 context->opus_decoder = opus_decoder_create(
1650 WINPR_ASSERTING_INT_CAST(opus_int32, context->common.format.nSamplesPerSec),
1651 context->common.format.nChannels, &opus_error);
1652 if (opus_error != OPUS_OK)
1657 int opus_error = OPUS_OK;
1659 context->opus_encoder = opus_encoder_create(
1660 WINPR_ASSERTING_INT_CAST(opus_int32, context->common.format.nSamplesPerSec),
1661 context->common.format.nChannels, OPUS_APPLICATION_VOIP, &opus_error);
1662 if (opus_error != OPUS_OK)
1666 opus_encoder_ctl(context->opus_encoder,
1667 OPUS_SET_BITRATE(context->common.format.nAvgBytesPerSec * 8));
1668 if (opus_error != OPUS_OK)
1674#if defined(WITH_FAAD2)
1675 context->faadSetup = FALSE;
1677#if defined(WITH_FAAC)
1679 if (context->common.encoder)
1681 faacEncConfigurationPtr cfg =
nullptr;
1684 faacEncClose(context->faac);
1686 context->faac = faacEncOpen(targetFormat->nSamplesPerSec, targetFormat->nChannels,
1687 &context->faacInputSamples, &context->faacMaxOutputBytes);
1692 cfg = faacEncGetCurrentConfiguration(context->faac);
1693 cfg->inputFormat = FAAC_INPUT_16BIT;
1694 cfg->outputFormat = 0;
1695 cfg->mpegVersion = MPEG4;
1697 cfg->bandWidth = targetFormat->nAvgBytesPerSec;
1698 const int rc = faacEncSetConfiguration(context->faac, cfg);
1704#if defined(WITH_SOXR)
1706 soxr_io_spec_t iospec = soxr_io_spec(SOXR_INT16, SOXR_INT16);
1707 soxr_error_t error =
nullptr;
1709 soxr_delete(context->sox);
1711 soxr_create(context->common.format.nSamplesPerSec, targetFormat->nSamplesPerSec,
1712 targetFormat->nChannels, &error, &iospec,
nullptr,
nullptr);
1714 if (!context->sox || (error !=
nullptr))
1724 WINPR_ASSERT(context);
1725 context->encoder = encode;
1726 context->buffer = Stream_New(
nullptr, 1024);
1727 if (!context->buffer)
1730 context->channelmix = Stream_New(
nullptr, 1024);
1731 if (!context->channelmix)
1734 context->resample = Stream_New(
nullptr, 1024);
1735 if (!context->resample)
1741 freerdp_dsp_common_context_uninit(context);
1747 WINPR_ASSERT(context);
1749 Stream_Free(context->buffer, TRUE);
1750 Stream_Free(context->channelmix, TRUE);
1751 Stream_Free(context->resample, TRUE);
1753 context->buffer =
nullptr;
1754 context->channelmix =
nullptr;
1755 context->resample =
nullptr;