From patchwork Sun Aug 28 21:19:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 37531 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp1584838pzh; Sun, 28 Aug 2022 14:21:35 -0700 (PDT) X-Google-Smtp-Source: AA6agR5YFVakabWsbnnD/es6s+gdYe4zDi9LpTjcUnOy7K5TmagHeqAQavkWKSjcVofjjcQovj0A X-Received: by 2002:a05:6402:541b:b0:446:783e:2bbf with SMTP id ev27-20020a056402541b00b00446783e2bbfmr14894158edb.252.1661721695458; Sun, 28 Aug 2022 14:21:35 -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 ft14-20020a170907800e00b0072b4ad3252dsi4059148ejc.83.2022.08.28.14.21.35; Sun, 28 Aug 2022 14:21:35 -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=mB3FbzeW; 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 2FC4468B9DE; Mon, 29 Aug 2022 00:20:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2094.outbound.protection.outlook.com [40.92.91.94]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9B77668B9DB for ; Mon, 29 Aug 2022 00:20:27 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Lw/tVWlyhINu7KEd1lUyP2bwt1/0g+Q63uy2Ff3N3PKVnfgjxF8CPEetwFuiDcs+vZK8FH8AfYXxwzd0HM+pjJslRfrvYCVexBaUCzwrWK8ohUlE0pwc9VQ80lVWYjkqft9pi8cPbSNwBjoywqMRnDf94nqHMPzPaxoESm/PODFiu1w2gVEC7XFUBfmOxT2VjCcsDyLirZP/+lQMxp2Xem22eurvj31w4B1H6Pfl6ES/lpae9En2sgWr54G1jQLcVOGXliKkcy7xhEYMH+l8nF3uZ5dVZ8pLySxyiLi0NVwGd9niII/rgT83UvylDU31WEu9MQEoPCZypOuj2Y/Gpw== 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=pZmMOcyD/b+wIlwPics7dGB5Dnh6EsjtamumpTX2mKw=; b=UvJ/YTf3mcF/qwISSqkxEJyN+oyb40M2KXwUNivhruPorxv04Titgglz/UiIiSsXaNozqccp5zohspTTlQqPPziuf05Eilu4binQXcYlyEuQ/bjS683PCLeDhWytrJzIw0QoixAnzbzNnF6ArpUK/HKXqNj87NQPWhPxW6+trsvnDA/GhLzxdoQhBMnEbJ+KYeJYH0WDM7IvzcEthXyIXUFust2YIqkcZywDfQXWEMdMoIiZXc1F9XmZxFaGhO8a3r1w/i3be5tVh7Nv5hwp+FRUucFraZXFqNwke1ltAB/lyAPEyGM9a4Me/0P8h/3hRN5ZsNp0ia7mv2plMhc2nQ== 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=pZmMOcyD/b+wIlwPics7dGB5Dnh6EsjtamumpTX2mKw=; b=mB3FbzeWlHd/j81yMA6TqivWGMTYIUY43rf6/OZIzILAeFV2glZ9bkbkR7xHLMNzHHVCVn/Rlpl9P9MwWxNo9/GXAHMF6PAyG/pfG8XmtD2MnX+Hh18NVkjy/+UhrXtDkgLOMwu/5+UMwock75Hy4TGtGu5/eA/O5pLFmyHwgjwRXPntgfkbdyWe+jxe8D+8hrjZACwhxjcICOW+f93fR6LuNBr+v1l4zeELiuvOdOlumX6rhTJesTtk+pEuPPDdBlW1S8xZSEk1+QqqyI/4xe+IKgrGiYmPZ3Ak753UgUsJ18hc5k7cJsf+VrgNi063rVo6AHSUspRgH1R98ED+VA== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU0P250MB0747.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3cb::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Sun, 28 Aug 2022 21:20:22 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::7d2a:d9d8:f384:4cee]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::7d2a:d9d8:f384:4cee%9]) with mapi id 15.20.5566.021; Sun, 28 Aug 2022 21:20:22 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Aug 2022 23:19:57 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [+Ck/VJ2supqicn33rioPwwPFEZkEKN3g] X-ClientProxiedBy: AS9PR06CA0114.eurprd06.prod.outlook.com (2603:10a6:20b:465::12) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20220828211957.472263-10-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d88b29bd-a202-45b0-48cf-08da893b1dd3 X-MS-Exchange-SLBlob-MailProps: EgT5Wr3QDKySlSM5rOKlGk6W0etq9ZOJYWRUJ7cq1GG645JYuETmTHKTgMXCXr+Uv1lmqIGUMpbyuTUEPAuMolgJkbRuvjRTRwtkuRcYPmynRVofFPUm6y8jh17jq/cFFt8Dc7NE2yK+9AKstFpS1CHLG8mLFUtalZrNNJcX3MFKA0ga4PQWnikLFK3Sh1+MFREKy3L2WNfyOPUdC1iWWmcrZFXCn7QIqqOc5q/yE2UKFCToXacQ8r5/uDG7XCyPvSaGQDiw9XVE+R9y9qotnOyh6GiOKBZSymlSrX7eGpKY2KfX5D5d5J13E1M1z/pldkwG1f8I17qhJ705GV8FQAMVe0Yfp0Rt+4ZBRZdrJgPHHwoSjywFMAR2JSAtVqDQFUXuGx7x1fD3BY6PAwnUfz+lBBYsfU2TwMiPoHjk++juuNv5ubYrWBd72cymEpdw6o/gXQ2EirYUoA6nCaTRJ7UstwnXN+uxlt5C9TkBTbfBqjYL0RVs+w8XxzIZi84qAyPGOYZWEWxKjI002H6gElsBJXc3P9FKHi4IEmf4CruM0yrk38iMQxSa4mo0OKfitpZybsTL4NUAR+fA3Ick+3cwvYthU0G2QsXDW6MRHK3s9C70aedmCG2NUnFXj0AdU7BQPA+tkRxO95abtOu4myBlaJEScKm5YrmYGM8HmOTMsh6/kamb/y6Bfr11c1IU0O4HYL9+Zx2axQcrs0psuCVWaYVZR5w4RJNuXJU8R0U= X-MS-TrafficTypeDiagnostic: DU0P250MB0747:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: p7okKz2VdCNjDKRcHx4wblwrjagKG/VLRlNmcAfxLBqfXEr9121U6MCobIGAYYu8k/IdvhPJRF7clkMu3P85Q8+oqOfhoJawvTYiHA7YsAtRvph2Fk4TxpGdRlDtKtWz2uCbfAP4kOOvDkkkHzF6lWyZlvhahod7KoE4P607zmJ9l1kEE+RJZypEZxbQBQRsPCpS4bpxSCd08PdCTqdJhO25qmzEPdd82rzuQnnD0yLCOc69M4D3rmwLw9KVX1RlHk0QrFgYI4gtyCMh6iayZk9KC4R8szt72jn4wGAsRaO/wZwtx9CDhRwmw9hHsx5HuyByZA8sPGP3Py2FbDyjrjP2zyVPMaINydSb0e00BeaaEjM9mxulzSGqbrXu4ML+F2agGprt1V1TxPH0sAEIX62XrXlt5HkJ2+zEVn0WC4xCFjTELMW2U+J8LHvHNWCey2zbfPpptOoMhUDshWUxwHCt1wNy9WENcbi7jll+U3ugu9bkooBtyOlcBaPPGulyfwegCb6XjmeymF7/YQq6vBa1Ir9EVQrTI+ZJwwsgHDkHiu8pqDHuviSsSUcUzNICxRDfPcU+qtbVx88NcjjPo62qxmhPHH2Fx9lxPRUAzVXC03LZ29ERX+LIjw32tznRlN/q4ppOpddok4cicbpFVQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: QgP0a+l+pMe4VBA08R0dL86ardYsyu/btHEt1NU5CBd6Yv3eXYAH/4FYYnBd6bB/DBh/dqkhl4E3xAtBEWQVTrVzJ6kDL40f3xeB5RfJK/+ZbFqc0Q2WxIfTVTq7DA8ExpN77ORSqRbWVXOJzfxNsxcTtzhLHKDQ1eu8423cVXbxQgW9n0XVqM7sb9HB5dYIGh5l+yA/pRAyKiLQU5hzZw8YDye87P4SmDGfvYoQO1xf5d4ASNO1jw8ZX3M//Ej5ICPZVVSps7vBGxcgZQIgpC85vVjpDR+syP27Qasg0Pq6f0WUXNqs+huIUEQpX+rzxUpgqm3eKHI06fTk3j9ZrU6vH/7tFnTlIhRhOtmvfHjhhzwvHaGnGFhR+83YtgRnhHWxdEx1Vu9lYgB7NuiBELLmrun2IwwENEycFhDs9G53gpe8p877bwzz0mlrBQ3VrAHzWUW+gN/b7v9om9iIDvEubbYx8y0rfGlIeywK/tIcA5sgZBHNMnMPMX57ZKzYSri6kumVnLWs1XpmF0ozhQDTTKytsGmHQ+GbxRQ1iZV9bc+VLR1urNmx5x0sjwSouhs2Pwo484G+gKMTvMumq5EW9dMGA8WO40NJdM0hI/pBoUV3JDUqzp8eR8IBLTeOnNwkb8bjU6iTLx98O/Dkuuo+2I7wtOxYF+8A7tqfCw6d5YuY6g0EU7GuqWQrzDohSAepM0Za/U1Rga/K5+MZPi9wRUGOyOOMWMVyOPoLFsLMvy68lHT/VlRgHu/XerHeiggZbBqRjBF+5/QTdMPQmfQPQrhWP15exMNSNEPeqivchzt4KMVvvkFGfuaxNroTatezvnnIAP/XAUyRm0vIf0GShAsoSmeERoXNwsgzpYJH7x7PS1TwjZgJIUPAX5k88HLJTn4Zr1tF2VHftudBwFV7cSsR4Pn4Bs1wy4yfbPRBvTFm+R8yVKU/WobCtog8DFmRqhr2Sd1dVv2bssvcgR1lsTH6OA2h6WY1SoH8DRmtDaLRJxJ8/IAQAHIPdXgpUY3OgDeRbTxkIXI6039WXlvD8FSW6VYhI7iTClIHCZvkZZju7CFKzN9LpeTeq+nNfQYFbVbZBEX/rJGc7S8fcBJvtukx3koi2ndcpJfJAItageazN2b9YfrlosiNM0NPQzrHnjlT3qTK0WtYnmvV28jTVd8vP1rTtY9C/AcI88UFHgKwa1sgQ5vsclQQgDMg91SxuCaAGxezoc15/3iBfZc88xOKEIGM+jjKEL2AGAGQdoIce37zNFfnR0I3qIMRBtNhfizeMOZZ3C/VlXrmgHxOIXbMSL90rwH7+uOeTAU= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d88b29bd-a202-45b0-48cf-08da893b1dd3 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Aug 2022 21:20:22.4370 (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: DU0P250MB0747 Subject: [FFmpeg-devel] [PATCH 11/11] avcodec/frame_thread_encoder: Stop serializing unreferencing AVFrames 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: qlZoD9+Iwlal Currently, the frame-threaded decoding API still supports thread-unsafe callbacks. If one uses a thread-unsafe get_buffer2() callback, calls to av_frame_unref() by the decoder are serialized, because it is presumed that the underlying deallocator is thread-unsafe. The frame-threaded encoder seems to have been written with this restriction in mind: It always serializes unreferencing its AVFrames, although no documentation forces it to do so. This commit schedules to change this behaviour as soon as thread-unsafe callbacks are removed. For this reason, the FF_API_THREAD_SAFE_CALLBACKS define is reused. Signed-off-by: Andreas Rheinhardt --- libavcodec/encode.c | 8 +++++++- libavcodec/encode.h | 2 +- libavcodec/frame_thread_encoder.c | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 8c6d81286c..ade4d458e7 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -190,7 +190,7 @@ int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame) } int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt, - const AVFrame *frame, int *got_packet) + AVFrame *frame, int *got_packet) { const FFCodec *const codec = ffcodec(avctx->codec); int ret; @@ -227,6 +227,10 @@ int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt, unref: av_packet_unref(avpkt); } +#if !FF_API_THREAD_SAFE_CALLBACKS + if (frame) + av_frame_unref(frame); +#endif return ret; } @@ -267,8 +271,10 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt) ret = ff_thread_video_encode_frame(avctx, avpkt, frame, &got_packet); else { ret = ff_encode_encode_cb(avctx, avpkt, frame, &got_packet); +#if FF_API_THREAD_SAFE_CALLBACKS if (frame) av_frame_unref(frame); +#endif } if (avci->draining && !got_packet) diff --git a/libavcodec/encode.h b/libavcodec/encode.h index 296ffd312e..81d18d6ead 100644 --- a/libavcodec/encode.h +++ b/libavcodec/encode.h @@ -76,7 +76,7 @@ int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size); int ff_encode_preinit(AVCodecContext *avctx); int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt, - const AVFrame *frame, int *got_packet); + AVFrame *frame, int *got_packet); /** * Rescale from sample rate to AVCodecContext.time_base. diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 1faaef522e..35775ae823 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -48,7 +48,9 @@ typedef struct{ typedef struct{ AVCodecContext *parent_avctx; +#if FF_API_THREAD_SAFE_CALLBACKS pthread_mutex_t buffer_mutex; +#endif pthread_mutex_t task_fifo_mutex; /* Used to guard (next_)task_index */ pthread_cond_t task_fifo_cond; @@ -68,9 +70,15 @@ typedef struct{ } ThreadContext; #define OFF(member) offsetof(ThreadContext, member) +#if FF_API_THREAD_SAFE_CALLBACKS DEFINE_OFFSET_ARRAY(ThreadContext, thread_ctx, pthread_init_cnt, (OFF(buffer_mutex), OFF(task_fifo_mutex), OFF(finished_task_mutex)), (OFF(task_fifo_cond), OFF(finished_task_cond))); +#else +DEFINE_OFFSET_ARRAY(ThreadContext, thread_ctx, pthread_init_cnt, + (OFF(task_fifo_mutex), OFF(finished_task_mutex)), + (OFF(task_fifo_cond), OFF(finished_task_cond))); +#endif #undef OFF static void * attribute_align_arg worker(void *v){ @@ -104,9 +112,11 @@ static void * attribute_align_arg worker(void *v){ pkt = task->outdata; ret = ff_encode_encode_cb(avctx, pkt, frame, &task->got_packet); +#if FF_API_THREAD_SAFE_CALLBACKS pthread_mutex_lock(&c->buffer_mutex); av_frame_unref(frame); pthread_mutex_unlock(&c->buffer_mutex); +#endif pthread_mutex_lock(&c->finished_task_mutex); task->return_code = ret; task->finished = 1; @@ -114,9 +124,13 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_unlock(&c->finished_task_mutex); } end: +#if FF_API_THREAD_SAFE_CALLBACKS pthread_mutex_lock(&c->buffer_mutex); +#endif avcodec_close(avctx); +#if FF_API_THREAD_SAFE_CALLBACKS pthread_mutex_unlock(&c->buffer_mutex); +#endif av_freep(&avctx); return NULL; }