From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 95D2D47698 for ; Tue, 19 Sep 2023 20:02:37 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3D12868C9ED; Tue, 19 Sep 2023 22:59:04 +0300 (EEST) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01olkn2065.outbound.protection.outlook.com [40.92.65.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7964768C9ED for ; Tue, 19 Sep 2023 22:59:02 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cNHbSR5PReLQl1hE2TrcQWpGLZrRooT06eWgo+yLX2bDgDnaqTeMzdxeCUMPenpHtmePhs2UFw54JbdSEfa0gCSLe0I7nVHunsoBvbIHBi94JpYbmjdnUQ5CK6VNYJdwJcY4gGIvUSAp1rK2xobThOc7AiaMFIE7fccQyoNZIenUHMUSo/U/TIlzTyTx+8ripFY2moSHwT724UWwo/1q8QkFU4UaZ5dluFuXkQf8eyigxPj+EU+XcHmQRMB+mHfhhBp6JoWb4gAUpR9+YdQQbYcpffq1GS5xYjyjFqdSTlxp8JaQAP22tQTxM/Vae3hGxYWMb1qVNAzREXd9n+NYkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=gTNXLm1yWQSkWPKrjNIPdYJ/HWrCj1ZQN3TFl3q2RWw=; b=lvyb2WrhXVVC17tZh7MzXIoxwIocZfHGFttK6hL1NvWP5yQyMuGoOJmmIHO0KtBuqW5+/qOwskjq0bEvBXSPfVye9elqO9pAzZm74S2hPps/N+/y+D0zG3XR77GXLctGKU1M7BWx51PLJsHkUaxD1QPUpYGaY65qe/bwelKN6uV0FsZTdWAWTGFYxF2cWVrjV6wG7dLHG/A2si75ZzEgdvDrgv0vxJ8eelXtmvm5HJv1NrNT9ZvkMiXNzF89Xs7sb1RSrT9MYRUuS2+jYf3AqZiShhGBQor+hiFbKHVGOpRwNqbIQ3WBmYTYaLwumG8QvZEfmamif/HJZukwObBzxg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gTNXLm1yWQSkWPKrjNIPdYJ/HWrCj1ZQN3TFl3q2RWw=; b=CmtW4M6u4rTl07nZkMLVb6cpTnAGkWZJ/a3Mw/6daFTAHES0TmC0/QEbVWJ/pErBJZrz9etbxCX/CqC6iYb84hkZYQ4W1QnGBNgIKYVSWFqUUmFOlJIURYl2GMbeNToxgEwEDmiSOQgnPjG+c9WXvVw3W8XjXzNss22gQaADLQVLQKKqmkIm8fHlpGkvRs+uQdC9q3mXjdS42gzWpDUoGkYVpbUunNkeAyZC66EXZVJ+smW8PqwrmBUatWYZnYjTlR32RPHBky58j2hy0pwxS9KtpPqIuGxLX5KaalI9CPhdGxX4ZWWGLlvDB/xdlas3WHAqVM0+RyOBeNMGlhX59g== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU2P250MB0237.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:276::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.26; Tue, 19 Sep 2023 19:59:01 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6792.026; Tue, 19 Sep 2023 19:59:00 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Sep 2023 21:57:28 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [Hryj1kHZfsJ7+QkSscCAnFSdCMDAH8FP] X-ClientProxiedBy: ZR0P278CA0086.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::19) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230919195734.1005750-36-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DU2P250MB0237:EE_ X-MS-Office365-Filtering-Correlation-Id: 81ff7c41-54e8-45b9-8a91-08dbb94ade08 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DwZVVfJoUN1A3+xUkl/Xf4jkAvQqBJPBZPk4G0U71dkd0lRl5BbnJnSDys3FEB+lYt50cY/7fIgs0lyVu0ZSU4PjggTr3cmwf0FlaergIVdovo+BCd7dOD9X+gjCzp284DjHg9MXgM2ZNbEMcax0nCUuAEv10doz1vbX5lE52sjdmLImo1XgmiA++2dCHImaIWyExS6RXCD9Pmyu9wwiq+NvVQSRenlWcY1TDH78eHcoBoA3aQoOKJrNBNCarqnsPlqBNznlPQKW3oB+sRwWtMJChwTd5gOcxx/nSbveJdjDz2k53dIcf9iiiUw6p/+IrX7DTnuvhzGxYnctD75AFdO0yYulcIkzSwy/NWCBJE3hSG+x2gGDW6mLzxQnRBGy2lbIIycVfHmq5SumwpEwQ6j7VzOJ8ytRLlHsO1Fp655K92OU1n+YnlNuf3rvcwku/AaKXk8Zn8CAJy83OaTiXPowo4s36bbKfeTxh3gORNH6uJSoXD7XRYvseuLsB09CUOlgODVPJ+VkQZzZRrlI6bR9fh3f6/0P6w+pcXgl9ZN3Ozis0QB9eikOtole7z5dio03rZ9VwoFRqd4ILwEUT45De/u+Y7B2NBUPM6kNTEu+RozC8+gqK4dPeNnByjI6 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?XeVpngHNPLZSD9x1mnFEecrWIxvPY8CBESrEguBihLHd4MOV544CyTm9EGcg?= =?us-ascii?Q?qFWGkVxDRgoRoIHvTGnnQawCBp1EIH1dBujdLrVJ1e6sPmmrqgF5+CKYI2cE?= =?us-ascii?Q?KLiD6UT602wxNFF2KV3UTo/ZdBoEJAebQJKq7UCPm2SBChfw7piv6byWxPZJ?= =?us-ascii?Q?d8mQqMUwAqhJjHomdFr94jKWXT/hlceZSvCzPADrkzYssm9eJ4uydMB+N3Nb?= =?us-ascii?Q?RPgP4/AXwUzLo9rJQTjeO5oRkcFpGz5FT+dxZHw3csl46JnKTrWiS/bpd2F6?= =?us-ascii?Q?rIT+Vq1B4Z7qIHfzAKBWQGWX+7Jl/xM5HnoCmvv3xwZB5/0hTKVWgDEwLrnq?= =?us-ascii?Q?gpxbsHZ1tmahV+PP5keKxcwPx+8uK6n+icolQWVO8oU6SpV26TAT3gkMfP6j?= =?us-ascii?Q?VC+/kFmKEVwK7naxTMHmX1ypSSHoxxyEoKuyIchnNQyilqjHgQZauUqxB6NX?= =?us-ascii?Q?f13zghQn7Li/kufKcwaSzV/a2hLpdBO9chu8tu2lE4ZJ+1DN9q0xwoPwwrzM?= =?us-ascii?Q?S3WDrCPqHHHiHjTyuYACk2rD6CvQgv5I0yd/4pPYoPfPWdv5pqNoykPgZtOH?= =?us-ascii?Q?82O6/+6rSOohTgwA+MXCDqDS1nn5M5iIB6/TT79oX19IFKuR82tldTIdScQf?= =?us-ascii?Q?MwDHsAZeMVz+1xkuz6F7bRNoZU2oVl/uOk9Sz1fcoePt+2b+IIo+/N/z6iXX?= =?us-ascii?Q?/AAkHZTl+H2gCscgPmalaiYs2O6FkKAStLQSTYPZBnsaI99o5Dr7pnO63obD?= =?us-ascii?Q?iKLG8zGphmBqkhNacKWmqxlZL0UO9ZjkYmFrdZ5dNw3c15EDbe3r2E5yU8eb?= =?us-ascii?Q?YIDemLBtYiz+RqltrmKvN++eisLkCf/6QJMq0nnPt9DqmImTWixnNhw4fZev?= =?us-ascii?Q?XW6cBKe5j8sdZBhFdyd0p3qWy56FP5BuVJeBSlAy3C1krWDqf8CVjT1sWd7t?= =?us-ascii?Q?ulMB6Vs+fDN9zN3mJqOv41tQFDFb8FARda2qnGg8HNpA0PfV45NFpbGPyAYQ?= =?us-ascii?Q?usegVTQrUXaAcaxbLO3uQqnKveHSZhRdkVn9N49isUcJpxw26l6GnpV4Rsmm?= =?us-ascii?Q?0YanCkkE/q8iwInsGDoDfr5oKMIC35KM7ztK3nSK28A2FFurNi8PWILkrr9+?= =?us-ascii?Q?bvIxiuQv3JWeZQebQkxER8RJZX2tEsBLm8gJftj9M0Zme6YHqZGFf1w9JMU2?= =?us-ascii?Q?fAZx+4RdPHp7ZOCqbD2w8ozwsZ54bFaHfm9XBAsdNGNaGm3dupVkGsckAgiv?= =?us-ascii?Q?jPC84YRQX2CLnszHSx0N?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 81ff7c41-54e8-45b9-8a91-08dbb94ade08 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2023 19:59:00.9120 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU2P250MB0237 Subject: [FFmpeg-devel] [PATCH 36/42] avcodec/wavpack: Use ThreadProgress API 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 Cc: Andreas Rheinhardt Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: It is more natural given that WavPack doesn't need the data of the previous frame at all; it just needs the DSD context. Signed-off-by: Andreas Rheinhardt --- libavcodec/wavpack.c | 100 +++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 56 deletions(-) diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 97705c8854..acb23ab8fe 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -30,7 +30,7 @@ #include "get_bits.h" #include "refstruct.h" #include "thread.h" -#include "threadframe.h" +#include "threadprogress.h" #include "unary.h" #include "wavpack.h" #include "dsd.h" @@ -107,11 +107,11 @@ typedef struct WavpackContext { int samples; int ch_offset; - AVFrame *frame; - ThreadFrame curr_frame, prev_frame; Modulation modulation; DSDContext *dsdctx; ///< RefStruct reference + ThreadProgress *curr_progress, *prev_progress; ///< RefStruct references + FFRefStructPool *progress_pool; ///< RefStruct reference int dsd_channels; } WavpackContext; @@ -992,10 +992,18 @@ static int wv_dsd_reset(WavpackContext *s, int channels) s->dsd_channels = 0; ff_refstruct_unref(&s->dsdctx); + ff_refstruct_unref(&s->curr_progress); + ff_refstruct_unref(&s->prev_progress); if (!channels) return 0; + if (!s->progress_pool) { + s->progress_pool = ff_refstruct_pool_alloc(sizeof(*s->curr_progress), 0); + if (!s->progress_pool) + return AVERROR(ENOMEM); + } + if (channels > INT_MAX / sizeof(*s->dsdctx)) return AVERROR(EINVAL); @@ -1015,17 +1023,9 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) { WavpackContext *fsrc = src->priv_data; WavpackContext *fdst = dst->priv_data; - int ret; - - if (dst == src) - return 0; - - ff_thread_release_ext_buffer(dst, &fdst->curr_frame); - if (fsrc->curr_frame.f->data[0]) { - if ((ret = ff_thread_ref_frame(&fdst->curr_frame, &fsrc->curr_frame)) < 0) - return ret; - } + ff_refstruct_replace(&fdst->progress_pool, fsrc->progress_pool); + ff_refstruct_replace(&fdst->curr_progress, fsrc->curr_progress); ff_refstruct_replace(&fdst->dsdctx, fsrc->dsdctx); fdst->dsd_channels = fsrc->dsd_channels; @@ -1041,12 +1041,6 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx) s->fdec_num = 0; - s->curr_frame.f = av_frame_alloc(); - s->prev_frame.f = av_frame_alloc(); - - if (!s->curr_frame.f || !s->prev_frame.f) - return AVERROR(ENOMEM); - ff_init_dsd_data(); return 0; @@ -1061,18 +1055,15 @@ static av_cold int wavpack_decode_end(AVCodecContext *avctx) av_freep(&s->fdec); s->fdec_num = 0; - ff_thread_release_ext_buffer(avctx, &s->curr_frame); - av_frame_free(&s->curr_frame.f); - - ff_thread_release_ext_buffer(avctx, &s->prev_frame); - av_frame_free(&s->prev_frame.f); - ff_refstruct_unref(&s->dsdctx); + ff_refstruct_unref(&s->curr_progress); + ff_refstruct_unref(&s->prev_progress); + ff_refstruct_pool_uninit(&s->progress_pool); return 0; } -static int wavpack_decode_block(AVCodecContext *avctx, int block_no, +static int wavpack_decode_block(AVCodecContext *avctx, AVFrame *frame, int block_no, const uint8_t *buf, int buf_size) { WavpackContext *wc = avctx->priv_data; @@ -1526,24 +1517,27 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, av_log(avctx, AV_LOG_ERROR, "Error reinitializing the DSD context\n"); return ret; } - ff_thread_release_ext_buffer(avctx, &wc->curr_frame); } av_channel_layout_copy(&avctx->ch_layout, &new_ch_layout); avctx->sample_rate = new_samplerate; avctx->sample_fmt = sample_fmt; avctx->bits_per_raw_sample = orig_bpp; - ff_thread_release_ext_buffer(avctx, &wc->prev_frame); - FFSWAP(ThreadFrame, wc->curr_frame, wc->prev_frame); - /* get output buffer */ - wc->curr_frame.f->nb_samples = s->samples; - ret = ff_thread_get_ext_buffer(avctx, &wc->curr_frame, - AV_GET_BUFFER_FLAG_REF); + frame->nb_samples = s->samples; + ret = ff_thread_get_buffer(avctx, frame, 0); if (ret < 0) return ret; - wc->frame = wc->curr_frame.f; + ff_refstruct_unref(&wc->prev_progress); + if (wc->dsdctx) { + wc->prev_progress = ff_refstruct_pool_get(wc->progress_pool); + if (!wc->prev_progress) + return AVERROR(ENOMEM); + ff_thread_progress_init(wc->prev_progress, avctx); + } + FFSWAP(ThreadProgress*, wc->prev_progress, wc->curr_progress); + av_assert1(!!wc->dsdctx == !!wc->curr_progress); ff_thread_finish_setup(avctx); } @@ -1552,9 +1546,9 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, return ((avctx->err_recognition & AV_EF_EXPLODE) || !wc->ch_offset) ? AVERROR_INVALIDDATA : 0; } - samples_l = wc->frame->extended_data[wc->ch_offset]; + samples_l = frame->extended_data[wc->ch_offset]; if (s->stereo) - samples_r = wc->frame->extended_data[wc->ch_offset + 1]; + samples_r = frame->extended_data[wc->ch_offset + 1]; wc->ch_offset += 1 + s->stereo; @@ -1606,14 +1600,14 @@ static int dsd_channel(AVCodecContext *avctx, void *frmptr, int jobnr, int threa const WavpackContext *s = avctx->priv_data; AVFrame *frame = frmptr; - ff_dsd2pcm_translate (&s->dsdctx [jobnr], s->samples, 0, + ff_dsd2pcm_translate(&s->dsdctx[jobnr], s->samples, 0, (uint8_t *)frame->extended_data[jobnr], 4, (float *)frame->extended_data[jobnr], 1); return 0; } -static int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *rframe, +static int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) { WavpackContext *s = avctx->priv_data; @@ -1624,7 +1618,6 @@ static int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *rframe, if (avpkt->size <= WV_HEADER_SIZE) return AVERROR_INVALIDDATA; - s->frame = NULL; s->block = 0; s->ch_offset = 0; @@ -1650,7 +1643,8 @@ static int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *rframe, ret = AVERROR_INVALIDDATA; goto error; } - if ((ret = wavpack_decode_block(avctx, s->block, buf, frame_size)) < 0) + ret = wavpack_decode_block(avctx, frame, s->block, buf, frame_size); + if (ret < 0) goto error; s->block++; buf += frame_size; @@ -1663,26 +1657,22 @@ static int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *rframe, goto error; } - ff_thread_await_progress(&s->prev_frame, INT_MAX, 0); - ff_thread_release_ext_buffer(avctx, &s->prev_frame); - - if (s->modulation == MODULATION_DSD) - avctx->execute2(avctx, dsd_channel, s->frame, NULL, avctx->ch_layout.nb_channels); - - ff_thread_report_progress(&s->curr_frame, INT_MAX, 0); - - if ((ret = av_frame_ref(rframe, s->frame)) < 0) - return ret; + if (s->dsdctx) { + if (s->prev_progress) + ff_thread_progress_await2(s->prev_progress, INT_MAX); + avctx->execute2(avctx, dsd_channel, frame, NULL, avctx->ch_layout.nb_channels); + ff_thread_progress_report2(s->curr_progress, INT_MAX); + } *got_frame_ptr = 1; return avpkt->size; error: - if (s->frame) { - ff_thread_await_progress(&s->prev_frame, INT_MAX, 0); - ff_thread_release_ext_buffer(avctx, &s->prev_frame); - ff_thread_report_progress(&s->curr_frame, INT_MAX, 0); + if (s->curr_progress) { + if (s->prev_progress) + ff_thread_progress_await2(s->prev_progress, INT_MAX); + ff_thread_progress_report2(s->curr_progress, INT_MAX); } return ret; @@ -1701,6 +1691,4 @@ const FFCodec ff_wavpack_decoder = { UPDATE_THREAD_CONTEXT(update_thread_context), .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_CHANNEL_CONF, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | - FF_CODEC_CAP_ALLOCATE_PROGRESS, }; -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".