21#include "dsp_fdk_aac.h"
22#include "dsp_fdk_impl.h"
24#include <freerdp/log.h>
25#define TAG FREERDP_TAG("dsp.fdk")
27WINPR_ATTR_FORMAT_ARG(2, 3)
28static
void write_log(
unsigned log_level, WINPR_FORMAT_ARG const
char* fmt, ...)
30 wLog* log = WLog_Get(TAG);
32 if (WLog_IsLevelActive(log, log_level))
34 char buffer[1024] = WINPR_C_ARRAY_INIT;
36 va_list ap = WINPR_C_ARRAY_INIT;
38 (void)vsnprintf(buffer,
sizeof(buffer), fmt, ap);
41 WLog_PrintTextMessage(log, log_level, __LINE__, __FILE__, __func__,
"%s", buffer);
46 const BYTE* data,
size_t length,
wStream* out)
48 WINPR_ASSERT(context);
49 WINPR_ASSERT(srcFormat);
51 if (srcFormat->wFormatTag != WAVE_FORMAT_PCM)
53 WLog_WARN(TAG,
"Feeding %s format data to encoder function, but require %s",
54 audio_format_get_tag_string(srcFormat->wFormatTag),
55 audio_format_get_tag_string(WAVE_FORMAT_PCM));
59 if (!context->fdkSetup)
61 ssize_t rc = fdk_aac_dsp_impl_config(
62 context->fdkAacInstance, &context->buffersize, context->encoder,
63 context->format.nSamplesPerSec, context->format.nChannels,
64 context->format.nAvgBytesPerSec, context->frames_per_packet, write_log);
68 context->fdkSetup = TRUE;
71 if (!Stream_EnsureRemainingCapacity(out, context->buffersize))
75 while (offset < length)
78 const ssize_t encoded = fdk_aac_dsp_impl_encode(
79 context->fdkAacInstance, &data[offset], length - offset, Stream_Pointer(out),
80 Stream_GetRemainingCapacity(out), &consumed, write_log);
81 if ((encoded < 0) || (consumed == 0))
83 Stream_Seek(out, (
size_t)encoded);
90 const BYTE* data,
size_t length,
wStream* out)
92 WINPR_ASSERT(context);
93 WINPR_ASSERT(srcFormat);
95 if (srcFormat->wFormatTag != WAVE_FORMAT_AAC_MS)
97 WLog_WARN(TAG,
"Feeding %s format data to encoder function, but require %s",
98 audio_format_get_tag_string(srcFormat->wFormatTag),
99 audio_format_get_tag_string(WAVE_FORMAT_AAC_MS));
103 if (!context->fdkSetup)
105 ssize_t rc = fdk_aac_dsp_impl_config(
106 context->fdkAacInstance, &context->buffersize, context->encoder,
107 context->format.nSamplesPerSec, context->format.nChannels,
108 context->format.nAvgBytesPerSec, context->frames_per_packet, write_log);
112 context->fdkSetup = TRUE;
118 rest = fdk_aac_dsp_impl_decode_fill(context->fdkAacInstance, data, length, write_log);
121 WLog_WARN(TAG,
"DecodeFill() failed");
128 const size_t expect = context->buffersize;
129 if (!Stream_EnsureRemainingCapacity(out, expect))
132 ret = fdk_aac_dsp_impl_decode_read(context->fdkAacInstance, Stream_Pointer(out), expect,
137 Stream_Seek(out, (
size_t)ret);
146 WINPR_ASSERT(context);
148 fdk_aac_dsp_impl_uninit(&context->fdkAacInstance, context->encoder, write_log);
153 WINPR_ASSERT(context);
154 context->fdkSetup = FALSE;
155 WINPR_ASSERT(frames_per_packet <= UINT_MAX);
156 context->frames_per_packet = (unsigned)frames_per_packet;
157 return fdk_aac_dsp_impl_init(&context->fdkAacInstance, context->encoder, write_log);