From patchwork Mon Feb 7 00:58:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34153 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp5361849iov; Sun, 6 Feb 2022 16:58:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJzrtfFugPT23UV4H996LmSbBdww7kLc+RDa/L3kATUm9R2s9KhSj1r9ItZXXgjdKnMIa2Rh X-Received: by 2002:a17:907:7f1c:: with SMTP id qf28mr7810619ejc.94.1644195530006; Sun, 06 Feb 2022 16:58:50 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n2si6529339edi.143.2022.02.06.16.58.49; Sun, 06 Feb 2022 16:58:49 -0800 (PST) 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=obSCTsoh; 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 71CEE68B1F3; Mon, 7 Feb 2022 02:58:35 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075106.outbound.protection.outlook.com [40.92.75.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C605A68AFCF for ; Mon, 7 Feb 2022 02:58:28 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MXY7uRWPAvbOc/zmpio9++FGk0d5gcNflQ789Y63WcwC6+HyBRBQzV/X7wNEasYxB+RLeJUgHNbez5yZnive8qazXdoB5vVUz2kv7/tBXe4vwKYTkX5Etd7bcetCulx+U2fbAV8FV6zRl6PdtrmE4qYAgep/r7NotMvwS1IsWHABdR0oOCpz6NKxjSci4IAMGFc+kpG8Dq1ulsKhMbiTHd2bynRmPcnyh0MInyKdXV2x0JwGCFiWThahNKDQyZC51QhdEqH3LbTYJCkCsn8xbSWMjN1wB+Swa4H0O4Iv7mo74Hv4alevWC8p2495Hcqr5G1UGvxSSpEP2BvAkWY2RA== 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=zJFdbZ0AMf2KjWOFguPiAuAnHYi27UwNf0lwsHuR+YA=; b=XeShj0gd2kc43ZKYTB88jEhkLKA2ToPYoyKlC1gUHq+soMvrx9DYNekRU9uJv00oBZV4LvCIZL4cSjioW19xSe9sV0KZQnCdefOKX3R/8G406IZQE1AzEjSiyqkknlYzJd8JxSq7AX9jARM4AoI2pYwDGwwCMvUrxyuKKJLn6XCQPmYQO+CvOoBEUr/7sdsDIo25c1t00ohUN0atD7LsvdrR+Ko2Qiw0XXReH5HK94jaqB+ZeX+8yTpRj6yxKK0BHy3WhqJIUPdmdsMeczKFGJkkKXh3+VbmMhJzDyVNlOAx692ak0UVmbNTK9mp8veXxCtF/m+CbHZ91VXMifd8fw== 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=zJFdbZ0AMf2KjWOFguPiAuAnHYi27UwNf0lwsHuR+YA=; b=obSCTsoh1XSXJJmtaGSYEE3Rm0sQXrtfZD/7KgxrFoHcPytIffRZYz8L/p01YVIDRRFY9vu0XdXhXvmCQfrY4KxNi0BLQpcBzSB0+/9Ldhk0O04uKHQol1lQk1IpqPC4JD4DASaW/OaqRMCSPkHisuph34pj8NYY3WeZX/bv9p3ABV8uQqB2DxVmoNvf+IgVAMiS75sE1E/3Z0GqrGZY2zKqvEVNs+txVlIwBssMQYXv3YfhVxS5GEGDHlF1c1GgROEM61tkACsLYKJNmSFu/zmxgYULO7H2fPe0JDGRHtJehc+MSGXoGQoDMYF2/yqeSz1O/PMPfjdHkmG4ut6j+w== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB5559.eurprd03.prod.outlook.com (2603:10a6:20b:f3::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.18; Mon, 7 Feb 2022 00:58:22 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.018; Mon, 7 Feb 2022 00:58:22 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Feb 2022 01:58:06 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [wVpdK39w96T32l+phY0aalwic0zcdtEK] X-ClientProxiedBy: AM5PR0502CA0002.eurprd05.prod.outlook.com (2603:10a6:203:91::12) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220207005808.635200-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2eac013f-8a0d-4515-8e90-08d9e9d4f02b X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNX9TGuA1ZT0pdzH+4wnQw+JlkuwBd7BSFIXivNFF6qUkC1+eviWEIHwpPHC2lHcNz5lA75bxX+YaJARxRW4olP8Gbp0pcB8IDyRbyLHbry5hZXE1psW2ryT4UszTctuBCDX3SMMfTmgk/yXt0DhseplAezD2CP/a8KhbVnq/dhBFVTwA3m0xGLHvy6Nn3mCXHoChHSZyCVSCNIlmYAUymuZ9GYiL/rr8JrYbGZ8C7AHbemhF9j2jfkOOSVw5MXcTVBqmjhcq8TaqFcqDNoQ5f0+Chkpd4u+aKjKI4mhiPNJsA6EaehIoMrCEnoFN9f+pQ/Rg+kBiO7086gWiMFHlLmnH8Kvt87Tri945efQBSnO7QOovIGkQDefB3bhupbxRy8SGbG7CUwP0tW8jT+Ph+r5yoJiv6+s1Iq6ZpMlcrf2PpQb+nB2GdL/7dWuMn4EQeZSq9Qr7+Acj3vA1gHVoAbWHh3amDzkafsSrzhX3x2QVRjWaStlgdfjkJKdNl++Cab/60/DZ3pSVTHndOjufzgJp22A1C/bGGmfqF0ReFW8an2c15RVbKRv+4fgXViQwZ+C/OQ4eCR3whtvC4M7G362b5aZecO56gfZMOMG2iQkDqLVUrND3Xot4cuOsy5njTOL1jXPhBMGcq7KVzWX2pknMXUJvUKg95lSWEFfwufJ5Kez33cO/W4JTt5C8tHRmAIJ42HQGMo0SBn5RZEx+U2hPnJPksNJbGo= X-MS-TrafficTypeDiagnostic: AM6PR03MB5559:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WR/faB1h484A6DHR3cYF046LRVz6F2LZiOuxuF1F+/5OvBPqA9F1TtCjQ82MVuC1hX7ROX8uJU7aA1kF+x5CHPxmMOEVTbw1le6LtSWDLg6euYxUfjVLffsRKE61smqVZj7btKdl54ifMpUYfzfMDF0sEU5AsVSmW8Z9rbnPc1fgxpBvkkZxdVQ4yc6BYRUChEp1od7LB4PAx5FzSNJHyK9jmO7qtweNzBoeNi1Dc1LyYjsPBcsTCnPfYm2upDR28P/xhN3XAVeVoWETTJG+yN6ZdguomDrrSm5LNFUsmkpM5BaR/0HQlqIWjP9kWurjBXaVvrl4zCmdyKD51KAEaBw82yVvYJU6L+tamymsxGJZZ0tyeLVH9UKfOTF0USt2ZQ7uw+CdJnodf0VoT82vDKMySBShMkS/d9e91V8LnEKhmIpTLJKL7cqG1KIkkfkCTJLVQMw0JZUegE5fRxhb4eI9sdIQ4ffEo1L9Yt96wO+KE5pPNiNG0pKHkQu66lFN+P/XGcC23n541pMzbHnaTv4yQABu8i445haXC4HNetlFDxi//JPWDtOW3dZ6C/4YyN/sqqFxerlC4SGiPElrmg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kRR2oSxOVX1X0W0WC974Se3cWoOebUg8H8JRkGdskYr19H4sQ4bOwFWaKw3HucxhjQQSAH8+6kzY7py1Yof/yv5btHYu7RyCoutvw2CO+KMBMp9LPzxezpeXtjE1XYl8q7mxatlbv8iy4DAnxyzpkeDtYYnrppYrZd51kS3ue8nE5EIWXNxslpyj5HYse8bYfhWMXEveCR0oLgQvRFuKpetxeOZdy5mscIQtOe0BiTSUWZU+paZD0vcjNBuKG5Cr5g6ev+4jT30rJJJGuSlfEtmbTv2mr93fF3LFukpBs9Y+QG5XsXvnuuRBiRAaehDa71m6jBV0/kZSUXEsKeEGFfT4Y32GfgUVspG7e4cGfASKQGW0zRhwOuWFSuoQb3GGziglNKmUr4LbYh//J5F3c4vuyOrOjz9uDxPbjqWLU9QwkqUi/pQgeUhSr4pAPkXCs5Lh/FUfIzCB7jv4VLrXRthJD3Ax9Lf5JRg4yyOtWR23XZV33A/qg8+0QY22v+nUoK9/zrb/lneNIiJTmPfpX5KvcMmASL64b/GlWSTv8f7lZEbGfoAf2K+gWRb+A7wH3vi6ddZ/+3gv8yyWFwLW82+IlglSjDR6nCCzddUHS4Ww2xNF5gdyi2wOcjOqa2kCTPAEpoJ/9RcZ/h6oJBdtlXjwrJwDJp7bI2EX8u+IC90S0ZNvO/8yFhRzDBuJhtZzzEVXZmV69NbVgnVvpl8VqgDqTJ+xFfpCXZ2LlyNeFI8pDd8e3KmBz1HcN6KbJ81Ji7uTa0a98wtO50tI8nXzNyCMKAmnUZjeS0sdswab8r5DGOClcIJor23ULQ8qi78AsBawA3eJ3axpuLZmparHX5YbwsXUAk3gIHxtEIKgGN6cGMKdfyRpgl67ARHlAw9CoaNLVwLxbsHfpc6oBQHYNngi/iFNBv7EN12a9Gv9fTzLouVvTUWmjl0Hno40VfG3xBX0+nZOBvZrWcPYxLxHZg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2eac013f-8a0d-4515-8e90-08d9e9d4f02b X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 00:58:22.3704 (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: AM6PR03MB5559 Subject: [FFmpeg-devel] [PATCH 4/6] avcodec/threadframe: Add ff_thread_(get|release)_ext_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: Lx98GW/RhK3w These will be used by the codecs that need allocated progress and is in preparation for no longer using ThreadFrame by the codecs that don't. Signed-off-by: Andreas Rheinhardt --- libavcodec/ffv1.c | 5 +++-- libavcodec/ffv1dec.c | 9 +++++---- libavcodec/h264_picture.c | 4 ++-- libavcodec/h264_slice.c | 6 +++--- libavcodec/hevc_refs.c | 6 +++--- libavcodec/mimic.c | 12 ++++++------ libavcodec/mpegpicture.c | 7 ++++--- libavcodec/pngdec.c | 17 +++++++++-------- libavcodec/pthread_frame.c | 10 ++++++++++ libavcodec/threadframe.h | 24 ++++++++++++++++++++++++ libavcodec/utils.c | 15 ++++++++++++++- libavcodec/vp3.c | 23 ++++++++++++----------- libavcodec/vp8.c | 8 ++++---- libavcodec/vp9.c | 18 +++++++++--------- libavcodec/wavpack.c | 18 ++++++++++-------- 15 files changed, 118 insertions(+), 64 deletions(-) diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index d8a0c39254..6bde984815 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -37,6 +37,7 @@ #include "rangecoder.h" #include "mathops.h" #include "ffv1.h" +#include "threadframe.h" av_cold int ff_ffv1_common_init(AVCodecContext *avctx) { @@ -204,11 +205,11 @@ av_cold int ff_ffv1_close(AVCodecContext *avctx) int i, j; if (s->picture.f) - ff_thread_release_buffer(avctx, &s->picture); + ff_thread_release_ext_buffer(avctx, &s->picture); av_frame_free(&s->picture.f); if (s->last_picture.f) - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); av_frame_free(&s->last_picture.f); for (j = 0; j < s->max_slice_count; j++) { diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index 3f90a8fb55..45ecf3152e 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -842,7 +842,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac AVFrame *p; if (f->last_picture.f) - ff_thread_release_buffer(avctx, &f->last_picture); + ff_thread_release_ext_buffer(avctx, &f->last_picture); FFSWAP(ThreadFrame, f->picture, f->last_picture); f->cur = p = f->picture.f; @@ -874,7 +874,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac p->key_frame = 0; } - if ((ret = ff_thread_get_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF)) < 0) + ret = ff_thread_get_ext_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF); + if (ret < 0) return ret; if (avctx->debug & FF_DEBUG_PICT_INFO) @@ -966,7 +967,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac ff_thread_report_progress(&f->picture, INT_MAX, 0); if (f->last_picture.f) - ff_thread_release_buffer(avctx, &f->last_picture); + ff_thread_release_ext_buffer(avctx, &f->last_picture); if ((ret = av_frame_ref(data, f->picture.f)) < 0) return ret; @@ -1037,7 +1038,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) av_assert1(fdst->max_slice_count == fsrc->max_slice_count); - ff_thread_release_buffer(dst, &fdst->picture); + ff_thread_release_ext_buffer(dst, &fdst->picture); if (fsrc->picture.f->data[0]) { if ((ret = ff_thread_ref_frame(&fdst->picture, &fsrc->picture)) < 0) return ret; diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index 50a21c260f..c7f5b64b99 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -40,7 +40,7 @@ void ff_h264_unref_picture(H264Context *h, H264Picture *pic) if (!pic->f || !pic->f->buf[0]) return; - ff_thread_release_buffer(h->avctx, &pic->tf); + ff_thread_release_ext_buffer(h->avctx, &pic->tf); ff_thread_release_buffer(h->avctx, &pic->tf_grain); av_buffer_unref(&pic->hwaccel_priv_buf); @@ -155,7 +155,7 @@ int ff_h264_replace_picture(H264Context *h, H264Picture *dst, const H264Picture av_assert0(src->tf.f == src->f); dst->tf.f = dst->f; - ff_thread_release_buffer(h->avctx, &dst->tf); + ff_thread_release_ext_buffer(h->avctx, &dst->tf); ret = ff_thread_ref_frame(&dst->tf, &src->tf); if (ret < 0) goto fail; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 600a109889..32d2e090d5 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -191,8 +191,8 @@ static int alloc_picture(H264Context *h, H264Picture *pic) av_assert0(!pic->f->data[0]); pic->tf.f = pic->f; - ret = ff_thread_get_buffer(h->avctx, &pic->tf, pic->reference ? - AV_GET_BUFFER_FLAG_REF : 0); + ret = ff_thread_get_ext_buffer(h->avctx, &pic->tf, + pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); if (ret < 0) goto fail; @@ -1699,7 +1699,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl, ff_thread_await_progress(&prev->tf, INT_MAX, 0); if (prev->field_picture) ff_thread_await_progress(&prev->tf, INT_MAX, 1); - ff_thread_release_buffer(h->avctx, &h->short_ref[0]->tf); + ff_thread_release_ext_buffer(h->avctx, &h->short_ref[0]->tf); h->short_ref[0]->tf.f = h->short_ref[0]->f; ret = ff_thread_ref_frame(&h->short_ref[0]->tf, &prev->tf); if (ret < 0) diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index d0a7888e21..0dd456bb92 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -38,7 +38,7 @@ void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags) frame->flags &= ~flags; if (!frame->flags) { - ff_thread_release_buffer(s->avctx, &frame->tf); + ff_thread_release_ext_buffer(s->avctx, &frame->tf); ff_thread_release_buffer(s->avctx, &frame->tf_grain); frame->needs_fg = 0; @@ -90,8 +90,8 @@ static HEVCFrame *alloc_frame(HEVCContext *s) if (frame->frame->buf[0]) continue; - ret = ff_thread_get_buffer(s->avctx, &frame->tf, - AV_GET_BUFFER_FLAG_REF); + ret = ff_thread_get_ext_buffer(s->avctx, &frame->tf, + AV_GET_BUFFER_FLAG_REF); if (ret < 0) return NULL; diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c index 6a51da5748..d3343b5da7 100644 --- a/libavcodec/mimic.c +++ b/libavcodec/mimic.c @@ -112,7 +112,7 @@ static av_cold int mimic_decode_end(AVCodecContext *avctx) for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) { if (ctx->frames[i].f) - ff_thread_release_buffer(avctx, &ctx->frames[i]); + ff_thread_release_ext_buffer(avctx, &ctx->frames[i]); av_frame_free(&ctx->frames[i].f); } @@ -164,7 +164,7 @@ static int mimic_decode_update_thread_context(AVCodecContext *avctx, const AVCod dst->prev_index = src->next_prev_index; for (i = 0; i < FF_ARRAY_ELEMS(dst->frames); i++) { - ff_thread_release_buffer(avctx, &dst->frames[i]); + ff_thread_release_ext_buffer(avctx, &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) @@ -395,11 +395,11 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - ff_thread_release_buffer(avctx, &ctx->frames[ctx->cur_index]); + ff_thread_release_ext_buffer(avctx, &ctx->frames[ctx->cur_index]); ctx->frames[ctx->cur_index].f->pict_type = is_pframe ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; - if ((res = ff_thread_get_buffer(avctx, &ctx->frames[ctx->cur_index], - AV_GET_BUFFER_FLAG_REF)) < 0) + 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; @@ -420,7 +420,7 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data, ff_thread_report_progress(&ctx->frames[ctx->cur_index], INT_MAX, 0); if (res < 0) { if (!(avctx->active_thread_type & FF_THREAD_FRAME)) - ff_thread_release_buffer(avctx, &ctx->frames[ctx->cur_index]); + ff_thread_release_ext_buffer(avctx, &ctx->frames[ctx->cur_index]); return res; } diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c index 27e497c404..be6e6967e0 100644 --- a/libavcodec/mpegpicture.c +++ b/libavcodec/mpegpicture.c @@ -29,6 +29,7 @@ #include "motion_est.h" #include "mpegpicture.h" #include "mpegutils.h" +#include "threadframe.h" static void av_noinline free_picture_tables(Picture *pic) { @@ -130,8 +131,8 @@ static int alloc_frame_buffer(AVCodecContext *avctx, Picture *pic, pic->f->height = avctx->height + 2 * EDGE_WIDTH; } - r = ff_thread_get_buffer(avctx, &pic->tf, - pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); + r = ff_thread_get_ext_buffer(avctx, &pic->tf, + pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); } else { pic->f->width = avctx->width; pic->f->height = avctx->height; @@ -321,7 +322,7 @@ void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *pic) if (avctx->codec_id != AV_CODEC_ID_WMV3IMAGE && avctx->codec_id != AV_CODEC_ID_VC1IMAGE && avctx->codec_id != AV_CODEC_ID_MSS2) - ff_thread_release_buffer(avctx, &pic->tf); + ff_thread_release_ext_buffer(avctx, &pic->tf); else if (pic->f) av_frame_unref(pic->f); diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 3b12f4057a..7571def907 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -721,8 +721,9 @@ static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, s->bpp += byte_depth; } - ff_thread_release_buffer(avctx, &s->picture); - if ((ret = ff_thread_get_buffer(avctx, &s->picture, AV_GET_BUFFER_FLAG_REF)) < 0) + ff_thread_release_ext_buffer(avctx, &s->picture); + if ((ret = ff_thread_get_ext_buffer(avctx, &s->picture, + AV_GET_BUFFER_FLAG_REF)) < 0) return ret; p->pict_type = AV_PICTURE_TYPE_I; @@ -1560,7 +1561,7 @@ static int decode_frame_png(AVCodecContext *avctx, goto the_end; if (!(avctx->active_thread_type & FF_THREAD_FRAME)) { - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); FFSWAP(ThreadFrame, s->picture, s->last_picture); } @@ -1624,9 +1625,9 @@ static int decode_frame_apng(AVCodecContext *avctx, if (!(avctx->active_thread_type & FF_THREAD_FRAME)) { if (s->dispose_op == APNG_DISPOSE_OP_PREVIOUS) { - ff_thread_release_buffer(avctx, &s->picture); + ff_thread_release_ext_buffer(avctx, &s->picture); } else { - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); FFSWAP(ThreadFrame, s->picture, s->last_picture); } } @@ -1677,7 +1678,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) src_frame = psrc->dispose_op == APNG_DISPOSE_OP_PREVIOUS ? &psrc->last_picture : &psrc->picture; - ff_thread_release_buffer(dst, &pdst->last_picture); + ff_thread_release_ext_buffer(dst, &pdst->last_picture); if (src_frame && src_frame->f->data[0]) { ret = ff_thread_ref_frame(&pdst->last_picture, src_frame); if (ret < 0) @@ -1712,9 +1713,9 @@ static av_cold int png_dec_end(AVCodecContext *avctx) { PNGDecContext *s = avctx->priv_data; - ff_thread_release_buffer(avctx, &s->last_picture); + ff_thread_release_ext_buffer(avctx, &s->last_picture); av_frame_free(&s->last_picture.f); - ff_thread_release_buffer(avctx, &s->picture); + ff_thread_release_ext_buffer(avctx, &s->picture); av_frame_free(&s->picture.f); av_freep(&s->buffer); s->buffer_size = 0; diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 73dc4d3669..f405622ca1 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -1057,6 +1057,11 @@ int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) return ret; } +int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) +{ + return ff_thread_get_buffer(avctx, f, flags); +} + void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) { #if FF_API_THREAD_SAFE_CALLBACKS @@ -1126,3 +1131,8 @@ fail: } #endif } + +void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f) +{ + ff_thread_release_buffer(avctx, f); +} diff --git a/libavcodec/threadframe.h b/libavcodec/threadframe.h index c2caf511b9..be63e62435 100644 --- a/libavcodec/threadframe.h +++ b/libavcodec/threadframe.h @@ -50,4 +50,28 @@ void ff_thread_report_progress(ThreadFrame *f, int progress, int field); */ void ff_thread_await_progress(ThreadFrame *f, int progress, int field); +/** + * Wrapper around ff_get_buffer() for frame-multithreaded codecs. + * Call this function instead of ff_get_buffer() if you might need + * to wait for progress on this frame. + * Cannot be called after the codec has called ff_thread_finish_setup(). + * + * @param avctx The current context. + * @param f The frame to write into. + * @note: It is fine to call this with codecs that do not support + * frame threading. + */ +int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags); + +/** + * Unref a ThreadFrame. + * + * This is basically a wrapper around av_frame_unref() and should + * be called instead of it. + * + * @param avctx The current context. + * @param f The picture being released. + */ +void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f); + #endif diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 0fd4469a74..bc16424f91 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -879,7 +879,7 @@ int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src) if (src->progress && !(dst->progress = av_buffer_ref(src->progress))) { - ff_thread_release_buffer(dst->owner[0], dst); + ff_thread_release_ext_buffer(dst->owner[0], dst); return AVERROR(ENOMEM); } @@ -899,12 +899,25 @@ int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) return ff_get_buffer(avctx, f->f, flags); } +int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags) +{ + f->owner[0] = f->owner[1] = avctx; + return ff_get_buffer(avctx, f->f, flags); +} + void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f) { if (f->f) av_frame_unref(f->f); } +void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f) +{ + f->owner[0] = f->owner[1] = NULL; + if (f->f) + av_frame_unref(f->f); +} + void ff_thread_finish_setup(AVCodecContext *avctx) { } diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 06b0e873b6..e9ab54d736 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -333,11 +333,11 @@ static void vp3_decode_flush(AVCodecContext *avctx) Vp3DecodeContext *s = avctx->priv_data; if (s->golden_frame.f) - ff_thread_release_buffer(avctx, &s->golden_frame); + ff_thread_release_ext_buffer(avctx, &s->golden_frame); if (s->last_frame.f) - ff_thread_release_buffer(avctx, &s->last_frame); + ff_thread_release_ext_buffer(avctx, &s->last_frame); if (s->current_frame.f) - ff_thread_release_buffer(avctx, &s->current_frame); + ff_thread_release_ext_buffer(avctx, &s->current_frame); } static av_cold int vp3_decode_end(AVCodecContext *avctx) @@ -2507,25 +2507,25 @@ static int update_frames(AVCodecContext *avctx) int ret = 0; /* shuffle frames (last = current) */ - ff_thread_release_buffer(avctx, &s->last_frame); + ff_thread_release_ext_buffer(avctx, &s->last_frame); ret = ff_thread_ref_frame(&s->last_frame, &s->current_frame); if (ret < 0) goto fail; if (s->keyframe) { - ff_thread_release_buffer(avctx, &s->golden_frame); + ff_thread_release_ext_buffer(avctx, &s->golden_frame); ret = ff_thread_ref_frame(&s->golden_frame, &s->current_frame); } fail: - ff_thread_release_buffer(avctx, &s->current_frame); + ff_thread_release_ext_buffer(avctx, &s->current_frame); return ret; } #if HAVE_THREADS static int ref_frame(Vp3DecodeContext *s, ThreadFrame *dst, ThreadFrame *src) { - ff_thread_release_buffer(s->avctx, dst); + ff_thread_release_ext_buffer(s->avctx, dst); if (src->f->data[0]) return ff_thread_ref_frame(dst, src); return 0; @@ -2675,7 +2675,8 @@ static int vp3_decode_frame(AVCodecContext *avctx, s->current_frame.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; s->current_frame.f->key_frame = s->keyframe; - if ((ret = ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF)) < 0) + if ((ret = ff_thread_get_ext_buffer(avctx, &s->current_frame, + AV_GET_BUFFER_FLAG_REF)) < 0) goto error; if (!s->edge_emu_buffer) @@ -2734,10 +2735,10 @@ static int vp3_decode_frame(AVCodecContext *avctx, "vp3: first frame not a keyframe\n"); s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I; - if ((ret = ff_thread_get_buffer(avctx, &s->golden_frame, - AV_GET_BUFFER_FLAG_REF)) < 0) + if ((ret = ff_thread_get_ext_buffer(avctx, &s->golden_frame, + AV_GET_BUFFER_FLAG_REF)) < 0) goto error; - ff_thread_release_buffer(avctx, &s->last_frame); + ff_thread_release_ext_buffer(avctx, &s->last_frame); if ((ret = ff_thread_ref_frame(&s->last_frame, &s->golden_frame)) < 0) goto error; diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 6aba0c5feb..40a7e13683 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -72,8 +72,8 @@ static void free_buffers(VP8Context *s) static int vp8_alloc_frame(VP8Context *s, VP8Frame *f, int ref) { int ret; - if ((ret = ff_thread_get_buffer(s->avctx, &f->tf, - ref ? AV_GET_BUFFER_FLAG_REF : 0)) < 0) + if ((ret = ff_thread_get_ext_buffer(s->avctx, &f->tf, + ref ? AV_GET_BUFFER_FLAG_REF : 0)) < 0) return ret; if (!(f->seg_map = av_buffer_allocz(s->mb_width * s->mb_height))) goto fail; @@ -90,7 +90,7 @@ static int vp8_alloc_frame(VP8Context *s, VP8Frame *f, int ref) fail: av_buffer_unref(&f->seg_map); - ff_thread_release_buffer(s->avctx, &f->tf); + ff_thread_release_ext_buffer(s->avctx, &f->tf); return AVERROR(ENOMEM); } @@ -99,7 +99,7 @@ static void vp8_release_frame(VP8Context *s, VP8Frame *f) av_buffer_unref(&f->seg_map); av_buffer_unref(&f->hwaccel_priv_buf); f->hwaccel_picture_private = NULL; - ff_thread_release_buffer(s->avctx, &f->tf); + ff_thread_release_ext_buffer(s->avctx, &f->tf); } #if CONFIG_VP8_DECODER diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 1250425dce..7ef10f7a80 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -93,7 +93,7 @@ static void vp9_tile_data_free(VP9TileData *td) static void vp9_frame_unref(AVCodecContext *avctx, VP9Frame *f) { - ff_thread_release_buffer(avctx, &f->tf); + ff_thread_release_ext_buffer(avctx, &f->tf); av_buffer_unref(&f->extradata); av_buffer_unref(&f->hwaccel_priv_buf); f->segmentation_map = NULL; @@ -105,7 +105,7 @@ static int vp9_frame_alloc(AVCodecContext *avctx, VP9Frame *f) VP9Context *s = avctx->priv_data; int ret, sz; - ret = ff_thread_get_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF); + ret = ff_thread_get_ext_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF); if (ret < 0) return ret; @@ -1237,9 +1237,9 @@ static av_cold int vp9_decode_free(AVCodecContext *avctx) } av_buffer_pool_uninit(&s->frame_extradata_pool); for (i = 0; i < 8; i++) { - ff_thread_release_buffer(avctx, &s->s.refs[i]); + ff_thread_release_ext_buffer(avctx, &s->s.refs[i]); av_frame_free(&s->s.refs[i].f); - ff_thread_release_buffer(avctx, &s->next_refs[i]); + ff_thread_release_ext_buffer(avctx, &s->next_refs[i]); av_frame_free(&s->next_refs[i].f); } @@ -1571,7 +1571,7 @@ static int vp9_decode_frame(AVCodecContext *avctx, void *frame, ((AVFrame *)frame)->pkt_dts = pkt->dts; for (i = 0; i < 8; i++) { if (s->next_refs[i].f->buf[0]) - ff_thread_release_buffer(avctx, &s->next_refs[i]); + ff_thread_release_ext_buffer(avctx, &s->next_refs[i]); if (s->s.refs[i].f->buf[0] && (ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.refs[i])) < 0) return ret; @@ -1611,7 +1611,7 @@ static int vp9_decode_frame(AVCodecContext *avctx, void *frame, // ref frame setup for (i = 0; i < 8; i++) { if (s->next_refs[i].f->buf[0]) - ff_thread_release_buffer(avctx, &s->next_refs[i]); + ff_thread_release_ext_buffer(avctx, &s->next_refs[i]); if (s->s.h.refreshrefmask & (1 << i)) { ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.frames[CUR_FRAME].tf); } else if (s->s.refs[i].f->buf[0]) { @@ -1760,7 +1760,7 @@ finish: // ref frame setup for (i = 0; i < 8; i++) { if (s->s.refs[i].f->buf[0]) - ff_thread_release_buffer(avctx, &s->s.refs[i]); + ff_thread_release_ext_buffer(avctx, &s->s.refs[i]); if (s->next_refs[i].f->buf[0] && (ret = ff_thread_ref_frame(&s->s.refs[i], &s->next_refs[i])) < 0) return ret; @@ -1783,7 +1783,7 @@ static void vp9_decode_flush(AVCodecContext *avctx) for (i = 0; i < 3; i++) vp9_frame_unref(avctx, &s->s.frames[i]); for (i = 0; i < 8; i++) - ff_thread_release_buffer(avctx, &s->s.refs[i]); + ff_thread_release_ext_buffer(avctx, &s->s.refs[i]); } static av_cold int vp9_decode_init(AVCodecContext *avctx) @@ -1832,7 +1832,7 @@ static int vp9_decode_update_thread_context(AVCodecContext *dst, const AVCodecCo } for (i = 0; i < 8; i++) { if (s->s.refs[i].f->buf[0]) - ff_thread_release_buffer(dst, &s->s.refs[i]); + ff_thread_release_ext_buffer(dst, &s->s.refs[i]); if (ssrc->next_refs[i].f->buf[0]) { if ((ret = ff_thread_ref_frame(&s->s.refs[i], &ssrc->next_refs[i])) < 0) return ret; diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 5a338d7658..30790ef16e 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -1019,7 +1019,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) if (dst == src) return 0; - ff_thread_release_buffer(dst, &fdst->curr_frame); + 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; @@ -1066,10 +1066,10 @@ static av_cold int wavpack_decode_end(AVCodecContext *avctx) av_freep(&s->fdec[i]); s->fdec_num = 0; - ff_thread_release_buffer(avctx, &s->curr_frame); + ff_thread_release_ext_buffer(avctx, &s->curr_frame); av_frame_free(&s->curr_frame.f); - ff_thread_release_buffer(avctx, &s->prev_frame); + ff_thread_release_ext_buffer(avctx, &s->prev_frame); av_frame_free(&s->prev_frame.f); av_buffer_unref(&s->dsd_ref); @@ -1539,7 +1539,7 @@ 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_buffer(avctx, &wc->curr_frame); + ff_thread_release_ext_buffer(avctx, &wc->curr_frame); } avctx->channels = new_channels; avctx->channel_layout = new_chmask; @@ -1547,12 +1547,14 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, avctx->sample_fmt = sample_fmt; avctx->bits_per_raw_sample = orig_bpp; - ff_thread_release_buffer(avctx, &wc->prev_frame); + 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; - if ((ret = ff_thread_get_buffer(avctx, &wc->curr_frame, AV_GET_BUFFER_FLAG_REF)) < 0) + ret = ff_thread_get_ext_buffer(avctx, &wc->curr_frame, + AV_GET_BUFFER_FLAG_REF); + if (ret < 0) return ret; wc->frame = wc->curr_frame.f; @@ -1676,7 +1678,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, } ff_thread_await_progress(&s->prev_frame, INT_MAX, 0); - ff_thread_release_buffer(avctx, &s->prev_frame); + ff_thread_release_ext_buffer(avctx, &s->prev_frame); if (s->modulation == MODULATION_DSD) avctx->execute2(avctx, dsd_channel, s->frame, NULL, avctx->channels); @@ -1693,7 +1695,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, error: if (s->frame) { ff_thread_await_progress(&s->prev_frame, INT_MAX, 0); - ff_thread_release_buffer(avctx, &s->prev_frame); + ff_thread_release_ext_buffer(avctx, &s->prev_frame); ff_thread_report_progress(&s->curr_frame, INT_MAX, 0); }