From 3765a9fe35703d97f27898516eec7e51dce799cd Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 11 May 2021 11:32:50 +0200 Subject: [PATCH] Fixed AAC encoding for microphone * Fixed b-frame interval for FFMPEG * Fixed sample size for FAAC --- libfreerdp/CMakeLists.txt | 4 +++ libfreerdp/codec/dsp.c | 46 +++++++++++++++++++---------------- libfreerdp/codec/dsp_ffmpeg.c | 2 ++ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/libfreerdp/CMakeLists.txt b/libfreerdp/CMakeLists.txt index e3a410316..ef76d059b 100644 --- a/libfreerdp/CMakeLists.txt +++ b/libfreerdp/CMakeLists.txt @@ -115,6 +115,10 @@ foreach(${MODULE_PREFIX}_SUBMODULE ${${MODULE_PREFIX}_SUBMODULES}) add_subdirectory(${${MODULE_PREFIX}_SUBMODULE}) endforeach() +if (NOT WITH_DSP_FFMPEG AND NOT WITH_FAAC) + message(WARNING "Compiling without WITH_DSP_FFMPEG and WITH_FAAC, AAC encoder support disabled") +endif () + ## cmake source properties are only seen by targets in the same CMakeLists.txt ## therefore primitives and codecs need to be defined here diff --git a/libfreerdp/codec/dsp.c b/libfreerdp/codec/dsp.c index a5039cea5..431bfa4e8 100644 --- a/libfreerdp/codec/dsp.c +++ b/libfreerdp/codec/dsp.c @@ -531,7 +531,6 @@ static BOOL freerdp_dsp_encode_faac(FREERDP_DSP_CONTEXT* context, const BYTE* sr wStream* out) { const int16_t* inSamples = (const int16_t*)src; - int32_t* outSamples; unsigned int bpp; size_t nrSamples, x; int rc; @@ -539,28 +538,29 @@ static BOOL freerdp_dsp_encode_faac(FREERDP_DSP_CONTEXT* context, const BYTE* sr if (!context || !src || !out) return FALSE; - bpp = context->format.wBitsPerSample / 8 * context->format.nChannels; + bpp = context->format.wBitsPerSample / 8; nrSamples = size / bpp; - if (!Stream_EnsureCapacity(context->buffer, - nrSamples * sizeof(int32_t) * context->format.nChannels)) + if (!Stream_EnsureRemainingCapacity(context->buffer, nrSamples * sizeof(int16_t))) return FALSE; - if (!Stream_EnsureRemainingCapacity(out, context->faacMaxOutputBytes)) - return FALSE; - - outSamples = (int32_t*)Stream_Buffer(context->buffer); - - for (x = 0; x < nrSamples * context->format.nChannels; x++) - outSamples[x] = inSamples[x]; - - rc = faacEncEncode(context->faac, outSamples, nrSamples * context->format.nChannels, - Stream_Pointer(out), Stream_GetRemainingCapacity(out)); - - if (rc < 0) - return FALSE; - else if (rc > 0) - Stream_Seek(out, (size_t)rc); + for (x = 0; x < nrSamples; x++) + { + Stream_Write_INT16(context->buffer, inSamples[x]); + if (Stream_GetPosition(context->buffer) / bpp >= context->faacInputSamples) + { + if (!Stream_EnsureRemainingCapacity(out, context->faacMaxOutputBytes)) + return FALSE; + rc = faacEncEncode(context->faac, (int32_t*)Stream_Buffer(context->buffer), + context->faacInputSamples, Stream_Pointer(out), + Stream_GetRemainingCapacity(out)); + if (rc < 0) + return FALSE; + if (rc > 0) + Stream_Seek(out, (size_t)rc); + Stream_SetPosition(context->buffer, 0); + } + } return TRUE; } @@ -1282,7 +1282,7 @@ BOOL freerdp_dsp_supports_format(const AUDIO_FORMAT* format, BOOL encode) return TRUE; #endif -#if defined(WITH_FAAC) && defined(WITH_DSP_EXPERIMENTAL) +#if defined(WITH_FAAC) if (encode) return TRUE; @@ -1326,7 +1326,11 @@ BOOL freerdp_dsp_context_reset(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* return FALSE; cfg = faacEncGetCurrentConfiguration(context->faac); - cfg->bitRate = 10000; + cfg->inputFormat = FAAC_INPUT_16BIT; + cfg->outputFormat = 0; + cfg->mpegVersion = MPEG4; + cfg->useTns = 1; + cfg->bandWidth = targetFormat->nAvgBytesPerSec; faacEncSetConfiguration(context->faac, cfg); } diff --git a/libfreerdp/codec/dsp_ffmpeg.c b/libfreerdp/codec/dsp_ffmpeg.c index 0af3cf4fc..d680bd763 100644 --- a/libfreerdp/codec/dsp_ffmpeg.c +++ b/libfreerdp/codec/dsp_ffmpeg.c @@ -270,6 +270,8 @@ static BOOL ffmpeg_open_context(FREERDP_DSP_CONTEXT* context) break; } + context->context->max_b_frames = 1; + context->context->delay = 0; context->context->channels = format->nChannels; context->context->channel_layout = layout; context->context->sample_rate = format->nSamplesPerSec;