From patchwork Sat May 11 20:50:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 48738 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1706:b0:1af:cdee:28c5 with SMTP id nv6csp298144pzb; Sat, 11 May 2024 13:53:14 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUVHPmKaLvAGZnpM15wRrldifxb4kTB3ZTDZKFQwEK2sCUUmyVX5qcnhVKo1gZApw6tFgbg/fRKmxsTkvIJSO1hb2KvvcKoim7NEg== X-Google-Smtp-Source: AGHT+IH+W6AfpUmp6mJFKbl5J6cxcDT2QG3meE7W29fqfBLvK2X0K5fwHaOo8A/nDnbsxomEH2f6 X-Received: by 2002:a50:d793:0:b0:572:3fe4:18b5 with SMTP id 4fb4d7f45d1cf-5734d67aa8fmr3749917a12.32.1715460794419; Sat, 11 May 2024 13:53:14 -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 4fb4d7f45d1cf-5733c2d5e86si3638143a12.232.2024.05.11.13.53.13; Sat, 11 May 2024 13:53:14 -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=Sp0rvMRZ; 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 C164168D5DA; Sat, 11 May 2024 23:52:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04olkn2040.outbound.protection.outlook.com [40.92.74.40]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4077F68D5DE for ; Sat, 11 May 2024 23:52:26 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=S70qHfXUr1tQZtrsrRNMNdxXrB0gfgZKKrbmtfKJY/Kw/LpX+lvBpPtChSmLaqUYJo98HhHI60NiyhAjnNeX3OIBRUZRDuvXB7ndCV8uuS1aTTh7IPJyf4InIpNaKHXIlQqcx19fwhIGKZWfC0cQF2QzmnC605ivpI07Dh/CYzRYSJ1Whcf54gonPNuZsocgTqIy1uC4CT40maa/VEKz8xcxaPDyYdq/9UenZ7fLFoipmzQEFp7xPm79BYTSo5EJgPuuVejx/NnMpHPkNYvxuO4zCFbreEM0HG02lnwlR+O+oAv8e8LaR2suDxdtm895M4bJ8dDpCJUSnat21wB0dQ== 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=lI9JdPRx0oo0qr0wNqHPlkFLPIfn3JzI0Vkx4XD/lYc=; b=jRf0u4Qcfi+d81Eo5nuleEYEwtGSXtZFxqD7EXzrBJ0P+5rmcqOAlvgrwcBs6Z5dUH1hW4AqeB9fZGwN3qzsHfjw7VVse0A7tu7XYCNKbzmtybUfCD7mcU2y+OqLTBfplSQuS2hGfjAYajIkqNSUoQbZf2cl1TXH/Y6X2MCGgoPsAkUcwdkPR+1kLnIl/WwmnZWpsvM3M0p9AHm0GnrGNcrRGoi2mFUtRFEbOe/oz6wtDWVvuVsOKfUC/Uz8XANeRkkeRuG74UtwNk9NQh0RvPusqF0mBW1+hyyQ2wRLqACSlCBbcTw7mEgE0UM0Aq1y7jLaSLjGO6rJ9hAwZYrywQ== 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=lI9JdPRx0oo0qr0wNqHPlkFLPIfn3JzI0Vkx4XD/lYc=; b=Sp0rvMRZlERXe8aJAM6JeDKtrjunhMRm5U0ohPDrhuLWbUOtcx5KMfYbx3V9Wk/2M7NZ0OGAgis4vj94V6bzfKVS5VYkXkAcZwPXG+gdb9ugJf3BO/L6/a+PjrD0LnUbjlF7NspTDbWTTgiVnN/3HdYkdNJneDd8jezRJDHYxi5670fc/2BF4+RngxCnk7h6K3DbBJztDgq4HXhoGpre1wwdLwLH2U9crA1BYxjKJnsZOpCKqmFB0SVS7lWffGMkuFnxv2/CXltbcFP2x75O1Md8JNXmZq6yuixSZp9rpBo8iOro+yboDxPgzuYxtqPwMA/DrFuG8DCQW1dEvcYLdg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DB9P250MB0449.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:325::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.51; Sat, 11 May 2024 20:52:24 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%7]) with mapi id 15.20.7544.052; Sat, 11 May 2024 20:52:24 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 May 2024 22:50:33 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [jm7z1g7ukYdhOUaF4W1rlS5zrAqFylCd2j+yNTDgc0U=] X-ClientProxiedBy: ZR0P278CA0172.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:45::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240511205135.2411886-8-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DB9P250MB0449:EE_ X-MS-Office365-Filtering-Correlation-Id: 90bd0698-acf4-44aa-e0a3-08dc71fc4241 X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|3412199016|440099019|1710799017; X-Microsoft-Antispam-Message-Info: J71N+3GSvR57Zukw473zucbB1AvNNhUgFJ1CubsCcdiG6YSY/0Kl4DrwuRJ316jNJk2ITjP9Fns7UJrzve7/dMZqSLigH00HOcRgbcxpVo2jvbUK1Zca3Y7+Qwyq6zVwFvs75opnlGCwxBTDSFsJXDYZQay33zBMT7lWGp7CYntd/QJEn+2ItpdQFKwaImpyDplNs2rHcD8Qc4qFd2Igx7bTxm4dFg88Tc8bpaqNNct/8gDHgqhaJOW1w5NLGk5MK54ZWyLb9Yfw05usPgTDyURGG/0U91cEzfb6h2eDrsVy2+nZnIJjk3CA8H94px1khCEZBM1h7emj4DYdDHT0AB0L9JUExf3UYOayz8gJVSDKX51bLiwz5kSkf+hh8JRsCOSi3uEhLlq8VEfXLPIrt4hPHqoCwblT1D18aaTQD2NpZvnUSlZPz1CWGreaohM8qKVe9myUOhyWc3uxl/N4HBw+jMB8mN2drL2Jn4muqB28fo9DdG4wBcb5yb3kGuZl07ocjT3Di6Zy2B1V/Etn0od1bMi3nmiip3QBGHMxzFDEB7m02I8Tp0mmUtsznaLKOdDnEros31qRaBCcvEid0hOflQg+tnHXgOPVabboOzpx5Hn/jwZQpE3n8LyrTUQF X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: iuTFUET2ysFGqLkl4bRH3y8i33VBUT2+MJlAwEeUzhX2igmlaWdJmNkhK2PWSSuiUOotyLvR73YyPkX2pyT0rp6SsMqgry+i3MHAzqJ9dd8Q35HGdXxAw9icXfXzbVSDgaNh4bYZ4Mamdo8/Trkz1w1f29fK/8kS4w3H2g/Rz5vkvWhUGQeHRr5rlQSRJWTmwOiwH3hwCdpevcXNUAeGBS21BhmbHsi8dg91tJGUWhXQSl4XrO5eEl+aHL4raOSB/O/6yu59cOmq+QX5K7vWVZbXvsd3CnD8P7LsotC7azdpbNIL9jCpZm4crxlG2rOqtYkAPfQrZjt8nrpCVJ+Ob4/EluTp4ZeHVb4M2Arv5vBSqp9NLzdotnanDR8yzUlft9M0ugFX8+e0g4CJroyitBmHPyMuHVJ1udJt1sLQb4x1zMgpzhm0hgKjwezRiBoKwx4l4N/lSdhwWIOECF83D3bLPg7wqloLyYyJBZWZVJB5l6ssBcUB89he2rztYprUZzJNUX/P1mWr8kVp+W0de7uiI+yrzHryyKPKm/FIU7g/eEs5jhRUwrI8YNbMvV+C9uCeI4KlcArLwUdhQBzWyFpYTISQcMKjAHR4sC27pCAs37iHrNJ/+ilUmnqV5PWBGZZocdj6wZ4C7ejwIXR2Ad2shyExD2caoFJOrw9SVlVjr428FiHOXG/z+mTHIwFiYLvgolsozacl3fq5JNqFa/V8F1sun84Rh9H3RFO/sA2X4ccxro3w+7n3OK4+Ns1HJYtFeb8tWFHbiYI8VUHyCuxJX7J31yOFHNxnhv6vTpYVdeQUkHBEAovHXIMqJf2G8S//7knzhXrfhRRYComrIjDvAmMsKT5wDn/U/ST8nefv7DgpizQbsmo/GKY8zFsYbXPnJQ9CNwtOCX8ShHHu7sGz4vtV57ts3jNL6IVKox50vHEM8J/A90gx7c1gGtky6iwRJSkUFPr82Uy6gkF8bqKTVHtZiM+XbvgW8whPiVxW4iP1qKT8EiaI3NI0Sxh3hUto8vHbH75YBpvlqqkg/cSiJgHzKsuUmKZPTleeIIv8L3qz4DH/ASenW+zd9xD5MAfyjXfmLoOprT9pnB+zItOkxVTJGpLMbJVI0i6aTMks2f9GV6IrLgPyOUFgaiM2yo+dlblYeGW1TEdTVQnM6Hm3MO6UdCasYfzUwsJTsA4ZEQjMXIdn9DBoaWIAUoVIOf3jOXExmxAFygpiccjJm3hEY9vJGSCZBVZfp2b8kFE020J+Ukc/lc7FqUqdC26TGglE/hMt4dtSuKW5cX5uvA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 90bd0698-acf4-44aa-e0a3-08dc71fc4241 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 May 2024 20:52:23.9741 (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: DB9P250MB0449 Subject: [FFmpeg-devel] [PATCH v2 09/71] avcodec/mpegvideo_dec: Factor allocating dummy frames out 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: ntQfT7ZWUSwU This will allow to reuse it to allocate dummy frames for the second field (which can be a P-field even if the first field was an intra field). Signed-off-by: Andreas Rheinhardt --- libavcodec/mpegvideo_dec.c | 85 +++++++++++++++++++++++--------------- libavcodec/mpegvideodec.h | 4 ++ 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/libavcodec/mpegvideo_dec.c b/libavcodec/mpegvideo_dec.c index 597ffde7f8..efc257d43e 100644 --- a/libavcodec/mpegvideo_dec.c +++ b/libavcodec/mpegvideo_dec.c @@ -281,14 +281,21 @@ fail: return ret; } -static int av_cold alloc_dummy_frame(MpegEncContext *s, Picture **picp) +static int av_cold alloc_dummy_frame(MpegEncContext *s, Picture **picp, Picture *wpic) { Picture *pic; - int ret = alloc_picture(s, picp, 1); + int ret = alloc_picture(s, &pic, 1); if (ret < 0) return ret; - pic = *picp; + ff_mpeg_unref_picture(wpic); + ret = ff_mpeg_ref_picture(wpic, pic); + if (ret < 0) { + ff_mpeg_unref_picture(pic); + return ret; + } + + *picp = pic; ff_thread_report_progress(&pic->tf, INT_MAX, 0); ff_thread_report_progress(&pic->tf, INT_MAX, 1); @@ -314,6 +321,45 @@ static void color_frame(AVFrame *frame, int luma) } } +int ff_mpv_alloc_dummy_frames(MpegEncContext *s) +{ + AVCodecContext *avctx = s->avctx; + int ret; + + if ((!s->last_picture_ptr || !s->last_picture_ptr->f->buf[0]) && + (s->pict_type != AV_PICTURE_TYPE_I)) { + if (s->pict_type == AV_PICTURE_TYPE_B && s->next_picture_ptr && s->next_picture_ptr->f->buf[0]) + av_log(avctx, AV_LOG_DEBUG, + "allocating dummy last picture for B frame\n"); + else if (s->codec_id != AV_CODEC_ID_H261 /* H.261 has no keyframes */ && + (s->picture_structure == PICT_FRAME || s->first_field)) + av_log(avctx, AV_LOG_ERROR, + "warning: first frame is no keyframe\n"); + + /* Allocate a dummy frame */ + ret = alloc_dummy_frame(s, &s->last_picture_ptr, &s->last_picture); + if (ret < 0) + return ret; + + if (!avctx->hwaccel) { + int luma_val = s->codec_id == AV_CODEC_ID_FLV1 || s->codec_id == AV_CODEC_ID_H263 ? 16 : 0x80; + color_frame(s->last_picture_ptr->f, luma_val); + } + } + if ((!s->next_picture_ptr || !s->next_picture_ptr->f->buf[0]) && + s->pict_type == AV_PICTURE_TYPE_B) { + /* Allocate a dummy frame */ + ret = alloc_dummy_frame(s, &s->next_picture_ptr, &s->next_picture); + if (ret < 0) + return ret; + } + + av_assert0(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && + s->last_picture_ptr->f->buf[0])); + + return 0; +} + /** * generic function called after decoding * the header and before a frame is decoded. @@ -382,34 +428,6 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx) s->current_picture_ptr ? s->current_picture_ptr->f->data[0] : NULL, s->pict_type, s->droppable); - if ((!s->last_picture_ptr || !s->last_picture_ptr->f->buf[0]) && - (s->pict_type != AV_PICTURE_TYPE_I)) { - if (s->pict_type == AV_PICTURE_TYPE_B && s->next_picture_ptr && s->next_picture_ptr->f->buf[0]) - av_log(avctx, AV_LOG_DEBUG, - "allocating dummy last picture for B frame\n"); - else if (s->codec_id != AV_CODEC_ID_H261) - av_log(avctx, AV_LOG_ERROR, - "warning: first frame is no keyframe\n"); - - /* Allocate a dummy frame */ - ret = alloc_dummy_frame(s, &s->last_picture_ptr); - if (ret < 0) - return ret; - - if (!avctx->hwaccel) { - int luma_val = s->codec_id == AV_CODEC_ID_FLV1 || s->codec_id == AV_CODEC_ID_H263 ? 16 : 0x80; - color_frame(s->last_picture_ptr->f, luma_val); - } - - } - if ((!s->next_picture_ptr || !s->next_picture_ptr->f->buf[0]) && - s->pict_type == AV_PICTURE_TYPE_B) { - /* Allocate a dummy frame */ - ret = alloc_dummy_frame(s, &s->next_picture_ptr); - if (ret < 0) - return ret; - } - if (s->last_picture_ptr) { if (s->last_picture_ptr->f->buf[0] && (ret = ff_mpeg_ref_picture(&s->last_picture, @@ -423,8 +441,9 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx) return ret; } - av_assert0(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && - s->last_picture_ptr->f->buf[0])); + ret = ff_mpv_alloc_dummy_frames(s); + if (ret < 0) + return ret; /* set dequantizer, we can't do it during init as * it might change for MPEG-4 and we can't do it in the header diff --git a/libavcodec/mpegvideodec.h b/libavcodec/mpegvideodec.h index 0b841bc1a1..42c2697749 100644 --- a/libavcodec/mpegvideodec.h +++ b/libavcodec/mpegvideodec.h @@ -50,6 +50,10 @@ void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx); int ff_mpv_common_frame_size_change(MpegEncContext *s); int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx); +/** + * Ensure that the dummy frames are allocated according to pict_type if necessary. + */ +int ff_mpv_alloc_dummy_frames(MpegEncContext *s); void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]); void ff_mpv_report_decode_progress(MpegEncContext *s); void ff_mpv_frame_end(MpegEncContext *s);