if (!audin->attached)
return CHANNEL_RC_OK;
- WLog_Print(audin->log, WLOG_TRACE,
- "%s: nChannels: %"PRIu16" nSamplesPerSec: %"PRIu32" "
- "nAvgBytesPerSec: %"PRIu32" nBlockAlign: %"PRIu16" wBitsPerSample: %"PRIu16" cbSize: %"PRIu16" [%"PRIdz"]",
- rdpsnd_get_audio_tag_string(audin->format->wFormatTag),
- audin->format->nChannels, audin->format->nSamplesPerSec, audin->format->nAvgBytesPerSec,
- audin->format->nBlockAlign, audin->format->wBitsPerSample, audin->format->cbSize, size);
Stream_SetPosition(audin->data, 0);
if (!Stream_EnsureRemainingCapacity(audin->data, 1))
}
else
{
- size_t block = audin->FramesPerPacket;
- size_t rest = audin->FramesPerPacket % audin->format->nBlockAlign;
-
- if (rest > 0)
- block += audin->format->nBlockAlign - rest;
-
- block *= format->wBitsPerSample / 8 * format->nChannels;
-
- if (block < size)
- size = block;
-
- Stream_SetPosition(audin->buffer, 0);
-
- if (!Stream_EnsureRemainingCapacity(audin->buffer, 2 * block))
- return CHANNEL_RC_NO_MEMORY;
-
- Stream_Write(audin->buffer, data, size);
- Stream_Zero(audin->buffer, block - size);
- Stream_SealLength(audin->buffer);
-
- if (!freerdp_dsp_encode(audin->dsp_context, format, Stream_Buffer(audin->buffer),
- Stream_Length(audin->buffer), audin->data))
+ if (!freerdp_dsp_encode(audin->dsp_context, format, data, size, audin->data))
return ERROR_INTERNAL_ERROR;
}
+ /* Did not encode anything, skip this, the codec is not ready for output. */
if (Stream_GetPosition(audin->data) <= 1)
return CHANNEL_RC_OK;
+ WLog_Print(audin->log, WLOG_TRACE,
+ "%s: nChannels: %"PRIu16" nSamplesPerSec: %"PRIu32" "
+ "nAvgBytesPerSec: %"PRIu32" nBlockAlign: %"PRIu16" wBitsPerSample: %"PRIu16" cbSize: %"PRIu16" [%"PRIdz"/%"PRIdz"]",
+ rdpsnd_get_audio_tag_string(audin->format->wFormatTag),
+ audin->format->nChannels, audin->format->nSamplesPerSec, audin->format->nAvgBytesPerSec,
+ audin->format->nBlockAlign, audin->format->wBitsPerSample, audin->format->cbSize, size,
+ Stream_GetPosition(audin->data) - 1);
+
if ((error = audin_send_incoming_data_pdu(callback)))
{
WLog_Print(audin->log, WLOG_ERROR, "audin_send_incoming_data_pdu failed!");
#if !defined(WITH_DSP_EXPERIMENTAL)
case AV_CODEC_ID_MP3:
- case AV_CODEC_ID_GSM_MS:
- case AV_CODEC_ID_AAC:
+ case AV_CODEC_ID_ADPCM_IMA_WAV:
+ case AV_CODEC_ID_ADPCM_MS:
return TRUE;
#endif
context->rcontext = NULL;
}
}
+
static BOOL ffmpeg_open_context(FREERDP_DSP_CONTEXT* context)
{
int ret;
context->context->strict_std_compliance = FF_COMPLIANCE_UNOFFICIAL;
break;
+ case AV_CODEC_ID_AAC:
+ context->context->profile = FF_PROFILE_AAC_MAIN;
+ break;
+
default:
break;
}
{
ret = avcodec_receive_packet(context, packet);
- if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ if ((ret == AVERROR(EAGAIN)) || (ret == AVERROR_EOF))
return TRUE;
else if (ret < 0)
{
const BYTE* data, size_t length, wStream* out)
{
int rc;
- int samples, rest;
if (!context || !format || !data || !out || !context->encoder)
return FALSE;
}
else
{
+ int samples, rest;
rest = samples = context->resampled->nb_samples;
do
{
+ int restSamples;
+ int inSamples = samples;
+
if (samples + context->bufferedSamples > context->context->frame_size)
- samples = context->context->frame_size - context->bufferedSamples;
+ inSamples = context->context->frame_size - context->bufferedSamples;
+ restSamples = samples - inSamples;
rc = av_samples_copy(context->buffered->extended_data, context->resampled->extended_data,
- context->bufferedSamples, 0, samples,
+ context->bufferedSamples, 0, inSamples,
context->context->channels, context->context->sample_fmt);
- rest -= samples;
- context->bufferedSamples += samples;
+ rest -= inSamples;
+ context->bufferedSamples += inSamples;
if (context->context->frame_size <= context->bufferedSamples)
{
context->bufferedSamples = 0;
}
+
+ if (restSamples > 0)
+ {
+ rc = av_samples_copy(context->buffered->extended_data, context->resampled->extended_data,
+ context->bufferedSamples, inSamples, restSamples,
+ context->context->channels, context->context->sample_fmt);
+ rest -= restSamples;
+ context->bufferedSamples += restSamples;
+ }
}
while (rest > 0);