From patchwork Sat Aug 26 16:53:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 43351 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7194:b0:149:dfde:5c0a with SMTP id s20csp503299pzb; Sat, 26 Aug 2023 09:54:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFBy/BK1Oi+enqY3k/R8MMzgScU74y4KywuCfYMgncS+GeAtH0bsaw7WREG+F0VcnvFg3k/ X-Received: by 2002:a17:906:de:b0:9a2:276d:d83b with SMTP id 30-20020a17090600de00b009a2276dd83bmr4276564eji.69.1693068846232; Sat, 26 Aug 2023 09:54:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693068846; cv=none; d=google.com; s=arc-20160816; b=zzGrSTlJdZxPksJeCByCaMq6P6SGLExMDx9z2oBwO7y05tBJD8iiceNNU4sbmSr26k QMXKqBz5aLguqqT+0nbk+wV3FkUy/iErCb1YfhyAIadC45CMZ0DO8uDCKw3leleZKccs OLNUeqzzZp3coUwZKOyqrnmkjM8zfVwTOMZ0M1qcYqIk7JnSDj6f8Jy3puk5kVqYTnZB 4v4NzeUOAKPXF7UI+rjYpGMAnZX4V+Sp/jxOE0QpAODH+PtaldRvMrA3w/fmcE/HdkPn myULLE5kabYyP1Ud2VBrSXApav0QFSxbt5zBa+Ed8yPr6geXXK9/KWJnXcrbUb7EdYDD 1O7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to; bh=IYDl+ld5AJtPZ3NiwJ27t2ymEgCIukffylraz8TmOh4=; fh=e5zN9xSzcxLA6bGo3lF+CqTbY/oLwzApV03EO/RBfgQ=; b=NAJr9kOZckFiHrazMDzd8phIgcBx1Ag/rh7lIQl3X5KYjlfIVdwJDQyffp6S9Ip6z1 RBuAbKrQWU9xaYJ7V8TIVJ0ueCMT+41O5IS/mEJB9D5fCJ8ujdKzbceleqX1z3U0QRNI kIB+4ywiTdP0pmuHS05Ki7gyNmnPXx3gs7EtV5sw55MNvT0C77vVqvSMAODIrW5Aqp7s xI1uQ1EdkN9Ssev+Z04wVr8XFkxujHYcgKD9ohJ+EML7dY0nMJQDErPlNjtCNApKygsd XKU4hVTLmc8IbtR4epio4S6g4ndAnkiLu12UJtZMjPMG9jWI5eR3IfL85+b7Hdu+jH2W 2sJA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w26-20020a1709064a1a00b0098f99532db7si408223eju.673.2023.08.26.09.54.03; Sat, 26 Aug 2023 09:54:06 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8669668C5BF; Sat, 26 Aug 2023 19:53:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F3E6F68C28D for ; Sat, 26 Aug 2023 19:53:51 +0300 (EEST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 0D54BE0002 for ; Sat, 26 Aug 2023 16:53:50 +0000 (UTC) From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Sat, 26 Aug 2023 18:53:49 +0200 Message-Id: <20230826165350.8838-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.17.1 X-GND-Sasl: michael@niedermayer.cc Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/apedec: remove unused variable 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: y5eGDOscrALP Signed-off-by: Michael Niedermayer --- libavcodec/apedec.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index a9d5eb7f33..8bd625ca05 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -145,8 +145,6 @@ typedef struct APEPredictor64 { uint64_t coeffsA[2][4]; ///< adaption coefficients uint64_t coeffsB[2][5]; ///< adaption coefficients int64_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE]; - - unsigned int sample_pos; } APEPredictor64; /** Decoder context */ @@ -860,8 +858,6 @@ static void init_predictor_decoder(APEContext *ctx) p64->lastA[0] = p64->lastA[1] = 0; p->sample_pos = 0; - - p64->sample_pos = 0; } /** Get inverse sign of integer (-1 for positive, 1 for negative and 0 for zero) */ From patchwork Sat Aug 26 16:53:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 43352 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7194:b0:149:dfde:5c0a with SMTP id s20csp503350pzb; Sat, 26 Aug 2023 09:54:15 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHB2BH4Ui15iOBN6nRSIYrIeHs4+7dG/LoLNJ7zoXsjOFxuQAF5BlvEsPtKGRBUu77Z+dQi X-Received: by 2002:a17:906:74cf:b0:9a2:b89:f82a with SMTP id z15-20020a17090674cf00b009a20b89f82amr5785518ejl.49.1693068854783; Sat, 26 Aug 2023 09:54:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693068854; cv=none; d=google.com; s=arc-20160816; b=Feez8yLhKfJTtKkKc6PWphpkQd5ZizoApGRZJxpU/+HJMUCkOxiuwSnRr1doIMzCu3 nVHPHsaMpuuoZhuWlDiu4UxzL5hA81FZnU+99oEtwvpzn2SyKBc3urPZPEHYSw15EpWw jt2HXiz1NAeOtBbKJz3eOKH/lh/l11ISSifTv3n7qplTCLoJJ8K6zhy02k7bPQ/Ng4I9 XLREJlMfxVJdS97f7gtpDVT1Pf4RAQv52OMUcaBIiTrcnGkln6p/0hEvnVI37CBUYmIf sFzdfFQrzc1pjAJEL1NTR5PFwDiJ85mfc7u168Dkdl3TWhTph1Cm4MST+YlT/4VqQItt hjew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=mp+w/D5oo/S/l3P8L5l0WQwawCVIul27K+8pzah/VyY=; fh=e5zN9xSzcxLA6bGo3lF+CqTbY/oLwzApV03EO/RBfgQ=; b=u1aGRYPwMOeS6ktT0b67dfVtkGpBgcQpR3srUmfMVWDlNskrPGSOkqQe+FCEW0RxD1 nelwxHf/7eTR1al8NvgtJZvMfo/vBY2N34h3zcFoxcFUertZGp0F4O/FRPfzQ7+XH8Cn G8/WYLWd/UbQe7PIo/YxS1tvxNsIMvgqXGrGq9JPuimmNOYRvxQzjaSXlay1Uusmsoli kjVZJtwK7gb4dAR5ARwm/6PY3p6iWY4axhkoY2cB6jf5OeIStS+TeI5viVBVqUkvZNeu G/7ZiSht3Irm1aPrzv5bEQ2tiV2cPO0T0Ty4cDXma80Y7xr0giUGPqrOOjJo/aLSxg5I RR4A== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d22-20020a17090694d600b0099e02fe7b8csi2245750ejy.799.2023.08.26.09.54.13; Sat, 26 Aug 2023 09:54: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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 92B3868C601; Sat, 26 Aug 2023 19:54:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B003568C28D for ; Sat, 26 Aug 2023 19:53:52 +0300 (EEST) Received: by mail.gandi.net (Postfix) with ESMTPSA id DEB0C240005 for ; Sat, 26 Aug 2023 16:53:51 +0000 (UTC) From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Sat, 26 Aug 2023 18:53:50 +0200 Message-Id: <20230826165350.8838-2-michael@niedermayer.cc> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230826165350.8838-1-michael@niedermayer.cc> References: <20230826165350.8838-1-michael@niedermayer.cc> X-GND-Sasl: michael@niedermayer.cc Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/apedec: Implement interim mode detection 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: v6pEp7g27GYd Fixes: NoLegacy.ape Found-by: Matt Ashland Signed-off-by: Michael Niedermayer --- libavcodec/apedec.c | 106 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 22 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 8bd625ca05..249fc22e24 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -171,6 +171,9 @@ typedef struct APEContext { int32_t *decoded_buffer; int decoded_size; int32_t *decoded[MAX_CHANNELS]; ///< decoded data for each channel + int32_t *interim_buffer; + int interim_size; + int32_t *interim[MAX_CHANNELS]; ///< decoded data for each channel int blocks_per_loop; ///< maximum number of samples to decode for each call int16_t* filterbuf[APE_FILTER_LEVELS]; ///< filter memory @@ -187,6 +190,7 @@ typedef struct APEContext { const uint8_t *ptr; ///< current position in frame data int error; + int interim_mode; void (*entropy_decode_mono)(struct APEContext *ctx, int blockstodecode); void (*entropy_decode_stereo)(struct APEContext *ctx, int blockstodecode); @@ -223,6 +227,7 @@ static av_cold int ape_decode_close(AVCodecContext *avctx) av_freep(&s->filterbuf[i]); av_freep(&s->decoded_buffer); + av_freep(&s->interim_buffer); av_freep(&s->data); s->decoded_size = s->data_size = 0; @@ -248,12 +253,15 @@ static av_cold int ape_decode_init(AVCodecContext *avctx) switch (s->bps) { case 8: avctx->sample_fmt = AV_SAMPLE_FMT_U8P; + s->interim_mode = 0; break; case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16P; + s->interim_mode = 0; break; case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32P; + s->interim_mode = -1; break; default: avpriv_request_sample(avctx, @@ -1181,7 +1189,7 @@ static av_always_inline int predictor_update_filter(APEPredictor64 *p, const int decoded, const int filter, const int delayA, const int delayB, const int adaptA, const int adaptB, - int compression_level) + int interim_mode) { int64_t predictionA, predictionB; int32_t sign; @@ -1209,7 +1217,7 @@ static av_always_inline int predictor_update_filter(APEPredictor64 *p, p->buf[delayB - 3] * p->coeffsB[filter][3] + p->buf[delayB - 4] * p->coeffsB[filter][4]; - if (compression_level < COMPRESSION_LEVEL_INSANE) { + if (interim_mode < 1) { predictionA = (int32_t)predictionA; predictionB = (int32_t)predictionB; p->lastA[filter] = decoded + ((int32_t)(predictionA + (predictionB >> 1)) >> 10); @@ -1234,33 +1242,74 @@ static av_always_inline int predictor_update_filter(APEPredictor64 *p, static void predictor_decode_stereo_3950(APEContext *ctx, int count) { - APEPredictor64 *p = &ctx->predictor64; - int32_t *decoded0 = ctx->decoded[0]; - int32_t *decoded1 = ctx->decoded[1]; + APEPredictor64 *p_default = &ctx->predictor64; + APEPredictor64 p_interim; + int lcount = count; + int num_passes = 1; ape_apply_filters(ctx, ctx->decoded[0], ctx->decoded[1], count); + if (ctx->interim_mode == -1) { + p_interim = *p_default; + num_passes ++; + memcpy(ctx->interim[0], ctx->decoded[0], sizeof(*ctx->interim[0])*count); + memcpy(ctx->interim[1], ctx->decoded[1], sizeof(*ctx->interim[1])*count); + } - while (count--) { - /* Predictor Y */ - *decoded0 = predictor_update_filter(p, *decoded0, 0, YDELAYA, YDELAYB, - YADAPTCOEFFSA, YADAPTCOEFFSB, - ctx->compression_level); - decoded0++; - *decoded1 = predictor_update_filter(p, *decoded1, 1, XDELAYA, XDELAYB, - XADAPTCOEFFSA, XADAPTCOEFFSB, - ctx->compression_level); - decoded1++; + for(int pass = 0; pass < num_passes; pass++) { + int32_t *decoded0, *decoded1; + int interim_mode = ctx->interim_mode > 0 || pass; + APEPredictor64 *p; - /* Combined */ - p->buf++; + if (pass) { + p = &p_interim; + decoded0 = ctx->interim[0]; + decoded1 = ctx->interim[1]; + } else { + p = p_default; + decoded0 = ctx->decoded[0]; + decoded1 = ctx->decoded[1]; + } + p->buf = p->historybuffer; + + count = lcount; + while (count--) { + /* Predictor Y */ + int32_t a0 = predictor_update_filter(p, *decoded0, 0, YDELAYA, YDELAYB, + YADAPTCOEFFSA, YADAPTCOEFFSB, + interim_mode); + int32_t a1 = predictor_update_filter(p, *decoded1, 1, XDELAYA, XDELAYB, + XADAPTCOEFFSA, XADAPTCOEFFSB, + interim_mode); + *decoded0++ = a0; + *decoded1++ = a1; + if (num_passes > 1) { + int32_t left = a1 - (unsigned)(a0 / 2); + int32_t right = left + a0; + + if (FFMAX(FFABS(left), FFABS(right)) > (1<<23)) { + ctx->interim_mode = !interim_mode; + av_log(ctx->avctx, AV_LOG_VERBOSE, "Interim mode: %d\n", ctx->interim_mode); + break; + } + } - /* Have we filled the history buffer? */ - if (p->buf == p->historybuffer + HISTORY_SIZE) { - memmove(p->historybuffer, p->buf, - PREDICTOR_SIZE * sizeof(*p->historybuffer)); - p->buf = p->historybuffer; + /* Combined */ + p->buf++; + + /* Have we filled the history buffer? */ + if (p->buf == p->historybuffer + HISTORY_SIZE) { + memmove(p->historybuffer, p->buf, + PREDICTOR_SIZE * sizeof(*p->historybuffer)); + p->buf = p->historybuffer; + } } } + if (num_passes > 1 && ctx->interim_mode > 0) { + memcpy(ctx->decoded[0], ctx->interim[0], sizeof(*ctx->interim[0])*lcount); + memcpy(ctx->decoded[1], ctx->interim[1], sizeof(*ctx->interim[1])*lcount); + *p_default = p_interim; + p_default->buf = p_default->historybuffer; + } } static void predictor_decode_mono_3950(APEContext *ctx, int count) @@ -1590,6 +1639,19 @@ static int ape_decode_frame(AVCodecContext *avctx, AVFrame *frame, s->decoded[0] = s->decoded_buffer; s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8); + if (s->interim_mode < 0) { + av_fast_malloc(&s->interim_buffer, &s->interim_size, decoded_buffer_size); + if (!s->interim_buffer) + return AVERROR(ENOMEM); + memset(s->interim_buffer, 0, decoded_buffer_size); + s->interim[0] = s->interim_buffer; + s->interim[1] = s->interim_buffer + FFALIGN(blockstodecode, 8); + } else { + av_freep(&s->interim_buffer); + s->interim_size = 0; + memset(s->interim, 0, sizeof(s->interim)); + } + s->error=0; if ((s->channels == 1) || (s->frameflags & APE_FRAMECODE_PSEUDO_STEREO))