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 6F5C249D41 for ; Mon, 8 Apr 2024 20:17:19 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E4AF068D428; Mon, 8 Apr 2024 23:16:14 +0300 (EEST) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2086.outbound.protection.outlook.com [40.92.89.86]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9D37868D357 for ; Mon, 8 Apr 2024 23:16:08 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Rm7Qw3akKoKFY+K5Iupyccri6V6/zJ/0bYXsZnvLyshvuiV+MZ24EVXj6HPwXx2m0jLqueHOt1J6XB4v1eGLe/HYmJTQxW+jsY6tu5r0D1bVBxut2sKWUs9wJs5G8wLv6AlGz9CZhYhIWo/lB3fiVhKuWwPEEbsysC6YdmdppPhelcmWfk5Aao4wIaYGKu8EciVSAjnJLb3ehyg1gl+derV6xaURcrHTx7wKfxbZAG0DzYkp+DQILT7EQkKg3jQFzfvz5nAIvBfjzki1AXy8L5o/UOl/X+lMgnLX9nQfpTmYLa6VeDNB9N83K//9/3C17fz5VndRxMxAcmDR+dJkkQ== 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=df80nxRCFkkbHKo6U5P6gMZm/Ui7+rnVtVzn2t5YSyA=; b=LmiVkBcroSIrPtsoLkZmdIN7ZE9E5TRPMq5Oyplhw4R1BqEev7TxXeoUoyBJ3aZ8KyS6EIMfPuGvkhnkbdHmxBdlRV/t/jtU/zsMkZ6NPtpZuydM2wbTfOR/wKA3A+CvuhVka6u+MOUrjHkeZ/NHLpBRJPGPDCzQQM318WcWCMkIED28Y0rW23769vBr/dSOQY+gmiAK4LAZPK/hQh5QPIp+UoCrnJpmaswKVU3va0681IeKVFj1FmuAOnHxqphmrHpSL63w0+w6UYd7Ut1+xvdNJz5okVG+7HyTm0+FF5PwVVtL3FRUHRWAllVqAVgvs0/EdV5AH154SEa0e3WwHw== 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=df80nxRCFkkbHKo6U5P6gMZm/Ui7+rnVtVzn2t5YSyA=; b=QaM22GfSS2PCZeFYVOctd5YpZUTHekLXJiLcBr/3ej/tpbkYO+hfrpvtz0XLDEiPFHGbqj1imFtabSAvdbM7cgBm4AKFNFrW+lfFpawv5ujn9cfYdsXOmowzftsgTvdEXaVnkZuJjCtz+GA5BG/EXihybCIHjO1LLAAbjPbfKgzatbtysLP6EPwBH9vf62FO4fDI9gAU5O2qyqaNv72MRr5S1KsiPQjJVU02KpJx20uZHHabYK9EFjY6qT7xTuQ/TLWYld4h1VgDbp7QWzuhaE/zDVNqeMgPkl8Qxb/IdTFFTfsN5ao5GlV8Vo5Opt1iWcW+rcM9SmttKGxa7K8vkQ== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AM8P250MB0171.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:322::18) 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:16:06 +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:16:06 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Apr 2024 22:13:59 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [wCohs+JsW4VRFGNLfPs1Pmd0IIoSg6A+CQUgqJ/xZTs=] 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-20-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AM8P250MB0171:EE_ X-MS-Office365-Filtering-Correlation-Id: bd16f64a-c848-408f-d8fe-08dc5808b8b4 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Fsdpj2IGvjpC7HDUKSoamYeVuRXNQssJQ9O7cuExIchbUIJpIXptOSqo5uHslUirRAUMnZAtFqNMhqrEzPHZQUZAXJgKL3cE95wr6evJTBle996PD7ffH8kOu2YzwsasNiCxElXorednBzPA6WKKoX6R11iDb5ePdEhfzNgvj2y4wy+5EdIVgKlg5q3Rmkf1bJwMBFaXMmcctigGGT+D24XUusNXu23Y3HXKMz4O/6e1fibx6gRa3LWRwq8Z2b8QjrC5Uz/XBN0Zxq4ryW1ET7s/G6N9GX1rHZQWKIZYJnGZ3nU3g9tbksQ4dZkXRopel6D8aWZEToXV4Ls2ij6+VXm5okLJmsje6cfnWpi6kVuI1GeBLgsvD4F9gS/Kcn5Gyj/2QQlJ1NxLc8MmKfn8g1jvVNtn1atmDSL0KMckaqLdzwDd7SnwcsyBY7A9jfHHhoNU1tRMgbjOooRd6lrwZxTIlu0av/kKl2zJN0cc5UapJSXE3lfXKVq66cL1KdFjQNC5VlGiwgYAbzlvqzm8wTdhGvJmUdvWtLTkavNCkvp1N1CRH2LGVzAwFe7sAjRSGdW+HERpVv1ru0ltb/cUfDx4iXhk6/CfRBGsLBJacxkvJ2as+Rp0f3L9x+Z0R/nB X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?nPgyc0XG6djvvJZdWcqBWwIKgd3NvmM9d8/UDl28kNd9IPyYn0daInGT2FIq?= =?us-ascii?Q?Zu+EYFqhycy4kj7DBpAW6+UVekxD9Meec1BBW2c56GaixzLSy5ZsWiTljZDG?= =?us-ascii?Q?r+1qQhVt7sDyy7GjVvhPexUzI2CiAY2B2EFvAGIYUX6olDFfmo+I/RO/smXq?= =?us-ascii?Q?UqPadUoPz251Mq0QUchaqe/Pppjn1dZHhBadYSCMQdufiXue1DMYmRju2LkT?= =?us-ascii?Q?0KDtuB6IEywwyxhluLeQkbu4b5G6UjOahTdT+0R1Q6UI0Bi/Y2RdO4mlVePD?= =?us-ascii?Q?80ACFeFE5aCrVDR5IzVu/lqcit2mODVSc7XoGHhfs8g2hFOgCi0ekrsKs+NI?= =?us-ascii?Q?t2kLu2vgSEDl67qX8s2gHRqjzmN2TgRoRN0N0AS/t20x4nVscctt9MNKgbSq?= =?us-ascii?Q?s3SAWbsg/sWSvZXVCNP35hGncM8DieLODsV1PBhSPUzc2aVXdKGdzm1vI2ag?= =?us-ascii?Q?aB14EJt36/NqESxpjA9uhlPPrZf0rg9d23YK40KvoZehlBv91wC2OYy/9zSW?= =?us-ascii?Q?NOGGryYrYvRuB01zMQ5/aulnpohlcx8/VaZbL9sZrhThPoKaIwAkS9FQW9gO?= =?us-ascii?Q?CJHAAKdwfLw+fjW9KuPGgfNHjj5FO7BdpJSFyt3W6B+ZPzrKlhvWEpYFwRVS?= =?us-ascii?Q?bIUKMGcQPcYgrCEHERRPDXpx/Xab1yo/ae6EfD2/DiAe4EoTFYYiMXdxWxUl?= =?us-ascii?Q?IawjkHJZ+D6Es4O+iSIPjfIKp8k3+hFmkoWp6UrD0w4fAk1PsfyM7tMYzTBF?= =?us-ascii?Q?U730sU0grJHi4c6/H0PSc38ikmnEzbR1rzbKXblJ+N/7imIxFSkIzHuTQiDY?= =?us-ascii?Q?WjkOpcDXBgjh/r4MhwV1FYHAUdJk/ta3oTJFQa/WRUavmRUvziCpE6KPqxLd?= =?us-ascii?Q?R9mCkJ8Z36DzgOUtcht0mEJ9plc9AigO9GKHhI6UXLWu37+wOlsDwUqvmGp4?= =?us-ascii?Q?sIpF6mHDpwd0CONokADe4Bgbb/uFnz0hm6q4c5R3u3e/FgiL0tCxq1mz7a7Z?= =?us-ascii?Q?rxQzaTs/vFHcxA9qfMAZsDYtD80yQ8mpi7IzpQx+8kddKKswLALAE1PInThW?= =?us-ascii?Q?yWAkXxBPcOuh0qckvQ6QEaTBMR2YCh1c6jjmSUbhK/2JGBY94jTFfdsQA0Wl?= =?us-ascii?Q?Jg3DKYoYoSmdktaVWIAGHhhLzTNXI3MZTc5fJQ4P+QwC+Ju4mzjB62zyapVU?= =?us-ascii?Q?g/WNSwcFYIzJINKJCH/IjXkJDp/Eqc+D55D1V5pIaNgYS0vbgMeNUcojO7vj?= =?us-ascii?Q?ZWaNYPR/q0XRyUdZCW5Sl5mRFsKVRcTQLKQ+xALnPQ=3D=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bd16f64a-c848-408f-d8fe-08dc5808b8b4 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:16:06.3243 (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: AM8P250MB0171 Subject: [FFmpeg-devel] [PATCH v2 21/27] avcodec/ffv1dec: 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: 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: Avoids implicit av_frame_ref() and therefore allocations and error checks. It also avoids explicitly allocating the AVFrames (done implicitly when getting the buffer). It also fixes a data race: The AVFrame's sample_aspect_ratio is currently updated after ff_thread_finish_setup() and this write is unsynchronized with the read in av_frame_ref(). Removing the implicit av_frame_ref() fixed this. Signed-off-by: Andreas Rheinhardt --- libavcodec/ffv1.h | 5 ++- libavcodec/ffv1dec.c | 81 +++++++++++++++++++------------------------- 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h index 04869da5c9..acec22e83e 100644 --- a/libavcodec/ffv1.h +++ b/libavcodec/ffv1.h @@ -28,13 +28,12 @@ * FF Video Codec 1 (a lossless codec) */ -#include "libavutil/imgutils.h" #include "avcodec.h" #include "get_bits.h" #include "mathops.h" +#include "progressframe.h" #include "put_bits.h" #include "rangecoder.h" -#include "threadframe.h" #ifdef __INTEL_COMPILER #undef av_flatten @@ -87,7 +86,7 @@ typedef struct FFV1Context { int flags; int64_t picture_number; int key_frame; - ThreadFrame picture, last_picture; + ProgressFrame picture, last_picture; struct FFV1Context *fsrc; AVFrame *cur; diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index dd594e3f9f..7a0d1909aa 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -37,8 +37,8 @@ #include "golomb.h" #include "mathops.h" #include "ffv1.h" +#include "progressframe.h" #include "thread.h" -#include "threadframe.h" static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed) @@ -264,8 +264,8 @@ static int decode_slice(AVCodecContext *c, void *arg) for( si=0; fs != f->slice_context[si]; si ++) ; - if(f->fsrc && !(p->flags & AV_FRAME_FLAG_KEY)) - ff_thread_await_progress(&f->last_picture, si, 0); + if (f->fsrc && !(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f) + ff_progress_frame_await(&f->last_picture, si); if(f->fsrc && !(p->flags & AV_FRAME_FLAG_KEY)) { FFV1Context *fssrc = f->fsrc->slice_context[si]; @@ -370,7 +370,7 @@ static int decode_slice(AVCodecContext *c, void *arg) } } - ff_thread_report_progress(&f->picture, si, 0); + ff_progress_frame_report(&f->picture, si); return 0; } @@ -858,11 +858,6 @@ static av_cold int decode_init(AVCodecContext *avctx) if ((ret = ff_ffv1_common_init(avctx)) < 0) return ret; - f->picture.f = av_frame_alloc(); - f->last_picture.f = av_frame_alloc(); - if (!f->picture.f || !f->last_picture.f) - return AVERROR(ENOMEM); - if (avctx->extradata_size > 0 && (ret = read_extra_header(f)) < 0) return ret; @@ -879,31 +874,21 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, int buf_size = avpkt->size; FFV1Context *f = avctx->priv_data; RangeCoder *const c = &f->slice_context[0]->c; - int i, ret; + int i, ret, key_frame; uint8_t keystate = 128; uint8_t *buf_p; AVFrame *p; - if (f->last_picture.f) - ff_thread_release_ext_buffer(&f->last_picture); - FFSWAP(ThreadFrame, f->picture, f->last_picture); - - f->cur = p = f->picture.f; + ff_progress_frame_unref(&f->last_picture); + FFSWAP(ProgressFrame, f->picture, f->last_picture); - if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) { - /* we have interlaced material flagged in container */ - p->flags |= AV_FRAME_FLAG_INTERLACED; - if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB) - p->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST; - } f->avctx = avctx; ff_init_range_decoder(c, buf, buf_size); ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8); - p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P if (get_rac(c, &keystate)) { - p->flags |= AV_FRAME_FLAG_KEY; + key_frame = AV_FRAME_FLAG_KEY; f->key_frame_ok = 0; if ((ret = read_header(f)) < 0) return ret; @@ -914,7 +899,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, "Cannot decode non-keyframe without valid keyframe\n"); return AVERROR_INVALIDDATA; } - p->flags &= ~AV_FRAME_FLAG_KEY; + key_frame = 0; } if (f->ac != AC_GOLOMB_RICE) { @@ -932,10 +917,23 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, return AVERROR_INVALIDDATA; } - ret = ff_thread_get_ext_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF); + ret = ff_progress_frame_get_buffer(avctx, &f->picture, + AV_GET_BUFFER_FLAG_REF); if (ret < 0) return ret; + f->cur = p = f->picture.f; + + p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P + p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | key_frame; + + if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) { + /* we have interlaced material flagged in container */ + p->flags |= AV_FRAME_FLAG_INTERLACED; + if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB) + p->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST; + } + if (avctx->debug & FF_DEBUG_PICT_INFO) av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n", f->version, !!(p->flags & AV_FRAME_FLAG_KEY), f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample); @@ -954,7 +952,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, } else v = buf_p - c->bytestream_start; if (buf_p - c->bytestream_start < v) { av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n"); - ff_thread_report_progress(&f->picture, INT_MAX, 0); + ff_progress_frame_report(&f->picture, INT_MAX); return AVERROR_INVALIDDATA; } buf_p -= v; @@ -996,11 +994,11 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, for (i = f->slice_count - 1; i >= 0; i--) { FFV1Context *fs = f->slice_context[i]; int j; - if (fs->slice_damaged && f->last_picture.f->data[0]) { + if (fs->slice_damaged && f->last_picture.f) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); const uint8_t *src[4]; uint8_t *dst[4]; - ff_thread_await_progress(&f->last_picture, INT_MAX, 0); + ff_progress_frame_await(&f->last_picture, INT_MAX); for (j = 0; j < desc->nb_components; j++) { int pixshift = desc->comp[j].depth > 8; int sh = (j == 1 || j == 2) ? f->chroma_h_shift : 0; @@ -1022,10 +1020,9 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, fs->slice_height); } } - ff_thread_report_progress(&f->picture, INT_MAX, 0); + ff_progress_frame_report(&f->picture, INT_MAX); - if (f->last_picture.f) - ff_thread_release_ext_buffer(&f->last_picture); + ff_progress_frame_unref(&f->last_picture); if ((ret = av_frame_ref(rframe, f->picture.f)) < 0) return ret; @@ -1067,7 +1064,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) { FFV1Context *fsrc = src->priv_data; FFV1Context *fdst = dst->priv_data; - int i, ret; + int i; if (dst == src) return 0; @@ -1088,12 +1085,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) av_assert1(fdst->max_slice_count == fsrc->max_slice_count); - - ff_thread_release_ext_buffer(&fdst->picture); - if (fsrc->picture.f->data[0]) { - if ((ret = ff_thread_ref_frame(&fdst->picture, &fsrc->picture)) < 0) - return ret; - } + ff_progress_frame_replace(&fdst->picture, &fsrc->picture); fdst->fsrc = fsrc; @@ -1105,15 +1097,9 @@ static av_cold int ffv1_decode_close(AVCodecContext *avctx) { FFV1Context *const s = avctx->priv_data; - if (s->picture.f) { - ff_thread_release_ext_buffer(&s->picture); - av_frame_free(&s->picture.f); - } + ff_progress_frame_unref(&s->picture); + ff_progress_frame_unref(&s->last_picture); - if (s->last_picture.f) { - ff_thread_release_ext_buffer(&s->last_picture); - av_frame_free(&s->last_picture.f); - } return ff_ffv1_close(avctx); } @@ -1129,5 +1115,6 @@ const FFCodec ff_ffv1_decoder = { UPDATE_THREAD_CONTEXT(update_thread_context), .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | + FF_CODEC_CAP_USES_PROGRESSFRAMES, }; -- 2.40.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".