diff options
author | Jan Ekström <jeebjp@gmail.com> | 2014-01-30 08:37:53 +0000 |
---|---|---|
committer | Janne Grunau <janne-libav@jannau.net> | 2014-01-31 11:09:10 +0100 |
commit | 5312818524484a995433b986a2a7a6602572d4db (patch) | |
tree | 0c00a4a8876fa924f5e510b2bfa9cb262731f6f6 | |
parent | 9ee9c679a7d444db223cf932e89cd39351f54f2d (diff) | |
download | ffmpeg-5312818524484a995433b986a2a7a6602572d4db.tar.gz |
atrac3plus: Make initialization dependant on channel count rather than channel map
Makes it easier to recreate an AVCodecContext for ATRAC3+ decoding,
which is needed in multimedia frameworks, as well as in general cases
where demuxing and decoding are separate entities.
-rw-r--r-- | libavcodec/atrac3plusdec.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/libavcodec/atrac3plusdec.c b/libavcodec/atrac3plusdec.c index dbdb3b3194..ddbfb5365f 100644 --- a/libavcodec/atrac3plusdec.c +++ b/libavcodec/atrac3plusdec.c @@ -77,35 +77,42 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, { memset(ctx->channel_blocks, 0, sizeof(ctx->channel_blocks)); - switch (avctx->channel_layout) { - case AV_CH_FRONT_LEFT: - case AV_CH_LAYOUT_MONO: + switch (avctx->channels) { + case 1: + if (avctx->channel_layout != AV_CH_FRONT_LEFT) + avctx->channel_layout = AV_CH_LAYOUT_MONO; + ctx->num_channel_blocks = 1; ctx->channel_blocks[0] = CH_UNIT_MONO; break; - case AV_CH_LAYOUT_STEREO: + case 2: + avctx->channel_layout = AV_CH_LAYOUT_STEREO; ctx->num_channel_blocks = 1; ctx->channel_blocks[0] = CH_UNIT_STEREO; break; - case AV_CH_LAYOUT_SURROUND: + case 3: + avctx->channel_layout = AV_CH_LAYOUT_SURROUND; ctx->num_channel_blocks = 2; ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; break; - case AV_CH_LAYOUT_4POINT0: + case 4: + avctx->channel_layout = AV_CH_LAYOUT_4POINT0; ctx->num_channel_blocks = 3; ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; ctx->channel_blocks[2] = CH_UNIT_MONO; break; - case AV_CH_LAYOUT_5POINT1_BACK: + case 6: + avctx->channel_layout = AV_CH_LAYOUT_5POINT1_BACK; ctx->num_channel_blocks = 4; ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; ctx->channel_blocks[2] = CH_UNIT_STEREO; ctx->channel_blocks[3] = CH_UNIT_MONO; break; - case AV_CH_LAYOUT_6POINT1_BACK: + case 7: + avctx->channel_layout = AV_CH_LAYOUT_6POINT1_BACK; ctx->num_channel_blocks = 5; ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; @@ -113,7 +120,8 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, ctx->channel_blocks[3] = CH_UNIT_MONO; ctx->channel_blocks[4] = CH_UNIT_MONO; break; - case AV_CH_LAYOUT_7POINT1: + case 8: + avctx->channel_layout = AV_CH_LAYOUT_7POINT1; ctx->num_channel_blocks = 5; ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; @@ -123,7 +131,7 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, break; default: av_log(avctx, AV_LOG_ERROR, - "Unsupported channel layout: %"PRIx64"!\n", avctx->channel_layout); + "Unsupported channel count: %d!\n", avctx->channels); return AVERROR_INVALIDDATA; } |