From patchwork Mon Oct 17 01:33:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38754 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1375530pzb; Sun, 16 Oct 2022 18:33:50 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6haR+iLWf3feQIwT+/y57pjT16L9hQ6vM9Pa6idX7L7qZ9dkawRYQi/57w2h3ZGOycvyMV X-Received: by 2002:aa7:d348:0:b0:45b:8ae3:ee3d with SMTP id m8-20020aa7d348000000b0045b8ae3ee3dmr8086340edr.428.1665970430127; Sun, 16 Oct 2022 18:33:50 -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 eg47-20020a05640228af00b0045cc6aa0429si6781026edb.250.2022.10.16.18.33.49; Sun, 16 Oct 2022 18:33:50 -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=oAjexvLQ; 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 E6C7768BC48; Mon, 17 Oct 2022 04:33:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02olkn2086.outbound.protection.outlook.com [40.92.49.86]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6A00268BBE7 for ; Mon, 17 Oct 2022 04:33:39 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Otxz/A/d1mDCIW1o0lt7kn09TCZhlmPkdavGutjqR7L3r6XTk64XVJJsN35MEnE0wAIXSCCoGwXt9ohh0ZjAv/SVixkOUpHu7PYoB/v6RX+w7N4UHuojhbNbOTcY08H+22LykSiaTGACbIMMC/XfywQInNwwrwgc2wnVQDhtew+kbSCyUg9yPd4kifBpRp084N89R1O3oblJ1lD26G8MOUH5wgqgvEeBACzUKFCRlY+horvmCXAiFkw7xSVrSX3HjGQjz8LDhXZrU4plGL0e3vKE8ITz/v5hXDWm9I40YzU/2Fzh04PrI60OXf+zyry6B9ci+0sfUb1VbZMsl41OGA== 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=41Zr2X46pnpsmfia52I98FehyTCwWTyZ8xmIU8FvpsY=; b=JGk0//X8uqRBm3h9A3872G3lUeuoNkKQ2rJBSJulht20QqfLFQHnoH6I41NMxmf9gPWyxximE8qNhkV75oCguctQwQsQ5EKf0oac70I7m0qUBeiwy4tP94j8fGq+htjFjWR/cTqdNLFuPSewpI9daMkMT1xRj6Cazf/C+Cgf4Ap65jrUiTtpSwKzcAGMiwCrK13rtFATduIN+wfgHLsmbczSNnv+1+/8x5acj65JmOPe9ikfoPaj6/TOJ+18zwuIfp6Q2vrw5Hu/Q3EV44WFN4a0dABabYhUOFwf0rZhuYCfTEL+meR3+2Z4V3PFbabrzjBX5ZWS2xVRIWINSEsH8w== 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=41Zr2X46pnpsmfia52I98FehyTCwWTyZ8xmIU8FvpsY=; b=oAjexvLQrqNC/9YwJAeRdpzdPExQ39Gt6O5EhhIf7Io9TV24QEmIMKFjsHkhvU9cjW1sqIVDcFMkhR3OcgbUbuqFlqhN+XoiqM8/AAnnJ/ykYoMqRYehYNJahCf748c4c2vZcwo4giXdYfXKP4C5aP6cRVvrBGBW4lC/38xYQf/mtAxvNl9XshF8L+nU/+Fmcpa3T9SAdG1tUDnNHBOriT7dk31dOiIboUhEJPpfsVNOgqQws17iboE5MUPB5lTaXl2vkv+/11vZezQ05AznNSBXUMh3HhxNliR8wn8udv7s9BEuxE84kfW7pOGzPBfmzKxgkT11FyzExf0CvQD9zw== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0916.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ec::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Mon, 17 Oct 2022 01:33:37 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f%2]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 01:33:37 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Oct 2022 03:33:35 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [loBSWquwMk3iXyNaD37z4jTA0J8vWfMXus6zMUJVyCQ=] X-ClientProxiedBy: FR3P281CA0040.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4a::8) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20221017013340.944278-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0916:EE_ X-MS-Office365-Filtering-Correlation-Id: 81c5c125-abb7-487e-a48e-08daafdf9cf1 X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmriMkceEMr8g00cHUekKy/uzHPwHZ7ZKMxT4dnOEAyAX2zcfXh78+NhbCMUg2J04HCWwfOzEgvkecnRlqsvHmCD2Y30MzAC/Gj7sQ2T6WyotmIBvOylT3Nt3xd+QNuar0aAmt4sNj3HSTMbRI9HJMmGwPFuT0d2a2vErlbj14bu+Rb86VKyrEFuXC+9Pz7nxQtQxpLojHKrE0AHeLaC3AqppOO1qZd/zHYdT1x5EeCTBdBY5O3EPSYN7sO66uyHHdk8u27luSxeepUAKY6L8o5hskuNVg5QbImdyxxux6YhYuf7sGDnJJ2i0dmA1qRY297tJipVPz29kVh71eNiuPiIyZiJ4vpqUuIi3LDHD/OrB3UNoTRWJlzqjAUeqWKNZ4+4J/Di5sswoLZ2xKKMcJ7Ltp52mVLJjKwbD8VBRQIrfhKFjETvQ0snaZ1W0Xh/OK+idBT/RfEy+tTsrnx1tccFMEH42dbjt12xHK0VPFLkDnNTIWNGLT74E4Yj4v/G3OMQy+ahMkTgt2kZCXw9yatmyMr2x0axnbvKvxt9nkBXeM/P71FQbT+cUGAYiekdcdOWOSDf+A/fijgeXMxuuJZ+LSWJWMCny5Aig9dqTlR0TSCe+hHsCF1AzoshLhr5agyII/vIc4ZNYtqKqUdrBc6VxxFGVwOfcV6ewRWz9g5ZPp1oXJcyCyNI+U9C0ONrOL4pK0LhVavp5klhjKeT8TZG/5+XBiauH76K5M+AwYmciymL2aswvjpVlmCfGr4hxAI= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: QshOvEtPTN4WRn43gf+JpNdou/MNRtliae+QqaZP2zUqxwKNwwL+CJq2mQDsvJ8cdSFh7T1uLX9fHmnaUsnTRL58U8IGU0MqrS01zGnOiS2y5yKMXQm1Gtk3vMADDVFXd9zhZmSayUJoxWyrPEJXMQJkup+IfzU1BItN208LYkxBP4uqrwj1Qm8bgb9Vh/mm/SbvJnKrYsMdpvdBIxg75NxxT8hV4emK3y+q9YekH3zMTGv/wRNWSsL7brdg89sF5v65Buym+beUIzGAXBk2EVJGO8XytKUigrad4lfM+Db/Oxp5PW6ZnSONwCuaFRN4I/oxtxcuNpRARbCFUTEE44gHGxC16gJG5EnWf6lenhyRz7LMVLSOjsO7iXYjCtsiyI844I53qXLC5vH9ALC/m6P2jpcHvQomwbSM6L0PGc4bvhvrFXnV3yOx/GzyKYXKx/aYf+l0hzEt+12bEGBCsKqyBiv/i8QYXJrR/dSHvQa8oE2/waQsRJDHHGYYNazwPtwxEMzpAZ/hh4sryE2Ef9P9QKau65SStNx2PXT45Fs1elJyvUzzmcNLEc7DJLKztncfdviHgR3GJiMM5+FQPYwfyhuBHj4S688MbyD2w6pH6tYr0jvWLIhgoiObXEk+i3GkG0v8nNGcOi7Ghci9G4EY3GhdJp3SVgPTMhNM1kAoA+S6I6BJHzr6PsKKQpnY X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: OCoZx8taxB0vtVKJeWekHqBkpopyOrkUj1INFZ+QmbnWa4DsHyLd0f1awXGz1BC8xtyBP2KQItTPeigT/KAARx75pGwHPgOkTEIX3Jk82/QmRwZXdPJ3hoy/H5Vl8964wH409HO6JTplYQ0R3d755fpuKc7jOaD6XPW7/eDuXysecIkDblIjWYfK9MuXK+SEUOf2Maai8NZHM0wyzfKFzzn1dHzOqqOJieIgMxhzFTPAjQ/UZzCczqt1YEm0ZzJtU/tFZGyA1U0xz4aYwlGsJ3+yY3XlbQqDe1X6hpjcGegSvigZRunG3befmVRNvGVfrN0kPrPIUjCcCm0CbX/wZKhYJ6GzoYvhC+i3aP8wN3TkWLsVu1HtEK9+gRbNFQp1zURWanMeRwPl9WTEbDpdlUkwiyF6ki4DpifqEN1KTHHolMqXGJAO+q2ruXjBTnoirMNi9f+tLKIQIfIc40P6HAg7ZNaZw4oGsglKxJTE0PL2DR52gHMiq6JglUXE7cXw2rr5iOg9RQL9OFBvBuVL3JDlQIb2DRcpTocPnjmz08Q2OY6IYat3swkoavAxq/+5v4DfqopKuVueYq29fphlWnUVSoUlRrfbABdnFNDwpqdohdoCMDlQWF42Rfkuy//loaXZOwns7gCf1xLZW/Muw4qYEJ7XkbU8r5IDhLuVVEpJSgPuum981I6CskAAQ2JF9MQDpv2e3vBFJWHbddgV5ZqrmpQM6UQxs+5uanUBT/2fkhVZY3DhrlciZ6UBkq0n/0lk+8pZEaCZ6g5oVBN9NgNVBZoLhZl86kmjZkTcbjuFcu2M3XHDR1hPrfvPd31kgeLvsPQM2NGqRXkHfUyAsY9ysBcvPtIaG/sUP25g15Nx44NTW10dv4AWRw6Tk+Pc3EzHVZIl7SgsX3p9EQ0/6GZHTGE8wJjxD+9YmF8CfJyu8e8W8Gz5A2oy8Z1/DTGJw02icApY9ETtm8YbrygrEtfjANM1jMn97jSiP9Fud4O8ROMqdPO/1W3sXHpqe0wIot+LRMf76JfXjBlU31Oj29HOyHFf+lX+h3IGkVRCv2Rz5jVcgmeRPpwX2VMrnvlaaxjM6VZ1T0EFzk2HBBZCvtaUojzVMWiDIfSk5us1YhhR9nr7sS0SJ7YrNFur0OPxOimzxq8yV88rh5RBz0TLx7dynGzxgwFEM8b32ieXpVg9yDpIQlS7+XjKL1oCnH7IJVVb7hCsFxqy2LgafU31/S6/r/3o/D9LXU/RI5GLAqDXcL9WaUgJ8pFt8YR61xsCblrg/L25/FfFd2Q3YUFNcwtBoG8Sd/iIunvzhnDtNiWZ+Rp960t+gFnetPoQAbRv X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 81c5c125-abb7-487e-a48e-08daafdf9cf1 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2022 01:33:37.4339 (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: DU0P250MB0916 Subject: [FFmpeg-devel] [PATCH 1/6] avcodec/mpegvideo: Ignore skip_idct for encoders 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: X/ioWm6pHrvO It is documented to be unused for encoders. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpegvideo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 5095149eaa..448b65bb96 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1413,7 +1413,6 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix, op_qpix); } } - } /* skip dequant / idct if we are really late ;) */ if(s->avctx->skip_idct){ @@ -1422,6 +1421,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], || s->avctx->skip_idct >= AVDISCARD_ALL) goto skip_idct; } + } /* add dct residue */ if (IS_ENCODER(s) || !(IS_MPEG12(s) || s->msmpeg4_version From patchwork Mon Oct 17 01:34:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38755 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1375762pzb; Sun, 16 Oct 2022 18:34:49 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7E2RG9vFyJahQ6NifjbvG3aDv+53pkFdBZpNkvAXzqsDUrthoCd2ou6aTy43bLXLvN2qRE X-Received: by 2002:a17:907:2723:b0:78e:22f9:f16a with SMTP id d3-20020a170907272300b0078e22f9f16amr6582035ejl.682.1665970489605; Sun, 16 Oct 2022 18:34:49 -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 m13-20020a056402510d00b0045d9ceae669si1268797edd.404.2022.10.16.18.34.49; Sun, 16 Oct 2022 18:34:49 -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="Q/J7rxvN"; 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 333A768BC85; Mon, 17 Oct 2022 04:34:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02olkn2105.outbound.protection.outlook.com [40.92.49.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DBBFF68BB29 for ; Mon, 17 Oct 2022 04:34:40 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Rp6rZQ2PycbiOVrkJyH6Ol7VRhOu7XbUo2v3cGNguW76GlJv3+YhOXIZ0p/2aSE6leJ+Q48pftBaKbGAxHICEIglPW/HzRNn9Ku1TjZXlqTrPZBDKMe2QLXma3+Hpk63F5O1qK6OH9k9Vi1v8TdDI7l+eV0QCXen8wv/Cq3FPJsNxjnCMwmxstuafS02U+NupZH7sQBXPXSvSr3scNGXNsTTmNTIhrjZZkj0CfxP832wYStyb47cBCdOukQcee5ShogYLNtl9o4zNJQK1C+yw6XNDLmzMxXpm7+DBK3e0Zis7cZBz42PKJ6mDqhL90h8r+S7N2zRSOz5JKOjYW7Ozg== 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=DtpkCnz3XwYwa4Uez/n6h0nBHNA1G8EUpV8xNboeWvM=; b=TFT24QbHW0za6O5J36ftBOZSMUkt24VVAQN4Av2rYb3XSgBS0jd9UFOBFk7YB4yp/Hh+NNJ7NuDqMfquk8xQrLaoidykA9B8Zha6IxlE8w4AAh+4cB5anWW1Nr68Pw7913YdZ7plWBfC1fAweGbqwmc/BKdAM+TL/nNq3jSzXkoNI6uHGS33wsPRPWt1kfvexSq6Al1sKSkxFadUzE5cs9Qx6RKQj0nueqIZoIbAJy2i7QnPOYC0IN56lshd+4kSwmDG3DEkRpXn6cHpLTPxTUW45D8WPK++L23nLz4dMZbgntiPwhfclr43Ks5exHM53dmqG2Koh1nMPXbBcXDB6A== 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=DtpkCnz3XwYwa4Uez/n6h0nBHNA1G8EUpV8xNboeWvM=; b=Q/J7rxvNExRjIbiEqIlG0jQleYZvSIInwgJq8FIXQEkWdoTYP2YF7hJdlyw3zG5L+ToQng6czGckPJa2lxmVvZl5t6elX8UwtkyV8RnynfbzbRXR5d3BoccYlt6Cer2axxpL5ywZdTe2n3mg211uV9ncvhTD04jZiFEkVFqq8Mk0gmmvZ/LswLIilwiP9pb4mNrdzJgUhGVHWR/yqbvw0ZtvlBQaLM0EgVGnI8yWqcjNt/71ICn2u3nfKll51E+YwI5y4Rn0MRgbDR9XoSi7GKzW5YcqOACBh+gGrhfXMvDiOfqmO9Vf4sigeLI66fY2cXUC3W/XWKkw/nf8Mq/kEg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0916.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ec::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Mon, 17 Oct 2022 01:34:39 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f%2]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 01:34:39 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Oct 2022 03:34:38 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [u2R+la1k4Dv/J41u+djK+4tGkP1oEKDKFsJpkVEhdo8=] X-ClientProxiedBy: FR3P281CA0056.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20221017013442.944352-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0916:EE_ X-MS-Office365-Filtering-Correlation-Id: 87eec863-f5b0-438f-32f1-08daafdfc1f2 X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmriMkceEMr8g00cHUekKy/u+afc6hYnzg+51sD1wUhiuV3UUFsiO1fnLfkY/V12Z6EemMx5UR8OMFTbeE7shX95Cvn/P2Q5mDOrJHLCUrJ9gQIRIlrOTgoAUPTQ4fa/AYDiV3RM4OfcttKvrnRUWHUV+3/44JANlPprS0YN6yxHAntMkXRhOs1I5V8uuiCWQC5ZX6qKdvTTpBNzank71cMHrvHY60QM5KVBw4l3aLUfCBMOPlMKigzprWfNWUSMDMLcNc6p69AZ8RgoVY7FBDmIs+FCAZTdWLKKX7Pe6r6r2H7Amd3vCAm/vPvCy2X9BEDzdBtlDDx5/dOOk0Im4ogLtRTSwYcmuusswdpW0CAlR/VUKaDs5bII0DedPvQQLatLOz6ss+9tVn9vgvtPhw+cSSQ/DyC6wACFtY0cb7njTdsYIBPzT0UKh1se+VYsKZ5XE/EY+C9p2dFl5JcCUAMchbAE006n4cBMk2/a+QS0CWE6R8uQex+REb2RA+Aql18SW9foXubRkUO/fyQM7U73wfrFYKnPTiItXoL6W45dHpdlzS+UNwY9x4UfTKADTjLJWPuQ+t0PIEbnTyd7dKgHKhWNpEjonXyd+TIwfAKBO0mN1VLc+MvehAlsax1IsH87d9WHlfouijTvjFSiqCjv4rwwqaazg8ofeKFYIzBRzPUP263dpfQu6a8PO8G4CwlMw60XwAfBZOykLLkVMqRyQuowlGr7yDDmfKmWB+Lrsnh/nbgwltQTkXq4N6iU/a0= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: umIbvuL+WIz2z4FF3R+sXaPIlhMOEJ0pEnFdqvjwiBQlKip2JWPr9Th12xFDPDq6CsH/ufg6Y8uwEu23tcTSnmA6IuiM7g95DfuMaVGcpvQGlY1gervhvZUUQcyq3/H84mMVEh1yDrwbMmuXTr8c/JIaaSXp1Z5PRtukf6eZXfmY4VcJcpVU4I+vJqrkGDs4wSBGCPfAkN95h9dzII7l5OsEaQz739x4y9GMm0c4EhnlxmzCvPncA2lDbiOhAR33IK3ltGw2InEHIqSm+0oRMArF3rn5ZJNcyH/jQ7v/2l7S9wolTu/bD6lLaR8Na2DQDpstvoswPXeOdv6FRez4GEgzHj6Ihe5ihXpKtV1AvPewGq8uN7vWWfaNBPmfLQ9AviYtW0IjsQWa1xIgkH8tXwiOfHiefaFenWqi+m4nRgqz2sDazkd5mtATW1VzPbmYiWGqQLjvkpRf8DNk1CAsnWry2Nv483BGPyDL6M7dcyAFM5SvT3r0bJJYKiHUrXCdAASNyIvfvWK3fpoAY9Vh+ITuUkQ53JqayB2rMDnkvQ1u9dUimottg6zIU0SIA2Q1ZQvCa9M5m1vudmkwWBG9E4xkekJAmv/RqKrj/3Hf2dtWROoxixHmxxD7wpJAx2FmkRPLDTMPZQNnMvMVXJ84mUtdXj+VNF+Js4yjjVmla7Rk0ZExo2BJNaVbfCmXxkAa X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: b3BKKZ7srn2l5s/f0fiYGwoY1j89ceZj5YLgam5/BeBVY6ZSiDD5ajEoMa3K9LKZ/SRfYi7SlqjBrBzhnGIk1XJ2B8uR0fDoirF7fa4ZsA/Iey45zFA9dQtfl8D72uK6CjSIioHB6MBuStMLg8cVWHbV/cSiPiRktkeYUuifeRnTBrEhH9ge8h/UamQyyyGpAwnskmJ/u9QMgmqZX8mNr738x4cqyoG4v11J0ZfUrh5ypQfRWvWhgidjbEh8bR4MRx+u1tl9cbt2xz7C5r/GIqqtQj3dlWAtlJKVxzvx8G8UE6pN2nJE5NB0Rsdwi93rOwR6nkNeXeBFyQTIkPJofjnJQFedQFvYLTxEBSwZjadydFDko1kl9WCQZjnTgYl1o7SSVWgFd7BKviOEZOx+k/iaquKxFJjGWK5Mqdg43zIgF2gEXcxyEVT4wA2mxpKeiLo9bcWump39iJA7NHoGXrMcrf3lMcy7WpJEf/c9exFt6DeP8Y2p8yUKcGujZ9pzzXY71wcD07hqjJCnVQ60gXc8V3X3Cb6xvxFQXTpm0mSIgmR+A3Zw3TKXWbr4mA3cxxIP6P6Dhu+Lb8y2pqNwJkqRJ61yjOwS+4xz0YtE5n1xvobk1XvD2wYj3vh1+2vVg1Rfi+/j6sT5mbunxMMIfPyLqSLZ4fxYUQOh2Rg0pr7D7oS8SzNN9dcAHRje9lXeBtZIDf8hB5F6WBVoqenyZLjTmVHAjDJJ5vMcmv7rY4cR4B1eEPiiOB1JXnIZwy9L2jVM7GKDg+yvEO/sE3P1e4KZQ3CZPDOQJFbUhEZp0cGyyggw9uQiaQKUYVgi9c9QHFyMdM7l4HtIaYoBwne6mjqIGZ3x6sSYJVSXJlYaVrPpcFFuKCDr8qxVjZN6Gn4+BPzoLKJrwdf5M9yUo4vxvE6x+3CKAhtLeCdHj1sYL9ZybUC6NmR2LqZcZzeriJ4Xi+mob7Bag2oGKyMkBT9j1PqdKLpqEW6wjXwHv/uFFSWguu3ljoRh59hDqsFl2f2eQ8ivYy0g40MyyKs/Si4P5vHBXliwumudoIVBLqMPtpWbUepyqRMhBiJTQCiMDh4C+n4GipGl/YCaRl7+zu11I71xFL+yZWZxetNFtXCeMgNvw3JUAfL8BZITXfsFKYxWg4Eqfo9+X4Jo/VcziWaxwndmxyxxkDdQXAw8A5LgDFy8S+uossB/zBNdS0cLLl4PMYsLj5mU+tynvWtBRcAbZpIgGnZO4srr3zMFB+5pO4h7Nh1J5I+ZQclmhA6az8mGLi6dnXUeuCEvM6zBMW7s1we7XxjPLcqa5XgYxDygIwQSRUMDunRBe22x8ublaSr0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 87eec863-f5b0-438f-32f1-08daafdfc1f2 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2022 01:34:39.4508 (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: DU0P250MB0916 Subject: [FFmpeg-devel] [PATCH 2/6] avcodec/mpegvideo: Make inlining is_mpeg12 more flexible 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: IB0DzBJsDuEC There are two types of checks for whether the current codec is MPEG-1/2 in mpv_reconstruct_mb_internal(): Those that are required for correctness and those that are not; an example of the latter is "is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)". The reason for the existence of such checks is that mpv_reconstruct_mb_internal() has the av_always_inline attribute and is_mpeg12 is usually inlined, so that in case we are dealing with MPEG-1/2 the above check can be completely optimized away. But is_mpeg12 is not always inlined: it is not in case CONFIG_SMALL is true in which case is_mpeg12 is always zero, so that the checks required for correctness need to check out_format explicitly. This is currently done via a macro in mpv_reconstruct_mb_internal(), so that the fact that it is CONFIG_SMALL that determines this is encoded at two places. This commit changes this by making is_mpeg12 a three-state: DEFINITELY_MPEG12, MAY_BE_MPEG12 and NOT_MPEG12. In the second case, one has to resort to check out_format, in the other cases is_mpeg12 can be taken at face-value. This will allow to make inlining is_mpeg12 more flexible in a future commit. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpegvideo.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 448b65bb96..c2fedbfdaa 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1294,6 +1294,10 @@ void ff_clean_intra_table_entries(MpegEncContext *s) s->mbintra_table[xy]= 0; } +#define NOT_MPEG12 0 +#define MAY_BE_MPEG12 1 +#define DEFINITELY_MPEG12 2 + /* generic function called after a macroblock has been parsed by the decoder or after it has been encoded by the encoder. @@ -1309,14 +1313,14 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], int lowres_flag, int is_mpeg12) { #define IS_ENCODER(s) (CONFIG_MPEGVIDEOENC && !lowres_flag && (s)->encoding) -#define IS_MPEG12(s) (CONFIG_SMALL ? ((s)->out_format == FMT_MPEG1) : is_mpeg12) +#define IS_MPEG12(s) (is_mpeg12 == MAY_BE_MPEG12 ? ((s)->out_format == FMT_MPEG1) : is_mpeg12) const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; s->current_picture.qscale_table[mb_xy] = s->qscale; /* update DC predictors for P macroblocks */ if (!s->mb_intra) { - if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) { + if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) { if(s->mbintra_table[mb_xy]) ff_clean_intra_table_entries(s); } else { @@ -1324,8 +1328,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], s->last_dc[1] = s->last_dc[2] = 128 << s->intra_dc_precision; } - } - else if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) + } else if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) s->mbintra_table[mb_xy]=1; if (!IS_ENCODER(s) || (s->avctx->flags & AV_CODEC_FLAG_PSNR) || s->frame_skip_threshold || s->frame_skip_factor || @@ -1399,7 +1402,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], } }else{ op_qpix = s->me.qpel_put; - if ((is_mpeg12 || !s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) { + if ((is_mpeg12 == DEFINITELY_MPEG12 || !s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) { op_pix = s->hdsp.put_pixels_tab; }else{ op_pix = s->hdsp.put_no_rnd_pixels_tab; @@ -1444,7 +1447,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); } } - } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){ + } else if (is_mpeg12 == DEFINITELY_MPEG12 || (s->codec_id != AV_CODEC_ID_WMV2)){ add_dct(s, block[0], 0, dest_y , dct_linesize); add_dct(s, block[1], 1, dest_y + block_size, dct_linesize); add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize); @@ -1477,7 +1480,8 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], } else { /* Only MPEG-4 Simple Studio Profile is supported in > 8-bit mode. TODO: Integrate 10-bit properly into mpegvideo.c so that ER works properly */ - if (!is_mpeg12 && CONFIG_MPEG4_DECODER && /* s->codec_id == AV_CODEC_ID_MPEG4 && */ + if (is_mpeg12 != DEFINITELY_MPEG12 && CONFIG_MPEG4_DECODER && + /* s->codec_id == AV_CODEC_ID_MPEG4 && */ s->avctx->bits_per_raw_sample > 8) { ff_mpeg4_decode_studio(s, dest_y, dest_cb, dest_cr, block_size, uvlinesize, dct_linesize, dct_offset); @@ -1558,12 +1562,16 @@ void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]) #if !CONFIG_SMALL if(s->out_format == FMT_MPEG1) { - if(s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, 1); - else mpv_reconstruct_mb_internal(s, block, 0, 1); - } else + if (s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, DEFINITELY_MPEG12); + else mpv_reconstruct_mb_internal(s, block, 0, DEFINITELY_MPEG12); + } else { + if (s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, NOT_MPEG12); + else mpv_reconstruct_mb_internal(s, block, 0, NOT_MPEG12); + } +#else + if (s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, MAY_BE_MPEG12); + else mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12); #endif - if(s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, 0); - else mpv_reconstruct_mb_internal(s, block, 0, 0); } void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename From patchwork Mon Oct 17 01:34:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38756 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1375804pzb; Sun, 16 Oct 2022 18:35:05 -0700 (PDT) X-Google-Smtp-Source: AMsMyM54+Aq5oOy4JjSmYJ/7d6oT7jm69PDH0kQQmhQgJznf0qemERRNy4jNp7VTjXB+WE4RozG3 X-Received: by 2002:a05:6402:448b:b0:43b:5ec6:8863 with SMTP id er11-20020a056402448b00b0043b5ec68863mr7937266edb.377.1665970505709; Sun, 16 Oct 2022 18:35:05 -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 g5-20020a50d5c5000000b00457f31c1a10si5961986edj.584.2022.10.16.18.35.05; Sun, 16 Oct 2022 18:35:05 -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="gAlfct/H"; 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 2E06F68BC94; Mon, 17 Oct 2022 04:35:03 +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-oln040092074068.outbound.protection.outlook.com [40.92.74.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A48E868BC8B for ; Mon, 17 Oct 2022 04:35:01 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dcLBbuK5fjgtbYLojrNk8r4QF8HmYNQ7ykIHz9JVcrRo5KUwqD8ARm7Dl8DK6bCV1K3rxc1XlBHN+KAnJElht7IQ32LnrGiN6jAywU+T/f4XzpK27G8qK+i3dFgr+ElQF5jsor7whEDV4X2KCSiStShHmuGCh0LRi56ZoynJWfz95dbd2MO2CwQ519pUwbBjBMvc8cTt2KkIOQTETPKC9p/KrHgfuP1t/7fC/I8lsXmqmMS5JyBbXVtmcd/Ldif6kcIXvO2RkK1Y59CrdaqYmia4wwv4jOYgRCyXOLcAAAE8Wi83tM/STpzCn44PcmXRXUIPHZEVjUyYipSNengOnw== 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=Z7OrYCRLSmtlDgnZuEo7nh6O+j7nN3q3b0NGXvuKUzk=; b=ZQROFY8y3dyJvQO4b4DqNn/SjCCaA183HQL9qSqf4DD2yRPF+xCpBQotBzcVBRkoHWqhxQ94wHv+2st1rVCLlIMT2q02tNwLvfMmLPEBsc3NsCOubDlfXHoEs3bOFx4qpvTfASdSALxANt1pHAgqbiQxFcHKrJ/l0nw+qJDGvlBZ++nPQ5t1co5cIkLFXDQ3/JA4Pv/L9lCaLB1ugXWxhKh5MbDiXBnpj0mZXEvvFTDiQbMIAxh4FwEBz0+s3mX3bID2KraPZMbxudtnjSarVl7TIjuj7ZmWQO1d2oXrQdnAzeOUBEhZb3n8/1quxhaKqID6vo/puI21vJR6FePSGg== 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=Z7OrYCRLSmtlDgnZuEo7nh6O+j7nN3q3b0NGXvuKUzk=; b=gAlfct/HUvpS905I3OFZgy3XEtyFGgFpzh/nAMmwwPYm4zlhVE1oX0JVCK6W7ChUJtrsfrqBTitcSGDg6jGQkM6BjreQ+XmtY0To2e/7SlOOr/Lx3IfpkmCx8Z8qhzap8cgs6ISH5DnQ60pW4l6vzIGj4qt+aMteZH02jdQslu2iurMVJm6aFMg/3qEhP37pgPElGH1nDkQ+wWCtSSrxdGEI/X3P5D4TlavfyuCbrSNMfM2umqNNaehfJ7WviffSXsxosZ7wMoG0T4NmkjXHCa9DFS/rmOgsGeSIXH2ky3hIqKlk50ar5YzW1Sl/aauGX1W45eAnc2egEy3u1puEQA== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0916.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ec::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Mon, 17 Oct 2022 01:34:59 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f%2]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 01:34:59 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Oct 2022 03:34:39 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [Tyw6g+Tpi13aI2HYcC4WsX+sw4IrQ6ZujYLUNMYRHUU=] X-ClientProxiedBy: FR3P281CA0056.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20221017013442.944352-2-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0916:EE_ X-MS-Office365-Filtering-Correlation-Id: 73e3c662-a2d4-432f-8853-08daafdfcdc2 X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmriMkceEMr8g00cHUekKy/us0waovk5mOuuLfRBQZurUqJm00fPV6PkuaznKwOHSeRv1aJeakMQxAlPHAnwFBJ7iywMgLsfUsLGlz/Cdwcd3n/pLlcTmZHt76dYOlv2FaeDugI0Z1CHRn7y6Xva3rozjQVh6TczYVq+PQEekgL19S9ogAifmRZHtvQyLn9Prp0mgHdov8cRfgr4mDAh7f2iDvAhJZu9B7BY3ipPYJrmyMT64obA3VmmXHR//+wsWNAJs8ZsFwhjv0Vkk2oOTD2nTg2vNBy4uaK+sLB9vvp6hXHPrNeQl9ZtVvt8Xc6MAWAQVE9oxLhvZs9W00IX6eFzFxZcevzA3N8CwtlLQQj05EThvlX/aZhM7HHJvlaEVfwC7N4V0wKkzC5AMIaby2zR58xD0Sjhtw5y3b6aePZmw9xpH3Dczob7VIhgM4evrnUYwMPTFk7glYXIHSUiLqYCGPgVTMs4+O4Nj7IebYen+Eti4dTlo+xZUDwW3FkWfdd3BITtWj3l8iKVp2xqLxemz0di9Wu73QN55DH5INAQ/N7/EqXI6XDB3Gjb00+f/fCkrdVkabh/NrP1fcycOdnqpaxqxvFs2Ki+voeqDCzvq83RKjfU0kt5jvZVCeNEMUvhA78blA/yQMSeX2YRZZcyDbpMGF7q0cu5hsK5V1ATwaOqAYpI/ebW0FQJRjVRFZ8fGNQySRvAqJppih0N3BdihVHa/Vvu5A3zTBgdFioAoIa0MAZuQhf+icvPWnYC3Es= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FpVoM5Cd7kGfRNKU2fLZlRhVNmPEMsOI6XD+zPN8A2ruU8DgA/kOyND/Q1HqlR0qDwnyqRKiN2m3cxS+Wwcq5H27m+7T78jxZP4n2B26pZw335iZSFIkoBUmLqwulbNYANks6usp9iC3/P6H2DBnSl7vU/iiTs5d124wVfFDgLlPizbJcKKP1V13fXjCsiO4OOlWrKG0e3UZfiY86y3U6Q8TYCkBnLZGYx9jhByAGYw4a+t3cFLO8LfSDx0IN/qkGwsinjcN8iGQpLkMwHPvuJZJkxw93Qn+dP9gOIfhP2JI1HvNgZ5Dfi9Gi7TNDdYcH7bqhcnu8NKLNV2l0zo6EDrgqCiEt+iwKFggWN27DBDd5Y8zw0X0tCpC5KBSsCuv9jbt5eNkN38zUl5kA0xXHoRNmT0RH6pm5YgKQpTcpMOkDEgu3IAmvlha5RaSr6PCZP7KvVLKMWChZcAA6ht+7w+SAzsgPn+aHobqc41q55uqHoJOiFZ00YDRLuZ3K27NIrxhjclcLvPA6CSx6Tmw9ZWXzVLZcH3+aWNJ6702hppBB5qV3d1RLPtw4mheM7TTiOQNmHPO16HPpo7gT5g6tGsApBXugSJkFewVAFzTai+/yYlg8KASKaUgZ/OyJDizRl34AqUljmq/BRPaqIE3g19EO5KWEKiggdLgUoMJeK71B5tQuRf5+NEv2H30WmfQ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 8gyoJIVPtrYgptX94iWEVCciSvWP2LBvzV7yId7KzPVJYxi+Zx84C5AionOmEg3dNvseVca+hI8wZyMAVuy0fVQ1MuBipFJSYk9KQXW+3jSXzTcaDlwhH0T/Vt3E5grEjOnXypPjhsrOOQ2ZDA2uQ4I8+ld0Dlj01NsGgm3meRuG5ZwsxShnwfBGbmTwxeboz/MGWZXQfmUAW1PYwY6Hw4FDJnWYmjJSi9nJbEU+VvcFFDcgUhhet56Y/BORCYuAztsliPFMRwsjsQUeupehNut0p3Mp64Q1Ob3tO7DoHWaEIV40Vfy0s2dh5rKAV2pDdT7rJNcwkW/vLRHVK4LZ8XYPexzjnjrbYmJsrUggrj0jLgEfOxggY7S3tXzDuW6/IiO+04DmfZ3CGuEYxmS1gac+kWtBqqHNJx165JQ5NEvXktdc2U469hd/H/tCR2+WffFTGasoZaJCgIb3ea5XePVlH5MYfgY7BtJL4sHtME/HgKWJ5qKkD0yc0mv8OP7CE9e8rwwYIPzUqnP2jjHacSyiKptVae9fx6PO4de31Nk/l2ejVWB01fAwKEBPWZ5eqVN2wwojyxiHHeQsg1FV/vYZ6PIqY+O6UqFgvgZTs6K8VBSHJZ/Bx2SFO4THRtV2Yd60X3+tgcQSdLdi3BwnMKEZ+pfL0zddjWSfgOM7SGaDaqtti15nqa9gT58MY0QOVQz6gJ92abdQOgb1521QW5miXbbuAKP5e/UyE9yopD6F57rBjop7pgJtWr+35wCAKPUH8xKKDrwbhgeu+n0WAF5iY1O7pkM3YphFpJVo5N47ReMYf7KfUCNAV8l2X8B6IcuhpcJDeddNr9flvpg8I6KV9sY0xVMz0zZO7Axk59Ry4yzCfFnRh45FTG2bjFrGoWF9OHWgVpCYyXVcFOiepcxW6wxXdxL+K5N4WTnCnvACF0QaAzOQBuG4udJLqBFWXpkxZ1AaHDEbFKWVIuCtzbdF7mmjIoYfGAHu7If6cyXHQ3MEL0i+fY1ALEJ3K0dMdyIiPcJqc9WA9/mkNr/KTnKPn4REI1lSu+fspSJUPLkNJlOuIZjIExtgk94aLnms7SSjk7/Bu7TKUsdoOfOt2p2H+K0I4DnA04zP9aUvwCUQ50lY6qYCPYpYX/V1xuyo8zngH7NIpQqejaKs+28PGafpvBYVDMfnbncaKwsbFe8neQm7KaQTVHtjfA0PG85JNx51zMHl6QYOD4BNCO26Y3bsKq6W+aI2L3mRfalGPtziZx/YdHaG+U6CkwOBxkrGTnHZuiqqyg3HfF3BPf03W50w/9m/UTHwmJZPuq0FtXe2XmmdDWGDPuoTAn0zQE9S X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 73e3c662-a2d4-432f-8853-08daafdfcdc2 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2022 01:34:59.2879 (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: DU0P250MB0916 Subject: [FFmpeg-devel] [PATCH 3/6] avcodec/mpegvideo: Inline is_encoder in mpv_reconstruct_mb_internal() 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: I10w3O3MZ0TT Up until now, we inlined lowres_flag as well as is_mpeg12 independently (unless CONFIG_SMALL was true); this commit changes this to instead inline mpv_reconstruct_mb_internal() (at most) four times, namely once for encoders, once for decoders using lowres and once for non-lowres mpeg-1/2 decoders and once for non-lowres non-mpeg-1/2 decoders (mpeg-1/2 is not inlined in case of CONFIG_SMALL). This is neutral performance-wise, but proved beneficial size-wise: It saved 1776B of .text for GCC 11 or 1344B for Clang 14 (both -O3 x64). Notice that inlining is_mpeg12 for is_encoder would not really be beneficial, as the encoder codepath does mostly not depend on is_mpeg12 at all. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpegvideo.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index c2fedbfdaa..43f3ec5a47 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1310,9 +1310,8 @@ void ff_clean_intra_table_entries(MpegEncContext *s) */ static av_always_inline void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], - int lowres_flag, int is_mpeg12) + int lowres_flag, int is_mpeg12, int is_encoder) { -#define IS_ENCODER(s) (CONFIG_MPEGVIDEOENC && !lowres_flag && (s)->encoding) #define IS_MPEG12(s) (is_mpeg12 == MAY_BE_MPEG12 ? ((s)->out_format == FMT_MPEG1) : is_mpeg12) const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; @@ -1331,7 +1330,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], } else if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) s->mbintra_table[mb_xy]=1; - if (!IS_ENCODER(s) || (s->avctx->flags & AV_CODEC_FLAG_PSNR) || s->frame_skip_threshold || s->frame_skip_factor || + if (!is_encoder || (s->avctx->flags & AV_CODEC_FLAG_PSNR) || s->frame_skip_threshold || s->frame_skip_factor || !((s->intra_only || s->pict_type == AV_PICTURE_TYPE_B) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { // FIXME precalc uint8_t *dest_y, *dest_cb, *dest_cr; @@ -1340,12 +1339,12 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], qpel_mc_func (*op_qpix)[16]; const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics const int uvlinesize = s->current_picture.f->linesize[1]; - const int readable = s->pict_type != AV_PICTURE_TYPE_B || IS_ENCODER(s) || s->avctx->draw_horiz_band || lowres_flag; + const int readable = s->pict_type != AV_PICTURE_TYPE_B || is_encoder || s->avctx->draw_horiz_band || lowres_flag; const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8; /* avoid copy if macroblock skipped in last frame too */ /* skip only during decoding as we might trash the buffers during encoding a bit */ - if (!IS_ENCODER(s)) { + if (!is_encoder) { uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy]; if (s->mb_skipped) { @@ -1375,7 +1374,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], if (!s->mb_intra) { /* motion handling */ /* decoding or more than one mb_type (MC was already done otherwise) */ - if (!IS_ENCODER(s)) { + if (!is_encoder) { if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) { if (s->mv_dir & MV_DIR_FORWARD) { @@ -1427,7 +1426,7 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], } /* add dct residue */ - if (IS_ENCODER(s) || !(IS_MPEG12(s) || s->msmpeg4_version + if (is_encoder || !(IS_MPEG12(s) || s->msmpeg4_version || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){ add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); @@ -1480,14 +1479,14 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], } else { /* Only MPEG-4 Simple Studio Profile is supported in > 8-bit mode. TODO: Integrate 10-bit properly into mpegvideo.c so that ER works properly */ - if (is_mpeg12 != DEFINITELY_MPEG12 && CONFIG_MPEG4_DECODER && + if (!is_encoder && is_mpeg12 != DEFINITELY_MPEG12 && CONFIG_MPEG4_DECODER && /* s->codec_id == AV_CODEC_ID_MPEG4 && */ s->avctx->bits_per_raw_sample > 8) { ff_mpeg4_decode_studio(s, dest_y, dest_cb, dest_cr, block_size, uvlinesize, dct_linesize, dct_offset); } /* dct only in intra block */ - else if (IS_ENCODER(s) || !IS_MPEG12(s)) { + else if (is_encoder || !IS_MPEG12(s)) { put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); @@ -1560,18 +1559,19 @@ void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]) } } + if (s->encoding) { + mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12, 1); + } else if (!s->avctx->lowres) { #if !CONFIG_SMALL - if(s->out_format == FMT_MPEG1) { - if (s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, DEFINITELY_MPEG12); - else mpv_reconstruct_mb_internal(s, block, 0, DEFINITELY_MPEG12); - } else { - if (s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, NOT_MPEG12); - else mpv_reconstruct_mb_internal(s, block, 0, NOT_MPEG12); - } + if (s->out_format == FMT_MPEG1) + mpv_reconstruct_mb_internal(s, block, 0, DEFINITELY_MPEG12, 0); + else + mpv_reconstruct_mb_internal(s, block, 0, NOT_MPEG12, 0); #else - if (s->avctx->lowres) mpv_reconstruct_mb_internal(s, block, 1, MAY_BE_MPEG12); - else mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12); + mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12, 0); #endif + } else + mpv_reconstruct_mb_internal(s, block, 1, MAY_BE_MPEG12, 0); } void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename From patchwork Mon Oct 17 01:34:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38757 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1375852pzb; Sun, 16 Oct 2022 18:35:20 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5M2QadlURmX4FBqUvIbhNER6lzZQJuctxSFQSyldP6zJJt6l9eaI0jf4mFydUweTJ4B1b2 X-Received: by 2002:a17:907:3ea9:b0:78d:fdf0:88fe with SMTP id hs41-20020a1709073ea900b0078dfdf088femr7051084ejc.667.1665970519796; Sun, 16 Oct 2022 18:35:19 -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 hs40-20020a1709073ea800b0078df2f22f80si9422925ejc.647.2022.10.16.18.35.19; Sun, 16 Oct 2022 18:35:19 -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=CPskxOkN; 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 4356868BCA6; Mon, 17 Oct 2022 04:35:16 +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-oln040092074017.outbound.protection.outlook.com [40.92.74.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 85F1368BC9B for ; Mon, 17 Oct 2022 04:35:09 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=L2Ih1Z7tPIgyygPWlSNEdIDLugTuZ2UD/HJoBfCUrZB4aAeT+zIhMe4SZRFE+jI3XRLSuBlGSUUoOSQsCsjNfrw5Qu6XLCk7/Ql44L4wPpfL+LuWOkeDlXZIAUcJBvBrdVCvcbrHT91/JdywIr9VBd+lp7mAl18mXqiBCdya9vZJAj9bjmwZVzStvD6qw/idS+IG6N+e673a3UlwS4iQf0EwAliMEhjcaAwDZDeC1Sh2tMH6lAABHhgAQpiBiP16CWYGisuIaUNcnEJbG14heEBgHohRhPhAZLvHrNUHjJMI6sRkr2gYMUROSL5kARscQsldDRs7oEwtW3SGOHvpxw== 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=1oZazUSKme05DuALMHEXr03H65SEnrs+vD2mCV4Nirk=; b=kWQpPxD70oFUtgWVxVNq34u+r1qvkp3PBYsXFOIZ35wPLmZqHnUv4/9fGu/kABVFLlPj/ZpKkuNhaslYb+jMm3kJsaoweGhi3T32D4H4mFAC0V07ll5+bgcQ/IXQjRxWq5D0uPgVgt7HIMIAZ0vbKCgU6Hv0se38+K+svsetejQA6JWONEL3kctbT9AtCFHlfagLpAsdZWs0SeF6cRQlFd4eS5tiOEJeNgFU7zpJx5q2MT4Pgrt/A/W2zJEsVNH1nFzxwAuyI3FI/uRwfcbZEiETTW25hUFgD7dBR1fMxRPMbj0ItEqX+RvAuS0C5ayyefGybmlYL4kvGAXvM82fYw== 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=1oZazUSKme05DuALMHEXr03H65SEnrs+vD2mCV4Nirk=; b=CPskxOkN/pnbZ7yoRD/jtzRs7IifXIiIwpdJ/hHR/192bD076ZoeUYVVXjxKvQ10fmOT/pjNJOVI+Fer+ltNfTU2zSX0/FLYSJ4Qm5lYNQkNc76bzkRkjftIvsRf3LzRCcGdft49ZE70M85dwk2ZXlW4Biuz69rKENtrCST2dfPQuRrcNhSNjslYeJtdsYsdCTKnT/XVl2P9efKxZ3sntlzklYZzF7V13bthzy/iTgrNQPMCU2ysApQSnfkumGQYOeEvGStkh9IyScwdhleYfE6J62u3rV0upnF7N25TmpI2jQwPJCIo71NjT9D8AfUX01QCSgs5Og8ExvBvWL+XHg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0916.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ec::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Mon, 17 Oct 2022 01:35:07 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f%2]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 01:35:07 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Oct 2022 03:34:40 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [DEO2b4aaLu/yg6AjhwtNyRWNjp2+KP/WQ9S9Js+AUT4=] X-ClientProxiedBy: FR3P281CA0056.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20221017013442.944352-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0916:EE_ X-MS-Office365-Filtering-Correlation-Id: 493142e8-241b-48de-0814-08daafdfd264 X-MS-Exchange-SLBlob-MailProps: a+H6FLLcF3qR2HGZMjL0lsxSCb0c35+zDhUpoAmRt2ts1ouapa1XJt8lOJ8AeQle1A5lxGorQhfHVitkX1Nka/YMfEJmkFKhKU+8Xs8hkBaw3dd1XiMyiZeR4Htvnn7Euvql5ALA4E7RqVAKVLj4qtGUxh+hhrpOd4r86vWrVZ3sq59nqfQgTpnUmlDda50X7Z/369OuuvN/x74KZ0FPcnuI5zz90SM+OoUniZBA6EuQpLCGbbcz51+J8Pjcqqnco96n8hBL7hvo++uSs81KBEAm1w9H3CQd0VJ8vHhrcBxZBgpqqWGzNj57YeJQb+KAHf7JMbHpyj1N8QJGr065/BxdlI31J57QZ74slFTxFKrlG9RL30NjMVUjcuLddPQr20u3suCWMMh4Z4wrnapBnhsoq54ISaxziX3kYk82Ckxb6PU6PYsNavmgTzukJpupF2bvgc5NAa5N8SbHAuWZHJT7Pz9Pfz7EAh5rf1whEsSOgEUBjmQ9jrUQ7/NvTv+otG7tdb28eiGDVmROKIIlvtIi8Aw/vlm2QN3Ro3mOG2GT5xuhWDr9csMNIDtkiutFIa4NxSJmvwX3COEVfaSL0eU7YS8PuGl+ta+95/VO3YplJ7rx4v6z7Fsv2l1+wPffoJzKmVfi4ov2FwsRpYdgzB3awntVmnuxtCkpMarPj01MQIaNbRMLaVv1MbBu4ePwyM962d48E6qsE7vS5jcPPdzIFitQr0358i2cpeX5ZWrPQ6133aCaqw2kaiPBbOZ5tGzjc7/SXA+1njsr3nbAghTEh1hAq2azoYA1877Ddb0jo6Gjf/G91v9sZi2H16db X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 7WWuXv4cqXk0/n6ijCBQGRd23ttRcu07el2OFQmiEcFXmlbu878niCe1LmhCNPydKnitQ67TfNA1TJrl8S9wgT5HYASkI6+L9vpwgiolNwdd33+ZWYTjcNQSt8N+zmgc2G40sjkZGA2wj3ORfiRrtE0ZPOdhZXjyttIdCCPuKT9TYAH89HvJTC6go5DQhOR4NFnAqKr6X+0bCcVqglYRDhYX3i9fOb61icgBFqn97AJ0Aa4wBg8m6SRS3XGciSgLl0e9td+uIO6p0UBJ8zZYHhju69CeVzd1FB6O0pWksxL66O829ekHNMjvZP21eh3wwlBGoNOSXDk8OKr40rJQmwzjjZDRvjZT54p6oUDH+c+3iaH66TUnsuqPPmLGS8NtDbDO7uDKzFi7wjsrxzcXqEyVqXwy3MjWmimO8MyVq+lbp52F6bkXQ7Vipy3aMzjTZ/TZcXXUnDP4iltoRJD3c5QtaOHBsjJIgmJ6QJix9kLe79D/d3tFPBD1vAAMjrI4jNk9gjirzwiv1eNVKyOMQa+1alvwKzELFlU9FvAjAkdoQWgSfxgNHwTSc587bw1X0A5JDe/jE4WPaWBAM3hNNrgWc6xD3vtCIVh7Va6TjfEsAJUHohmh7BrS/OS6qSNXCZ4N8/lVcMiDVe8wQbot6Jv3rhHE9UHQxca65+xJG7ifeFeAaGCID50q8mDjMO8Y X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: BllAkG+Apw0IhIeJJHP7vw1sUfzX5cE0ST9FXg+ZMU6QtaqHOX7ahqn9wXr3WIK5tMgePD3Egs5GQn3RHSh07Ip8qOPZMvi+RNOGWZcOjDaKXZowv/S7Kn+UmwleIP0WipCDOHwyD8zAJai0z//mrqN5MSpYHwIcNuR3XwRv9mm/f5/JYLGe8CretLnFyO9r1d5fBeFJ3D9G18QxX2i1PaW5fz+17WOBniD6TEq1H+7uu8kbpwQBT3VL7PO1dmAb57EzIxjcqcP6OWcMc6i60txDB7vohb68JpvQSUkRf1rHPU9AxaGleOKX0ubvFRp1CPvkxLHuDxFvTcCOoLe0S9UNJEtI0i3KHF6W1XFBh8korubvAipvC7H9sPTvIrJjDnSbfvAHnHAZBzETDTADRuQt919/abbWVINR+FJmx+TY6gT/7X6i8xxKm7LJ+CDkVuYkBLlw+XM+t/hSkUp9W+Mwdu1mUEy7bNCry2Y7RV0XntylPxYUKi9DuHvg4KhWCLy+MVw4L5tRRshuzSRAAlNwCK8x1dCr7Wg9f4UJl+ELXlY7i6Kgq//ItLKiWXNqXFjybZH65+ZjSHGVcR0yxybZJWMeYLLNYFITD8MNLmMXN0n+VtdLmJGLzos0kXmGeCZOitzWPXIYdeTAT9IhB4M18kW14MUXDPftshZVR2v2imBnq0u0TBFPVzKkjMU9kknR6VCZHJL+fMb59oilGODImmQPxVowH6x0nvCSYYM2/xoVjbcLURRKGl1nywBL/ybJVd3vWhGwURmC8C2eN4QU/VX4DvwPRADq5ZfCKPY0sE8JTtL35Ahxpqh2KiT70lHeyTiWIex+bCWock/g7HqmygNULtC3GxlQEAueOF2LLep45kLtnVOKNw8LqXVcAf3+gsJ1YFoMBFKWbnd3mKJbuNRT6TK6xrRsZMl7ZkNDYxokcLkQmtZko39kCDzgNlMQNMlyjFkJJJSXy7gYW+My/ip88qxKHgTmMPPjw/6G7ojfiH1TFMHaNfczIszAbRBXxvIyRIA2YlVOl5DsLAxmnYBZT8iPbCfW+1IcE2pctAblstAA1s8HBXuPDe3sQZeO0sjDcSq041/uAftIb7q0HCU9AD7VebR6fB3rTqTopoTqafA/kRSIITzLaG/TH6j1QZ7YjvspwNnTnV8g1xe7VSxuqhdwB6ECQk4X65UV3X5hpySiRssLpKUk2TtnGWBOni4aavEiFESiSi8k1/JbzKWNsvg/9N5cLPw3Y9IMFJPV50Pp/Qa+StThzJIrr/eAfF3ppSs1DY18avnMTG+8jhWzyIzyWMcL5bxca7j4rXEeE7mKoSKhy4OWcIC3 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 493142e8-241b-48de-0814-08daafdfd264 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2022 01:35:07.1329 (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: DU0P250MB0916 Subject: [FFmpeg-devel] [PATCH 4/6] avcodec/mpegvideo: Split ff_mpv_reconstruct_mb() into de/encoder part 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: IJxQE62qvcr4 This has the advantage of not having to check for whether a given MpegEncContext is actually a decoder or an encoder context at runtime. To do so, mpv_reconstruct_mb_internal() is moved into a new template file that is included by both mpegvideo_enc.c and mpegvideo_dec.c; the decoder-only code (mainly lowres) are also moved to mpegvideo_dec.c. The is_encoder checks are changed to #if IS_ENCODER in order to avoid having to include headers for decoder-only functions in mpegvideo_enc.c. This approach also has the advantage that it is easy to adapt mpv_reconstruct_mb_internal() to using different structures for decoders and encoders (e.g. the check for whether a macroblock should be processed for the encoder or not uses MpegEncContext elements that make no sense for decoders and should not be part of their context). Signed-off-by: Andreas Rheinhardt --- libavcodec/mpeg_er.c | 1 + libavcodec/mpegvideo.c | 737 ----------------------- libavcodec/mpegvideo.h | 2 - libavcodec/mpegvideo_dec.c | 467 ++++++++++++++ libavcodec/mpegvideo_enc.c | 26 +- libavcodec/mpegvideodec.h | 1 + libavcodec/mpv_reconstruct_mb_template.c | 300 +++++++++ 7 files changed, 792 insertions(+), 742 deletions(-) create mode 100644 libavcodec/mpv_reconstruct_mb_template.c diff --git a/libavcodec/mpeg_er.c b/libavcodec/mpeg_er.c index 02f407d8ea..8034963253 100644 --- a/libavcodec/mpeg_er.c +++ b/libavcodec/mpeg_er.c @@ -18,6 +18,7 @@ #include "error_resilience.h" #include "mpegvideo.h" +#include "mpegvideodec.h" #include "mpeg_er.h" static void set_erpic(ERPicture *dst, Picture *src) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 43f3ec5a47..850d8f2e94 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -27,8 +27,6 @@ * The simplest mpeg encoder (well, it was the simplest!). */ -#include "config_components.h" - #include "libavutil/attributes.h" #include "libavutil/avassert.h" #include "libavutil/imgutils.h" @@ -42,12 +40,7 @@ #include "mpeg_er.h" #include "mpegutils.h" #include "mpegvideo.h" -#include "mpeg4videodec.h" #include "mpegvideodata.h" -#include "qpeldsp.h" -#include "threadframe.h" -#include "wmv2dec.h" -#include static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, int16_t *block, int n, int qscale) @@ -811,456 +804,6 @@ void ff_mpv_common_end(MpegEncContext *s) } -static inline int hpel_motion_lowres(MpegEncContext *s, - uint8_t *dest, const uint8_t *src, - int field_based, int field_select, - int src_x, int src_y, - int width, int height, ptrdiff_t stride, - int h_edge_pos, int v_edge_pos, - int w, int h, const h264_chroma_mc_func *pix_op, - int motion_x, int motion_y) -{ - const int lowres = s->avctx->lowres; - const int op_index = FFMIN(lowres, 3); - const int s_mask = (2 << lowres) - 1; - int emu = 0; - int sx, sy; - - if (s->quarter_sample) { - motion_x /= 2; - motion_y /= 2; - } - - sx = motion_x & s_mask; - sy = motion_y & s_mask; - src_x += motion_x >> lowres + 1; - src_y += motion_y >> lowres + 1; - - src += src_y * stride + src_x; - - if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) || - (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, src, - s->linesize, s->linesize, - w + 1, (h + 1) << field_based, - src_x, src_y * (1 << field_based), - h_edge_pos, v_edge_pos); - src = s->sc.edge_emu_buffer; - emu = 1; - } - - sx = (sx << 2) >> lowres; - sy = (sy << 2) >> lowres; - if (field_select) - src += s->linesize; - pix_op[op_index](dest, src, stride, h, sx, sy); - return emu; -} - -/* apply one mpeg motion vector to the three components */ -static av_always_inline void mpeg_motion_lowres(MpegEncContext *s, - uint8_t *dest_y, - uint8_t *dest_cb, - uint8_t *dest_cr, - int field_based, - int bottom_field, - int field_select, - uint8_t *const *ref_picture, - const h264_chroma_mc_func *pix_op, - int motion_x, int motion_y, - int h, int mb_y) -{ - const uint8_t *ptr_y, *ptr_cb, *ptr_cr; - int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, sx, sy, uvsx, uvsy; - ptrdiff_t uvlinesize, linesize; - const int lowres = s->avctx->lowres; - const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 3); - const int block_s = 8>>lowres; - const int s_mask = (2 << lowres) - 1; - const int h_edge_pos = s->h_edge_pos >> lowres; - const int v_edge_pos = s->v_edge_pos >> lowres; - linesize = s->current_picture.f->linesize[0] << field_based; - uvlinesize = s->current_picture.f->linesize[1] << field_based; - - // FIXME obviously not perfect but qpel will not work in lowres anyway - if (s->quarter_sample) { - motion_x /= 2; - motion_y /= 2; - } - - if(field_based){ - motion_y += (bottom_field - field_select)*((1 << lowres)-1); - } - - sx = motion_x & s_mask; - sy = motion_y & s_mask; - src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1); - src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1); - - if (s->out_format == FMT_H263) { - uvsx = ((motion_x >> 1) & s_mask) | (sx & 1); - uvsy = ((motion_y >> 1) & s_mask) | (sy & 1); - uvsrc_x = src_x >> 1; - uvsrc_y = src_y >> 1; - } else if (s->out_format == FMT_H261) { - // even chroma mv's are full pel in H261 - mx = motion_x / 4; - my = motion_y / 4; - uvsx = (2 * mx) & s_mask; - uvsy = (2 * my) & s_mask; - uvsrc_x = s->mb_x * block_s + (mx >> lowres); - uvsrc_y = mb_y * block_s + (my >> lowres); - } else { - if(s->chroma_y_shift){ - mx = motion_x / 2; - my = motion_y / 2; - uvsx = mx & s_mask; - uvsy = my & s_mask; - uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1); - uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1); - } else { - if(s->chroma_x_shift){ - //Chroma422 - mx = motion_x / 2; - uvsx = mx & s_mask; - uvsy = motion_y & s_mask; - uvsrc_y = src_y; - uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1)); - } else { - //Chroma444 - uvsx = motion_x & s_mask; - uvsy = motion_y & s_mask; - uvsrc_x = src_x; - uvsrc_y = src_y; - } - } - } - - ptr_y = ref_picture[0] + src_y * linesize + src_x; - ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x; - ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x; - - if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) || uvsrc_y<0 || - (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr_y, - linesize >> field_based, linesize >> field_based, - 17, 17 + field_based, - src_x, src_y * (1 << field_based), h_edge_pos, - v_edge_pos); - ptr_y = s->sc.edge_emu_buffer; - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - uint8_t *ubuf = s->sc.edge_emu_buffer + 18 * s->linesize; - uint8_t *vbuf =ubuf + 10 * s->uvlinesize; - if (s->workaround_bugs & FF_BUG_IEDGE) - vbuf -= s->uvlinesize; - s->vdsp.emulated_edge_mc(ubuf, ptr_cb, - uvlinesize >> field_based, uvlinesize >> field_based, - 9, 9 + field_based, - uvsrc_x, uvsrc_y * (1 << field_based), - h_edge_pos >> 1, v_edge_pos >> 1); - s->vdsp.emulated_edge_mc(vbuf, ptr_cr, - uvlinesize >> field_based,uvlinesize >> field_based, - 9, 9 + field_based, - uvsrc_x, uvsrc_y * (1 << field_based), - h_edge_pos >> 1, v_edge_pos >> 1); - ptr_cb = ubuf; - ptr_cr = vbuf; - } - } - - // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f->data - if (bottom_field) { - dest_y += s->linesize; - dest_cb += s->uvlinesize; - dest_cr += s->uvlinesize; - } - - if (field_select) { - ptr_y += s->linesize; - ptr_cb += s->uvlinesize; - ptr_cr += s->uvlinesize; - } - - sx = (sx << 2) >> lowres; - sy = (sy << 2) >> lowres; - pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy); - - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - int hc = s->chroma_y_shift ? (h+1-bottom_field)>>1 : h; - uvsx = (uvsx << 2) >> lowres; - uvsy = (uvsy << 2) >> lowres; - if (hc) { - pix_op[op_index](dest_cb, ptr_cb, uvlinesize, hc, uvsx, uvsy); - pix_op[op_index](dest_cr, ptr_cr, uvlinesize, hc, uvsx, uvsy); - } - } - // FIXME h261 lowres loop filter -} - -static inline void chroma_4mv_motion_lowres(MpegEncContext *s, - uint8_t *dest_cb, uint8_t *dest_cr, - uint8_t *const *ref_picture, - const h264_chroma_mc_func * pix_op, - int mx, int my) -{ - const int lowres = s->avctx->lowres; - const int op_index = FFMIN(lowres, 3); - const int block_s = 8 >> lowres; - const int s_mask = (2 << lowres) - 1; - const int h_edge_pos = s->h_edge_pos >> lowres + 1; - const int v_edge_pos = s->v_edge_pos >> lowres + 1; - int emu = 0, src_x, src_y, sx, sy; - ptrdiff_t offset; - const uint8_t *ptr; - - if (s->quarter_sample) { - mx /= 2; - my /= 2; - } - - /* In case of 8X8, we construct a single chroma motion vector - with a special rounding */ - mx = ff_h263_round_chroma(mx); - my = ff_h263_round_chroma(my); - - sx = mx & s_mask; - sy = my & s_mask; - src_x = s->mb_x * block_s + (mx >> lowres + 1); - src_y = s->mb_y * block_s + (my >> lowres + 1); - - offset = src_y * s->uvlinesize + src_x; - ptr = ref_picture[1] + offset; - if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) || - (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, - s->uvlinesize, s->uvlinesize, - 9, 9, - src_x, src_y, h_edge_pos, v_edge_pos); - ptr = s->sc.edge_emu_buffer; - emu = 1; - } - sx = (sx << 2) >> lowres; - sy = (sy << 2) >> lowres; - pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy); - - ptr = ref_picture[2] + offset; - if (emu) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, - s->uvlinesize, s->uvlinesize, - 9, 9, - src_x, src_y, h_edge_pos, v_edge_pos); - ptr = s->sc.edge_emu_buffer; - } - pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy); -} - -/** - * motion compensation of a single macroblock - * @param s context - * @param dest_y luma destination pointer - * @param dest_cb chroma cb/u destination pointer - * @param dest_cr chroma cr/v destination pointer - * @param dir direction (0->forward, 1->backward) - * @param ref_picture array[3] of pointers to the 3 planes of the reference picture - * @param pix_op halfpel motion compensation function (average or put normally) - * the motion vectors are taken from s->mv and the MV type from s->mv_type - */ -static inline void MPV_motion_lowres(MpegEncContext *s, - uint8_t *dest_y, uint8_t *dest_cb, - uint8_t *dest_cr, - int dir, uint8_t *const *ref_picture, - const h264_chroma_mc_func *pix_op) -{ - int mx, my; - int mb_x, mb_y, i; - const int lowres = s->avctx->lowres; - const int block_s = 8 >>lowres; - - mb_x = s->mb_x; - mb_y = s->mb_y; - - switch (s->mv_type) { - case MV_TYPE_16X16: - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 0, 0, 0, - ref_picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], - 2 * block_s, mb_y); - break; - case MV_TYPE_8X8: - mx = 0; - my = 0; - for (i = 0; i < 4; i++) { - hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * - s->linesize) * block_s, - ref_picture[0], 0, 0, - (2 * mb_x + (i & 1)) * block_s, - (2 * mb_y + (i >> 1)) * block_s, - s->width, s->height, s->linesize, - s->h_edge_pos >> lowres, s->v_edge_pos >> lowres, - block_s, block_s, pix_op, - s->mv[dir][i][0], s->mv[dir][i][1]); - - mx += s->mv[dir][i][0]; - my += s->mv[dir][i][1]; - } - - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) - chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, - pix_op, mx, my); - break; - case MV_TYPE_FIELD: - if (s->picture_structure == PICT_FRAME) { - /* top field */ - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 1, 0, s->field_select[dir][0], - ref_picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], - block_s, mb_y); - /* bottom field */ - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 1, 1, s->field_select[dir][1], - ref_picture, pix_op, - s->mv[dir][1][0], s->mv[dir][1][1], - block_s, mb_y); - } else { - if (s->picture_structure != s->field_select[dir][0] + 1 && - s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) { - ref_picture = s->current_picture_ptr->f->data; - - } - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 0, 0, s->field_select[dir][0], - ref_picture, pix_op, - s->mv[dir][0][0], - s->mv[dir][0][1], 2 * block_s, mb_y >> 1); - } - break; - case MV_TYPE_16X8: - for (i = 0; i < 2; i++) { - uint8_t *const *ref2picture; - - if (s->picture_structure == s->field_select[dir][i] + 1 || - s->pict_type == AV_PICTURE_TYPE_B || s->first_field) { - ref2picture = ref_picture; - } else { - ref2picture = s->current_picture_ptr->f->data; - } - - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 0, 0, s->field_select[dir][i], - ref2picture, pix_op, - s->mv[dir][i][0], s->mv[dir][i][1] + - 2 * block_s * i, block_s, mb_y >> 1); - - dest_y += 2 * block_s * s->linesize; - dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize; - dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize; - } - break; - case MV_TYPE_DMV: - if (s->picture_structure == PICT_FRAME) { - for (i = 0; i < 2; i++) { - int j; - for (j = 0; j < 2; j++) { - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 1, j, j ^ i, - ref_picture, pix_op, - s->mv[dir][2 * i + j][0], - s->mv[dir][2 * i + j][1], - block_s, mb_y); - } - pix_op = s->h264chroma.avg_h264_chroma_pixels_tab; - } - } else { - for (i = 0; i < 2; i++) { - mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, - 0, 0, s->picture_structure != i + 1, - ref_picture, pix_op, - s->mv[dir][2 * i][0],s->mv[dir][2 * i][1], - 2 * block_s, mb_y >> 1); - - // after put we make avg of the same block - pix_op = s->h264chroma.avg_h264_chroma_pixels_tab; - - // opposite parity is always in the same - // frame if this is second field - if (!s->first_field) { - ref_picture = s->current_picture_ptr->f->data; - } - } - } - break; - default: - av_assert2(0); - } -} - -/** - * find the lowest MB row referenced in the MVs - */ -static int lowest_referenced_row(MpegEncContext *s, int dir) -{ - int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample; - int my, off, i, mvs; - - if (s->picture_structure != PICT_FRAME || s->mcsel) - goto unhandled; - - switch (s->mv_type) { - case MV_TYPE_16X16: - mvs = 1; - break; - case MV_TYPE_16X8: - mvs = 2; - break; - case MV_TYPE_8X8: - mvs = 4; - break; - default: - goto unhandled; - } - - for (i = 0; i < mvs; i++) { - my = s->mv[dir][i][1]; - my_max = FFMAX(my_max, my); - my_min = FFMIN(my_min, my); - } - - off = ((FFMAX(-my_min, my_max)<> 6; - - return av_clip(s->mb_y + off, 0, s->mb_height - 1); -unhandled: - return s->mb_height-1; -} - -/* put block[] to dest[] */ -static inline void put_dct(MpegEncContext *s, - int16_t *block, int i, uint8_t *dest, int line_size, int qscale) -{ - s->dct_unquantize_intra(s, block, i, qscale); - s->idsp.idct_put(dest, line_size, block); -} - -/* add block[] to dest[] */ -static inline void add_dct(MpegEncContext *s, - int16_t *block, int i, uint8_t *dest, int line_size) -{ - if (s->block_last_index[i] >= 0) { - s->idsp.idct_add(dest, line_size, block); - } -} - -static inline void add_dequant_dct(MpegEncContext *s, - int16_t *block, int i, uint8_t *dest, int line_size, int qscale) -{ - if (s->block_last_index[i] >= 0) { - s->dct_unquantize_inter(s, block, i, qscale); - - s->idsp.idct_add(dest, line_size, block); - } -} - /** * Clean dc, ac, coded_block for the current non-intra MB. */ @@ -1294,286 +837,6 @@ void ff_clean_intra_table_entries(MpegEncContext *s) s->mbintra_table[xy]= 0; } -#define NOT_MPEG12 0 -#define MAY_BE_MPEG12 1 -#define DEFINITELY_MPEG12 2 - -/* generic function called after a macroblock has been parsed by the - decoder or after it has been encoded by the encoder. - - Important variables used: - s->mb_intra : true if intra macroblock - s->mv_dir : motion vector direction - s->mv_type : motion vector type - s->mv : motion vector - s->interlaced_dct : true if interlaced dct used (mpeg2) - */ -static av_always_inline -void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], - int lowres_flag, int is_mpeg12, int is_encoder) -{ -#define IS_MPEG12(s) (is_mpeg12 == MAY_BE_MPEG12 ? ((s)->out_format == FMT_MPEG1) : is_mpeg12) - const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; - - s->current_picture.qscale_table[mb_xy] = s->qscale; - - /* update DC predictors for P macroblocks */ - if (!s->mb_intra) { - if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) { - if(s->mbintra_table[mb_xy]) - ff_clean_intra_table_entries(s); - } else { - s->last_dc[0] = - s->last_dc[1] = - s->last_dc[2] = 128 << s->intra_dc_precision; - } - } else if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) - s->mbintra_table[mb_xy]=1; - - if (!is_encoder || (s->avctx->flags & AV_CODEC_FLAG_PSNR) || s->frame_skip_threshold || s->frame_skip_factor || - !((s->intra_only || s->pict_type == AV_PICTURE_TYPE_B) && - s->avctx->mb_decision != FF_MB_DECISION_RD)) { // FIXME precalc - uint8_t *dest_y, *dest_cb, *dest_cr; - int dct_linesize, dct_offset; - op_pixels_func (*op_pix)[4]; - qpel_mc_func (*op_qpix)[16]; - const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics - const int uvlinesize = s->current_picture.f->linesize[1]; - const int readable = s->pict_type != AV_PICTURE_TYPE_B || is_encoder || s->avctx->draw_horiz_band || lowres_flag; - const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8; - - /* avoid copy if macroblock skipped in last frame too */ - /* skip only during decoding as we might trash the buffers during encoding a bit */ - if (!is_encoder) { - uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy]; - - if (s->mb_skipped) { - s->mb_skipped= 0; - av_assert2(s->pict_type!=AV_PICTURE_TYPE_I); - *mbskip_ptr = 1; - } else if(!s->current_picture.reference) { - *mbskip_ptr = 1; - } else{ - *mbskip_ptr = 0; /* not skipped */ - } - } - - dct_linesize = linesize << s->interlaced_dct; - dct_offset = s->interlaced_dct ? linesize : linesize * block_size; - - if(readable){ - dest_y= s->dest[0]; - dest_cb= s->dest[1]; - dest_cr= s->dest[2]; - }else{ - dest_y = s->sc.b_scratchpad; - dest_cb= s->sc.b_scratchpad+16*linesize; - dest_cr= s->sc.b_scratchpad+32*linesize; - } - - if (!s->mb_intra) { - /* motion handling */ - /* decoding or more than one mb_type (MC was already done otherwise) */ - if (!is_encoder) { - - if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) { - if (s->mv_dir & MV_DIR_FORWARD) { - ff_thread_await_progress(&s->last_picture_ptr->tf, - lowest_referenced_row(s, 0), - 0); - } - if (s->mv_dir & MV_DIR_BACKWARD) { - ff_thread_await_progress(&s->next_picture_ptr->tf, - lowest_referenced_row(s, 1), - 0); - } - } - - if(lowres_flag){ - const h264_chroma_mc_func *op_pix = s->h264chroma.put_h264_chroma_pixels_tab; - - if (s->mv_dir & MV_DIR_FORWARD) { - MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix); - op_pix = s->h264chroma.avg_h264_chroma_pixels_tab; - } - if (s->mv_dir & MV_DIR_BACKWARD) { - MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix); - } - }else{ - op_qpix = s->me.qpel_put; - if ((is_mpeg12 == DEFINITELY_MPEG12 || !s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) { - op_pix = s->hdsp.put_pixels_tab; - }else{ - op_pix = s->hdsp.put_no_rnd_pixels_tab; - } - if (s->mv_dir & MV_DIR_FORWARD) { - ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix, op_qpix); - op_pix = s->hdsp.avg_pixels_tab; - op_qpix= s->me.qpel_avg; - } - if (s->mv_dir & MV_DIR_BACKWARD) { - ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix, op_qpix); - } - } - - /* skip dequant / idct if we are really late ;) */ - if(s->avctx->skip_idct){ - if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) - ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) - || s->avctx->skip_idct >= AVDISCARD_ALL) - goto skip_idct; - } - } - - /* add dct residue */ - if (is_encoder || !(IS_MPEG12(s) || s->msmpeg4_version - || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){ - add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); - add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); - add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); - add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); - - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - if (s->chroma_y_shift){ - add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); - add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); - }else{ - dct_linesize >>= 1; - dct_offset >>=1; - add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale); - add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale); - add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale); - add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); - } - } - } else if (is_mpeg12 == DEFINITELY_MPEG12 || (s->codec_id != AV_CODEC_ID_WMV2)){ - add_dct(s, block[0], 0, dest_y , dct_linesize); - add_dct(s, block[1], 1, dest_y + block_size, dct_linesize); - add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize); - add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize); - - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - if(s->chroma_y_shift){//Chroma420 - add_dct(s, block[4], 4, dest_cb, uvlinesize); - add_dct(s, block[5], 5, dest_cr, uvlinesize); - }else{ - //chroma422 - dct_linesize = uvlinesize << s->interlaced_dct; - dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size; - - add_dct(s, block[4], 4, dest_cb, dct_linesize); - add_dct(s, block[5], 5, dest_cr, dct_linesize); - add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize); - add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize); - if(!s->chroma_x_shift){//Chroma444 - add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize); - add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize); - add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize); - add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize); - } - } - }//fi gray - } else if (CONFIG_WMV2_DECODER) { - ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr); - } - } else { - /* Only MPEG-4 Simple Studio Profile is supported in > 8-bit mode. - TODO: Integrate 10-bit properly into mpegvideo.c so that ER works properly */ - if (!is_encoder && is_mpeg12 != DEFINITELY_MPEG12 && CONFIG_MPEG4_DECODER && - /* s->codec_id == AV_CODEC_ID_MPEG4 && */ - s->avctx->bits_per_raw_sample > 8) { - ff_mpeg4_decode_studio(s, dest_y, dest_cb, dest_cr, block_size, - uvlinesize, dct_linesize, dct_offset); - } - /* dct only in intra block */ - else if (is_encoder || !IS_MPEG12(s)) { - put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); - put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); - put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); - put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); - - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - if(s->chroma_y_shift){ - put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); - put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); - }else{ - dct_offset >>=1; - dct_linesize >>=1; - put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale); - put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale); - put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale); - put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); - } - } - }else{ - s->idsp.idct_put(dest_y, dct_linesize, block[0]); - s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]); - s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]); - s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]); - - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - if(s->chroma_y_shift){ - s->idsp.idct_put(dest_cb, uvlinesize, block[4]); - s->idsp.idct_put(dest_cr, uvlinesize, block[5]); - }else{ - - dct_linesize = uvlinesize << s->interlaced_dct; - dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size; - - s->idsp.idct_put(dest_cb, dct_linesize, block[4]); - s->idsp.idct_put(dest_cr, dct_linesize, block[5]); - s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]); - s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]); - if(!s->chroma_x_shift){//Chroma444 - s->idsp.idct_put(dest_cb + block_size, dct_linesize, block[8]); - s->idsp.idct_put(dest_cr + block_size, dct_linesize, block[9]); - s->idsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]); - s->idsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]); - } - } - }//gray - } - } -skip_idct: - if(!readable){ - s->hdsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16); - if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { - s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift); - s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift); - } - } - } -} - -void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]) -{ - if (s->avctx->debug & FF_DEBUG_DCT_COEFF) { - /* print DCT coefficients */ - av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y); - for (int i = 0; i < 6; i++) { - for (int j = 0; j < 64; j++) { - av_log(s->avctx, AV_LOG_DEBUG, "%5d", - block[i][s->idsp.idct_permutation[j]]); - } - av_log(s->avctx, AV_LOG_DEBUG, "\n"); - } - } - - if (s->encoding) { - mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12, 1); - } else if (!s->avctx->lowres) { -#if !CONFIG_SMALL - if (s->out_format == FMT_MPEG1) - mpv_reconstruct_mb_internal(s, block, 0, DEFINITELY_MPEG12, 0); - else - mpv_reconstruct_mb_internal(s, block, 0, NOT_MPEG12, 0); -#else - mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12, 0); -#endif - } else - mpv_reconstruct_mb_internal(s, block, 1, MAY_BE_MPEG12, 0); -} - void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics const int uvlinesize = s->current_picture.f->linesize[1]; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 1ddf8034aa..6e458b0379 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -582,8 +582,6 @@ void ff_mpv_free_context_frame(MpegEncContext *s); void ff_mpv_common_end(MpegEncContext *s); -void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]); - void ff_clean_intra_table_entries(MpegEncContext *s); int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src); diff --git a/libavcodec/mpegvideo_dec.c b/libavcodec/mpegvideo_dec.c index 6d1edc027a..c2d6d8bdd7 100644 --- a/libavcodec/mpegvideo_dec.c +++ b/libavcodec/mpegvideo_dec.c @@ -22,17 +22,22 @@ #include +#include "config_components.h" + #include "libavutil/avassert.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" #include "libavutil/video_enc_params.h" #include "avcodec.h" +#include "h264chroma.h" #include "internal.h" #include "mpegutils.h" #include "mpegvideo.h" #include "mpegvideodec.h" +#include "mpeg4videodec.h" #include "threadframe.h" +#include "wmv2dec.h" void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx) { @@ -563,3 +568,465 @@ void ff_mpv_report_decode_progress(MpegEncContext *s) if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->er.error_occurred) ff_thread_report_progress(&s->current_picture_ptr->tf, s->mb_y, 0); } + + +static inline int hpel_motion_lowres(MpegEncContext *s, + uint8_t *dest, const uint8_t *src, + int field_based, int field_select, + int src_x, int src_y, + int width, int height, ptrdiff_t stride, + int h_edge_pos, int v_edge_pos, + int w, int h, const h264_chroma_mc_func *pix_op, + int motion_x, int motion_y) +{ + const int lowres = s->avctx->lowres; + const int op_index = FFMIN(lowres, 3); + const int s_mask = (2 << lowres) - 1; + int emu = 0; + int sx, sy; + + if (s->quarter_sample) { + motion_x /= 2; + motion_y /= 2; + } + + sx = motion_x & s_mask; + sy = motion_y & s_mask; + src_x += motion_x >> lowres + 1; + src_y += motion_y >> lowres + 1; + + src += src_y * stride + src_x; + + if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) || + (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, src, + s->linesize, s->linesize, + w + 1, (h + 1) << field_based, + src_x, src_y * (1 << field_based), + h_edge_pos, v_edge_pos); + src = s->sc.edge_emu_buffer; + emu = 1; + } + + sx = (sx << 2) >> lowres; + sy = (sy << 2) >> lowres; + if (field_select) + src += s->linesize; + pix_op[op_index](dest, src, stride, h, sx, sy); + return emu; +} + +/* apply one mpeg motion vector to the three components */ +static av_always_inline void mpeg_motion_lowres(MpegEncContext *s, + uint8_t *dest_y, + uint8_t *dest_cb, + uint8_t *dest_cr, + int field_based, + int bottom_field, + int field_select, + uint8_t *const *ref_picture, + const h264_chroma_mc_func *pix_op, + int motion_x, int motion_y, + int h, int mb_y) +{ + const uint8_t *ptr_y, *ptr_cb, *ptr_cr; + int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, sx, sy, uvsx, uvsy; + ptrdiff_t uvlinesize, linesize; + const int lowres = s->avctx->lowres; + const int op_index = FFMIN(lowres - 1 + s->chroma_x_shift, 3); + const int block_s = 8 >> lowres; + const int s_mask = (2 << lowres) - 1; + const int h_edge_pos = s->h_edge_pos >> lowres; + const int v_edge_pos = s->v_edge_pos >> lowres; + linesize = s->current_picture.f->linesize[0] << field_based; + uvlinesize = s->current_picture.f->linesize[1] << field_based; + + // FIXME obviously not perfect but qpel will not work in lowres anyway + if (s->quarter_sample) { + motion_x /= 2; + motion_y /= 2; + } + + if (field_based) { + motion_y += (bottom_field - field_select)*((1 << lowres)-1); + } + + sx = motion_x & s_mask; + sy = motion_y & s_mask; + src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1); + src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1); + + if (s->out_format == FMT_H263) { + uvsx = ((motion_x >> 1) & s_mask) | (sx & 1); + uvsy = ((motion_y >> 1) & s_mask) | (sy & 1); + uvsrc_x = src_x >> 1; + uvsrc_y = src_y >> 1; + } else if (s->out_format == FMT_H261) { + // even chroma mv's are full pel in H261 + mx = motion_x / 4; + my = motion_y / 4; + uvsx = (2 * mx) & s_mask; + uvsy = (2 * my) & s_mask; + uvsrc_x = s->mb_x * block_s + (mx >> lowres); + uvsrc_y = mb_y * block_s + (my >> lowres); + } else { + if (s->chroma_y_shift) { + mx = motion_x / 2; + my = motion_y / 2; + uvsx = mx & s_mask; + uvsy = my & s_mask; + uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1); + uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1); + } else { + if (s->chroma_x_shift) { + //Chroma422 + mx = motion_x / 2; + uvsx = mx & s_mask; + uvsy = motion_y & s_mask; + uvsrc_y = src_y; + uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1)); + } else { + //Chroma444 + uvsx = motion_x & s_mask; + uvsy = motion_y & s_mask; + uvsrc_x = src_x; + uvsrc_y = src_y; + } + } + } + + ptr_y = ref_picture[0] + src_y * linesize + src_x; + ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x; + ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x; + + if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) || uvsrc_y<0 || + (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr_y, + linesize >> field_based, linesize >> field_based, + 17, 17 + field_based, + src_x, src_y * (1 << field_based), h_edge_pos, + v_edge_pos); + ptr_y = s->sc.edge_emu_buffer; + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + uint8_t *ubuf = s->sc.edge_emu_buffer + 18 * s->linesize; + uint8_t *vbuf =ubuf + 10 * s->uvlinesize; + if (s->workaround_bugs & FF_BUG_IEDGE) + vbuf -= s->uvlinesize; + s->vdsp.emulated_edge_mc(ubuf, ptr_cb, + uvlinesize >> field_based, uvlinesize >> field_based, + 9, 9 + field_based, + uvsrc_x, uvsrc_y * (1 << field_based), + h_edge_pos >> 1, v_edge_pos >> 1); + s->vdsp.emulated_edge_mc(vbuf, ptr_cr, + uvlinesize >> field_based,uvlinesize >> field_based, + 9, 9 + field_based, + uvsrc_x, uvsrc_y * (1 << field_based), + h_edge_pos >> 1, v_edge_pos >> 1); + ptr_cb = ubuf; + ptr_cr = vbuf; + } + } + + // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f->data + if (bottom_field) { + dest_y += s->linesize; + dest_cb += s->uvlinesize; + dest_cr += s->uvlinesize; + } + + if (field_select) { + ptr_y += s->linesize; + ptr_cb += s->uvlinesize; + ptr_cr += s->uvlinesize; + } + + sx = (sx << 2) >> lowres; + sy = (sy << 2) >> lowres; + pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy); + + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + int hc = s->chroma_y_shift ? (h+1-bottom_field)>>1 : h; + uvsx = (uvsx << 2) >> lowres; + uvsy = (uvsy << 2) >> lowres; + if (hc) { + pix_op[op_index](dest_cb, ptr_cb, uvlinesize, hc, uvsx, uvsy); + pix_op[op_index](dest_cr, ptr_cr, uvlinesize, hc, uvsx, uvsy); + } + } + // FIXME h261 lowres loop filter +} + +static inline void chroma_4mv_motion_lowres(MpegEncContext *s, + uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t *const *ref_picture, + const h264_chroma_mc_func * pix_op, + int mx, int my) +{ + const int lowres = s->avctx->lowres; + const int op_index = FFMIN(lowres, 3); + const int block_s = 8 >> lowres; + const int s_mask = (2 << lowres) - 1; + const int h_edge_pos = s->h_edge_pos >> lowres + 1; + const int v_edge_pos = s->v_edge_pos >> lowres + 1; + int emu = 0, src_x, src_y, sx, sy; + ptrdiff_t offset; + const uint8_t *ptr; + + if (s->quarter_sample) { + mx /= 2; + my /= 2; + } + + /* In case of 8X8, we construct a single chroma motion vector + with a special rounding */ + mx = ff_h263_round_chroma(mx); + my = ff_h263_round_chroma(my); + + sx = mx & s_mask; + sy = my & s_mask; + src_x = s->mb_x * block_s + (mx >> lowres + 1); + src_y = s->mb_y * block_s + (my >> lowres + 1); + + offset = src_y * s->uvlinesize + src_x; + ptr = ref_picture[1] + offset; + if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) || + (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, + s->uvlinesize, s->uvlinesize, + 9, 9, + src_x, src_y, h_edge_pos, v_edge_pos); + ptr = s->sc.edge_emu_buffer; + emu = 1; + } + sx = (sx << 2) >> lowres; + sy = (sy << 2) >> lowres; + pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy); + + ptr = ref_picture[2] + offset; + if (emu) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, + s->uvlinesize, s->uvlinesize, + 9, 9, + src_x, src_y, h_edge_pos, v_edge_pos); + ptr = s->sc.edge_emu_buffer; + } + pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy); +} + +/** + * motion compensation of a single macroblock + * @param s context + * @param dest_y luma destination pointer + * @param dest_cb chroma cb/u destination pointer + * @param dest_cr chroma cr/v destination pointer + * @param dir direction (0->forward, 1->backward) + * @param ref_picture array[3] of pointers to the 3 planes of the reference picture + * @param pix_op halfpel motion compensation function (average or put normally) + * the motion vectors are taken from s->mv and the MV type from s->mv_type + */ +static inline void MPV_motion_lowres(MpegEncContext *s, + uint8_t *dest_y, uint8_t *dest_cb, + uint8_t *dest_cr, + int dir, uint8_t *const *ref_picture, + const h264_chroma_mc_func *pix_op) +{ + int mx, my; + int mb_x, mb_y; + const int lowres = s->avctx->lowres; + const int block_s = 8 >>lowres; + + mb_x = s->mb_x; + mb_y = s->mb_y; + + switch (s->mv_type) { + case MV_TYPE_16X16: + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 0, 0, 0, + ref_picture, pix_op, + s->mv[dir][0][0], s->mv[dir][0][1], + 2 * block_s, mb_y); + break; + case MV_TYPE_8X8: + mx = 0; + my = 0; + for (int i = 0; i < 4; i++) { + hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * + s->linesize) * block_s, + ref_picture[0], 0, 0, + (2 * mb_x + (i & 1)) * block_s, + (2 * mb_y + (i >> 1)) * block_s, + s->width, s->height, s->linesize, + s->h_edge_pos >> lowres, s->v_edge_pos >> lowres, + block_s, block_s, pix_op, + s->mv[dir][i][0], s->mv[dir][i][1]); + + mx += s->mv[dir][i][0]; + my += s->mv[dir][i][1]; + } + + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) + chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, + pix_op, mx, my); + break; + case MV_TYPE_FIELD: + if (s->picture_structure == PICT_FRAME) { + /* top field */ + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 1, 0, s->field_select[dir][0], + ref_picture, pix_op, + s->mv[dir][0][0], s->mv[dir][0][1], + block_s, mb_y); + /* bottom field */ + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 1, 1, s->field_select[dir][1], + ref_picture, pix_op, + s->mv[dir][1][0], s->mv[dir][1][1], + block_s, mb_y); + } else { + if (s->picture_structure != s->field_select[dir][0] + 1 && + s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) { + ref_picture = s->current_picture_ptr->f->data; + + } + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 0, 0, s->field_select[dir][0], + ref_picture, pix_op, + s->mv[dir][0][0], + s->mv[dir][0][1], 2 * block_s, mb_y >> 1); + } + break; + case MV_TYPE_16X8: + for (int i = 0; i < 2; i++) { + uint8_t *const *ref2picture; + + if (s->picture_structure == s->field_select[dir][i] + 1 || + s->pict_type == AV_PICTURE_TYPE_B || s->first_field) { + ref2picture = ref_picture; + } else { + ref2picture = s->current_picture_ptr->f->data; + } + + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 0, 0, s->field_select[dir][i], + ref2picture, pix_op, + s->mv[dir][i][0], s->mv[dir][i][1] + + 2 * block_s * i, block_s, mb_y >> 1); + + dest_y += 2 * block_s * s->linesize; + dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize; + dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize; + } + break; + case MV_TYPE_DMV: + if (s->picture_structure == PICT_FRAME) { + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 1, j, j ^ i, + ref_picture, pix_op, + s->mv[dir][2 * i + j][0], + s->mv[dir][2 * i + j][1], + block_s, mb_y); + } + pix_op = s->h264chroma.avg_h264_chroma_pixels_tab; + } + } else { + for (int i = 0; i < 2; i++) { + mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, + 0, 0, s->picture_structure != i + 1, + ref_picture, pix_op, + s->mv[dir][2 * i][0],s->mv[dir][2 * i][1], + 2 * block_s, mb_y >> 1); + + // after put we make avg of the same block + pix_op = s->h264chroma.avg_h264_chroma_pixels_tab; + + // opposite parity is always in the same + // frame if this is second field + if (!s->first_field) { + ref_picture = s->current_picture_ptr->f->data; + } + } + } + break; + default: + av_assert2(0); + } +} + +/** + * find the lowest MB row referenced in the MVs + */ +static int lowest_referenced_row(MpegEncContext *s, int dir) +{ + int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample; + int off, mvs; + + if (s->picture_structure != PICT_FRAME || s->mcsel) + goto unhandled; + + switch (s->mv_type) { + case MV_TYPE_16X16: + mvs = 1; + break; + case MV_TYPE_16X8: + mvs = 2; + break; + case MV_TYPE_8X8: + mvs = 4; + break; + default: + goto unhandled; + } + + for (int i = 0; i < mvs; i++) { + int my = s->mv[dir][i][1]; + my_max = FFMAX(my_max, my); + my_min = FFMIN(my_min, my); + } + + off = ((FFMAX(-my_min, my_max) << qpel_shift) + 63) >> 6; + + return av_clip(s->mb_y + off, 0, s->mb_height - 1); +unhandled: + return s->mb_height - 1; +} + +/* add block[] to dest[] */ +static inline void add_dct(MpegEncContext *s, + int16_t *block, int i, uint8_t *dest, int line_size) +{ + if (s->block_last_index[i] >= 0) { + s->idsp.idct_add(dest, line_size, block); + } +} + +#define IS_ENCODER 0 +#include "mpv_reconstruct_mb_template.c" + +void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]) +{ + if (s->avctx->debug & FF_DEBUG_DCT_COEFF) { + /* print DCT coefficients */ + av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y); + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 64; j++) { + av_log(s->avctx, AV_LOG_DEBUG, "%5d", + block[i][s->idsp.idct_permutation[j]]); + } + av_log(s->avctx, AV_LOG_DEBUG, "\n"); + } + } + + if (!s->avctx->lowres) { +#if !CONFIG_SMALL + if (s->out_format == FMT_MPEG1) + mpv_reconstruct_mb_internal(s, block, 0, DEFINITELY_MPEG12); + else + mpv_reconstruct_mb_internal(s, block, 0, NOT_MPEG12); +#else + mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12); +#endif + } else + mpv_reconstruct_mb_internal(s, block, 1, MAY_BE_MPEG12); +} diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 2cbb856866..ce363a585d 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1017,6 +1017,26 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx) return 0; } +#define IS_ENCODER 1 +#include "mpv_reconstruct_mb_template.c" + +static void mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64]) +{ + if (s->avctx->debug & FF_DEBUG_DCT_COEFF) { + /* print DCT coefficients */ + av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y); + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 64; j++) { + av_log(s->avctx, AV_LOG_DEBUG, "%5d", + block[i][s->idsp.idct_permutation[j]]); + } + av_log(s->avctx, AV_LOG_DEBUG, "\n"); + } + } + + mpv_reconstruct_mb_internal(s, block, 0, MAY_BE_MPEG12); +} + static int get_sae(const uint8_t *src, int ref, int stride) { int x,y; @@ -2577,7 +2597,7 @@ static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegE } if(s->avctx->mb_decision == FF_MB_DECISION_RD){ - ff_mpv_reconstruct_mb(s, s->block); + mpv_reconstruct_mb(s, s->block); score *= s->lambda2; score += sse_mb(s) << FF_LAMBDA_SHIFT; @@ -3287,7 +3307,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ } if(s->avctx->mb_decision == FF_MB_DECISION_BITS) - ff_mpv_reconstruct_mb(s, s->block); + mpv_reconstruct_mb(s, s->block); } else { int motion_x = 0, motion_y = 0; s->mv_type=MV_TYPE_16X16; @@ -3406,7 +3426,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B) ff_h263_update_motion_val(s); - ff_mpv_reconstruct_mb(s, s->block); + mpv_reconstruct_mb(s, s->block); } /* clean the MV table in IPS frames for direct mode in B-frames */ diff --git a/libavcodec/mpegvideodec.h b/libavcodec/mpegvideodec.h index 250034b486..0b841bc1a1 100644 --- a/libavcodec/mpegvideodec.h +++ b/libavcodec/mpegvideodec.h @@ -50,6 +50,7 @@ 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); +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); diff --git a/libavcodec/mpv_reconstruct_mb_template.c b/libavcodec/mpv_reconstruct_mb_template.c new file mode 100644 index 0000000000..7d74ec1f5c --- /dev/null +++ b/libavcodec/mpv_reconstruct_mb_template.c @@ -0,0 +1,300 @@ +/* + * MPEG macroblock reconstruction + * Copyright (c) 2000,2001 Fabrice Bellard + * Copyright (c) 2002-2004 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define NOT_MPEG12 0 +#define MAY_BE_MPEG12 1 +#define DEFINITELY_MPEG12 2 + +/* put block[] to dest[] */ +static inline void put_dct(MpegEncContext *s, + int16_t *block, int i, uint8_t *dest, int line_size, int qscale) +{ + s->dct_unquantize_intra(s, block, i, qscale); + s->idsp.idct_put(dest, line_size, block); +} + +static inline void add_dequant_dct(MpegEncContext *s, + int16_t *block, int i, uint8_t *dest, int line_size, int qscale) +{ + if (s->block_last_index[i] >= 0) { + s->dct_unquantize_inter(s, block, i, qscale); + + s->idsp.idct_add(dest, line_size, block); + } +} + +/* generic function called after a macroblock has been parsed by the + decoder or after it has been encoded by the encoder. + + Important variables used: + s->mb_intra : true if intra macroblock + s->mv_dir : motion vector direction + s->mv_type : motion vector type + s->mv : motion vector + s->interlaced_dct : true if interlaced dct used (mpeg2) + */ +static av_always_inline +void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], + int lowres_flag, int is_mpeg12) +{ +#define IS_MPEG12(s) (is_mpeg12 == MAY_BE_MPEG12 ? ((s)->out_format == FMT_MPEG1) : is_mpeg12) + const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; + + s->current_picture.qscale_table[mb_xy] = s->qscale; + + /* update DC predictors for P macroblocks */ + if (!s->mb_intra) { + if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) { + if (s->mbintra_table[mb_xy]) + ff_clean_intra_table_entries(s); + } else { + s->last_dc[0] = + s->last_dc[1] = + s->last_dc[2] = 128 << s->intra_dc_precision; + } + } else if (is_mpeg12 != DEFINITELY_MPEG12 && (s->h263_pred || s->h263_aic)) + s->mbintra_table[mb_xy] = 1; + +#if IS_ENCODER + if ((s->avctx->flags & AV_CODEC_FLAG_PSNR) || s->frame_skip_threshold || s->frame_skip_factor || + !((s->intra_only || s->pict_type == AV_PICTURE_TYPE_B) && + s->avctx->mb_decision != FF_MB_DECISION_RD)) // FIXME precalc +#endif /* IS_ENCODER */ + { + uint8_t *dest_y, *dest_cb, *dest_cr; + int dct_linesize, dct_offset; + const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics + const int uvlinesize = s->current_picture.f->linesize[1]; + const int readable = IS_ENCODER || lowres_flag || s->pict_type != AV_PICTURE_TYPE_B || s->avctx->draw_horiz_band; + const int block_size = lowres_flag ? 8 >> s->avctx->lowres : 8; + + /* avoid copy if macroblock skipped in last frame too */ + /* skip only during decoding as we might trash the buffers during encoding a bit */ + if (!IS_ENCODER) { + uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy]; + + if (s->mb_skipped) { + s->mb_skipped = 0; + av_assert2(s->pict_type!=AV_PICTURE_TYPE_I); + *mbskip_ptr = 1; + } else if(!s->current_picture.reference) { + *mbskip_ptr = 1; + } else{ + *mbskip_ptr = 0; /* not skipped */ + } + } + + dct_linesize = linesize << s->interlaced_dct; + dct_offset = s->interlaced_dct ? linesize : linesize * block_size; + + if (readable) { + dest_y = s->dest[0]; + dest_cb = s->dest[1]; + dest_cr = s->dest[2]; + } else { + dest_y = s->sc.b_scratchpad; + dest_cb = s->sc.b_scratchpad + 16 * linesize; + dest_cr = s->sc.b_scratchpad + 32 * linesize; + } + + if (!s->mb_intra) { + /* motion handling */ + /* decoding or more than one mb_type (MC was already done otherwise) */ + +#if !IS_ENCODER + if (HAVE_THREADS && s->avctx->active_thread_type & FF_THREAD_FRAME) { + if (s->mv_dir & MV_DIR_FORWARD) { + ff_thread_await_progress(&s->last_picture_ptr->tf, + lowest_referenced_row(s, 0), 0); + } + if (s->mv_dir & MV_DIR_BACKWARD) { + ff_thread_await_progress(&s->next_picture_ptr->tf, + lowest_referenced_row(s, 1), 0); + } + } + + if (lowres_flag) { + const h264_chroma_mc_func *op_pix = s->h264chroma.put_h264_chroma_pixels_tab; + + if (s->mv_dir & MV_DIR_FORWARD) { + MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix); + op_pix = s->h264chroma.avg_h264_chroma_pixels_tab; + } + if (s->mv_dir & MV_DIR_BACKWARD) { + MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix); + } + } else { + op_pixels_func (*op_pix)[4]; + qpel_mc_func (*op_qpix)[16] = s->me.qpel_put; + + if ((is_mpeg12 == DEFINITELY_MPEG12 || !s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) { + op_pix = s->hdsp.put_pixels_tab; + } else { + op_pix = s->hdsp.put_no_rnd_pixels_tab; + } + if (s->mv_dir & MV_DIR_FORWARD) { + ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix, op_qpix); + op_pix = s->hdsp.avg_pixels_tab; + op_qpix = s->me.qpel_avg; + } + if (s->mv_dir & MV_DIR_BACKWARD) { + ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix, op_qpix); + } + } + + /* skip dequant / idct if we are really late ;) */ + if (s->avctx->skip_idct) { + if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) + ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) + || s->avctx->skip_idct >= AVDISCARD_ALL) + goto skip_idct; + } + + /* add dct residue */ + if (!(IS_MPEG12(s) || s->msmpeg4_version || + (s->codec_id == AV_CODEC_ID_MPEG4 && !s->mpeg_quant))) +#endif /* !IS_ENCODER */ + { + add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); + add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); + add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); + add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); + + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + if (s->chroma_y_shift) { + add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); + add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); + } else { + dct_linesize >>= 1; + dct_offset >>= 1; + add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale); + add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale); + add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale); + add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); + } + } + } +#if !IS_ENCODER + else if (is_mpeg12 == DEFINITELY_MPEG12 || (s->codec_id != AV_CODEC_ID_WMV2)) { + add_dct(s, block[0], 0, dest_y , dct_linesize); + add_dct(s, block[1], 1, dest_y + block_size, dct_linesize); + add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize); + add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize); + + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + if (s->chroma_y_shift) {//Chroma420 + add_dct(s, block[4], 4, dest_cb, uvlinesize); + add_dct(s, block[5], 5, dest_cr, uvlinesize); + } else { + //chroma422 + dct_linesize = uvlinesize << s->interlaced_dct; + dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size; + + add_dct(s, block[4], 4, dest_cb, dct_linesize); + add_dct(s, block[5], 5, dest_cr, dct_linesize); + add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize); + add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize); + if (!s->chroma_x_shift) {//Chroma444 + add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize); + add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize); + add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize); + add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize); + } + } + } //fi gray + } else if (CONFIG_WMV2_DECODER) { + ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr); + } +#endif /* !IS_ENCODER */ + } else { +#if !IS_ENCODER + /* Only MPEG-4 Simple Studio Profile is supported in > 8-bit mode. + TODO: Integrate 10-bit properly into mpegvideo.c so that ER works properly */ + if (is_mpeg12 != DEFINITELY_MPEG12 && CONFIG_MPEG4_DECODER && + /* s->codec_id == AV_CODEC_ID_MPEG4 && */ + s->avctx->bits_per_raw_sample > 8) { + ff_mpeg4_decode_studio(s, dest_y, dest_cb, dest_cr, block_size, + uvlinesize, dct_linesize, dct_offset); + } else if (!IS_MPEG12(s)) +#endif /* !IS_ENCODER */ + { + /* dct only in intra block */ + put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); + put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); + put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); + put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); + + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + if (s->chroma_y_shift) { + put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); + put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); + } else { + dct_offset >>=1; + dct_linesize >>=1; + put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale); + put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale); + put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale); + put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); + } + } + } +#if !IS_ENCODER + else { + s->idsp.idct_put(dest_y, dct_linesize, block[0]); + s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]); + s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]); + s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]); + + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + if (s->chroma_y_shift) { + s->idsp.idct_put(dest_cb, uvlinesize, block[4]); + s->idsp.idct_put(dest_cr, uvlinesize, block[5]); + } else { + dct_linesize = uvlinesize << s->interlaced_dct; + dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size; + + s->idsp.idct_put(dest_cb, dct_linesize, block[4]); + s->idsp.idct_put(dest_cr, dct_linesize, block[5]); + s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]); + s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]); + if (!s->chroma_x_shift) { //Chroma444 + s->idsp.idct_put(dest_cb + block_size, dct_linesize, block[8]); + s->idsp.idct_put(dest_cr + block_size, dct_linesize, block[9]); + s->idsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]); + s->idsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]); + } + } + } //gray + } + } +skip_idct: + if (!readable) { + s->hdsp.put_pixels_tab[0][0](s->dest[0], dest_y, linesize, 16); + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { + s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize, 16 >> s->chroma_y_shift); + s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize, 16 >> s->chroma_y_shift); + } +#endif /* !IS_ENCODER */ + } + } +} + From patchwork Mon Oct 17 01:34:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38758 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1375891pzb; Sun, 16 Oct 2022 18:35:28 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4Fw5n5Rk4cMfG+A1Wl6HHVU2adfQIuPmn8UjyjQf/8roKlyXVZbj9CIxwIUW8+TJObDYAy X-Received: by 2002:a17:907:7e9e:b0:78d:f3b0:fc78 with SMTP id qb30-20020a1709077e9e00b0078df3b0fc78mr6881501ejc.478.1665970528592; Sun, 16 Oct 2022 18:35:28 -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 p2-20020aa7d302000000b004599fc7f310si6573338edq.140.2022.10.16.18.35.28; Sun, 16 Oct 2022 18:35:28 -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="XU/J8gn8"; 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 382FC68BCAB; Mon, 17 Oct 2022 04:35:17 +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-oln040092074017.outbound.protection.outlook.com [40.92.74.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CA77368BC9B for ; Mon, 17 Oct 2022 04:35:14 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Zp0W0Af/0mn1jLe766/qzlwtdBXu5bTc4ekjLCciNN0r3+GaxrGWFo1hCr3Acw0V6yR/nc/L3ORbb17EFAOd98Q7TgY50k6FNjWzMvBxK7nUuVc7uIjlR3zM1+hml/3f+QMYmMm47XXG14NPPwHG77tWT0Bit6bR5bND/IjfNwTr8e2g0gWWN2p156HR4hBMLBh/SgFlUGgfnF/hbHfhUE9bhfxkMN6FNbaaMgl2dw5QdbEkeGyhevLXR43erHzt6r9RxzVYSMYfy4b54jgIF86NHAn5POQTGcvwNjnHlzgd8ALq+iM+W0cm/6pkHcXje9fPxUuela0Lj8/iu/dxhA== 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=x1Hz7bJteqZIsf4aNdmyMLIeX25QbxZs+U7zanobgwE=; b=fgS4hM2jS0zAzBEFSPtdNpOh4hEIADaCcJ+esao0b55W+0hVTjei4im3pwBpdJOccG5uPGF1fRj0wY6y7NdWlNHOKeUujE7ThbvBYZ8HFfrCdtEXE9uTNhh2JATHAOwlrw5bpnOKvxBR9PZnAFmA1V6VXKi38jZOrgUmDCHhBDaFLRpZJekfgo/hGHgoVCxQ2O5c4rMFZNBoamHQXCpb2xmkAdrY+nBfEzPWITSWrfyXEERaGTkqLCbpM/DMMeJ5ow0pgt4zc/wXf36d9GhHpHPoz6U3rR/ZjdwIfnTUPpxjPpME0Cqagkq4IlqQDJFC5KxDEbVAPvnSmxAexly94A== 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=x1Hz7bJteqZIsf4aNdmyMLIeX25QbxZs+U7zanobgwE=; b=XU/J8gn84rOHpk1/6KvE+hwoaJT4a8yjLUg1YdTAdXgEt0Nd5U0rcu+m5vu7Qo3OI0IoYSyxrTuNV1/P4dI54a4PAfI5BVbdd+6lWQd/azlCUko61u15Qw1y8P5XhxEc/DxmGxcMx0+CcsrIfGG6B5I+CpwdVw0EqWd2CUuB04BuqBudoXIURIlMZW27ymuHCLdY0u0LCfYg+oHjtCnKA6JKwuT8YByIDbcmmJw0BM+aMcln3bB8IiIFYsze/sIhafpoLCY7ed3fbb+GqGFODizznWcWfOlhdRs/UO4L6tR+x3TQPVfcQZLIdtOWimz16j6bGQpBzWpjKJzDHafL5w== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0916.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ec::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Mon, 17 Oct 2022 01:35:08 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f%2]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 01:35:08 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Oct 2022 03:34:41 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [1oPjfSI4+6rVR3osQNIRWMGX2kQCnBLKlF28ngMxFdU=] X-ClientProxiedBy: FR3P281CA0056.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20221017013442.944352-4-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0916:EE_ X-MS-Office365-Filtering-Correlation-Id: 307a2546-ac99-40bd-be19-08daafdfd360 X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmriMkceEMr8g00cHUekKy/uvzg+YRX9i3I/e3cQaTfrkOKTFPJfm2nJ2pSfsGFlI2aUM1DO5fADDuqcJKyu/se+ct/HFjT/RFGwxop+iuZwHNKhe+wbIlBE4Afj4TxGB/uOn1AlmwSqTl7/qhaL+ko5RoyftFEPHbrryMxmRvpk4kgpmwJH6qScTw66qF5wRFgBijQ873EkKzzbzfIpRM9pFI1QHAuGLXbU/MAq77JDCuBueMAuGyhKqD8CWrmuCKxKW1etC7CCF6UtMjRlQHNiGH+0epzM7Y3KvNucRvvkx8Gijam6sibosZPAhY3Z+vGGabc8/HtXQoSgn3Bs82u/AAh2a4xboMJFDyBw2JGD2j5b6NY2suSLaVs4zCqrmB58E7kicubWRdsJBgtSebEK2CN7DDdylWiCM0+c3IIDWPWpsToIiCQg7aYr3saOoE24IpSnRra/nuQpKq7Y1ho2DF6vx1LlqKotXVdHFd3vDoDLRV2riVq9QyUItWCVl2cXE8t2TYP3FlnlOkWXx/d+Lc/dF/KBrFlnGFJuflfu2QCdNxK1oS6jMpLl4ycJR2dKncAjp6ofM3ejji7CRl2jj0QolVqjxkLa0a9woCvr+TcyTZ+N+PNYNhDXwi6MCvetiulZM7Wovwzie2dMw5UhmmAXteCcoAkGU7fvUD2oCI4OD0Lb/Z/BK6AR4I2Kqyel/OZSM4RjZpmC6VcVJhfA0n1Z0VzLQbGlMT2lTEqSuPfq6Yy1makKKqqAw6VvR+0= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: mp/3dVZgW9GhG3TL+dncnlvci/PCu3bvMPOZ8bZkas9O/655ewXdgl5o9AhBnf+9UFU35Pevv50oXAFOTJxjc6N95MIiELGro1LDVSSAJUBpW1a1z2fB+wCiF9tj8NU4lwU5pG43HeREJU4t+EkdcwyLcap+y53KZAVSeQt0KaCNwWj0FFFR4kgathyeF6jjPvMM8AoL+41vIT+iqKuY4/RJV62OCgz/Cw0AlBZceTnOaeL8GwPX4wA1PaTqL64bUi9AHyy/LfvFFxR4ogf2RXylAijMT6q/u3J+TAOo22TXgTlAY21BpuYmtrOD6+sclTwpM5eBAS6+JBf8xvVWSOjV6S648mpst6Joh95v8X9ooqx3O2tGKmageJBSzYCvqdbysYF04ULO04sSaJghsG5H1yeIdh5Z+OWkvuAYvqiqhT9LpHKUywEQG5WF+CqGTSf06/ao2FgjtYqgq8icS6GJpy9SNihf9XE3jNiwL4uXuRwLHHLTcpX9Owy2FfOSRQpDDlwCIfvN9YOCzmx4IPlANLKgCDInkBEIJiCgg7GUDXmax2uXGdpumqgI9cCEcSrV/nWwjZQEghuxHuMltfr9Cva6fYa6+nh3YomyhTadnh1sIZjHwMMM0zKCcdjh14RHUcvhBfZm2CHi5i7NcqmqjVHY1RMiPyRtXt7+1TX8KFOxECEhU/G7nEPPeVW+ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: wQ9KrCMxBT8OkLMW59eZnc3/CFud/GWobBj1mS127A0sVsj361XgR4a90cOZjC4LCu05SESzezE45Ow1vfpAOOdrExChcBzqPXEk7wDjFK7CNHYOnUl2xbjiMms5iyFBfilrXlqQQs1SFxpAzYys/gbYeqb7KUPS1Pg3YBlQLS55K3QjhOr426bEJeFnt2p1oQ5ihc42oZqaxFBm0mANL9jhulU50yCIQ4XseSu8CaJdlSKaMwan7HVUsIuipQXe6CODPALzJtpqx6KuFNroW07p+iu0RvpEoMAeQgiYN3a00a6Oa/ngZ4ZiosD430320CCkpaghpg4i6YOUhzD9p4NLHHXncgV9VZjhv3nq6Pjzt3+2lX8z3LYPgcYvy2Y4iaLllWFBLxSYu75Bx3YAdYasFFz4E/mogGSoKyB1rWcF485S9H4Tx696VTppbXaGTbMSckfVrtu50LOaFB3H9Ve/Zk4nN69I33PwJBexJ/dPSmQhe6YKtRiZgSWDN20MDsV1vvSrdznZFOQP594QykndrQseLr5TsSgNHMn8ZoZ0nuaTfGC1Low69vjCEE+itx/Hja73TLeqiEB/eBdcShCMfTrkulOe88++l+sKl18yQmS3MkwDR3NCAG8RAczMrRTyqDp0mSbus05nzfoZaeyvoMshmgDsWTGkMARuYFdbIsl43o1oMZeHttyoBr4cXmRmlMhchYJas+k8sI5y/IjUNgKps5ACgCjQ9FHwdjcyaa8RmWcdzy6rb8Zcx6cbfZp9fgTpLib+VO1AOtd1HlgMBHM7QrkDZx5hHJf9pmUIiHa88DRhSWNDdmGT4GLkMT73eX6Ub/N8evkGl0diXA/rPyokO6mCOxrO1cvCSMZ4sF9RuFRyWJK3pTCOBTx0/iL25Ev7hsI8DLr9HRJkoHoaIxtVbeJcQb/W6Km5wE3sMC5i1MfBdJccWrlsRYfLt0sSm+gdVF8vkCu41FhltrDiWni8/2duDLAo/fy0q6W7DEHHu0jI8M9MyHe1cRvItdjfMCFi0NOfvgQTjsrhlKSyW+W1zM0/TXjH7WWhJFl4VB4FExsfDuNoWbR3xCtBVXKNG4hHgu46UANENt/xfBYcLEwM1ay4RzDt0RXVmEA6mZpBHfI8cYotYLyFQ4HBw3AOpOWirBTbizgN6u22IWE27fBYdsPbRpRstxFa+Afja3tCNLNTXy88oz3DiwyC9RkBo+V+GE7PO4134SIdCpXp/S3R2LNBx+1CX6vkDT44sp9krkEniGZeUYiHGy8vna3WiYMDngj+Zl3d/tpm9C/PWdD8CbXvQCHvQNWLuVvEjQEu4ooT1X3qyy7OtTrp X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 307a2546-ac99-40bd-be19-08daafdfd360 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2022 01:35:08.7277 (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: DU0P250MB0916 Subject: [FFmpeg-devel] [PATCH 5/6] avcodec/mpeg12dec: Remove always-true check 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: Gra9CTi19Yp2 mpeg12dec.c is a decoder-only file. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpeg12dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index df76a90c6c..56bf73df11 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1788,7 +1788,7 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y, return ret; // Note motion_val is normally NULL unless we want to extract the MVs. - if (s->current_picture.motion_val[0] && !s->encoding) { + if (s->current_picture.motion_val[0]) { const int wrap = s->b8_stride; int xy = s->mb_x * 2 + s->mb_y * 2 * wrap; int b8_xy = 4 * (s->mb_x + s->mb_y * s->mb_stride); From patchwork Mon Oct 17 01:34:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38759 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1375945pzb; Sun, 16 Oct 2022 18:35:38 -0700 (PDT) X-Google-Smtp-Source: AMsMyM75v8rvP0op0QpTyBWxkVROx+5c64O1O+85zgK/h0/iW88Hp2lttcQxXC/HFGxH7uAAhUSr X-Received: by 2002:a05:6402:500d:b0:459:3e56:e6f9 with SMTP id p13-20020a056402500d00b004593e56e6f9mr8268802eda.367.1665970537878; Sun, 16 Oct 2022 18:35:37 -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 hc35-20020a17090716a300b0078081036bdasi8697519ejc.501.2022.10.16.18.35.37; Sun, 16 Oct 2022 18:35:37 -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=XXUV7VYa; 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 3079C68BCB0; Mon, 17 Oct 2022 04:35:18 +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-oln040092074017.outbound.protection.outlook.com [40.92.74.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E538968BC9E for ; Mon, 17 Oct 2022 04:35:14 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YgeE3wAJ7+iFrkHJtcZ5YDeHo5UDkfRkjh8G4JaJ0RiLnioNCE6k2dW0NfUh9MkEXjtdljjcOA/TRnEgtJLmrcTOVwdLnqumsYHjUlgJbr1EcUcDEereeJinHS2+DhCXev/SaHPU/7HsH+s8IxnBJl6GAPSwZd+R13VCHIyE3weBXAe0nIUBGurjcbEkKQOuE4NYb64g8z7Y2T0ynDffhkBXhjBwJrbV1dxhtci/1iAovDoz1+k/O1Hg70feTrlA7i+QmTrlK/yOskpram8p/Mo8Y29h5LKiXcLsbwE4v6jHMuLdy6H4+eZqkWkASl2qur/vOEAlL8bZkiGFyJA6Ew== 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=7NssOlKdLzfHHKWDCDYZXC1mkRJ0vf3w/eYL1VjG9bI=; b=ci6B7mdrV2SnKJJI+l7gr2d7HLxnJLZEoUF3xle6eYcKoFTvJGVALZRlErw4ABiMGNfjs5cbsNJCsRt+F07sasvx/iB0KR2TpC/OeBZobrRbd3IaS8dq0GZFtCy78nSKkEnbkKTxBaGbHC0nx1YWc15UErZcEUNMc5a5wNUrlxJg731LaNbfe9oLeZxTxKJsMUQ5KAyKU1Sg+G5VyJUz6r7hVjBVmiBPH/pWhD1sCeMtgAIB72kGI2eg9Z9Am0OwX2D0wVo286N/mgOZstKN7A1Q1E/rVgEXHsmwr7BZ8g5ht+J3e/uDgsriCgXw+FT6PVn8cpXDge8bnwYfP0nnuw== 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=7NssOlKdLzfHHKWDCDYZXC1mkRJ0vf3w/eYL1VjG9bI=; b=XXUV7VYaSdMm2MkkoS0Q1vFxYiUBvqBXGt8Ps+YRFALULot8ioIH1uIReyVuCinqIfu7WEwW0uUZitS8CrLZecqFQPE/6J65P6am9UgOUjtjT/dDTGe3gFj9OwoUzE13usvvnrpNLX3Ku8/rfjxMaFqPA74CUbXBIQJpr6G57Z12kQldZVCxJjdZ8PShpAyDkEgZisvhQr85WT7uL619jccCLbih4Xe/ZcnKc0Iyvbbav5pmyHL8egGOPMtQ/4S/4xNRFxEAJbklt1/nB3AGK7jZ30BxSylye1PL93POptsqzWHTdCUIJqDdmE/aXuVrcqasK096Wxw8P3a0B5Bq6w== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0916.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ec::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Mon, 17 Oct 2022 01:35:10 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::20c0:9c9e:87f:79f%2]) with mapi id 15.20.5723.033; Mon, 17 Oct 2022 01:35:10 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Oct 2022 03:34:42 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [zYUuFcXHl1808fLjWG8ZjCx8IA07j5Sp17uO2kYZZKQ=] X-ClientProxiedBy: FR3P281CA0056.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20221017013442.944352-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0916:EE_ X-MS-Office365-Filtering-Correlation-Id: 89c6ef7e-a195-4650-a220-08daafdfd43e X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmriMkceEMr8g00cHUekKy/ufTlndA4FdAcZeqIVNXp5yPMtQx4yQLr1g0QxRRb3EWogldxCXdXQaVvGWvYwRIWoe9hAHbFdLQc6Ms3YepFigkeNxnjSNjziu/I5qSBM4TsmEj1z6UuCVxqxfWp9VuSF1mgJl7aNROAX0zQfs+kDFDa7wwgje4Z8cLv9edC8LDpwLNv1b+U7B7vbinVb8S8RZGKsthgwnrVoVGHF0DHJ2ISvy2pqmdE5CfHIGM7XjRYwCXXbsnpwL9vC6BwMsVa7mqFyCStrc3Irdv2Aj34MRM1BwAvpdrvtslF69ta8MoX6gi9kGXj5oZ/ATOaxCyvSmT2/qYqufzVTS/rwz5wmYJ6+9jK9YIonUMZ6JvFlMF/SuvBbZtgdVSLRFYRdtRyy6za+bPDODfgmwkGNLs4aX9Zd1YKLTnmlLjnj62Xp4PuvK6fNk5NiktczenmEDpP9WCL480rkV9XNppaBUqH0onsBTw0KGkejDsPX7V/14yxETnDjUYFG07T44E8UANQd907lyGLLtVny/5FcoXlFsaTPV1uf8S2ugOKGJMJgUduB2VcJEVABcVWV+VAGevs4tvqdqi9gofSFH22tLfCZZadMiudeamK6wVv/3dTqgbUVL+he9YCaDhTWPw5dwfccZhNOIehr+XC8hdZUbAulUDThuWPkjm9+ZtjaDPspeVyTvfQulTubUKjb1PqqGe7FkMM1zMrhpti3hDfgVN5O+jYFNdomqqsiWCoVa7Fc+4U= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: QonNmXEdtfRfNOWSuzv+lPOSoK28N/HeJMSjVnUOuI7Q8tFVnKgv684OaOM7VA25j2w3YSsIyMgBH+N613SpBOi5wrWDBLrw5pTv5gwXNaFilev+2Ih9Gwd1oEvJTB0LGDFBaj+FXp+1aU70fn4YYOFsRSJsG/SapqhbgocRGcb7pIAfXPxC4lXA0+syDF2CWRNn2wMD44z1LVFsG3XMBlVYAxiZwxXzneotOTEaZ0W/q56JvSqnZS5Gs2fEkBsiLZkKRbs/lhSbQk4clE3kRdTOQOfeZ86PHhirS7wTOiytBrPzkIjMHf1rEA8L/Gpq0RCq0GiI5/eZFwOdG7+pGAANdtNFsBUFyUm8CCt9VEZv/zi+XbqVf1Q4ZPYWWD/mBJOrew7f9cMCab8l3/0F9AE3UzB9KKIOrB6EUWeQQvPXtUDz/tlYYmD3Ant/yB0+utfIfUTgmBIz3s83qWU3EDChoLLV7a92ZA63XtcbPY6KPYjRbOiMxZlA34gDCXStBkR0XtjRus873WeeDnTlJMh/VXJBLGdnolwp5q53kx3esIeYk9P9ZguFsYjg6su3lk+aELqYN4T6E0UOq7kb2eH93AqwH30cRotWgHWvTpsaLNmomNBFS4epu1C1Vr6jkUUtFIUbYt46UzXM1ilZwODDswds9Vcq9r4YrWqTWx1mdXEOCwU2jDwwlcQ76CrS X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: xcbg3+rKRXrSYWiPmzhiMpxTX2TQEvzJu+xSc9nVi89RoFg6tZ5RTP9CB3NxHlWtQkiozBs7jaefs0QCbrIQH62XViAkMMaDsejAUma+yz5pBuomgRYOYQ9n+a4HMur0WxCpFPVTDTATBOo9b4I/9I4RVJpZ+5kF3Xs1xoSWj2a2KKL3ytyO3Rej2gFrRyHX1Ie0lojfwB1cfrs0t/NhgOrA2+Sb+TX0Lb6XuDPR5cxXnNNRdgZAp7v8vbB4pVQFvdR5W8fmC1ZZXagPBoiNYpaKcDBiKZZCDiiDiYrsS1IJqbWv9lVVUuFWAyuK2GQ5QZHv8GG40eH3NZQjgaEusL6xeD20C7qLs3vdmDT2cetFCA/JThc2BM6X9eOHBw9fceVQo9uoefs7NEOxB5R5LyPa9ZSaayoQIfJMVKbmH9lOfx4u+Sd3Mn1AZq/KYm9QAhDBLoPjS75bguBb33J8Pu0wvd3o7np2a2TMprhEUe4iJngT/w+G5WTSudnO9LoHtkmE4mHJfu94bVLvJgR+bh+3aMNqltG6sNPs6Ril/B/43aJYRZ+D5dfGkQ/igEHOKTObhq/ln60jUNIir2+dRRu32gbjaHqBMyVVXwDK01PW15ye4pP8hTmCboBk/ok/OzOtdDIFcVena4AHW59mYPb5z4D7wkDFhK1nLKKpS09iH0Si+vvd4Vvo9gwirBfsJYPA1CPKVLcCGvqjTnxWYGZD3T66OQJ4y+3AOdxr2UrFLopWTX1Xx8TJ3jPz/1nVSQMYR6xne1IuNoNB0flJVVweGkcARWkMXRjEii6DxklzhmkqFRupKn9tef/004nqbucY9QmhMCMcEYK46hnoWAYc73srZSbkse1a+iBfWb2DhKowxaEJcZRar8GNkr9lBY6c9wFVu6mtZpaVy+q71kvUgmvMdOdTpCcbVFndmLOpsZW0hBTnMks6CP+ab/UcKpuRZozmOLCkWoqS9Mw19AVpWloqShhXxXUlZ02TQz5bB/ZxRPCVIbKIxgh4lJbQ2S0NqLqlqLzMiLOoxWJ7qFKofdrniGGmdme24WF0D++/O3mj4mmFsl0EdoFU9tS4eE8UP0lK6Mo5HI5PvMJlW/RanfGJFwJSOPulGxQnayyy7HqLnlw7ef3OywFYr2xEyAt3/OFGsksh9zqgElikS/W/+AFNzeuhWLMBL5mVGvAKxb5Q7hanQ4vu9/4hhMNf/6UE+px/nmCr2WPm60e8w5pPCMmi8GnxiQNSH1HIhteBMxCm845HQD75YhOwAK3NThAXRGrfWE/D1MV66V44IHNgdzFnDCYZcK+P2lWlVZNjuiExO6rtdMsUedDLk/+c X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 89c6ef7e-a195-4650-a220-08daafdfd43e X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2022 01:35:10.2287 (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: DU0P250MB0916 Subject: [FFmpeg-devel] [PATCH 6/6] avcodec/mpv_reconstruct_mb_template: Optimize dead code away 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: JEAwnmCpRllF None of the MPEG-1/2 codecs support frame threading, so one can optimize the check for it away. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpv_reconstruct_mb_template.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/mpv_reconstruct_mb_template.c b/libavcodec/mpv_reconstruct_mb_template.c index 7d74ec1f5c..5f2a19e587 100644 --- a/libavcodec/mpv_reconstruct_mb_template.c +++ b/libavcodec/mpv_reconstruct_mb_template.c @@ -121,7 +121,8 @@ void mpv_reconstruct_mb_internal(MpegEncContext *s, int16_t block[12][64], /* decoding or more than one mb_type (MC was already done otherwise) */ #if !IS_ENCODER - if (HAVE_THREADS && s->avctx->active_thread_type & FF_THREAD_FRAME) { + if (HAVE_THREADS && is_mpeg12 != DEFINITELY_MPEG12 && + s->avctx->active_thread_type & FF_THREAD_FRAME) { if (s->mv_dir & MV_DIR_FORWARD) { ff_thread_await_progress(&s->last_picture_ptr->tf, lowest_referenced_row(s, 0), 0);