From patchwork Wed Oct 12 18:03:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 38706 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1503988pzb; Wed, 12 Oct 2022 11:03:41 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5v3oCV/VdD+cpSB5TAPPBpn00KyZnChKTYzRMp9jzFz94zyC/Il9dEvQjuLt2YPCpkGf1h X-Received: by 2002:aa7:cd4f:0:b0:458:6077:c3ac with SMTP id v15-20020aa7cd4f000000b004586077c3acmr28632851edw.32.1665597820933; Wed, 12 Oct 2022 11:03:40 -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 p14-20020a170906604e00b0078d07d3be2asi13841131ejj.333.2022.10.12.11.03.40; Wed, 12 Oct 2022 11:03:40 -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="oWEo6dB/"; 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 1FD8668BD3F; Wed, 12 Oct 2022 21:03:37 +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-oln040092074101.outbound.protection.outlook.com [40.92.74.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A1A7468BB2C for ; Wed, 12 Oct 2022 21:03:30 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Umq5hvP7lBCCRsUp42kjNycCbnG5v/RnHRD+muN7d3+5SxkItQjUMPDoyD2r7Ma5EGkOPoLCsn2JW8T1o+Py+ALATU7BcaIoB8nNRhuf/28hbjZVVfpDO/nOxWfoJE0ZQmIsIPrLC9ZtHPcJ3kI3HXLdqG9zDC4jqVG2/tXgyaLC8BpqYgfrF32RlR8IA9LcwNmqQEPMvBKyx2T5cTK6KHUEoqxKK+/QceVsf9OeUOptbqZ40gnKD41JRv0u8cqDG6+xATDEz5dJnDhRXzEq6piAiuMR4ksp3JSQdQD6ErDV9Jd/u55xFPQS2lEn963qFsbpl2GHMTF5vWFCa8Th5w== 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=RPYLNCpwe7h+5/hUGSKFde96D9jeBD5rDd1cJUG7daM=; b=bJ1rX3ezueSY6Ms10f6q5AbgDA9/aNnwScJOvjvtNnYXz42LVKupOxZ741coZlaJ+pa+ShMU95DjfIV2jkwTMKObury6ElRb0biXMmOi+KDmoYyNkuz/6ubxh/dJByILH7B79t7EYHWq5/v7f27wo1tsRJGntsJ/WrC1nOfiByDtDAxeYrwSUfFXKusu34vZOoQAFBja6NCVvhTkaDsK9kTKoOvTUzaJQ9tejFaSkL3IRn2K0lV3BhD8hOz+7k2nLtzO6F0FNDEob8DXOznRWN6eE9PD1ToLmANtGYo2QSu7JlqXITfjnJGxr2eUkXcC8RXAJAwzKPdkQHt0h8F72Q== 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=RPYLNCpwe7h+5/hUGSKFde96D9jeBD5rDd1cJUG7daM=; b=oWEo6dB/aSzC4sLK5Zq/4hJpgGR1tt4eHcms2LL9Yp/jA2etFmSKq5OW23oiJ59FhnQUe/h6bBIH5xL/t3uEYxoJ6eqRRJxCi7nnY20f9LE1tChYL8Y8Y6oyIRRlABd6WBwqTs9aMO/m/TThm/cJatimgabdx7p96LrnUtAzPuL/2i9enHIWSS3rM1dviAgOmJJpw2oDHbwYoaTATFJl8ImXFuZpxvYrtv0WFhjB86k6zlxuesTFLR8/ZA2NLa99gdH0jpR3ELNnOC4rOUer7QEaWbkY3L2jjAHOiO4gpBnCoXPde4TyBoOJrrGnp/qZ9Owq2cf+tBR+8i9Ibvc3eQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU2P250MB0095.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:270::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5709.15; Wed, 12 Oct 2022 18:03:28 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::f9d7:680f:70c4:44fe]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::f9d7:680f:70c4:44fe%7]) with mapi id 15.20.5709.015; Wed, 12 Oct 2022 18:03:28 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 12 Oct 2022 20:03:25 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [wbBwuH8eZYjkeiBnBHhlyGFNFeUk6t1Qx15WVYxw8NQ=] X-ClientProxiedBy: AS9PR06CA0039.eurprd06.prod.outlook.com (2603:10a6:20b:463::31) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20221012180330.1834161-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DU2P250MB0095:EE_ X-MS-Office365-Filtering-Correlation-Id: a1079788-d072-4172-64d6-08daac7c10c2 X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmqnpNgInvu+2FGvrKiQOZUvpi38XCrfgqEd+k5xXNg8ZoaQhS9KVLm56OMImoMYTE8VGM4/KW3741fZr9BsUCAPGl8Po63uIQiBqod0U315Janeg5mjeQUFJbTiz+JNIiyVMeakeUH8cS4JUpl8118CSKwcrI12M4BD1BzLXHWSa8r7hSkUurBAC+j0d+ZxUMizneZiKlSFW3Q0PFDiTBJRV945E/QN7Z55/bXKZZE78p0CYIYNyyJPZ+HmwZp4lEq0K8Ia/D9Mt4gYhk4Id8zmiGjFB8DTKUi06QEDOx0skhoVTCEM/MpHCbdzYY0h5NSyOlMeqRfSB5VDFS5I7PiEGOWo/0aUMj1yA9TGZTtOV77Wi+X5mSbZKQXtPE94lcJIhpspQTMstmTGluZpaFEtJXIK5rT6562SwXIJ/Oq60P5voCXL0C2Oo0dPoh53FK0nqTC0AgRFtkEa0XiEj0GjoU0wHch+9CJ9e7v7X84DGG/ioEnSlFKencxJeJchFqyNT6vpOGUMBrnRJJD1YYCMj6FEZzhWHm4lyPujSZgGPc3sdx7Idl+4VzwZipismy2wqn+Zk3bytIDIIVgi7wEbBvPccDAKBksWpCDUJyG60X11B6U3WBBqxhqciFtt4U0pE/f4vCBKdE6QO3kPfXkcpBF9vxv//0QhjyrmHOpUfxM1CFPIU8AF05N7ANxwrfFYJ16q4S3Zh3OkuLC/vlZUkr4w2oHslO9QeCcdYE2KKCxashbDza79OWoFVEvgyfs= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OQEYMOpgGYJiGciQ7e6JjPBeg8BfbP4iYGVZvkbTqFt5Wr0A3NcH5jHBBVvra0IjqsSAnKg2BA2zmSQrk/hTBWWtiv0hI/oDQNSx/rQk7bgHaBo0zXcjy67bA4QhbneU6r2qQsNabTzvWqkJ7G19xG43n5YVbknV0edBEKiIpRh5mhafegj+lYSsz7p8aQkNC2PfOS7oBEKqLSQktT8d01JvZB5N/VrkkDXCENb/Yr0k1ZGWP49LOOszP36pCzpexyjsexOusDWsizhpWHavhQ4ffEL3jA9clxvjH5XMgG75dvwdTsshl1DN+sUS0F5xbfh5cU1uQtJgfAgAkI5gH0VkQbhLNbfwWNa5TE1OWBIaRiFI4lI3kraJQy5zM2K2mN5zH34dfsbqJXBB4uMzdlgKbxt7bokUqT4mfntjEklNOMAYGale1y//xf5B3+wwodO9LsxBbg74DxqAOKssc9l8Tvx+OQl+6cvknCCjeQUc8GpodFy5umBIyKnJ8k6joCZN789sjxS8qo+GH8/qkj+EbZDW61tH9Nok0eS8YpmHKf3iybotraq2T77a6a533bdwKW9SYZLPkM29DX1QndBraATHebHtQwN+7L+JZd66lMdl+UDtMZjhn2EYmZAVsNS8HC02xDnMjpL6RP+uaDBfZ3kEB4CowS6jmj/DIHHgVEiYqMZFUKgiPHpibqe7 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Sk5VTXNZq5VdS5TnIqm3eDbpS1yyP/jow/fTRpiSe1MJFrbDAIukWDXV5pTduDawRcQosEfcNV/8BkqdwnHjpOrIGBwAoMZW4KZNm0kOWbiWla6mycrNQyj+FdGC206nLlnb5yk+NypFnJc/xBpLGRhoTMQxOdMwwkY9MOQwbWHFQ4B7U0J3VcgUPEwy5HZRGW+JOU+sY992IZZII/s1nwra+ZxEPdpdw68bqPqznhsq0jUSRi5YJAdzbw7fP8Odr6mRJNNbAgagz/RNzTKdHPXzR3E3+tvG2LNhlaqWXG2+Qd0GS3xUIaOfzk71I2KBY+cXu8wie/+KN1t2jRNj2IWnNi8nEEBT2xdqSc68X/DBt9KDnFi0Zqf3fS6x6aN5IdjFD3h6Ez6Ihk4KdWRyCbXX6VEf4LoSucl/QkSwUZ6RNhpKg+BJwGhsXfTOk7bLQ/gF19Ym1AW4lLqZGH5ooxS4cMOFJjy4xvOhR2pePtvLW0hJflULut9W+aEoO/hN6dwuOP/RMQF1fomvH4BummL2vdB5Sgf3lPryXI77+oqd4vqWuobw2D9JhIYIFJWrPJfiFvkqE7EnFwzj7sdj+fCLW9v/PeyXQYjg9q9oVzrGMhQKBf7HrqDR9hJdT9n1V0x9cjW9Woz6OfCp3pLQD7PpHIr2rqPl1dwhBYab2MVXiXjZ6Dg0QUg6lL8ApicFij1OF7HHgrzfGevb6QstB8jTcfl28ewAo6WMyZoYdAwlB6ylMRa/Khq880Xpgh3HT6Po3HweW65hkixsWjeeU6J5t1y3b0/DoflafBgNGDii+f4J+BOe5YtPzAtNpZ6XcouSxNUnYu+fVf6pJXHAGoteAD8HOjbNnkVqSu+rxCwak9poJKwuDbPzI4pHwEv+80EZzWDmeAHWubfHdy0S10btR3RtEcbnWUwjy1nXBsIc/IDjRhp7ODd7oCoPNway19NKekRpyd4yQBnF0jBVDv5k7KAVRcF2psfDw2lRZLEw9Y9VCicNBOFZuDeYpOy0Vc6PZTDomC9DgQfUuRynLxzRlupbZe7EwOu8HfMniAAbpe6EGKIqyRwotkdLCmIkwl/9NrWPK4ehbwTaNboAgYpUBlZjrnQfSypxrloAd0FkUbz3VThDFQSQPbsYzQ98CvDkJDvmm8X/2QSHsNdL3wAVaocrwAbyiG+UarUELE6oVWJKy4L2W3oRHUPAndmvTmE/nqiTX5fCG3EqrQaG7/ceoNg/K8NV3OdyN/snb37scnRBoqA/x2rnB1Z/wIOJShf90ovjDeEPLGqnwgLmMEM9SLa50F8HkxhMITlwW6JXitntWEfGwjQpGvob+9wa X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a1079788-d072-4172-64d6-08daac7c10c2 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Oct 2022 18:03:28.6255 (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: DU2P250MB0095 Subject: [FFmpeg-devel] [PATCH 1/6] avcodec/mpegvideo_motion: Move mspel/gmc motion to mpeg4videodec.c 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: 9plvTz52BOB3 It is the only codec for which mcsel is ever set. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpeg4videodec.c | 168 ++++++++++++++++++++++++++++++++++ libavcodec/mpeg4videodec.h | 3 + libavcodec/mpegvideo_motion.c | 166 +-------------------------------- 3 files changed, 174 insertions(+), 163 deletions(-) diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 4dbf37afe5..58a8ac9027 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -72,6 +72,174 @@ static const int mb_type_b_map[4] = { MB_TYPE_L0 | MB_TYPE_16x16, }; +static void gmc1_motion(MpegEncContext *s, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t *const *ref_picture) +{ + const uint8_t *ptr; + int src_x, src_y, motion_x, motion_y; + ptrdiff_t offset, linesize, uvlinesize; + int emu = 0; + + motion_x = s->sprite_offset[0][0]; + motion_y = s->sprite_offset[0][1]; + src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy + 1)); + src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy + 1)); + motion_x *= 1 << (3 - s->sprite_warping_accuracy); + motion_y *= 1 << (3 - s->sprite_warping_accuracy); + src_x = av_clip(src_x, -16, s->width); + if (src_x == s->width) + motion_x = 0; + src_y = av_clip(src_y, -16, s->height); + if (src_y == s->height) + motion_y = 0; + + linesize = s->linesize; + uvlinesize = s->uvlinesize; + + ptr = ref_picture[0] + src_y * linesize + src_x; + + if ((unsigned)src_x >= FFMAX(s->h_edge_pos - 17, 0) || + (unsigned)src_y >= FFMAX(s->v_edge_pos - 17, 0)) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, + linesize, linesize, + 17, 17, + src_x, src_y, + s->h_edge_pos, s->v_edge_pos); + ptr = s->sc.edge_emu_buffer; + } + + if ((motion_x | motion_y) & 7) { + s->mdsp.gmc1(dest_y, ptr, linesize, 16, + motion_x & 15, motion_y & 15, 128 - s->no_rounding); + s->mdsp.gmc1(dest_y + 8, ptr + 8, linesize, 16, + motion_x & 15, motion_y & 15, 128 - s->no_rounding); + } else { + int dxy; + + dxy = ((motion_x >> 3) & 1) | ((motion_y >> 2) & 2); + if (s->no_rounding) { + s->hdsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16); + } else { + s->hdsp.put_pixels_tab[0][dxy](dest_y, ptr, linesize, 16); + } + } + + if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) + return; + + motion_x = s->sprite_offset[1][0]; + motion_y = s->sprite_offset[1][1]; + src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy + 1)); + src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy + 1)); + motion_x *= 1 << (3 - s->sprite_warping_accuracy); + motion_y *= 1 << (3 - s->sprite_warping_accuracy); + src_x = av_clip(src_x, -8, s->width >> 1); + if (src_x == s->width >> 1) + motion_x = 0; + src_y = av_clip(src_y, -8, s->height >> 1); + if (src_y == s->height >> 1) + motion_y = 0; + + offset = (src_y * uvlinesize) + src_x; + ptr = ref_picture[1] + offset; + if ((unsigned)src_x >= FFMAX((s->h_edge_pos >> 1) - 9, 0) || + (unsigned)src_y >= FFMAX((s->v_edge_pos >> 1) - 9, 0)) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, + uvlinesize, uvlinesize, + 9, 9, + src_x, src_y, + s->h_edge_pos >> 1, s->v_edge_pos >> 1); + ptr = s->sc.edge_emu_buffer; + emu = 1; + } + s->mdsp.gmc1(dest_cb, ptr, uvlinesize, 8, + motion_x & 15, motion_y & 15, 128 - s->no_rounding); + + ptr = ref_picture[2] + offset; + if (emu) { + s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, + uvlinesize, uvlinesize, + 9, 9, + src_x, src_y, + s->h_edge_pos >> 1, s->v_edge_pos >> 1); + ptr = s->sc.edge_emu_buffer; + } + s->mdsp.gmc1(dest_cr, ptr, uvlinesize, 8, + motion_x & 15, motion_y & 15, 128 - s->no_rounding); +} + +static void gmc_motion(MpegEncContext *s, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t *const *ref_picture) +{ + const uint8_t *ptr; + int linesize, uvlinesize; + const int a = s->sprite_warping_accuracy; + int ox, oy; + + linesize = s->linesize; + uvlinesize = s->uvlinesize; + + ptr = ref_picture[0]; + + ox = s->sprite_offset[0][0] + s->sprite_delta[0][0] * s->mb_x * 16 + + s->sprite_delta[0][1] * s->mb_y * 16; + oy = s->sprite_offset[0][1] + s->sprite_delta[1][0] * s->mb_x * 16 + + s->sprite_delta[1][1] * s->mb_y * 16; + + s->mdsp.gmc(dest_y, ptr, linesize, 16, + ox, oy, + s->sprite_delta[0][0], s->sprite_delta[0][1], + s->sprite_delta[1][0], s->sprite_delta[1][1], + a + 1, (1 << (2 * a + 1)) - s->no_rounding, + s->h_edge_pos, s->v_edge_pos); + s->mdsp.gmc(dest_y + 8, ptr, linesize, 16, + ox + s->sprite_delta[0][0] * 8, + oy + s->sprite_delta[1][0] * 8, + s->sprite_delta[0][0], s->sprite_delta[0][1], + s->sprite_delta[1][0], s->sprite_delta[1][1], + a + 1, (1 << (2 * a + 1)) - s->no_rounding, + s->h_edge_pos, s->v_edge_pos); + + if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) + return; + + ox = s->sprite_offset[1][0] + s->sprite_delta[0][0] * s->mb_x * 8 + + s->sprite_delta[0][1] * s->mb_y * 8; + oy = s->sprite_offset[1][1] + s->sprite_delta[1][0] * s->mb_x * 8 + + s->sprite_delta[1][1] * s->mb_y * 8; + + ptr = ref_picture[1]; + s->mdsp.gmc(dest_cb, ptr, uvlinesize, 8, + ox, oy, + s->sprite_delta[0][0], s->sprite_delta[0][1], + s->sprite_delta[1][0], s->sprite_delta[1][1], + a + 1, (1 << (2 * a + 1)) - s->no_rounding, + (s->h_edge_pos + 1) >> 1, (s->v_edge_pos + 1) >> 1); + + ptr = ref_picture[2]; + s->mdsp.gmc(dest_cr, ptr, uvlinesize, 8, + ox, oy, + s->sprite_delta[0][0], s->sprite_delta[0][1], + s->sprite_delta[1][0], s->sprite_delta[1][1], + a + 1, (1 << (2 * a + 1)) - s->no_rounding, + (s->h_edge_pos + 1) >> 1, (s->v_edge_pos + 1) >> 1); +} + +void ff_mpeg4_mcsel_motion(MpegEncContext *s, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t *const *ref_picture) +{ + if (s->real_sprite_warping_points == 1) { + gmc1_motion(s, dest_y, dest_cb, dest_cr, + ref_picture); + } else { + gmc_motion(s, dest_y, dest_cb, dest_cr, + ref_picture); + } +} + void ff_mpeg4_decode_studio(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int block_size, int uvlinesize, int dct_linesize, int dct_offset) diff --git a/libavcodec/mpeg4videodec.h b/libavcodec/mpeg4videodec.h index 65d846aed0..8d1e121b67 100644 --- a/libavcodec/mpeg4videodec.h +++ b/libavcodec/mpeg4videodec.h @@ -87,6 +87,9 @@ int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, void ff_mpeg4_decode_studio(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int block_size, int uvlinesize, int dct_linesize, int dct_offset); +void ff_mpeg4_mcsel_motion(MpegEncContext *s, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t *const *ref_picture); int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx); int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx); int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx); diff --git a/libavcodec/mpegvideo_motion.c b/libavcodec/mpegvideo_motion.c index fe3bfc4454..8922f5b1a5 100644 --- a/libavcodec/mpegvideo_motion.c +++ b/libavcodec/mpegvideo_motion.c @@ -31,164 +31,10 @@ #include "h261.h" #include "mpegutils.h" #include "mpegvideo.h" +#include "mpeg4videodec.h" #include "qpeldsp.h" #include "wmv2.h" -static void gmc1_motion(MpegEncContext *s, - uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, - uint8_t *const *ref_picture) -{ - const uint8_t *ptr; - int src_x, src_y, motion_x, motion_y; - ptrdiff_t offset, linesize, uvlinesize; - int emu = 0; - - motion_x = s->sprite_offset[0][0]; - motion_y = s->sprite_offset[0][1]; - src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy + 1)); - src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy + 1)); - motion_x *= 1 << (3 - s->sprite_warping_accuracy); - motion_y *= 1 << (3 - s->sprite_warping_accuracy); - src_x = av_clip(src_x, -16, s->width); - if (src_x == s->width) - motion_x = 0; - src_y = av_clip(src_y, -16, s->height); - if (src_y == s->height) - motion_y = 0; - - linesize = s->linesize; - uvlinesize = s->uvlinesize; - - ptr = ref_picture[0] + src_y * linesize + src_x; - - if ((unsigned)src_x >= FFMAX(s->h_edge_pos - 17, 0) || - (unsigned)src_y >= FFMAX(s->v_edge_pos - 17, 0)) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, - linesize, linesize, - 17, 17, - src_x, src_y, - s->h_edge_pos, s->v_edge_pos); - ptr = s->sc.edge_emu_buffer; - } - - if ((motion_x | motion_y) & 7) { - s->mdsp.gmc1(dest_y, ptr, linesize, 16, - motion_x & 15, motion_y & 15, 128 - s->no_rounding); - s->mdsp.gmc1(dest_y + 8, ptr + 8, linesize, 16, - motion_x & 15, motion_y & 15, 128 - s->no_rounding); - } else { - int dxy; - - dxy = ((motion_x >> 3) & 1) | ((motion_y >> 2) & 2); - if (s->no_rounding) { - s->hdsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16); - } else { - s->hdsp.put_pixels_tab[0][dxy](dest_y, ptr, linesize, 16); - } - } - - if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) - return; - - motion_x = s->sprite_offset[1][0]; - motion_y = s->sprite_offset[1][1]; - src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy + 1)); - src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy + 1)); - motion_x *= 1 << (3 - s->sprite_warping_accuracy); - motion_y *= 1 << (3 - s->sprite_warping_accuracy); - src_x = av_clip(src_x, -8, s->width >> 1); - if (src_x == s->width >> 1) - motion_x = 0; - src_y = av_clip(src_y, -8, s->height >> 1); - if (src_y == s->height >> 1) - motion_y = 0; - - offset = (src_y * uvlinesize) + src_x; - ptr = ref_picture[1] + offset; - if ((unsigned)src_x >= FFMAX((s->h_edge_pos >> 1) - 9, 0) || - (unsigned)src_y >= FFMAX((s->v_edge_pos >> 1) - 9, 0)) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, - uvlinesize, uvlinesize, - 9, 9, - src_x, src_y, - s->h_edge_pos >> 1, s->v_edge_pos >> 1); - ptr = s->sc.edge_emu_buffer; - emu = 1; - } - s->mdsp.gmc1(dest_cb, ptr, uvlinesize, 8, - motion_x & 15, motion_y & 15, 128 - s->no_rounding); - - ptr = ref_picture[2] + offset; - if (emu) { - s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, ptr, - uvlinesize, uvlinesize, - 9, 9, - src_x, src_y, - s->h_edge_pos >> 1, s->v_edge_pos >> 1); - ptr = s->sc.edge_emu_buffer; - } - s->mdsp.gmc1(dest_cr, ptr, uvlinesize, 8, - motion_x & 15, motion_y & 15, 128 - s->no_rounding); -} - -static void gmc_motion(MpegEncContext *s, - uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, - uint8_t *const *ref_picture) -{ - const uint8_t *ptr; - int linesize, uvlinesize; - const int a = s->sprite_warping_accuracy; - int ox, oy; - - linesize = s->linesize; - uvlinesize = s->uvlinesize; - - ptr = ref_picture[0]; - - ox = s->sprite_offset[0][0] + s->sprite_delta[0][0] * s->mb_x * 16 + - s->sprite_delta[0][1] * s->mb_y * 16; - oy = s->sprite_offset[0][1] + s->sprite_delta[1][0] * s->mb_x * 16 + - s->sprite_delta[1][1] * s->mb_y * 16; - - s->mdsp.gmc(dest_y, ptr, linesize, 16, - ox, oy, - s->sprite_delta[0][0], s->sprite_delta[0][1], - s->sprite_delta[1][0], s->sprite_delta[1][1], - a + 1, (1 << (2 * a + 1)) - s->no_rounding, - s->h_edge_pos, s->v_edge_pos); - s->mdsp.gmc(dest_y + 8, ptr, linesize, 16, - ox + s->sprite_delta[0][0] * 8, - oy + s->sprite_delta[1][0] * 8, - s->sprite_delta[0][0], s->sprite_delta[0][1], - s->sprite_delta[1][0], s->sprite_delta[1][1], - a + 1, (1 << (2 * a + 1)) - s->no_rounding, - s->h_edge_pos, s->v_edge_pos); - - if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) - return; - - ox = s->sprite_offset[1][0] + s->sprite_delta[0][0] * s->mb_x * 8 + - s->sprite_delta[0][1] * s->mb_y * 8; - oy = s->sprite_offset[1][1] + s->sprite_delta[1][0] * s->mb_x * 8 + - s->sprite_delta[1][1] * s->mb_y * 8; - - ptr = ref_picture[1]; - s->mdsp.gmc(dest_cb, ptr, uvlinesize, 8, - ox, oy, - s->sprite_delta[0][0], s->sprite_delta[0][1], - s->sprite_delta[1][0], s->sprite_delta[1][1], - a + 1, (1 << (2 * a + 1)) - s->no_rounding, - (s->h_edge_pos + 1) >> 1, (s->v_edge_pos + 1) >> 1); - - ptr = ref_picture[2]; - s->mdsp.gmc(dest_cr, ptr, uvlinesize, 8, - ox, oy, - s->sprite_delta[0][0], s->sprite_delta[0][1], - s->sprite_delta[1][0], s->sprite_delta[1][1], - a + 1, (1 << (2 * a + 1)) - s->no_rounding, - (s->h_edge_pos + 1) >> 1, (s->v_edge_pos + 1) >> 1); -} - static inline int hpel_motion(MpegEncContext *s, uint8_t *dest, uint8_t *src, int src_x, int src_y, @@ -849,14 +695,8 @@ static av_always_inline void mpv_motion_internal(MpegEncContext *s, switch (s->mv_type) { case MV_TYPE_16X16: - if (!is_mpeg12 && s->mcsel) { - if (s->real_sprite_warping_points == 1) { - gmc1_motion(s, dest_y, dest_cb, dest_cr, - ref_picture); - } else { - gmc_motion(s, dest_y, dest_cb, dest_cr, - ref_picture); - } + if (CONFIG_MPEG4_DECODER && !is_mpeg12 && s->mcsel) { + ff_mpeg4_mcsel_motion(s, dest_y, dest_cb, dest_cr, ref_picture); } else if (!is_mpeg12 && s->quarter_sample) { qpel_motion(s, dest_y, dest_cb, dest_cr, 0, 0, 0,