From patchwork Mon Apr 8 20:13:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 47940 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3f98:b0:1a7:a0dc:8de5 with SMTP id ay24csp135398pzb; Mon, 8 Apr 2024 13:14:37 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUB1/Pua2fUgA4h9DG1xsfAs/cpV88QvUtE9mUA4e3ll5M2aEbujJSChlgEkf9bLEcfFDkTA43CFWHbjxDKjBBw2HlGzW4PESBifA== X-Google-Smtp-Source: AGHT+IEr6BJuhbs+cFOqX5524VPIsjxn8cs0Mn/F3KhssDOcp96D59RYjXSOlLASPWfN02K/hi/o X-Received: by 2002:a05:6512:3c96:b0:513:cc4f:52b8 with SMTP id h22-20020a0565123c9600b00513cc4f52b8mr9786096lfv.12.1712607276916; Mon, 08 Apr 2024 13:14:36 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h19-20020a1709063b5300b00a4e7c30929fsi3936533ejf.326.2024.04.08.13.14.36; Mon, 08 Apr 2024 13:14:36 -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=@outlook.com header.s=selector1 header.b=b+pPnNNA; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E914668D2E7; Mon, 8 Apr 2024 23:14:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01olkn2067.outbound.protection.outlook.com [40.92.66.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3E39668D2E7 for ; Mon, 8 Apr 2024 23:14:21 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Wa42q2wS5YALXARkrH6XPHQtMqcy1AL2zfhnpl0rx+9o+E7j8k+wP2yJTPMRrUMzvC3t6TrIFjFSB0UZfkUnRkPwpaytJQDQ493Mt6tdYolg8kcIRma9B3Lrw5r47pvpKhrmBm3UHo0x72qmeUE/tNDaKshj5tYtu9T3Pxjy6dboPn06aJqFDjhczey1qmh5CLzSD40PlGr0PMDryLuuauZAZJxuLMaF1NX9q0SQ6Vpu7KONM2lI5XnvGuwwEmXPRo6neDT50spteM3QCNQoC7wHFkxLdOVx3axvqUNP9JpOs2VivhS7ZVXM9oym7QvKQgXlPG7f+mDs0YTb68ydEQ== 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=S0mh8wUiI270YF2yJquq0k2wPIqRx7E6wiFa6AeOVig=; b=Qc4RPCdDBnmgiPT3GjOSqZ5HmuPu6DZIbpkhqICMqxGQ13h/Vgr4QpVhXMDU+/gDvEPS1aa/baAWpIfFJUac6e2BxPICaGa5ae8W5O7oNTSlwqcVNMhwKAN/XtE6pD3/54x7cjHQeaeOeR6Yy7aGTBwTzalIZ36kfkjgMLmnloDW+XxqgEEbeyBLqYh3aw3+D6PbtqypxQcXU5IWQjAkuihU0sELMO+gAmvQDJ/M559k2rpyykqlgEzt10r/vkf37bkRNW2fhmUZHSqm4cI085ZTXj4ca1YAiW4ajXP87yl6gI7SQ0qgez9Bj2OfVlgkWTcQWC7ErYE7fafgHbSXfQ== 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=S0mh8wUiI270YF2yJquq0k2wPIqRx7E6wiFa6AeOVig=; b=b+pPnNNAd8m+FkWCyjPUikZ4z3EUSh+SG86ieEkP/Q6qlwd5mPznUbislny79QekhhnhYnuoLkHgwqYUGOI1KRBAhcraLfrsl5wpN71YdXK4/JP+a3dBVdBUykEpwDmr0eJv/PfclU6Y4HJs/NU7YqvXXcjJ/oZqABSrAgvA9Y6bhQZK+lmtC9l4x4aTVw28JRZbQZBqVaeELaBcd72utx6TPGwOcSSnvsrnT8PUkFQT5ttx56ppcIOEoo9RIXayD4UYWyblMO59ct/KznxCV3JjmoEJKYBzNBaWkvYbUmfwNHIv4kV5cGbXB/E3IAB4f7xsYEQXcD1yVote9rQ+0g== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by PAXP250MB0494.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:28d::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Mon, 8 Apr 2024 20:14:16 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d%4]) with mapi id 15.20.7409.042; Mon, 8 Apr 2024 20:14:16 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Apr 2024 22:13:41 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [kQRtIMEAMtHgGr5AqV3snFUIxuRZSa4edpQgizsJafg=] X-ClientProxiedBy: ZR0P278CA0124.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:20::21) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240408201405.2136840-2-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|PAXP250MB0494:EE_ X-MS-Office365-Filtering-Correlation-Id: 03988b75-459c-4fea-1839-08dc580876ed X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: q2Dp23noX5W8D/H9FBTVgC7QZZBugDi/YEyvtn7lZIo4up16qPVIzcO8UAUOmJhhUNLWs8zmJeNMRBmrN1viiIZYP8DW4pnsvdUhqXSaU+gv/vVc792TI8kr5VzuKugsoTTA1/NuWFbckeNY40crMNmomhJD+5Vzn/9bVsB3kCoPLRVzxr5YI1O6QTf4xQVB4P14H61nncIgXntbj06tLiuE/+MMBE7mwCCdSsTq6pY95IAVfQ4FX4uQaNeZuU/BXGzL4Qnew5Lbn+utBpOUBMQYqu1T0PRspC21HuVVhKGyN56wfkFXf3jc8nFgqvIUblXNQgmhYrlM0ubWVuZt++iy8DwYlqcR167ITAoCyqwe4e3Onfca8hGJRWdSAx6YMGWg4qVt5VHjRY4dzP26lLtPGWAKnI6fGN/iBruZSIs6gFQpYlROiBmowjF9W6QgN0agNOmeGhmQ5mVu5m3fc9iU45bvCtGsMdyWnP9YDm1EEHfkHUMoKlAGxFxOLJDJh16ndPHrQMtFJUzf0m+afBf9F1Xa9RpLeN8OSkd4U9DGLPwaDu8SEr66560GmMMStC9Iw8IHfZcG0VSjvthjHVeLaOFrdTfASpzDRVq/O89AMo55So48L0MBXOxllPKR X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: wiFcczg97+/g8h9BShzjPITc6nwQZH3tRQPGB5WOOEOXK6Oez3l29fy5CR8976fzucEmE1LUEV791+lNeC1mwTsXK6d7CUx92nQZQAnFPFyjFitlgIDzhssIVYMbcsHRyPE5csLPw+CBUKAqZAxl+rUZjdprXXOyBAV53Dbpmup6uEazVmEPzvTDMjLbu9UKwlfX+86XVmfZUs7tPYW/vJew2bLv7uqK7IgCLfSAg+/AkCuNnjtYZAvgoK3s76syo4g83VLNsU7EpHLVrVo/Upiox1hyemNEVc6vn8aDIoezvTGaI2kW/Z6cFdTC5v1hppsAT8/44hKp/z1LoY+3T6SDWu0pQZV0RONqDMgtZOArksVMFtyip+8S8w8s2cCRTOKJXy7lLFTKUeO0mZergfkv8GmJ2rbIcFUSLYaxg+I/yNKxzu2zvKmjK8kXQYKq4zMhBnoL3tBUCCm8aWDfu6uWThHwlVPRHx4J7VoUks9sZWZPNm0ZcKOrJCK82RkqgA7lIt34PZfylvHOa5jmpZrT+38HPsMOU97Qdqa/3kyHaW3DNu8nJIQuZlGUulJJf9V8uM1M4JOzRPl37ntsosJueiUpozNjf+Uo+717Ee0+B8fdhPi9uhsHWntAopWqpAevgcPT0ATmlvpHE60qvpYGi45bPlUxMsg2s5JX9sfKfpGZjzp8nxIyVoGwOP3JFvSMlLcDhLyJVMVr+NlmO2SJEAxsOJWBRSC7cM1D1smRN1kiRaJ9oSpzjGEJZFZgsqw9FaJfYChmAL3cf27/EitCfrashzjFl4atpCxP442B9wD1Ae1r4MDkagCGMX3O9NNzWPOM51ZGrOQP+8B6OmMMRPHfIz0HxjxH9vrV6rBnZkwTRD6MiCiGEesv7lmvUwXsnaeRzBc8scW9Mm4D8iwaqyl5gug0sf8Uxjvlsm6HDiHFkmYrKU9E50c0CK+qa/TUuUwRpqfgwGDbLzqP6CTN/rrtHW5QCMx3lWX+kM/5QHteR6+0yP8BainVOAwIT+s5F58OstL1c2y9sk1UaIfokvXNEsNEYQ0ERdOZwB+heOqyWtC9or6EP6PWtfyY/hy+6Fx6hNhxQMo/I11DR32g1Q8OA3JU68tbC6b19/fYKOn4OkRgI+R2qN+sl3OOhmbB1dFgY1qRFKZtWJirBC5ie1qxGK+T9drHIT9BkY8x+kFjH/KNn3kNv5FWHNoSVIHBOFvH8EZTwyFLyyHovko+5J8bc2KGc4LKoD7PcgHie4uybQAja5XZIQIKNI2xy0EeMht8nOtukFJrswaSNw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 03988b75-459c-4fea-1839-08dc580876ed X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2024 20:14:15.9642 (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: PAXP250MB0494 Subject: [FFmpeg-devel] [PATCH v2 03/27] avcodec/mimic: Switch to ProgressFrames 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: Anton Khirnov , Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6K64unQvNHs2 Avoids implicit av_frame_ref() and therefore allocations and error checks. Reviewed-by: Anton Khirnov Signed-off-by: Andreas Rheinhardt --- libavcodec/mimic.c | 61 +++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c index 8928f24022..2925aa50f7 100644 --- a/libavcodec/mimic.c +++ b/libavcodec/mimic.c @@ -34,8 +34,8 @@ #include "bswapdsp.h" #include "hpeldsp.h" #include "idctdsp.h" +#include "progressframe.h" #include "thread.h" -#include "threadframe.h" #define MIMIC_HEADER_SIZE 20 #define MIMIC_VLC_BITS 11 @@ -52,7 +52,7 @@ typedef struct MimicContext { int cur_index; int prev_index; - ThreadFrame frames [16]; + ProgressFrame frames[16]; DECLARE_ALIGNED(32, int16_t, dct_block)[64]; @@ -105,16 +105,12 @@ static const uint8_t col_zag[64] = { static av_cold int mimic_decode_end(AVCodecContext *avctx) { MimicContext *ctx = avctx->priv_data; - int i; av_freep(&ctx->swap_buf); ctx->swap_buf_size = 0; - for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) { - if (ctx->frames[i].f) - ff_thread_release_ext_buffer(&ctx->frames[i]); - av_frame_free(&ctx->frames[i].f); - } + for (int i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) + ff_progress_frame_unref(&ctx->frames[i]); return 0; } @@ -130,7 +126,6 @@ static av_cold int mimic_decode_init(AVCodecContext *avctx) { static AVOnce init_static_once = AV_ONCE_INIT; MimicContext *ctx = avctx->priv_data; - int i; ctx->prev_index = 0; ctx->cur_index = 15; @@ -141,12 +136,6 @@ static av_cold int mimic_decode_init(AVCodecContext *avctx) ff_idctdsp_init(&ctx->idsp, avctx); ff_permute_scantable(ctx->permutated_scantable, col_zag, ctx->idsp.idct_permutation); - for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) { - ctx->frames[i].f = av_frame_alloc(); - if (!ctx->frames[i].f) - return AVERROR(ENOMEM); - } - ff_thread_once(&init_static_once, mimic_init_static); return 0; @@ -156,7 +145,6 @@ static av_cold int mimic_decode_init(AVCodecContext *avctx) static int mimic_decode_update_thread_context(AVCodecContext *avctx, const AVCodecContext *avctx_from) { MimicContext *dst = avctx->priv_data, *src = avctx_from->priv_data; - int i, ret; if (avctx == avctx_from) return 0; @@ -164,13 +152,10 @@ static int mimic_decode_update_thread_context(AVCodecContext *avctx, const AVCod dst->cur_index = src->next_cur_index; dst->prev_index = src->next_prev_index; - for (i = 0; i < FF_ARRAY_ELEMS(dst->frames); i++) { - ff_thread_release_ext_buffer(&dst->frames[i]); - if (i != src->next_cur_index && src->frames[i].f->data[0]) { - ret = ff_thread_ref_frame(&dst->frames[i], &src->frames[i]); - if (ret < 0) - return ret; - } + for (int i = 0; i < FF_ARRAY_ELEMS(dst->frames); i++) { + ff_progress_frame_unref(&dst->frames[i]); + if (i != src->next_cur_index && src->frames[i].f) + ff_progress_frame_ref(&dst->frames[i], &src->frames[i]); } return 0; @@ -293,11 +278,10 @@ static int decode(MimicContext *ctx, int quality, int num_coeffs, } else { unsigned int backref = get_bits(&ctx->gb, 4); int index = (ctx->cur_index + backref) & 15; - uint8_t *p = ctx->frames[index].f->data[0]; - if (index != ctx->cur_index && p) { - ff_thread_await_progress(&ctx->frames[index], - cur_row, 0); + if (index != ctx->cur_index && ctx->frames[index].f) { + const uint8_t *p = ctx->frames[index].f->data[0]; + ff_progress_frame_await(&ctx->frames[index], cur_row); p += src - ctx->frames[ctx->prev_index].f->data[plane]; ctx->hdsp.put_pixels_tab[1][0](dst, p, stride, 8); @@ -307,8 +291,7 @@ static int decode(MimicContext *ctx, int quality, int num_coeffs, } } } else { - ff_thread_await_progress(&ctx->frames[ctx->prev_index], - cur_row, 0); + ff_progress_frame_await(&ctx->frames[ctx->prev_index], cur_row); ctx->hdsp.put_pixels_tab[1][0](dst, src, stride, 8); } src += 8; @@ -317,8 +300,7 @@ static int decode(MimicContext *ctx, int quality, int num_coeffs, src += (stride - ctx->num_hblocks[plane]) << 3; dst += (stride - ctx->num_hblocks[plane]) << 3; - ff_thread_report_progress(&ctx->frames[ctx->cur_index], - cur_row++, 0); + ff_progress_frame_report(&ctx->frames[ctx->cur_index], cur_row++); } } @@ -392,17 +374,18 @@ static int mimic_decode_frame(AVCodecContext *avctx, AVFrame *rframe, return AVERROR_PATCHWELCOME; } - if (is_pframe && !ctx->frames[ctx->prev_index].f->data[0]) { + if (is_pframe && !ctx->frames[ctx->prev_index].f) { av_log(avctx, AV_LOG_ERROR, "decoding must start with keyframe\n"); return AVERROR_INVALIDDATA; } - ff_thread_release_ext_buffer(&ctx->frames[ctx->cur_index]); + ff_progress_frame_unref(&ctx->frames[ctx->cur_index]); + res = ff_progress_frame_get_buffer(avctx, &ctx->frames[ctx->cur_index], + AV_GET_BUFFER_FLAG_REF); + if (res < 0) + return res; ctx->frames[ctx->cur_index].f->pict_type = is_pframe ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; - if ((res = ff_thread_get_ext_buffer(avctx, &ctx->frames[ctx->cur_index], - AV_GET_BUFFER_FLAG_REF)) < 0) - return res; ctx->next_prev_index = ctx->cur_index; ctx->next_cur_index = (ctx->cur_index - 1) & 15; @@ -419,10 +402,10 @@ static int mimic_decode_frame(AVCodecContext *avctx, AVFrame *rframe, init_get_bits(&ctx->gb, ctx->swap_buf, swap_buf_size << 3); res = decode(ctx, quality, num_coeffs, !is_pframe); - ff_thread_report_progress(&ctx->frames[ctx->cur_index], INT_MAX, 0); + ff_progress_frame_report(&ctx->frames[ctx->cur_index], INT_MAX); if (res < 0) { if (!(avctx->active_thread_type & FF_THREAD_FRAME)) - ff_thread_release_ext_buffer(&ctx->frames[ctx->cur_index]); + ff_progress_frame_unref(&ctx->frames[ctx->cur_index]); return res; } @@ -449,6 +432,6 @@ const FFCodec ff_mimic_decoder = { FF_CODEC_DECODE_CB(mimic_decode_frame), .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS, UPDATE_THREAD_CONTEXT(mimic_decode_update_thread_context), - .caps_internal = FF_CODEC_CAP_ALLOCATE_PROGRESS | + .caps_internal = FF_CODEC_CAP_USES_PROGRESSFRAMES | FF_CODEC_CAP_INIT_CLEANUP, };