Ffmeg does no Stereo Downmix for Codec AAV LATM

Do Downmix after decoding
This commit is contained in:
jojo61 2024-02-02 15:27:39 +01:00
parent 8629946041
commit 47b461ab46
2 changed files with 52 additions and 9 deletions

49
codec.c
View File

@ -717,7 +717,15 @@ void CodecAudioOpen(AudioDecoder *audio_decoder, int codec_id) {
} }
if (CodecDownmix) { if (CodecDownmix) {
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(53,61,100)
audio_decoder->AudioCtx->request_channels = 2;
#endif
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(59,24,100)
audio_decoder->AudioCtx->request_channel_layout = AV_CH_LAYOUT_STEREO; audio_decoder->AudioCtx->request_channel_layout = AV_CH_LAYOUT_STEREO;
#else
AVChannelLayout dmlayout = AV_CHANNEL_LAYOUT_STEREO;
av_opt_set_chlayout(audio_decoder->AudioCtx->priv_data, "downmix", &dmlayout, 0);
#endif
} }
pthread_mutex_lock(&CodecLockMutex); pthread_mutex_lock(&CodecLockMutex);
// open codec // open codec
@ -896,6 +904,10 @@ static int CodecAudioUpdateHelper(AudioDecoder *audio_decoder, int *passthrough)
audio_decoder->SpdifCount = 0; audio_decoder->SpdifCount = 0;
*passthrough = 1; *passthrough = 1;
} }
if (audio_decoder->HwChannels > 2 && CodecDownmix) {
audio_decoder->HwChannels = 2;
}
// channels/sample-rate not support? // channels/sample-rate not support?
if ((err = AudioSetup(&audio_decoder->HwSampleRate, &audio_decoder->HwChannels, *passthrough))) { if ((err = AudioSetup(&audio_decoder->HwSampleRate, &audio_decoder->HwChannels, *passthrough))) {
@ -1161,14 +1173,43 @@ static void CodecAudioUpdateFormat(AudioDecoder *audio_decoder) {
} }
#endif #endif
audio_decoder->Resample = swr_alloc_set_opts(audio_decoder->Resample, audio_ctx->channel_layout, AV_SAMPLE_FMT_S16, #if LIBSWRESAMPLE_VERSION_INT < AV_VERSION_INT(4,5,100)
audio_decoder->HwSampleRate, audio_ctx->channel_layout, if (audio_decoder->Channels > 2 && CodecDownmix) {
audio_ctx->sample_fmt, audio_ctx->sample_rate, 0, NULL); audio_decoder->Resample = swr_alloc_set_opts(audio_decoder->Resample,
AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, audio_decoder->HwSampleRate,
audio_ctx->channel_layout, audio_ctx->sample_fmt,audio_ctx->sample_rate,
0, NULL);
} else {
audio_decoder->Resample = swr_alloc_set_opts(audio_decoder->Resample, audio_ctx->channel_layout,
AV_SAMPLE_FMT_S16, audio_decoder->HwSampleRate,
audio_ctx->channel_layout, audio_ctx->sample_fmt,
audio_ctx->sample_rate, 0, NULL);
}
#else
if (audio_decoder->Channels > 2 && CodecDownmix) { // Codec does not Support Downmix
//printf("last ressort downmix Layout in %lx Lyout out: %llx \n",audio_ctx->channel_layout,AV_CH_LAYOUT_STEREO);
audio_decoder->Resample = swr_alloc();
av_opt_set_channel_layout(audio_decoder->Resample, "in_channel_layout",audio_ctx->channel_layout, 0);
av_opt_set_channel_layout(audio_decoder->Resample, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(audio_decoder->Resample, "in_sample_rate", audio_ctx->sample_rate, 0);
av_opt_set_int(audio_decoder->Resample, "out_sample_rate", audio_ctx->sample_rate, 0);
av_opt_set_sample_fmt(audio_decoder->Resample, "in_sample_fmt", audio_ctx->sample_fmt, 0);
av_opt_set_sample_fmt(audio_decoder->Resample, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
}
else {
swr_alloc_set_opts2(&audio_decoder->Resample, &audio_ctx->ch_layout,
AV_SAMPLE_FMT_S16, audio_decoder->HwSampleRate,
&audio_ctx->ch_layout, audio_ctx->sample_fmt,
audio_ctx->sample_rate, 0, NULL);
}
#endif
if (audio_decoder->Resample) { if (audio_decoder->Resample) {
swr_init(audio_decoder->Resample); swr_init(audio_decoder->Resample);
} else { } else {
Error(_("codec/audio: can't setup resample\n")); Error(_("codec/audio: can't setup resample\n"));
} }
} }
/** /**
@ -1220,6 +1261,7 @@ void CodecAudioDecode(AudioDecoder *audio_decoder, const AVPacket *avpkt) {
if (CodecAudioPassthroughHelper(audio_decoder, avpkt)) { if (CodecAudioPassthroughHelper(audio_decoder, avpkt)) {
return; return;
} }
if (audio_decoder->Resample) { if (audio_decoder->Resample) {
uint8_t outbuf[8192 * 2 * 8]; uint8_t outbuf[8192 * 2 * 8];
uint8_t *out[1]; uint8_t *out[1];
@ -1227,6 +1269,7 @@ void CodecAudioDecode(AudioDecoder *audio_decoder, const AVPacket *avpkt) {
out[0] = outbuf; out[0] = outbuf;
ret = swr_convert(audio_decoder->Resample, out, sizeof(outbuf) / (2 * audio_decoder->HwChannels), ret = swr_convert(audio_decoder->Resample, out, sizeof(outbuf) / (2 * audio_decoder->HwChannels),
(const uint8_t **)frame->extended_data, frame->nb_samples); (const uint8_t **)frame->extended_data, frame->nb_samples);
if (ret > 0) { if (ret > 0) {
if (!(audio_decoder->Passthrough & CodecPCM)) { if (!(audio_decoder->Passthrough & CodecPCM)) {
CodecReorderAudioFrame((int16_t *)outbuf, ret * 2 * audio_decoder->HwChannels, CodecReorderAudioFrame((int16_t *)outbuf, ret * 2 * audio_decoder->HwChannels,

View File

@ -61,7 +61,7 @@ extern void ToggleLUT();
/// vdr-plugin version number. /// vdr-plugin version number.
/// Makefile extracts the version number for generating the file name /// Makefile extracts the version number for generating the file name
/// for the distribution archive. /// for the distribution archive.
static const char *const VERSION = "3.16" static const char *const VERSION = "3.17"
#ifdef GIT_REV #ifdef GIT_REV
"-GIT" GIT_REV "-GIT" GIT_REV
#endif #endif