Refactored freerdp_dsp_resample, checks now done internally.
This commit is contained in:
parent
83f959ce6b
commit
ab15e34032
@ -29,6 +29,7 @@
|
|||||||
#include <winpr/crt.h>
|
#include <winpr/crt.h>
|
||||||
|
|
||||||
#include <freerdp/types.h>
|
#include <freerdp/types.h>
|
||||||
|
#include <freerdp/log.h>
|
||||||
#include <freerdp/codec/dsp.h>
|
#include <freerdp/codec/dsp.h>
|
||||||
|
|
||||||
#if !defined(WITH_DSP_FFMPEG)
|
#if !defined(WITH_DSP_FFMPEG)
|
||||||
@ -109,29 +110,65 @@ struct _FREERDP_DSP_CONTEXT
|
|||||||
|
|
||||||
static BOOL freerdp_dsp_resample(FREERDP_DSP_CONTEXT* context,
|
static BOOL freerdp_dsp_resample(FREERDP_DSP_CONTEXT* context,
|
||||||
const BYTE* src, size_t size,
|
const BYTE* src, size_t size,
|
||||||
const AUDIO_FORMAT* srcFormat)
|
const AUDIO_FORMAT* srcFormat,
|
||||||
|
const BYTE** data, size_t* length)
|
||||||
{
|
{
|
||||||
BYTE* p;
|
BYTE* p;
|
||||||
size_t sframes, rframes;
|
size_t sframes, rframes;
|
||||||
size_t rsize;
|
size_t rsize;
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
size_t sbytes, rbytes;
|
size_t sbytes, rbytes;
|
||||||
size_t srcBytePerFrame;
|
size_t srcBytesPerFrame, dstBytesPerFrame;
|
||||||
|
size_t srcChannels, dstChannels;
|
||||||
|
AUDIO_FORMAT format;
|
||||||
|
|
||||||
if (!context || !src || !srcFormat)
|
if (!context || !src || !srcFormat || !data || !length)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
assert(srcFormat->wFormatTag == WAVE_FORMAT_PCM);
|
if (srcFormat->wFormatTag != WAVE_FORMAT_PCM)
|
||||||
srcBytePerFrame = (srcFormat->wBitsPerSample > 8) ? 2 : 1;
|
{
|
||||||
sbytes = srcFormat->nChannels * srcBytePerFrame;
|
WLog_ERR(TAG, "%s requires %s for sample input, got %s", __FUNCTION__,
|
||||||
|
audio_format_get_tag_string(WAVE_FORMAT_PCM),
|
||||||
|
audio_format_get_tag_string(srcFormat->wFormatTag));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
srcChannels = srcFormat->nChannels;
|
||||||
|
dstChannels = context->format.nChannels;
|
||||||
|
srcBytesPerFrame = (srcFormat->wBitsPerSample > 8) ? 2 : 1;
|
||||||
|
dstBytesPerFrame = (context->format.wBitsPerSample > 8) ? 2 : 1;
|
||||||
|
/* We want to ignore differences of source and destination format. */
|
||||||
|
format = *srcFormat;
|
||||||
|
format.wFormatTag = WAVE_FORMAT_UNKNOWN;
|
||||||
|
|
||||||
|
if (audio_format_compatible(&format, &context->format))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* TODO: Currently sample size conversion is not implemented. */
|
||||||
|
if (srcFormat->wBitsPerSample != context->format.wBitsPerSample)
|
||||||
|
{
|
||||||
|
WLog_ERR(TAG, "%s does not support changing sample bit width [in=%"PRId16", out=%"PRId16"]",
|
||||||
|
__FUNCTION__, srcFormat->wBitsPerSample, context->format.wBitsPerSample);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Currently sample size conversion is not implemented. */
|
||||||
|
if (srcChannels != dstChannels)
|
||||||
|
{
|
||||||
|
WLog_ERR(TAG, "%s does not support changing number of channels [in=%"PRIdz", out=%"PRIdz"]",
|
||||||
|
__FUNCTION__, srcChannels, dstChannels);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sbytes = srcChannels * srcBytesPerFrame;
|
||||||
sframes = size / sbytes;
|
sframes = size / sbytes;
|
||||||
rbytes = srcBytePerFrame * context->format.nChannels;
|
rbytes = dstBytesPerFrame * dstChannels;
|
||||||
/* Integer rounding correct division */
|
/* Integer rounding correct division */
|
||||||
rframes = (sframes * context->format.nSamplesPerSec + (srcFormat->nSamplesPerSec + 1) / 2) /
|
rframes = (sframes * context->format.nSamplesPerSec + (srcFormat->nSamplesPerSec + 1) / 2) /
|
||||||
srcFormat->nSamplesPerSec;
|
srcFormat->nSamplesPerSec;
|
||||||
rsize = rbytes * rframes;
|
rsize = rframes * rbytes;
|
||||||
|
|
||||||
if (!Stream_EnsureCapacity(context->resample, rsize + 1024))
|
if (!Stream_EnsureCapacity(context->resample, rsize))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
p = Stream_Buffer(context->resample);
|
p = Stream_Buffer(context->resample);
|
||||||
@ -159,6 +196,8 @@ static BOOL freerdp_dsp_resample(FREERDP_DSP_CONTEXT* context,
|
|||||||
|
|
||||||
Stream_SetPointer(context->resample, p);
|
Stream_SetPointer(context->resample, p);
|
||||||
Stream_SealLength(context->resample);
|
Stream_SealLength(context->resample);
|
||||||
|
*data = Stream_Buffer(context->resample);
|
||||||
|
*length = Stream_Length(context->resample);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1049,15 +1088,9 @@ BOOL freerdp_dsp_encode(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* srcFor
|
|||||||
if (!context || !context->encoder || !srcFormat || !data || !out)
|
if (!context || !context->encoder || !srcFormat || !data || !out)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (srcFormat->nSamplesPerSec != context->format.nSamplesPerSec)
|
if (!freerdp_dsp_resample(context, data, length, srcFormat, &data, &length))
|
||||||
{
|
|
||||||
if (!freerdp_dsp_resample(context, data, length, srcFormat))
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
data = Stream_Buffer(context->resample);
|
|
||||||
length = Stream_GetPosition(context->resample);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (context->format.wFormatTag)
|
switch (context->format.wFormatTag)
|
||||||
{
|
{
|
||||||
case WAVE_FORMAT_PCM:
|
case WAVE_FORMAT_PCM:
|
||||||
@ -1196,7 +1229,6 @@ BOOL freerdp_dsp_supports_format(const AUDIO_FORMAT* format, BOOL encode)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL freerdp_dsp_context_reset(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* targetFormat)
|
BOOL freerdp_dsp_context_reset(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* targetFormat)
|
||||||
{
|
{
|
||||||
#if defined(WITH_DSP_FFMPEG)
|
#if defined(WITH_DSP_FFMPEG)
|
||||||
|
Loading…
Reference in New Issue
Block a user