mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Fix bug: alsa+ffmpeg use different channel layout.
This commit is contained in:
parent
947f6b312e
commit
09cf1f5c85
@ -1,6 +1,7 @@
|
|||||||
User johns
|
User johns
|
||||||
Date:
|
Date:
|
||||||
|
|
||||||
|
Fix bug: alsa and ffmpeg use different channel layout.
|
||||||
Support more LPCM sample rates and number of channels.
|
Support more LPCM sample rates and number of channels.
|
||||||
Quick&dirty support for mpeg LPCM streams.
|
Quick&dirty support for mpeg LPCM streams.
|
||||||
Workaround for text2skin undrawn OSD areas.
|
Workaround for text2skin undrawn OSD areas.
|
||||||
|
62
codec.c
62
codec.c
@ -739,6 +739,62 @@ void CodecSetAudioPassthrough(int mask)
|
|||||||
(void)mask;
|
(void)mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Reorder audio frame.
|
||||||
|
**
|
||||||
|
** ffmpeg L R C Ls Rs -> alsa L R Ls Rs C
|
||||||
|
** ffmpeg L R C LFE Ls Rs -> alsa L R Ls Rs C LFE
|
||||||
|
** ffmpeg L R C LFE Ls Rs Rl Rr -> alsa L R Ls Rs C LFE Rl Rr
|
||||||
|
*/
|
||||||
|
static void CodecReorderAudioFrame(int16_t * buf, int size, int channels)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int c;
|
||||||
|
int ls;
|
||||||
|
int rs;
|
||||||
|
int lfe;
|
||||||
|
|
||||||
|
switch (channels) {
|
||||||
|
case 5:
|
||||||
|
size /= 2;
|
||||||
|
for (i = 0; i < size; i += 5) {
|
||||||
|
c = buf[i + 2];
|
||||||
|
ls = buf[i + 3];
|
||||||
|
rs = buf[i + 4];
|
||||||
|
buf[i + 2] = ls;
|
||||||
|
buf[i + 3] = rs;
|
||||||
|
buf[i + 4] = c;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
size /= 2;
|
||||||
|
for (i = 0; i < size; i += 6) {
|
||||||
|
c = buf[i + 2];
|
||||||
|
ls = buf[i + 3];
|
||||||
|
rs = buf[i + 4];
|
||||||
|
lfe = buf[i + 5];
|
||||||
|
buf[i + 2] = ls;
|
||||||
|
buf[i + 3] = rs;
|
||||||
|
buf[i + 4] = c;
|
||||||
|
buf[i + 5] = lfe;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
size /= 2;
|
||||||
|
for (i = 0; i < size; i += 8) {
|
||||||
|
c = buf[i + 2];
|
||||||
|
ls = buf[i + 3];
|
||||||
|
rs = buf[i + 4];
|
||||||
|
lfe = buf[i + 5];
|
||||||
|
buf[i + 2] = ls;
|
||||||
|
buf[i + 3] = rs;
|
||||||
|
buf[i + 4] = c;
|
||||||
|
buf[i + 5] = lfe;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_AVPARSER
|
#ifdef USE_AVPARSER
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -817,6 +873,8 @@ void CodecAudioDecode(AudioDecoder * audio_decoder, const AVPacket * avpkt)
|
|||||||
int err;
|
int err;
|
||||||
int isAC3;
|
int isAC3;
|
||||||
|
|
||||||
|
// FIXME: use swr_convert from swresample
|
||||||
|
// FIXME: tell ac3 decoder to use downmix
|
||||||
if (audio_decoder->ReSample) {
|
if (audio_decoder->ReSample) {
|
||||||
audio_resample_close(audio_decoder->ReSample);
|
audio_resample_close(audio_decoder->ReSample);
|
||||||
audio_decoder->ReSample = NULL;
|
audio_decoder->ReSample = NULL;
|
||||||
@ -893,6 +951,8 @@ void CodecAudioDecode(AudioDecoder * audio_decoder, const AVPacket * avpkt)
|
|||||||
audio_decoder->HwChannels *
|
audio_decoder->HwChannels *
|
||||||
av_get_bytes_per_sample(audio_ctx->sample_fmt);
|
av_get_bytes_per_sample(audio_ctx->sample_fmt);
|
||||||
Debug(4, "codec/audio: %d -> %d\n", buf_sz, outlen);
|
Debug(4, "codec/audio: %d -> %d\n", buf_sz, outlen);
|
||||||
|
CodecReorderAudioFrame(outbuf, outlen,
|
||||||
|
audio_decoder->HwChannels);
|
||||||
AudioEnqueue(outbuf, outlen);
|
AudioEnqueue(outbuf, outlen);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -971,6 +1031,8 @@ void CodecAudioDecode(AudioDecoder * audio_decoder, const AVPacket * avpkt)
|
|||||||
// True HD?
|
// True HD?
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
CodecReorderAudioFrame(buf, buf_sz,
|
||||||
|
audio_decoder->HwChannels);
|
||||||
AudioEnqueue(buf, buf_sz);
|
AudioEnqueue(buf, buf_sz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user