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 DCFC349439 for ; Sat, 11 May 2024 20:53:11 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E8B668D5FA; Sat, 11 May 2024 23:52:27 +0300 (EEST) 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: =?us-ascii?Q?iuTFUET2ysFGqLkl4bRH3y8i33VBUT2+MJlAwEeUzhX2igmlaWdJmNkhK2PW?= =?us-ascii?Q?SSuiUOotyLvR73YyPkX2pyT0rp6SsMqgry+i3MHAzqJ9dd8Q35HGdXxAw9ic?= =?us-ascii?Q?XfXzbVSDgaNh4bYZ4Mamdo8/Trkz1w1f29fK/8kS4w3H2g/Rz5vkvWhUGQeH?= =?us-ascii?Q?Rr5rlQSRJWTmwOiwH3hwCdpevcXNUAeGBS21BhmbHsi8dg91tJGUWhXQSl4X?= =?us-ascii?Q?rO5eEl+aHL4raOSB/O/6yu59cOmq+QX5K7vWVZbXvsd3CnD8P7LsotC7azdp?= =?us-ascii?Q?bNIL9jCpZm4crxlG2rOqtYkAPfQrZjt8nrpCVJ+Ob4/EluTp4ZeHVb4M2Arv?= =?us-ascii?Q?5vBSqp9NLzdotnanDR8yzUlft9M0ugFX8+e0g4CJroyitBmHPyMuHVJ1udJt?= =?us-ascii?Q?1sLQb4x1zMgpzhm0hgKjwezRiBoKwx4l4N/lSdhwWIOECF83D3bLPg7wqloL?= =?us-ascii?Q?yYyJBZWZVJB5l6ssBcUB89he2rztYprUZzJNUX/P1mWr8kVp+W0de7uiI+yr?= =?us-ascii?Q?zHryyKPKm/FIU7g/eEs5jhRUwrI8YNbMvV+C9uCeI4KlcArLwUdhQBzWyFpY?= =?us-ascii?Q?TISQcMKjAHR4sC27pCAs37iHrNJ/+ilUmnqV5PWBGZZocdj6wZ4C7ejwIXR2?= =?us-ascii?Q?Ad2shyExD2caoFJOrw9SVlVjr428FiHOXG/z+mTHIwFiYLvgolsozacl3fq5?= =?us-ascii?Q?JNqFa/V8F1sun84Rh9H3RFO/sA2X4ccxro3w+7n3OK4+Ns1HJYtFeb8tWFHb?= =?us-ascii?Q?iYI8VUHyCuxJX7J31yOFHNxnhv6vTpYVdeQUkHBEAovHXIMqJf2G8S//7knz?= =?us-ascii?Q?hXrfhRRYComrIjDvAmMsKT5wDn/U/ST8nefv7DgpizQbsmo/GKY8zFsYbXPn?= =?us-ascii?Q?JQ9CNwtOCX8ShHHu7sGz4vtV57ts3jNL6IVKox50vHEM8J/A90gx7c1gGtky?= =?us-ascii?Q?6iwRJSkUFPr82Uy6gkF8bqKTVHtZiM+XbvgW8whPiVxW4iP1qKT8EiaI3NI0?= =?us-ascii?Q?Sxh3hUto8vHbH75YBpvlqqkg/cSiJgHzKsuUmKZPTleeIIv8L3qz4DH/ASen?= =?us-ascii?Q?W+zd9xD5MAfyjXfmLoOprT9pnB+zItOkxVTJGpLMbJVI0i6aTMks2f9GV6Ir?= =?us-ascii?Q?LgPyOUFgaiM2yo+dlblYeGW1TEdTVQnM6Hm3MO6UdCasYfzUwsJTsA4ZEQjM?= =?us-ascii?Q?XIdn9DBoaWIAUoVIOf3jOXExmxAFygpiccjJm3hEY9vJGSCZBVZfp2b8kFE0?= =?us-ascii?Q?20J+Ukc/lc7FqUqdC26TGglE/hMt4dtSuKW5cX5uvA=3D=3D?= 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 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: 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); -- 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".