From patchwork Thu Oct 27 16:49:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 39017 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:85a8:b0:a2:d5a7:ad9d with SMTP id s40csp294246pzd; Thu, 27 Oct 2022 09:50:14 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7Z3aY7jMd4pqAt8mCNgV0atOo6jbULSOYa4D8K5u0h7EDOa4GrYNSlioNELwxJIG0wNV0s X-Received: by 2002:a17:906:4786:b0:78d:b793:5bf6 with SMTP id cw6-20020a170906478600b0078db7935bf6mr43642655ejc.222.1666889414266; Thu, 27 Oct 2022 09:50:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666889414; cv=none; d=google.com; s=arc-20160816; b=XC9n2H0tcHJnT+E99qNr9RpB7htSdYdeUa2IK2zbyAEN8wCTCWSFdcuP54MRfxLV6Q 8XKKOibvmqCXVWALvgpGOEmLtEBt5A9v42zGEyYufs6HymGgh4oxAXDk6ZEQpJr9IFnm uAGdZhYxR0YAoVvBOCepY5MfU26g0XC7xbhreNhicEDuoBG54w8VOUco02FmnYBxqpmf /IVh6WYBdst905psOFegFzKV7onZf2Tvum8gODeZbJ4HpwKuJcLw4yo7v2CivE2hxZ5R ybf4UHz5j6C6mUXAKzVHKY1QT/hVIEp6/7iOtu+P3Q46c+PIJyUPzVaZ9Q9ZMiIFGYj1 OjvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=AQjoFGUhvFMNDBipegbB3W8QOQuZ0EhFcJlGt+4lrGk=; b=0JIpAwYqJLsDHpv+e+MYGhfIjSs1+97PrCZ9BlULW60skqS9DME+joXm+T/0ZnvHGB 17piJPUqJuqAR7IgC801UYGWA7ua4CaWr33vOsqxxDpcL/y5yzjMDcyRXbHyjD053qRv zYaePV+0/wGtEMyMbndPpj7IKLtevDm1/6KC5s1kH4lv1q08guPqKzMslh4ygPtSP/py aIIU7aTLbHHUIhKpRQzMtJyFEz21Ihx1wKkMdXZZvUoe9c8xog7Kf0WV8gY/Z1VYAef3 PqP4tnxvtgAr7Y58C+EtoInF/JDu2NPN2FJ/01gnV4RaQN3pCdsgvkSHeXZoRNZEkwjj EaeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=RoEFM8gO; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hv17-20020a17090760d100b0073d8e26e78bsi1803356ejc.960.2022.10.27.09.50.13; Thu, 27 Oct 2022 09:50:14 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=RoEFM8gO; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 37E6B68BC48; Thu, 27 Oct 2022 19:50:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f181.google.com (mail-oi1-f181.google.com [209.85.167.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A48A368BC3F for ; Thu, 27 Oct 2022 19:49:57 +0300 (EEST) Received: by mail-oi1-f181.google.com with SMTP id i7so2880364oif.4 for ; Thu, 27 Oct 2022 09:49:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=6AKJ+huLcyhJE4LgNiHGtDmj329yPpV+kRPEplGinj4=; b=RoEFM8gOZj5N1TWOPtK5rMaqAo1zVIb1CeBqgV8AUhD1D+kWZoH1Bu3i29gy4xAVXw Uhhu+HaenFleODlV0BseuNxkdWdCl+h+toM4B60esmuLacEkKNFFRv5RVoZLx8M9fELi IflcNhMTNTR5PnkRlwtEn9A7HwAb9KVtNrJu//iYI/iXeE3fFKOsE3J+laCPORpd84om 7M9M74LDfTTCSb4mLEAn26tHWZShD0bQMiFanHFqJl7soOccYGGoc4s4SDrlhvXZhn/x BdCNMfEOrO7c0OZQQsuvChSErSL+n0SsIokyFV0MBOntGM3Hbi8AL1nr8KlTqAQd3fLl iY3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=6AKJ+huLcyhJE4LgNiHGtDmj329yPpV+kRPEplGinj4=; b=bBXcyhB8mv7hFdO2DbLA/Beta2gwbMxvDrc4fKhYn1Uy3heXUM3MDdNPdmp7CfocBO zuvKu7yIhpQ7mh5DXmlAKik7ntlNEppJaG8K1TTsBHZeKWGvXadJ5jAs7zzP7w3EiSk9 V34NRP8fP5nphba/DH5kamrbuSVU5ao3MP2Dowe9JPsShEwY9haO3PI/CGSXImsKZbcg l+5fhJAzw3Ij4MLQ25zQuLsDtG44ZnsqKDQdvGP3YtmbeYJxF67Qg/e7fFVjPGZjl7As f9Pzc8QI8v5XfcHJcBpCSf89+nLo6+Up9oaReDIM26R4FcEZT76ruQvUho+zW07FRV6L fpCg== X-Gm-Message-State: ACrzQf3UPNySMInVAAzjbDPteTLVLyojjaqkFhMZIm2IzXLnrBK3XbVY JokZ4LHf9A4/G7F5MIajCqaE5zNt4Xo= X-Received: by 2002:a05:6808:1386:b0:359:bf47:ed55 with SMTP id c6-20020a056808138600b00359bf47ed55mr1892534oiw.14.1666889395683; Thu, 27 Oct 2022 09:49:55 -0700 (PDT) Received: from localhost.localdomain ([191.97.187.183]) by smtp.gmail.com with ESMTPSA id a11-20020a056870468b00b0013b911d5960sm791879oap.49.2022.10.27.09.49.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Oct 2022 09:49:55 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 27 Oct 2022 13:49:40 -0300 Message-Id: <20221027164940.46118-1-jamrial@gmail.com> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/atrac3plus: reorder channels to match the output layout X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vjEiZdLz1RLy The order in which the channels are coded in the bitstream do not always follow the native, bitmask-based order of channels both signaled by the WAV container and forced by this same decoder. This is the case with layouts containing an LFE channel, as it's always coded last. Fixes ticket #9964. Signed-off-by: James Almer --- 6.1 and 7.1 untested, but much like 5.1 they were wrong before this change. libavcodec/atrac3plusdec.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/libavcodec/atrac3plusdec.c b/libavcodec/atrac3plusdec.c index ee71645a3c..8c3d20af76 100644 --- a/libavcodec/atrac3plusdec.c +++ b/libavcodec/atrac3plusdec.c @@ -65,6 +65,7 @@ typedef struct ATRAC3PContext { int num_channel_blocks; ///< number of channel blocks uint8_t channel_blocks[5]; ///< channel configuration descriptor + AVChannelLayout coded_ch_layout; ///< order of channels as coded in the bitstream } ATRAC3PContext; static av_cold int atrac3p_decode_close(AVCodecContext *avctx) @@ -74,6 +75,8 @@ static av_cold int atrac3p_decode_close(AVCodecContext *avctx) av_freep(&ctx->ch_units); av_freep(&ctx->fdsp); + av_channel_layout_uninit(&ctx->coded_ch_layout); + ff_mdct_end(&ctx->mdct_ctx); ff_mdct_end(&ctx->ipqf_dct_ctx); @@ -84,6 +87,7 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, AVCodecContext *avctx) { int channels = avctx->ch_layout.nb_channels; + int ret; memset(ctx->channel_blocks, 0, sizeof(ctx->channel_blocks)); av_channel_layout_uninit(&avctx->ch_layout); @@ -92,17 +96,20 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; ctx->num_channel_blocks = 1; ctx->channel_blocks[0] = CH_UNIT_MONO; + ctx->coded_ch_layout = avctx->ch_layout; break; case 2: avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO; ctx->num_channel_blocks = 1; ctx->channel_blocks[0] = CH_UNIT_STEREO; + ctx->coded_ch_layout = avctx->ch_layout; break; case 3: avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_SURROUND; ctx->num_channel_blocks = 2; ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; + ctx->coded_ch_layout = avctx->ch_layout; break; case 4: avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0; @@ -110,6 +117,7 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, ctx->channel_blocks[0] = CH_UNIT_STEREO; ctx->channel_blocks[1] = CH_UNIT_MONO; ctx->channel_blocks[2] = CH_UNIT_MONO; + ctx->coded_ch_layout = avctx->ch_layout; break; case 6: avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK; @@ -118,6 +126,9 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, ctx->channel_blocks[1] = CH_UNIT_MONO; ctx->channel_blocks[2] = CH_UNIT_STEREO; ctx->channel_blocks[3] = CH_UNIT_MONO; + ret = av_channel_layout_from_string(&ctx->coded_ch_layout, "FL+FR+FC+BL+BR+LFE"); + if (ret < 0) + return ret; break; case 7: avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT1_BACK; @@ -127,6 +138,9 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, ctx->channel_blocks[2] = CH_UNIT_STEREO; ctx->channel_blocks[3] = CH_UNIT_MONO; ctx->channel_blocks[4] = CH_UNIT_MONO; + ret = av_channel_layout_from_string(&ctx->coded_ch_layout, "FL+FR+FC+BL+BR+BC+LFE"); + if (ret < 0) + return ret; break; case 8: avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1; @@ -136,6 +150,9 @@ static av_cold int set_channel_params(ATRAC3PContext *ctx, ctx->channel_blocks[2] = CH_UNIT_STEREO; ctx->channel_blocks[3] = CH_UNIT_STEREO; ctx->channel_blocks[4] = CH_UNIT_MONO; + ret = av_channel_layout_from_string(&ctx->coded_ch_layout, "FL+FR+FC+BL+BR+SL+SR+LFE"); + if (ret < 0) + return ret; break; default: av_log(avctx, AV_LOG_ERROR, @@ -377,10 +394,12 @@ static int atrac3p_decode_frame(AVCodecContext *avctx, AVFrame *frame, reconstruct_frame(ctx, &ctx->ch_units[ch_block], channels_to_process, avctx); - for (i = 0; i < channels_to_process; i++) - memcpy(samples_p[out_ch_index + i], ctx->outp_buf[i], + for (i = 0; i < channels_to_process; i++) { + enum AVChannel ch = av_channel_layout_channel_from_index(&ctx->coded_ch_layout, out_ch_index + i); + int idx = av_channel_layout_index_from_channel(&frame->ch_layout, ch); + memcpy(samples_p[idx], ctx->outp_buf[i], ATRAC3P_FRAME_SAMPLES * sizeof(**samples_p)); - + } ch_block++; out_ch_index += channels_to_process; }