From patchwork Mon Sep 25 18:04:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43904 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:2a18:b0:15d:8365:d4b8 with SMTP id e24csp1403998pzh; Mon, 25 Sep 2023 11:05:13 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHw5ypZPdgeMX9i80o05EAdVr9gwMxdYahXMawGdq0+R2b6Uhya7ZU1lT5qZqJPU7sskIni X-Received: by 2002:a19:8c16:0:b0:503:3446:8ef5 with SMTP id o22-20020a198c16000000b0050334468ef5mr6461459lfd.10.1695665113309; Mon, 25 Sep 2023 11:05:13 -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 x1-20020aa7dac1000000b0052f8b665977si9285684eds.236.2023.09.25.11.05.12; Mon, 25 Sep 2023 11:05:13 -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=XgtDFRrd; 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 6506C68CA03; Mon, 25 Sep 2023 21:04:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01olkn2036.outbound.protection.outlook.com [40.92.65.36]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 517DA68C9F2 for ; Mon, 25 Sep 2023 21:04:10 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bwIpO8y7MZhLtvDsI9SD+fpC7c+kbXkpqpMXvli6N9RJokk2ZxcnDz0b3wpxp5SvKvFINM3vdgflVPvBOdPqEvGo4CaiYc61NJ9TGaN+7o1LRQ1+Lyz+qLh5kUjFhjMtuBmd1cEmVMFUnU9eRoOjbpAE6p+4zEcnRZ6Vc0bFZPFjfnl0BT5oYsdNi0KdlS7sWiWNvKQykg5fX1GkTRiR8eiANlG2WajwrM/TxNQ9sIR44qjJvN3kY5sVlgioc+e8AZ7Q6Z3mN+T/gqgdBTYRrO9oKua3XJjm5nG3gF9BuP9UwpOLP1EVEi+A8R+UhwoRNuMCEjs+f10Ib5uIuniIWw== 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=IJVwQwX0rMrKmrSEOY7MFMOMIyflV1CkYuougpP5rHk=; b=IOoAj9LfHEsGWvEwra/KhP84/bKczIWyWHvvVZCR7l57QYnKfaMJ7jWEtUpgjSmd3vAtUOUDOxDaq5jpReFfT3tb6UR6v+EGv+ZQ785v/k3WBJEqGohvMpAaJVJJxlLR9Hok6kMkN9d8FH8eX17nGo2xXYdA+DIllgovaez9iY/KeCJA5GzIiaKCgjgTaBJoqsDlmhCOeAE2jOkD/zAu+QUKxKi0PvPgxjrCB1qJumMntGPOI8k8R9oCK7VcDAbI1uwPFkEXrTTckSema4RKgNdB4YqLSe/zssuUzU8BxjqyCqPf0TpyxrtKnUA7GoYU4ed58JcsHq3cQB+FJfvv8w== 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=IJVwQwX0rMrKmrSEOY7MFMOMIyflV1CkYuougpP5rHk=; b=XgtDFRrdddj2mfE77BqxK/qi+/J92Xr7xZpgk9XoiCmLLSH5GSLmIZmiZYu5R9UgeTZSW75i8bmK26nVYZMCN0gpMpxU1QVR3XZN9Vx+1O+4+x2Nk0eEHceNmolWI43jfiDImN+bCVx2MJKCgvNudgOlS/B3UQ+K6i8Ks9+mekqWk3dL4hGjJp3KRejdtiCE/DkWtjHkAwO+zjANiSlBsGpqVOB3LP+lbnerv2c+beO838RsoW9G5mS2Jjp9WATfPf8VzP/3Knrc+4L1wDmjT9pNZQd/ScBQC7QBf0K8EfOmI58f3rsRHfg1K86ZNxsZbJqfCFEkGQjuwHHnJDD/hQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU2P250MB0271.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:270::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6813.28; Mon, 25 Sep 2023 18:03:59 +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; Mon, 25 Sep 2023 18:03:59 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 25 Sep 2023 20:04:54 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [jU6n9MLJbmGtqB3mGpZdi4j3W8HNQIK8] X-ClientProxiedBy: ZR0P278CA0083.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::16) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230925180457.2060101-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DU2P250MB0271:EE_ X-MS-Office365-Filtering-Correlation-Id: 6f5a65b0-638e-466d-088e-08dbbdf1cb02 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: EiLCK/K52GfT7UiVz2laLA17P2ESE66CtghstnhnSO1d5wJHzqRGUbbcLYeXkFkC7BVr0GyRJu13ccW73x8esljGUubBd8DnUJDMIITh9eBUP5WuqFNrHrzgdDzj4vKlbKR0BSbfKP4FzznkoXVnDd7vipEUyI70/q90itVmuoeW5xSoQiW8bwuVtVv1uGsImCSvMW0Am9Mi/dmq6YbOw3BK9kqe33zYnrybKf8wpVcz1/VRKgue3kkMYF7DQFg0OdHh44tTX0aFuY0cIBq8aWYItRv9ZApZ3efcdHOzjjGHLS4d1QDyLFLBEmywdFXRYOcKlngtGR3JmO7jqKXj8FJQRsuxudcamWVtRWmtmOEHGx+2lxPoA/nDftnMVQ4YRdedgucFHvYP8VGrxQetCP7mTpk+TgpXJNOXfwu3v5Bz3b13O8Kwwm2rgyDpsZmch25ssZyyZ8VvaIZwqRDU3NVVRTPSmrKs6g4c+hWKsvJF08teYtWdEngNtFlW+uSpt11RUbjAbG1P4rZx/c4f6Yd9HOpdyi47shpS4HDrB2Z64lEickmq8hYmvpiJlL/7hFBMt2AiQIGSG5gRVGDhghUxDiMKJ3Qk8Drm4M7NrltP7Ytbc+6QNPqHgBEyVckY X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: erO7EQUkwul81IRjVxgQ4/1taY9SCCG3DDoXrgMtDhHdVEIIK1Y74LQeAf7xI4jFspl02VcdFDXJOZCDDsDym/hh3FlD7F+iHaytgsKa98slM6k9ecDK3caSDL9Navq/11k1lPVXBfarwEjbj1/drC++RnMfHUFYTBfZQUWgtRzLX4Fu74L8x2WTwo9pqSJULeofgzJ21O+Xx84a9VsPdSAXH1fv6EPYqY362IZrElct07gLwiuFgetAGUV8LAupivrgBfpWcqDgJXVy7jIj0b3YRg8SYeh/L0PZerQiVpgR8Ot1nT3hiCLMFcGq07EXGw6c0gZp5KOiMIanyKHjQDQSDeKMwqJTTE3WngnXj2/0VohSNlZPAw23mD9z6+G0Czeuz8FvPPA0oyeoX6Ayc7zf33HUiZr8yVUMBhKVn/jcmgVQgml0C1yus/woErYU4Xxf3TxA/lwwqhQL1l/hJBkB3A+mO3zJI4a82R3ZbET7fvM6AgbxkZGAX5rkI/WlFEdivZ1H9uBxmoeX3Zpzz2xnaLKa5nVScKA0uh7P5wg78ZnvfR8tl+24IxPMkDVk1dqlpzmHF6cbNu0JE9zn9hCyKRIbGcMLdmHTK9p5jOogKsNEj9HyG2T9Njch9MCvOBtVVKg0SmI/OAZKK2XCki6hlo9bMqvzS0KxO8my6YjjUwTwLo4z0ZO9djcsqcTg53NQ42o/k4iHT5FmwK/BQdmbCLdupGf0tpp8DsVuGJxiFWUN9OYfBcsm/b3RJ87JKlsH9HIMjdmjLl3YetsnZINUFtd3OXuZKaKohf/n5PfIWD1WW1r7ZFbB5rMNqTh0trxnHiRo+MFlRgZn4uzgLxFlw+8ZXGKitYAgobD7Wblkua8n+G4/fUq2/RQ5qRpMuAEb9BEIsNueGF0wnX5AaxQYfWjXT+ulhFzZXpiJ6MydTjaouwBqIVQGBdxn5kMkRvIX4ttOEuUSRHflFYWYEOAB1Hg6b4jdMeqwID2WcjU83qhLkEioPQjT5oHruMijN6wH8Ne/0SBjxXBHAsvOrKwlyXHSyEYFD+WHVQZbQaedGgwrzaC62TZuldQyNtkdwLPu8myJHv6G9YLc3p4TNyx4qDgX1EA1TZ5Ke0jWjvZQe78X7+IBi2Y9s0ZlBF/yvdbveAkpEddXFjMfD77YNbUFYuxwnkh9bPR/flMRTqBasFp33MvLT1AXt5lSu6tUfCD6kb29PWrqOLYzrgPHbKIsNKJYiCIS0Zy5r2/Ae9j2z92YwSPJOwkuW8MLE3Sw X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6f5a65b0-638e-466d-088e-08dbbdf1cb02 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Sep 2023 18:03:59.6049 (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: DU2P250MB0271 Subject: [FFmpeg-devel] [PATCH 6/9] avcodec/snow: Split ff_snow_get_buffer() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 88mPEPvvlvCj The part of said function that is common to both encoder and decoder is negligible since c954cf1e1b766a0d1992d5be0a8be0055a8e1a6a and more than offset by the costs of "Am I an encoder?" checks. So move allocating the frames to the encoder and decoder directly. Also rename ff_snow_frame_start() to ff_snow_frames_prepare(), because a frame without a buffer has not been properly started. Signed-off-by: Andreas Rheinhardt --- libavcodec/snow.c | 46 +++++--------------------------------------- libavcodec/snow.h | 3 +-- libavcodec/snowdec.c | 9 ++++++++- libavcodec/snowenc.c | 29 ++++++++++++++++++++++++++-- 4 files changed, 41 insertions(+), 46 deletions(-) diff --git a/libavcodec/snow.c b/libavcodec/snow.c index 5eb3ee1e9e..09f2d60f47 100644 --- a/libavcodec/snow.c +++ b/libavcodec/snow.c @@ -22,7 +22,6 @@ #include "libavutil/thread.h" #include "avcodec.h" #include "decode.h" -#include "encode.h" #include "snow_dwt.h" #include "snow.h" #include "snowdata.h" @@ -61,36 +60,6 @@ void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_ } } -int ff_snow_get_buffer(SnowContext *s, AVFrame *frame) -{ - int ret, i; - int edges_needed = av_codec_is_encoder(s->avctx->codec); - - frame->width = s->avctx->width ; - frame->height = s->avctx->height; - if (edges_needed) { - frame->width += 2 * EDGE_WIDTH; - frame->height += 2 * EDGE_WIDTH; - - ret = ff_encode_alloc_frame(s->avctx, frame); - } else - ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF); - if (ret < 0) - return ret; - if (edges_needed) { - for (i = 0; frame->data[i]; i++) { - int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) * - frame->linesize[i] + - (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0)); - frame->data[i] += offset; - } - frame->width = s->avctx->width; - frame->height = s->avctx->height; - } - - return 0; -} - void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts int plane_index, level, orientation; @@ -589,20 +558,21 @@ void ff_snow_release_buffer(AVCodecContext *avctx) } } -int ff_snow_frame_start(SnowContext *s){ +int ff_snow_frames_prepare(SnowContext *s) +{ AVFrame *tmp; - int i, ret; ff_snow_release_buffer(s->avctx); tmp= s->last_picture[s->max_ref_frames-1]; - for(i=s->max_ref_frames-1; i>0; i--) + for (int i = s->max_ref_frames - 1; i > 0; i--) s->last_picture[i] = s->last_picture[i-1]; s->last_picture[0] = s->current_picture; s->current_picture = tmp; if(s->keyframe){ s->ref_frames= 0; + s->current_picture->flags |= AV_FRAME_FLAG_KEY; }else{ int i; for(i=0; imax_ref_frames && s->last_picture[i]->data[0]; i++) @@ -613,14 +583,8 @@ int ff_snow_frame_start(SnowContext *s){ av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n"); return AVERROR_INVALIDDATA; } - } - if ((ret = ff_snow_get_buffer(s, s->current_picture)) < 0) - return ret; - - if (s->keyframe) - s->current_picture->flags |= AV_FRAME_FLAG_KEY; - else s->current_picture->flags &= ~AV_FRAME_FLAG_KEY; + } return 0; } diff --git a/libavcodec/snow.h b/libavcodec/snow.h index ed0f9abb42..73c4535ec1 100644 --- a/libavcodec/snow.h +++ b/libavcodec/snow.h @@ -245,11 +245,10 @@ void ff_snow_common_end(SnowContext *s); void ff_snow_release_buffer(AVCodecContext *avctx); void ff_snow_reset_contexts(SnowContext *s); int ff_snow_alloc_blocks(SnowContext *s); -int ff_snow_frame_start(SnowContext *s); +int ff_snow_frames_prepare(SnowContext *s); void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t stride, int sx, int sy, int b_w, int b_h, const BlockNode *block, int plane_index, int w, int h); -int ff_snow_get_buffer(SnowContext *s, AVFrame *frame); /* common inline functions */ //XXX doublecheck all of them should stay inlined diff --git a/libavcodec/snowdec.c b/libavcodec/snowdec.c index e014d5087f..489c09324e 100644 --- a/libavcodec/snowdec.c +++ b/libavcodec/snowdec.c @@ -24,6 +24,7 @@ #include "libavutil/opt.h" #include "avcodec.h" #include "codec_internal.h" +#include "decode.h" #include "snow_dwt.h" #include "snow.h" @@ -475,7 +476,13 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *picture, ff_snow_alloc_blocks(s); - if((res = ff_snow_frame_start(s)) < 0) + if ((res = ff_snow_frames_prepare(s)) < 0) + return res; + + s->current_picture->width = s->avctx->width; + s->current_picture->height = s->avctx->height; + res = ff_get_buffer(s->avctx, s->current_picture, AV_GET_BUFFER_FLAG_REF); + if (res < 0) return res; s->current_picture->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index 14a59ca67b..f954a686c1 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -39,6 +39,28 @@ #include "mpegvideo.h" #include "h263enc.h" +static int get_encode_buffer(SnowContext *s, AVFrame *frame) +{ + int ret; + + frame->width = s->avctx->width + 2 * EDGE_WIDTH; + frame->height = s->avctx->height + 2 * EDGE_WIDTH; + + ret = ff_encode_alloc_frame(s->avctx, frame); + if (ret < 0) + return ret; + for (int i = 0; frame->data[i]; i++) { + int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) * + frame->linesize[i] + + (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0)); + frame->data[i] += offset; + } + frame->width = s->avctx->width; + frame->height = s->avctx->height; + + return 0; +} + static av_cold int encode_init(AVCodecContext *avctx) { SnowContext *s = avctx->priv_data; @@ -140,7 +162,7 @@ static av_cold int encode_init(AVCodecContext *avctx) if (!s->input_picture) return AVERROR(ENOMEM); - if ((ret = ff_snow_get_buffer(s, s->input_picture)) < 0) + if ((ret = get_encode_buffer(s, s->input_picture)) < 0) return ret; if(s->motion_est == FF_ME_ITER){ @@ -1659,7 +1681,10 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, emms_c(); } - ff_snow_frame_start(s); + ff_snow_frames_prepare(s); + ret = get_encode_buffer(s, s->current_picture); + if (ret < 0) + return ret; s->m.current_picture_ptr= &s->m.current_picture; s->m.current_picture.f = s->current_picture;