From: =?utf-8?q?Jeremy_B=C3=ADcha?= Date: Wed, 13 Mar 2024 16:06:41 -0400 Subject: Revert "rdp-dsp: Stop making fdk-aac optional" This reverts commit b70ae574d0b8e8b4804d460bae77232a24397841. Forwarded: not-needed Upstream knows that we still need this patch, perhaps hoping that the additional pressure will help get fdk-aac into Debian but that is up to the ftpmasters, not the gnome-remote-desktop packagers --- config.h.meson | 3 +++ meson.build | 14 +++++++++++++- meson_options.txt | 5 +++++ src/grd-rdp-audio-playback.c | 17 +++++++++++++++++ src/grd-rdp-dsp.c | 25 ++++++++++++++++++++++++- src/meson.build | 7 ++++++- 6 files changed, 68 insertions(+), 3 deletions(-) diff --git a/config.h.meson b/config.h.meson index 65b3c01..f3c741c 100644 --- a/config.h.meson +++ b/config.h.meson @@ -6,6 +6,9 @@ /* The prefix for our gettext translation domains. */ #mesondefine GETTEXT_PACKAGE +/* Defined if FDK AAC is available */ +#mesondefine HAVE_FDK_AAC + /* Defined if RDP backend enabled */ #mesondefine HAVE_RDP diff --git a/meson.build b/meson.build index d7c818d..14a7e62 100644 --- a/meson.build +++ b/meson.build @@ -36,6 +36,7 @@ tss2_rc_dep = dependency('tss2-rc') tss2_tctildr_dep = dependency('tss2-tctildr') xkbcommon_dep = dependency('xkbcommon', version: xkbcommon_req) +have_fdk_aac = get_option('fdk_aac') have_rdp = get_option('rdp') have_vnc = get_option('vnc') @@ -43,13 +44,16 @@ if not have_rdp and not have_vnc error('Must enable at least one backend') endif +if have_fdk_aac and not have_rdp + error('Support for audio output redirection using FDK AAC requires the RDP backend') +endif + if have_rdp add_global_arguments('-D_GNU_SOURCE', language : 'c') dl_dep = cc.find_library('dl', required: true) cuda_dep = dependency('ffnvcodec', version: cuda_req) - fdk_aac_dep = dependency('fdk-aac') freerdp_dep = dependency('freerdp3', version: freerdp_req) freerdp_client_dep = dependency('freerdp-client3', version: freerdp_req) freerdp_server_dep = dependency('freerdp-server3', version: freerdp_req) @@ -57,6 +61,9 @@ if have_rdp opus_dep = dependency('opus') polkit_dep = dependency('polkit-gobject-1', version: polkit_req) winpr_dep = dependency('winpr3', version: freerdp_req) + if have_fdk_aac + fdk_aac_dep = dependency('fdk-aac') + endif endif if have_vnc @@ -96,6 +103,7 @@ cdata.set_quoted('VERSION', meson.project_version()) cdata.set('HAVE_RDP', have_rdp) cdata.set('HAVE_VNC', have_vnc) +cdata.set('HAVE_FDK_AAC', have_fdk_aac) cdata.set_quoted('GRD_DATA_DIR', grd_datadir) cdata.set_quoted('GRD_CUSTOM_CONF', grd_custom_conf) @@ -186,6 +194,10 @@ output = [ ' RDP...................... ' + have_rdp.to_string(), ' VNC...................... ' + have_vnc.to_string(), '', + ' Options for the RDP backend:', + '', + ' Support for audio output redirection using FDK AAC........' + have_fdk_aac.to_string(), + '', ' Now type \'ninja -C ' + meson.project_build_root() + '\' to build ' + meson.project_name(), '', '', diff --git a/meson_options.txt b/meson_options.txt index c003176..b0b279d 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -8,6 +8,11 @@ option('tests', value: true, description: 'Build the test suite') +option('fdk_aac', + type: 'boolean', + value: true, + description: 'Audio output redirection for the RDP backend') + option('rdp', type: 'boolean', value: true, diff --git a/src/grd-rdp-audio-playback.c b/src/grd-rdp-audio-playback.c index 8422659..40d9a40 100644 --- a/src/grd-rdp-audio-playback.c +++ b/src/grd-rdp-audio-playback.c @@ -541,7 +541,9 @@ static const AUDIO_FORMAT audio_format_pcm = static AUDIO_FORMAT server_formats[] = { +#ifdef HAVE_FDK_AAC audio_format_aac, +#endif /* HAVE_FDK_AAC */ audio_format_opus, audio_format_pcm, }; @@ -639,9 +641,11 @@ rdpsnd_activated (RdpsndServerContext *rdpsnd_context) { AUDIO_FORMAT *audio_format = &rdpsnd_context->client_formats[i]; +#ifdef HAVE_FDK_AAC if (audio_playback->aac_client_format_idx < 0 && are_audio_formats_equal (audio_format, &audio_format_aac)) audio_playback->aac_client_format_idx = i; +#endif /* HAVE_FDK_AAC */ if (audio_playback->opus_client_format_idx < 0 && are_audio_formats_equal (audio_format, &audio_format_opus)) audio_playback->opus_client_format_idx = i; @@ -1142,6 +1146,19 @@ maybe_send_frames (GrdRdpAudioPlayback *audio_playback, audio_data_free (audio_data); } +#ifdef HAVE_FDK_AAC + if (audio_playback->aac_client_format_idx >= 0) + { + client_format_idx = audio_playback->aac_client_format_idx; + codec = GRD_RDP_DSP_CODEC_AAC; + } + else +#endif /* HAVE_FDK_AAC */ + { + client_format_idx = audio_playback->pcm_client_format_idx; + codec = GRD_RDP_DSP_CODEC_NONE; + } + switch (codec) { case GRD_RDP_DSP_CODEC_NONE: diff --git a/src/grd-rdp-dsp.c b/src/grd-rdp-dsp.c index f83d5c5..987316e 100644 --- a/src/grd-rdp-dsp.c +++ b/src/grd-rdp-dsp.c @@ -21,10 +21,13 @@ #include "grd-rdp-dsp.h" -#include #include #include +#ifdef HAVE_FDK_AAC +#include +#endif /* HAVE_FDK_AAC */ + #define G711_QUANT_MASK 0xF #define G711_SEG_MASK 0x70 #define G711_SEG_SHIFT 4 @@ -36,8 +39,10 @@ struct _GrdRdpDsp GrdRdpDspCreateFlag create_flags; uint32_t n_channels; +#ifdef HAVE_FDK_AAC HANDLE_AACENCODER aac_encoder; uint32_t aac_frame_length; +#endif /* HAVE_FDK_AAC */ OpusEncoder *opus_encoder; uint32_t opus_frame_length; @@ -74,7 +79,11 @@ grd_rdp_dsp_get_frames_per_packet (GrdRdpDsp *rdp_dsp, case GRD_RDP_DSP_CODEC_NONE: g_assert_not_reached (); case GRD_RDP_DSP_CODEC_AAC: +#ifdef HAVE_FDK_AAC return rdp_dsp->aac_frame_length; +#else + g_assert_not_reached (); +#endif /* HAVE_FDK_AAC */ case GRD_RDP_DSP_CODEC_ALAW: g_assert_not_reached (); case GRD_RDP_DSP_CODEC_OPUS: @@ -84,6 +93,7 @@ grd_rdp_dsp_get_frames_per_packet (GrdRdpDsp *rdp_dsp, g_assert_not_reached (); } +#ifdef HAVE_FDK_AAC static gboolean encode_aac (GrdRdpDsp *rdp_dsp, int16_t *input_data, @@ -139,6 +149,7 @@ encode_aac (GrdRdpDsp *rdp_dsp, return TRUE; } +#endif /* HAVE_FDK_AAC */ static gboolean encode_opus (GrdRdpDsp *rdp_dsp, @@ -189,8 +200,13 @@ grd_rdp_dsp_encode (GrdRdpDsp *rdp_dsp, g_assert_not_reached (); return FALSE; case GRD_RDP_DSP_CODEC_AAC: +#ifdef HAVE_FDK_AAC return encode_aac (rdp_dsp, input_data, input_size, input_elem_size, output_data, output_size); +#else + g_assert_not_reached (); + return FALSE; +#endif /* HAVE_FDK_AAC */ case GRD_RDP_DSP_CODEC_ALAW: g_assert_not_reached (); return FALSE; @@ -278,6 +294,7 @@ grd_rdp_dsp_decode (GrdRdpDsp *rdp_dsp, return FALSE; } +#ifdef HAVE_FDK_AAC static gboolean create_aac_encoder (GrdRdpDsp *rdp_dsp, uint32_t n_samples_per_sec, @@ -397,6 +414,7 @@ create_aac_encoder (GrdRdpDsp *rdp_dsp, return TRUE; } +#endif /* HAVE_FDK_AAC */ static gboolean create_opus_encoder (GrdRdpDsp *rdp_dsp, @@ -441,12 +459,15 @@ create_encoders (GrdRdpDsp *rdp_dsp, { rdp_dsp->n_channels = dsp_descriptor->n_channels; +#ifdef HAVE_FDK_AAC if (!create_aac_encoder (rdp_dsp, dsp_descriptor->n_samples_per_sec_aac, dsp_descriptor->n_channels, dsp_descriptor->bitrate_aac, error)) return FALSE; +#endif /* HAVE_FDK_AAC */ + if (!create_opus_encoder (rdp_dsp, dsp_descriptor->n_samples_per_sec_opus, dsp_descriptor->n_channels, @@ -480,7 +501,9 @@ grd_rdp_dsp_dispose (GObject *object) g_clear_pointer (&rdp_dsp->opus_encoder, opus_encoder_destroy); +#ifdef HAVE_FDK_AAC aacEncClose (&rdp_dsp->aac_encoder); +#endif /* HAVE_FDK_AAC */ G_OBJECT_CLASS (grd_rdp_dsp_parent_class)->dispose (object); } diff --git a/src/meson.build b/src/meson.build index 914e2cc..cc84f1f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -165,7 +165,6 @@ if have_rdp deps += [ cuda_dep, dl_dep, - fdk_aac_dep, freerdp_dep, freerdp_server_dep, fuse_dep, @@ -173,6 +172,12 @@ if have_rdp polkit_dep, winpr_dep, ] + + if (have_fdk_aac) + deps += [ + fdk_aac_dep, + ] + endif endif if have_vnc