mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
avcodev/libdcadec: implement request_channel_layout
Reviewed-by: Michael Niedermayer <michaelni@gmx.at> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
b457da4ce2
commit
c118101662
@ -34,6 +34,7 @@ typedef struct DCADecContext {
|
||||
struct dcadec_context *ctx;
|
||||
uint8_t *buffer;
|
||||
int buffer_size;
|
||||
int downmix_warned;
|
||||
} DCADecContext;
|
||||
|
||||
static int dcadec_decode_frame(AVCodecContext *avctx, void *data,
|
||||
@ -132,6 +133,17 @@ static int dcadec_decode_frame(AVCodecContext *avctx, void *data,
|
||||
if (exss = dcadec_context_get_exss_info(s->ctx)) {
|
||||
enum AVMatrixEncoding matrix_encoding = AV_MATRIX_ENCODING_NONE;
|
||||
|
||||
if (!s->downmix_warned) {
|
||||
uint64_t layout = avctx->request_channel_layout;
|
||||
|
||||
if (((layout == AV_CH_LAYOUT_STEREO_DOWNMIX || layout == AV_CH_LAYOUT_STEREO) && !exss->embedded_stereo) ||
|
||||
( layout == AV_CH_LAYOUT_5POINT1 && !exss->embedded_6ch))
|
||||
av_log(avctx, AV_LOG_WARNING, "%s downmix was requested but no custom coefficients are available, "
|
||||
"this may result in clipping\n",
|
||||
layout == AV_CH_LAYOUT_5POINT1 ? "5.1" : "Stereo");
|
||||
s->downmix_warned = 1;
|
||||
}
|
||||
|
||||
switch(exss->matrix_encoding) {
|
||||
case DCADEC_MATRIX_ENCODING_SURROUND:
|
||||
matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
|
||||
@ -197,6 +209,27 @@ static av_cold int dcadec_init(AVCodecContext *avctx)
|
||||
if (avctx->flags & CODEC_FLAG_BITEXACT)
|
||||
flags |= DCADEC_FLAG_CORE_BIT_EXACT;
|
||||
|
||||
if (avctx->request_channel_layout > 0 && avctx->request_channel_layout != AV_CH_LAYOUT_NATIVE) {
|
||||
switch (avctx->request_channel_layout) {
|
||||
case AV_CH_LAYOUT_STEREO:
|
||||
case AV_CH_LAYOUT_STEREO_DOWNMIX:
|
||||
/* libdcadec ignores the 2ch flag if used alone when no custom downmix coefficients
|
||||
are available, silently outputting a 5.1 downmix if possible instead.
|
||||
Using both the 2ch and 6ch flags together forces a 2ch downmix using default
|
||||
coefficients in such cases. This matches the behavior of the 6ch flag when used
|
||||
alone, where a 5.1 downmix is generated if possible, regardless of custom
|
||||
coefficients being available or not. */
|
||||
flags |= DCADEC_FLAG_KEEP_DMIX_2CH | DCADEC_FLAG_KEEP_DMIX_6CH;
|
||||
break;
|
||||
case AV_CH_LAYOUT_5POINT1:
|
||||
flags |= DCADEC_FLAG_KEEP_DMIX_6CH;
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_WARNING, "Invalid request_channel_layout\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
s->ctx = dcadec_context_create(flags);
|
||||
if (!s->ctx)
|
||||
return AVERROR(ENOMEM);
|
||||
|
Loading…
x
Reference in New Issue
Block a user