mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-15 11:17:49 +00: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;
|
struct dcadec_context *ctx;
|
||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
|
int downmix_warned;
|
||||||
} DCADecContext;
|
} DCADecContext;
|
||||||
|
|
||||||
static int dcadec_decode_frame(AVCodecContext *avctx, void *data,
|
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)) {
|
if (exss = dcadec_context_get_exss_info(s->ctx)) {
|
||||||
enum AVMatrixEncoding matrix_encoding = AV_MATRIX_ENCODING_NONE;
|
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) {
|
switch(exss->matrix_encoding) {
|
||||||
case DCADEC_MATRIX_ENCODING_SURROUND:
|
case DCADEC_MATRIX_ENCODING_SURROUND:
|
||||||
matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
|
matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
|
||||||
@ -197,6 +209,27 @@ static av_cold int dcadec_init(AVCodecContext *avctx)
|
|||||||
if (avctx->flags & CODEC_FLAG_BITEXACT)
|
if (avctx->flags & CODEC_FLAG_BITEXACT)
|
||||||
flags |= DCADEC_FLAG_CORE_BIT_EXACT;
|
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);
|
s->ctx = dcadec_context_create(flags);
|
||||||
if (!s->ctx)
|
if (!s->ctx)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
Loading…
Reference in New Issue
Block a user