From 4d45bd66612040555ec75644d312551d2aaafd02 Mon Sep 17 00:00:00 2001 From: Armin Novak <armin.novak@thincast.com> Date: Wed, 14 Mar 2018 16:10:12 +0100 Subject: [PATCH] Added CMake option WITH_DSP_EXPERIMENTAL Some encoder/decoder formats are currently not really working or have not been thouroughly tested. To allow fearless hackers fine tuning this flag is added to easily enable/disable these formats. --- cmake/ConfigOptions.cmake | 1 + config.h.in | 1 + libfreerdp/codec/dsp.c | 10 +++++++++- libfreerdp/codec/dsp_ffmpeg.c | 28 +++++++++++++++++++++++++--- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 9c13e4d45..e5c085ac0 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -132,6 +132,7 @@ option(WITH_DEBUG_SYMBOLS "Pack debug symbols to installer" OFF) option(WITH_CCACHE "Use ccache support if available" ON) option(WITH_ICU "Use ICU for unicode conversion" OFF) +option(WITH_DSP_EXPERIMENTAL "Enable experimental sound encoder/decoder formats" OFF) if (WITH_FFMPEG) option(WITH_DSP_FFMPEG "Use FFMPEG for audio encoding/decoding" OFF) endif(WITH_FFMPEG) diff --git a/config.h.in b/config.h.in index 875db0af6..34aa7ce04 100644 --- a/config.h.in +++ b/config.h.in @@ -58,6 +58,7 @@ #cmakedefine WITH_GFX_H264 #cmakedefine WITH_OPENH264 #cmakedefine WITH_FFMPEG +#cmakedefine WITH_DSP_EXPERIMENTAL #cmakedefine WITH_DSP_FFMPEG #cmakedefine WITH_X264 #cmakedefine WITH_MEDIA_FOUNDATION diff --git a/libfreerdp/codec/dsp.c b/libfreerdp/codec/dsp.c index 81107d48a..d246630ec 100644 --- a/libfreerdp/codec/dsp.c +++ b/libfreerdp/codec/dsp.c @@ -1128,12 +1128,20 @@ BOOL freerdp_dsp_supports_format(const AUDIO_FORMAT* format, BOOL encode) #if defined(WITH_GSM) case WAVE_FORMAT_GSM610: +#if defined(WITH_DSP_EXPERIMENTAL) return TRUE; +#else + return !encode; +#endif #endif #if defined(WITH_LAME) case WAVE_FORMAT_MPEGLAYER3: +#if defined(WITH_DSP_EXPERIMENTAL) return TRUE; +#else + return !encode; +#endif #endif case WAVE_FORMAT_AAC_MS: @@ -1142,7 +1150,7 @@ BOOL freerdp_dsp_supports_format(const AUDIO_FORMAT* format, BOOL encode) return TRUE; #endif -#if defined(WITH_FAAC) +#if defined(WITH_FAAC) && defined(WITH_DSP_EXPERIMENTAL) if (encode) return TRUE; diff --git a/libfreerdp/codec/dsp_ffmpeg.c b/libfreerdp/codec/dsp_ffmpeg.c index b48dbbf64..9865131ef 100644 --- a/libfreerdp/codec/dsp_ffmpeg.c +++ b/libfreerdp/codec/dsp_ffmpeg.c @@ -53,6 +53,28 @@ struct _FREERDP_DSP_CONTEXT AVAudioResampleContext* rcontext; }; +static BOOL ffmpeg_codec_is_filtered(enum AVCodecID id, BOOL encoder) +{ + if (!encoder) + return FALSE; + + switch(id) + { +#if !defined(WITH_DSP_EXPERIMENTAL) + case AV_CODEC_ID_MP3: + case AV_CODEC_ID_GSM_MS: + case AV_CODEC_ID_AAC: + return TRUE; +#endif + + case AV_CODEC_ID_NONE: + return TRUE; + + default: + return FALSE; + } +} + static enum AVCodecID ffmpeg_get_avcodec(const AUDIO_FORMAT* format) { const char* id; @@ -189,7 +211,7 @@ static BOOL ffmpeg_open_context(FREERDP_DSP_CONTEXT* context) layout = av_get_default_channel_layout(format->nChannels); context->id = ffmpeg_get_avcodec(format); - if (context->id == AV_CODEC_ID_NONE) + if (ffmpeg_codec_is_filtered(context->id, context->encoder)) goto fail; if (context->encoder) @@ -333,7 +355,7 @@ static BOOL ffmpeg_encode_frame(AVCodecContext* context, AVFrame* in, { const char* err = av_err2str(ret); WLog_ERR(TAG, "Error submitting the packet to the encoder %s [%d]", - err, ret); + err, ret); return FALSE; } @@ -452,7 +474,7 @@ BOOL freerdp_dsp_ffmpeg_supports_format(const AUDIO_FORMAT* format, BOOL encode) { enum AVCodecID id = ffmpeg_get_avcodec(format); - if (id == AV_CODEC_ID_NONE) + if (ffmpeg_codec_is_filtered(id, encode)) return FALSE; if (encode)