From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id CB4D645AAD for ; Wed, 15 Mar 2023 17:18:54 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BB56D68BE62; Wed, 15 Mar 2023 19:18:53 +0200 (EET) Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02olkn2047.outbound.protection.outlook.com [40.92.49.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6D99768BC49 for ; Wed, 15 Mar 2023 19:18:47 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iqGciRKvkz1SkXwIKx6fmTZJVeNGp8xmcgoWXYK9f68WbCxJeMyNKcTYIrgoy2Wa57911zlD2xU4u2glDH1z4jMYuVjdoQA5GXe0Gh7nVV1a5sTIgwhl3VSCNpIw1Vg9spFma1lMl9PCDIvDDmMGA/JL4OFEjpGOZg7fpIgEO4xUyiqFXPaVE0dP+EEDEEF1pzPwtUouNr9yS9SEbW+3FOAq67FBlCBp7DQZ+X5cjU8b22WY38rOlXLZeyhD5O+nP6Q6IuV1dw1o03AXuqEfo2Ko4tAENXQalYN35jKqCiHLpTldoeRSNh6LV3wMV58N5/zXHEGYb9QjxfT9ASlAAQ== 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=m1JSFYi1Exs5jxAPwNB4P62+N+wEn8vCh+8yB4grFmc=; b=KI1Sk7GAIOaABjnOpl0B5L4+nO0uSaUK9Flr7zb5iKVm8IGsWg5cFy+PX8aSCqJkzyNvMthjS1zMcandvPt1vtE96SFSPgBHXEdfsCO8xYAg2SHMFA6NgoG8516Ok5ZqH69j2GuA9A7J4V9FH1/siD6yDBxqMhymUjnkqy+pqRbpy/EdROO/7v604vOjMPivHcqJkiOOttcZ+30NqtodV2GXTDp7+BkRv1eIE7xYN7pKMvsQ0DvIR0SbwFVHQ6RsZjcovc/LWgH4f7ctJiJd8zBzRcqNSu9rA0UiriDT3cGK6hJrDSvC5U7WO7H7v3Gh/oF5i4gQOkZ+y2mjXfwgtw== 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=m1JSFYi1Exs5jxAPwNB4P62+N+wEn8vCh+8yB4grFmc=; b=A1ttraM8yF8FqS3FfwsayY2vJTTiY1YR41JsRRwrBlhYs0YHooOOXwf5ASQ9zTdM4T8nL8+uYdlOe/UiRXqbEiTtagMTPqbhhAELFdn4b/Zm2blM1U9mJRf3zu6rwWPnuoW6uFzaDg3C4PP0uwozS1VV4KTrZ+0BUqyBXGWoWKXuM9O5KBtPGc/Qa5r1MLFdJ3C7NqE1ryNK6hq/XySdNynO4H/Jl+6yifT6PzKFHlr/B7TB8jPfqmg1HrziGC1i+b4lzLEXuvMlcjWFRGKMo9tdOEhhfszTx8736NHaY2F00c5FsLPReVvd4yQwSSRn3tI/48pgFlE3y/R4qIJKoA== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DB9P250MB0473.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:33e::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.29; Wed, 15 Mar 2023 17:18:45 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::73a:bd4b:26f3:cc2b]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::73a:bd4b:26f3:cc2b%3]) with mapi id 15.20.6178.015; Wed, 15 Mar 2023 17:18:45 +0000 Message-ID: Date: Wed, 15 Mar 2023 18:19:21 +0100 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Andreas Rheinhardt In-Reply-To: X-TMN: [PKFBGWc3Dh0m2FaLoMDyU4qCYJ9vL7aFvF8k2ZZObxw=] X-ClientProxiedBy: ZR2P278CA0022.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:46::7) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <846286ef-73d1-0102-0606-dcddacbd6423@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DB9P250MB0473:EE_ X-MS-Office365-Filtering-Correlation-Id: bf3a17c5-068d-4eff-a272-08db257954f0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FVmBROwRIOEZ7cYLWiemw10tpbBkvqHushLcfY8ZdN/mLeUwkT2oS4VWR8wdy6p449K5kF35EsuJux4SwSvWE74Sy9Dx6JFGn3nbbnMEGEs8b/o1xtDgxWHMSRLiUWvK4uZ/84my02mm1ivYBYoxfoq20ArM58M/jfSRCM9rUEntvGgCr9FQnYw7h/9mOko2jjaTInGzOV1i7W8PiFmQwEQsI1c+2sIND86avmjGjXUE+/C8qpEqRihDovX/k78gi3Rxzffc1oh6sW90i2JJ5zSCWVQlG08sgf7QLH9/upKYJ/BYjT7ENW0ARj6d3e474RiApMLjOSMaG0B06UjLE4NgWWLDJM5zSd2H/5u0cqe9NQ3GA2etVWcZgRGXmuOd0pIFVMkLfERSrcjNTw0IyUIyMOVipxuhHN3ekQzeyh9VLSs1recmYoFsCDMEEX9IRr0p9LRnA9HpXxHZIcNLZamgBPINtIvAZxXUaRazMtXDuALvEthg6gwtiUJIfTneNrlwGIWXOGS/VgON3CuAEllMbrmf97qwGHuuUr+zJNnEIZsG/dy+zJMDAHLlGK+kKB4H5SmGJWS5jZQXuOeGQ/+mFE/FI/whI8isSDZG6crh4CVKPKvV4QFlT/+lDJPYWbdasTZ7PYCR7bFbkR0WRYgrCU+r5PhBnAgeZLIs3yo= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MEJ4citHYnNhdzlGM1g0YlVoY3JJSWZ1QTMxSlVxS3BVcDg4MlNudXJUTFFv?= =?utf-8?B?YW1DTmo3dnYxOTQxS08zWlhCSTZ1c0RmcnRqVnJpaXR3NE8rT2Z5bTFNU2tq?= =?utf-8?B?Y0pEZWNJN1NoSUR1RThFVTh6b2FZTmhkemNMaENUZElVUk51MnRJRWMxTUtW?= =?utf-8?B?UmFNVEVsTm01b3pkU1lZYnl2emcrR2oyaTFQaTRxbG5zRXhkYm0wVDAyajQ3?= =?utf-8?B?V3VmdXBuK1lMMHMxNU1vNnRndWU5YXgyVG44YVROU283S2IxcTN1SG15SjAr?= =?utf-8?B?dm91YXVjdXJBdUJqUjAzRisxdlhQQktLVXhzTE1DSmFvL1gxWXUyYnhrL2Rk?= =?utf-8?B?U3BBWUV3Y3htUk84blVPUE1WTkVmbzY5YVkyVWlOTnhuZGF4U0cyenRUM2Zh?= =?utf-8?B?UFdlMWxRMTRiRHYzOU9NYytFMkZsd1FycTVvTTVkaDc0ek8vcC8rVytmVmMz?= =?utf-8?B?NnhhLzU3dW52dDJacmplL3laNXpibHZHdlVxRGs5ekpkbFBVMmxJczg0UzJv?= =?utf-8?B?OFZvM3hIMnM5WjRlNndFdFM2b3RoSlBobE5OWlB2M1NxdWJ4UGZIWFBpVVZp?= =?utf-8?B?WXpGL0xSVVkxS0U1Q0VCQWk1dkFWZXBxZ3pBZkFwTnFabmFGbFRZalo5OVhp?= =?utf-8?B?NTNaR0NvK2FiN1BNZTJza2NvNnNjRklmQU1qNWtPRGpoRDNqZUxVUjlBUjV5?= =?utf-8?B?TmFSYVhqMW82Q1F6cUxybHFnZEMydUp3SGpRUkJqalo4aWIyc3o2ZDhrL1ps?= =?utf-8?B?aCtWdnc3TXg5OXZSdzNkYVdmelBwc2o3SVNGSzYxTHVwU3pvTkY5WnJIZVEy?= =?utf-8?B?NC9xVkM0V1JjMUhGemsrK2M1d3ltZU9KdHk2Qm1lamV5SlFIRDlTZG5BNXJE?= =?utf-8?B?VzdFL2FkclhHaC9XYkREeXBOMy9hM3Vjb09NdnlhKzN1MkVnclI5TERNZ2pN?= =?utf-8?B?Z0R2aVY2OXA4TWFMMEpTQUxxN21KTzQ5Zi9iU01BTnJSRUFCN0pOVVFtWnNM?= =?utf-8?B?aTJrbnpBN2pzZ3p6aWFkQzluT1FNVU84Sy9MNVhNcXVTNncxMnhncGxVVzFo?= =?utf-8?B?SVBHUmdiZDQzdWt6WWVxZGs3N25WVDRCaWdKbmxRTERJTXowcjFJM1NQNm02?= =?utf-8?B?NlpEUENuemh6bno0SHFVR2dmK0llTFFxZDBPSTFMVlluSGxNbWRIMGxQcUxy?= =?utf-8?B?OU9PMTdEVjBsNVJhNlVHc0tuMWN6RkVmNUtuMWNCWlVmSUhkZHoyTFZXUzUw?= =?utf-8?B?T1g1c1M2K2c4R1g5VldnbERXeVZHWlJmUkFZdUU0Umk5V2VNbEc2c1U5L1o5?= =?utf-8?B?dUUzUHlDSE02emVZbXR0N01LTTMwcE9MUHJXaXdIZE0zRVRpeWEzSzJUZTFl?= =?utf-8?B?RFdvdklXSytLUC9Pa3NCYktxSlBGanpYWHBLb01STTZMR2VGWkFiVG1UQXBW?= =?utf-8?B?b3o0NXhaSHUwSzQzb1FrVjZqV3JUYThzOXl2STRVZ0o0U3kxV1FwSURWTlNi?= =?utf-8?B?Z0laUi9zTXJxcXVYNUlCUTVxbTRLUG5hRVQyVnJWSDBJTzJCOENKM2NkaE0w?= =?utf-8?B?NFdpRi9FVDVuaEFrc0JGc2t3QTBlUk1mSnlnMTkwVDU1YmZ3bGRkTHpNNHNy?= =?utf-8?B?MjI1ZjJuZDN0WlkwaVlIZCtDL082V21YblN0cHZ6RXlSTmxmMVRRVDFJZ240?= =?utf-8?B?L2VXaVRuVXpWcXk0T3Y4ZUROR1ZwQ2ZyZmtUZm5ubFZocVlveXlLQkhRZXF6?= =?utf-8?Q?dZcvHc8rAaKgDipm4RKvkl2KvABOOzb8duMCRGM?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bf3a17c5-068d-4eff-a272-08db257954f0 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Mar 2023 17:18:45.1883 (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: DB9P250MB0473 Subject: Re: [FFmpeg-devel] [PATCH] avfilter: Remove mcdeint, uspp filters 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Andreas Rheinhardt: > These filters have been disabled two years ago in commit > 95054bfa48cc71db1c7bf66a6b6628cb62f262bf at the major bump > before the last major bump. No one stepped up to port them, > so this commit removes them. > > Signed-off-by: Andreas Rheinhardt > --- > LICENSE.md | 2 - > configure | 10 - > doc/filters.texi | 73 ---- > libavfilter/Makefile | 2 - > libavfilter/allfilters.c | 2 - > libavfilter/vf_mcdeint.c | 303 ---------------- > libavfilter/vf_uspp.c | 498 --------------------------- > tests/fate/filter-video.mak | 8 - > tests/ref/fate/filter-mcdeint-fast | 35 -- > tests/ref/fate/filter-mcdeint-medium | 35 -- > 10 files changed, 968 deletions(-) > delete mode 100644 libavfilter/vf_mcdeint.c > delete mode 100644 libavfilter/vf_uspp.c > delete mode 100644 tests/ref/fate/filter-mcdeint-fast > delete mode 100644 tests/ref/fate/filter-mcdeint-medium > > diff --git a/LICENSE.md b/LICENSE.md > index 613070e1b6..7e5ad9f7e4 100644 > --- a/LICENSE.md > +++ b/LICENSE.md > @@ -39,7 +39,6 @@ Specifically, the GPL parts of FFmpeg are: > - `vf_hqdn3d.c` > - `vf_kerndeint.c` > - `vf_lensfun.c` (GPL version 3 or later) > - - `vf_mcdeint.c` > - `vf_mpdecimate.c` > - `vf_nnedi.c` > - `vf_owdenoise.c` > @@ -56,7 +55,6 @@ Specifically, the GPL parts of FFmpeg are: > - `vf_stereo3d.c` > - `vf_super2xsai.c` > - `vf_tinterlace.c` > - - `vf_uspp.c` > - `vf_vaguedenoiser.c` > - `vsrc_mptestsrc.c` > > diff --git a/configure b/configure > index 03d3c429a5..6bc7a4382f 100755 > --- a/configure > +++ b/configure > @@ -3686,7 +3686,6 @@ ladspa_filter_deps="ladspa libdl" > lensfun_filter_deps="liblensfun version3" > libplacebo_filter_deps="libplacebo vulkan" > lv2_filter_deps="lv2" > -mcdeint_filter_deps="avcodec gpl" > metadata_filter_deps="avformat" > movie_filter_deps="avcodec avformat" > mpdecimate_filter_deps="gpl" > @@ -3752,7 +3751,6 @@ transpose_opencl_filter_deps="opencl" > transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags" > transpose_vulkan_filter_deps="vulkan spirv_compiler" > unsharp_opencl_filter_deps="opencl" > -uspp_filter_deps="gpl avcodec" > vaguedenoiser_filter_deps="gpl" > vflip_vulkan_filter_deps="vulkan spirv_compiler" > vidstabdetect_filter_deps="libvidstab" > @@ -7355,12 +7353,6 @@ esac > > enable frame_thread_encoder > > -# these filters depend on removed avcodec APIs > -# they are kept disabled for now, but will be removed if > -# nobody updates and re-enables them > -disable mcdeint_filter > -disable uspp_filter > - > enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; } > > check_deps $CONFIG_LIST \ > @@ -7470,7 +7462,6 @@ enabled cover_rect_filter && prepend avfilter_deps "avformat avcodec" > enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample" > enabled elbg_filter && prepend avfilter_deps "avcodec" > enabled find_rect_filter && prepend avfilter_deps "avformat avcodec" > -enabled mcdeint_filter && prepend avfilter_deps "avcodec" > enabled movie_filter && prepend avfilter_deps "avformat avcodec" > enabled pan_filter && prepend avfilter_deps "swresample" > enabled pp_filter && prepend avfilter_deps "postproc" > @@ -7484,7 +7475,6 @@ enabled smartblur_filter && prepend avfilter_deps "swscale" > enabled spp_filter && prepend avfilter_deps "avcodec" > enabled sr_filter && prepend avfilter_deps "avformat swscale" > enabled subtitles_filter && prepend avfilter_deps "avformat avcodec" > -enabled uspp_filter && prepend avfilter_deps "avcodec" > enabled zoompan_filter && prepend avfilter_deps "swscale" > > enabled lavfi_indev && prepend avdevice_deps "avfilter" > diff --git a/doc/filters.texi b/doc/filters.texi > index 7a7b2ba4e7..e8826ba2a3 100644 > --- a/doc/filters.texi > +++ b/doc/filters.texi > @@ -16984,52 +16984,6 @@ Typically useful for scene changes when used in combination with @code{tblend} f > > This filter supports the all above options as @ref{commands}. > > -@section mcdeint > - > -Apply motion-compensation deinterlacing. > - > -It needs one field per frame as input and must thus be used together > -with yadif=1/3 or equivalent. > - > -This filter is only available in ffmpeg version 4.4 or earlier. > - > -This filter accepts the following options: > -@table @option > -@item mode > -Set the deinterlacing mode. > - > -It accepts one of the following values: > -@table @samp > -@item fast > -@item medium > -@item slow > -use iterative motion estimation > -@item extra_slow > -like @samp{slow}, but use multiple reference frames. > -@end table > -Default value is @samp{fast}. > - > -@item parity > -Set the picture field parity assumed for the input video. It must be > -one of the following values: > - > -@table @samp > -@item 0, tff > -assume top field first > -@item 1, bff > -assume bottom field first > -@end table > - > -Default value is @samp{bff}. > - > -@item qp > -Set per-block quantization parameter (QP) used by the internal > -encoder. > - > -Higher values should result in a smoother motion vector field but less > -optimal individual vectors. Default value is 1. > -@end table > - > @section median > > Pick median pixel from certain rectangle defined by radius. > @@ -23342,33 +23296,6 @@ ffmpeg -r 1 -i image.jpg -vf untile=1x25 movie.mkv > @end example > @end itemize > > -@section uspp > - > -Apply ultra slow/simple postprocessing filter that compresses and decompresses > -the image at several (or - in the case of @option{quality} level @code{8} - all) > -shifts and average the results. > - > -The way this differs from the behavior of spp is that uspp actually encodes & > -decodes each case with libavcodec Snow, whereas spp uses a simplified intra only 8x8 > -DCT similar to MJPEG. > - > -This filter is only available in ffmpeg version 4.4 or earlier. > - > -The filter accepts the following options: > - > -@table @option > -@item quality > -Set quality. This option defines the number of levels for averaging. It accepts > -an integer in the range 0-8. If set to @code{0}, the filter will have no > -effect. A value of @code{8} means the higher quality. For each increment of > -that value the speed drops by a factor of approximately 2. Default value is > -@code{3}. > - > -@item qp > -Force a constant quantization parameter. If not set, the filter will use the QP > -from the video stream (if available). > -@end table > - > @section v360 > > Convert 360 videos between various formats. > diff --git a/libavfilter/Makefile b/libavfilter/Makefile > index b3d3d981dd..8b0b908617 100644 > --- a/libavfilter/Makefile > +++ b/libavfilter/Makefile > @@ -370,7 +370,6 @@ OBJS-$(CONFIG_MASKEDMERGE_FILTER) += vf_maskedmerge.o framesync.o > OBJS-$(CONFIG_MASKEDMIN_FILTER) += vf_maskedminmax.o framesync.o > OBJS-$(CONFIG_MASKEDTHRESHOLD_FILTER) += vf_maskedthreshold.o framesync.o > OBJS-$(CONFIG_MASKFUN_FILTER) += vf_maskfun.o > -OBJS-$(CONFIG_MCDEINT_FILTER) += vf_mcdeint.o > OBJS-$(CONFIG_MEDIAN_FILTER) += vf_median.o > OBJS-$(CONFIG_MERGEPLANES_FILTER) += vf_mergeplanes.o framesync.o > OBJS-$(CONFIG_MESTIMATE_FILTER) += vf_mestimate.o motion_estimation.o > @@ -522,7 +521,6 @@ OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o > OBJS-$(CONFIG_UNSHARP_OPENCL_FILTER) += vf_unsharp_opencl.o opencl.o \ > opencl/unsharp.o > OBJS-$(CONFIG_UNTILE_FILTER) += vf_untile.o > -OBJS-$(CONFIG_USPP_FILTER) += vf_uspp.o qp_table.o > OBJS-$(CONFIG_V360_FILTER) += vf_v360.o > OBJS-$(CONFIG_VAGUEDENOISER_FILTER) += vf_vaguedenoiser.o > OBJS-$(CONFIG_VARBLUR_FILTER) += vf_varblur.o framesync.o > diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c > index d7db46c2af..f4b36e88d6 100644 > --- a/libavfilter/allfilters.c > +++ b/libavfilter/allfilters.c > @@ -348,7 +348,6 @@ extern const AVFilter ff_vf_maskedmerge; > extern const AVFilter ff_vf_maskedmin; > extern const AVFilter ff_vf_maskedthreshold; > extern const AVFilter ff_vf_maskfun; > -extern const AVFilter ff_vf_mcdeint; > extern const AVFilter ff_vf_median; > extern const AVFilter ff_vf_mergeplanes; > extern const AVFilter ff_vf_mestimate; > @@ -491,7 +490,6 @@ extern const AVFilter ff_vf_unpremultiply; > extern const AVFilter ff_vf_unsharp; > extern const AVFilter ff_vf_unsharp_opencl; > extern const AVFilter ff_vf_untile; > -extern const AVFilter ff_vf_uspp; > extern const AVFilter ff_vf_v360; > extern const AVFilter ff_vf_vaguedenoiser; > extern const AVFilter ff_vf_varblur; > diff --git a/libavfilter/vf_mcdeint.c b/libavfilter/vf_mcdeint.c > deleted file mode 100644 > index e747521c0a..0000000000 > --- a/libavfilter/vf_mcdeint.c > +++ /dev/null > @@ -1,303 +0,0 @@ > -/* > - * Copyright (c) 2006 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 General Public License as published by > - * the Free Software Foundation; either version 2 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 General Public License for more details. > - * > - * You should have received a copy of the GNU 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. > - */ > - > -/** > - * @file > - * Motion Compensation Deinterlacer > - * Ported from MPlayer libmpcodecs/vf_mcdeint.c. > - * > - * Known Issues: > - * > - * The motion estimation is somewhat at the mercy of the input, if the > - * input frames are created purely based on spatial interpolation then > - * for example a thin black line or another random and not > - * interpolateable pattern will cause problems. > - * Note: completely ignoring the "unavailable" lines during motion > - * estimation did not look any better, so the most obvious solution > - * would be to improve tfields or penalize problematic motion vectors. > - * > - * If non iterative ME is used then snow currently ignores the OBMC > - * window and as a result sometimes creates artifacts. > - * > - * Only past frames are used, we should ideally use future frames too, > - * something like filtering the whole movie in forward and then > - * backward direction seems like an interesting idea but the current > - * filter framework is FAR from supporting such things. > - * > - * Combining the motion compensated image with the input image also is > - * not as trivial as it seems, simple blindly taking even lines from > - * one and odd ones from the other does not work at all as ME/MC > - * sometimes has nothing in the previous frames which matches the > - * current. The current algorithm has been found by trial and error > - * and almost certainly can be improved... > - */ > - > -#include "libavutil/opt.h" > -#include "libavutil/pixdesc.h" > -#include "libavcodec/avcodec.h" > -#include "avfilter.h" > -#include "formats.h" > -#include "internal.h" > - > -enum MCDeintMode { > - MODE_FAST = 0, > - MODE_MEDIUM, > - MODE_SLOW, > - MODE_EXTRA_SLOW, > - MODE_NB, > -}; > - > -enum MCDeintParity { > - PARITY_TFF = 0, ///< top field first > - PARITY_BFF = 1, ///< bottom field first > -}; > - > -typedef struct MCDeintContext { > - const AVClass *class; > - int mode; ///< MCDeintMode > - int parity; ///< MCDeintParity > - int qp; > - AVPacket *pkt; > - AVCodecContext *enc_ctx; > -} MCDeintContext; > - > -#define OFFSET(x) offsetof(MCDeintContext, x) > -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM > -#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit } > - > -static const AVOption mcdeint_options[] = { > - { "mode", "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_FAST}, 0, MODE_NB-1, FLAGS, .unit="mode" }, > - CONST("fast", NULL, MODE_FAST, "mode"), > - CONST("medium", NULL, MODE_MEDIUM, "mode"), > - CONST("slow", NULL, MODE_SLOW, "mode"), > - CONST("extra_slow", NULL, MODE_EXTRA_SLOW, "mode"), > - > - { "parity", "set the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=PARITY_BFF}, -1, 1, FLAGS, "parity" }, > - CONST("tff", "assume top field first", PARITY_TFF, "parity"), > - CONST("bff", "assume bottom field first", PARITY_BFF, "parity"), > - > - { "qp", "set qp", OFFSET(qp), AV_OPT_TYPE_INT, {.i64=1}, INT_MIN, INT_MAX, FLAGS }, > - { NULL } > -}; > - > -AVFILTER_DEFINE_CLASS(mcdeint); > - > -static int config_props(AVFilterLink *inlink) > -{ > - AVFilterContext *ctx = inlink->dst; > - MCDeintContext *mcdeint = ctx->priv; > - const AVCodec *enc; > - AVCodecContext *enc_ctx; > - AVDictionary *opts = NULL; > - int ret; > - > - if (!(enc = avcodec_find_encoder(AV_CODEC_ID_SNOW))) { > - av_log(ctx, AV_LOG_ERROR, "Snow encoder is not enabled in libavcodec\n"); > - return AVERROR(EINVAL); > - } > - > - mcdeint->pkt = av_packet_alloc(); > - if (!mcdeint->pkt) > - return AVERROR(ENOMEM); > - mcdeint->enc_ctx = avcodec_alloc_context3(enc); > - if (!mcdeint->enc_ctx) > - return AVERROR(ENOMEM); > - enc_ctx = mcdeint->enc_ctx; > - enc_ctx->width = inlink->w; > - enc_ctx->height = inlink->h; > - enc_ctx->time_base = (AVRational){1,25}; // meaningless > - enc_ctx->gop_size = INT_MAX; > - enc_ctx->max_b_frames = 0; > - enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P; > - enc_ctx->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY; > - enc_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; > - enc_ctx->global_quality = 1; > - enc_ctx->me_cmp = enc_ctx->me_sub_cmp = FF_CMP_SAD; > - enc_ctx->mb_cmp = FF_CMP_SSE; > - av_dict_set(&opts, "memc_only", "1", 0); > - av_dict_set(&opts, "no_bitstream", "1", 0); > - > - switch (mcdeint->mode) { > - case MODE_EXTRA_SLOW: > - enc_ctx->refs = 3; > - case MODE_SLOW: > - av_dict_set(&opts, "motion_est", "iter", 0); > - case MODE_MEDIUM: > - enc_ctx->flags |= AV_CODEC_FLAG_4MV; > - enc_ctx->dia_size = 2; > - case MODE_FAST: > - enc_ctx->flags |= AV_CODEC_FLAG_QPEL; > - } > - > - ret = avcodec_open2(enc_ctx, enc, &opts); > - av_dict_free(&opts); > - if (ret < 0) > - return ret; > - > - return 0; > -} > - > -static av_cold void uninit(AVFilterContext *ctx) > -{ > - MCDeintContext *mcdeint = ctx->priv; > - > - av_packet_free(&mcdeint->pkt); > - avcodec_free_context(&mcdeint->enc_ctx); > -} > - > -static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) > -{ > - MCDeintContext *mcdeint = inlink->dst->priv; > - AVFilterLink *outlink = inlink->dst->outputs[0]; > - AVFrame *outpic, *frame_dec; > - AVPacket *pkt = mcdeint->pkt; > - int x, y, i, ret, got_frame = 0; > - > - outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h); > - if (!outpic) { > - av_frame_free(&inpic); > - return AVERROR(ENOMEM); > - } > - av_frame_copy_props(outpic, inpic); > - inpic->quality = mcdeint->qp * FF_QP2LAMBDA; > - > - ret = avcodec_encode_video2(mcdeint->enc_ctx, pkt, inpic, &got_frame); > - if (ret < 0) > - goto end; > - > - frame_dec = mcdeint->enc_ctx->coded_frame; > - > - for (i = 0; i < 3; i++) { > - int is_chroma = !!i; > - int w = AV_CEIL_RSHIFT(inlink->w, is_chroma); > - int h = AV_CEIL_RSHIFT(inlink->h, is_chroma); > - int fils = frame_dec->linesize[i]; > - int srcs = inpic ->linesize[i]; > - int dsts = outpic ->linesize[i]; > - > - for (y = 0; y < h; y++) { > - if ((y ^ mcdeint->parity) & 1) { > - for (x = 0; x < w; x++) { > - uint8_t *filp = &frame_dec->data[i][x + y*fils]; > - uint8_t *srcp = &inpic ->data[i][x + y*srcs]; > - uint8_t *dstp = &outpic ->data[i][x + y*dsts]; > - > - if (y > 0 && y < h-1){ > - int is_edge = x < 3 || x > w-4; > - int diff0 = filp[-fils] - srcp[-srcs]; > - int diff1 = filp[+fils] - srcp[+srcs]; > - int temp = filp[0]; > - > -#define DELTA(j) av_clip(j, -x, w-1-x) > - > -#define GET_SCORE_EDGE(j)\ > - FFABS(srcp[-srcs+DELTA(-1+(j))] - srcp[+srcs+DELTA(-1-(j))])+\ > - FFABS(srcp[-srcs+DELTA(j) ] - srcp[+srcs+DELTA( -(j))])+\ > - FFABS(srcp[-srcs+DELTA(1+(j)) ] - srcp[+srcs+DELTA( 1-(j))]) > - > -#define GET_SCORE(j)\ > - FFABS(srcp[-srcs-1+(j)] - srcp[+srcs-1-(j)])+\ > - FFABS(srcp[-srcs +(j)] - srcp[+srcs -(j)])+\ > - FFABS(srcp[-srcs+1+(j)] - srcp[+srcs+1-(j)]) > - > -#define CHECK_EDGE(j)\ > - { int score = GET_SCORE_EDGE(j);\ > - if (score < spatial_score){\ > - spatial_score = score;\ > - diff0 = filp[-fils+DELTA(j)] - srcp[-srcs+DELTA(j)];\ > - diff1 = filp[+fils+DELTA(-(j))] - srcp[+srcs+DELTA(-(j))];\ > - > -#define CHECK(j)\ > - { int score = GET_SCORE(j);\ > - if (score < spatial_score){\ > - spatial_score= score;\ > - diff0 = filp[-fils+(j)] - srcp[-srcs+(j)];\ > - diff1 = filp[+fils-(j)] - srcp[+srcs-(j)];\ > - > - if (is_edge) { > - int spatial_score = GET_SCORE_EDGE(0) - 1; > - CHECK_EDGE(-1) CHECK_EDGE(-2) }} }} > - CHECK_EDGE( 1) CHECK_EDGE( 2) }} }} > - } else { > - int spatial_score = GET_SCORE(0) - 1; > - CHECK(-1) CHECK(-2) }} }} > - CHECK( 1) CHECK( 2) }} }} > - } > - > - > - if (diff0 + diff1 > 0) > - temp -= (diff0 + diff1 - FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2; > - else > - temp -= (diff0 + diff1 + FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2; > - *filp = *dstp = temp > 255U ? ~(temp>>31) : temp; > - } else { > - *dstp = *filp; > - } > - } > - } > - } > - > - for (y = 0; y < h; y++) { > - if (!((y ^ mcdeint->parity) & 1)) { > - for (x = 0; x < w; x++) { > - frame_dec->data[i][x + y*fils] = > - outpic ->data[i][x + y*dsts] = inpic->data[i][x + y*srcs]; > - } > - } > - } > - } > - mcdeint->parity ^= 1; > - > -end: > - av_packet_unref(pkt); > - av_frame_free(&inpic); > - if (ret < 0) { > - av_frame_free(&outpic); > - return ret; > - } > - return ff_filter_frame(outlink, outpic); > -} > - > -static const AVFilterPad mcdeint_inputs[] = { > - { > - .name = "default", > - .type = AVMEDIA_TYPE_VIDEO, > - .filter_frame = filter_frame, > - .config_props = config_props, > - }, > -}; > - > -static const AVFilterPad mcdeint_outputs[] = { > - { > - .name = "default", > - .type = AVMEDIA_TYPE_VIDEO, > - }, > -}; > - > -const AVFilter ff_vf_mcdeint = { > - .name = "mcdeint", > - .description = NULL_IF_CONFIG_SMALL("Apply motion compensating deinterlacing."), > - .priv_size = sizeof(MCDeintContext), > - .uninit = uninit, > - FILTER_INPUTS(mcdeint_inputs), > - FILTER_OUTPUTS(mcdeint_outputs), > - FILTER_SINGLE_PIXFMT(AV_PIX_FMT_YUV420P), > - .priv_class = &mcdeint_class, > -}; > diff --git a/libavfilter/vf_uspp.c b/libavfilter/vf_uspp.c > deleted file mode 100644 > index 051de00771..0000000000 > --- a/libavfilter/vf_uspp.c > +++ /dev/null > @@ -1,498 +0,0 @@ > -/* > - * Copyright (c) 2003 Michael Niedermayer > - * Copyright (c) 2014 Arwa Arif > - * > - * This file is part of FFmpeg. > - * > - * FFmpeg is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 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 General Public License for more details. > - * > - * You should have received a copy of the GNU 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. > - */ > - > -/** > - * @file > - * Ultra Slow/Simple Post-processing filter. > - * > - * Originally written by Michael Niedermayer for the MPlayer project, and > - * ported by Arwa Arif for FFmpeg. > - */ > - > -#include "libavutil/avassert.h" > -#include "libavutil/imgutils.h" > -#include "libavutil/mem_internal.h" > -#include "libavutil/opt.h" > -#include "libavutil/pixdesc.h" > -#include "libavutil/video_enc_params.h" > -#include "libavcodec/avcodec.h" > -#include "internal.h" > -#include "qp_table.h" > -#include "avfilter.h" > - > -#define MAX_LEVEL 8 /* quality levels */ > -#define BLOCK 16 > - > -typedef struct USPPContext { > - const AVClass *av_class; > - int log2_count; > - int hsub, vsub; > - int qp; > - enum AVVideoEncParamsType qscale_type; > - int temp_stride[3]; > - uint8_t *src[3]; > - uint16_t *temp[3]; > - int outbuf_size; > - uint8_t *outbuf; > - AVCodecContext *avctx_enc[BLOCK*BLOCK]; > - AVPacket *pkt; > - AVFrame *frame; > - AVFrame *frame_dec; > - int8_t *non_b_qp_table; > - int non_b_qp_stride; > - int use_bframe_qp; > -} USPPContext; > - > -#define OFFSET(x) offsetof(USPPContext, x) > -#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM > -static const AVOption uspp_options[] = { > - { "quality", "set quality", OFFSET(log2_count), AV_OPT_TYPE_INT, {.i64 = 3}, 0, MAX_LEVEL, FLAGS }, > - { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, FLAGS }, > - { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL,{.i64 = 0}, 0, 1, FLAGS }, > - { NULL } > -}; > - > -AVFILTER_DEFINE_CLASS(uspp); > - > -DECLARE_ALIGNED(8, static const uint8_t, dither)[8][8] = { > - { 0*4, 48*4, 12*4, 60*4, 3*4, 51*4, 15*4, 63*4, }, > - { 32*4, 16*4, 44*4, 28*4, 35*4, 19*4, 47*4, 31*4, }, > - { 8*4, 56*4, 4*4, 52*4, 11*4, 59*4, 7*4, 55*4, }, > - { 40*4, 24*4, 36*4, 20*4, 43*4, 27*4, 39*4, 23*4, }, > - { 2*4, 50*4, 14*4, 62*4, 1*4, 49*4, 13*4, 61*4, }, > - { 34*4, 18*4, 46*4, 30*4, 33*4, 17*4, 45*4, 29*4, }, > - { 10*4, 58*4, 6*4, 54*4, 9*4, 57*4, 5*4, 53*4, }, > - { 42*4, 26*4, 38*4, 22*4, 41*4, 25*4, 37*4, 21*4, }, > -}; > - > -static const uint8_t offset[511][2] = { > - { 0, 0}, > - { 0, 0}, { 8, 8}, // quality 1 > - { 0, 0}, { 4, 4}, {12, 8}, { 8,12}, // quality 2 > - { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, // quality 3 > - > - { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, > - { 5, 1}, {15, 3}, { 9, 5}, { 3, 7}, {13, 9}, { 7,11}, { 1,13}, {11,15}, // quality 4 > - > - { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, > - { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, > - { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, > - { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, // quality 5 > - > - { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, > - { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, > - { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, > - { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, > - { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, > - { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, > - { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, > - { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, // quality 6 > - > - { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, > - { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, > - { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, > - { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, > - { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10}, > - { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 2, 6}, {10, 6}, { 2,14}, {10,14}, > - { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11}, > - { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, > - { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, > - { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, > - { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, > - { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, > - { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, > - { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, > - { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, > - { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, // quality 7 > - > - { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, > - { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, > - { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, > - { 2, 6}, {10, 6}, { 2,14}, {10,14}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, > - { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, > - { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, > - { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 6, 4}, {14, 4}, { 6,12}, {14,12}, > - { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, > - { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, > - { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, > - { 3, 3}, {11, 3}, { 3,11}, {11,11}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, > - { 3, 7}, {11, 7}, { 3,15}, {11,15}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, > - { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, > - { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, // quality 8 > - { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 7, 5}, {15, 5}, { 7,13}, {15,13}, > - { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, > - { 0, 1}, { 8, 1}, { 0, 9}, { 8, 9}, { 4, 5}, {12, 5}, { 4,13}, {12,13}, > - { 0, 5}, { 8, 5}, { 0,13}, { 8,13}, { 4, 1}, {12, 1}, { 4, 9}, {12, 9}, > - { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, > - { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, > - { 0, 3}, { 8, 3}, { 0,11}, { 8,11}, { 4, 7}, {12, 7}, { 4,15}, {12,15}, > - { 0, 7}, { 8, 7}, { 0,15}, { 8,15}, { 4, 3}, {12, 3}, { 4,11}, {12,11}, > - { 2, 1}, {10, 1}, { 2, 9}, {10, 9}, { 6, 5}, {14, 5}, { 6,13}, {14,13}, > - { 2, 5}, {10, 5}, { 2,13}, {10,13}, { 6, 1}, {14, 1}, { 6, 9}, {14, 9}, > - { 1, 0}, { 9, 0}, { 1, 8}, { 9, 8}, { 5, 4}, {13, 4}, { 5,12}, {13,12}, > - { 1, 4}, { 9, 4}, { 1,12}, { 9,12}, { 5, 0}, {13, 0}, { 5, 8}, {13, 8}, > - { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, > - { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, > - { 1, 2}, { 9, 2}, { 1,10}, { 9,10}, { 5, 6}, {13, 6}, { 5,14}, {13,14}, > - { 1, 6}, { 9, 6}, { 1,14}, { 9,14}, { 5, 2}, {13, 2}, { 5,10}, {13,10}, > - { 3, 0}, {11, 0}, { 3, 8}, {11, 8}, { 7, 4}, {15, 4}, { 7,12}, {15,12}, > - { 3, 4}, {11, 4}, { 3,12}, {11,12}, { 7, 0}, {15, 0}, { 7, 8}, {15, 8}, > -}; > - > -static void store_slice_c(uint8_t *dst, const uint16_t *src, > - int dst_stride, int src_stride, > - int width, int height, int log2_scale) > -{ > - int y, x; > - > -#define STORE(pos) do { \ > - temp = ((src[x + y * src_stride + pos] << log2_scale) + d[pos]) >> 8; \ > - if (temp & 0x100) temp = ~(temp >> 31); \ > - dst[x + y * dst_stride + pos] = temp; \ > -} while (0) > - > - for (y = 0; y < height; y++) { > - const uint8_t *d = dither[y&7]; > - for (x = 0; x < width; x += 8) { > - int temp; > - STORE(0); > - STORE(1); > - STORE(2); > - STORE(3); > - STORE(4); > - STORE(5); > - STORE(6); > - STORE(7); > - } > - } > -} > - > -static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3], > - int dst_stride[3], int src_stride[3], int width, > - int height, uint8_t *qp_store, int qp_stride) > -{ > - int x, y, i, j; > - const int count = 1<log2_count; > - int ret; > - > - for (i = 0; i < 3; i++) { > - int is_chroma = !!i; > - int w = AV_CEIL_RSHIFT(width, is_chroma ? p->hsub : 0); > - int h = AV_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0); > - int stride = p->temp_stride[i]; > - int block = BLOCK >> (is_chroma ? p->hsub : 0); > - > - if (!src[i] || !dst[i]) > - continue; > - for (y = 0; y < h; y++) { > - int index = block + block * stride + y * stride; > - > - memcpy(p->src[i] + index, src[i] + y * src_stride[i], w ); > - for (x = 0; x < block; x++) { > - p->src[i][index - x - 1] = p->src[i][index + x ]; > - p->src[i][index + w + x ] = p->src[i][index + w - x - 1]; > - } > - } > - for (y = 0; y < block; y++) { > - memcpy(p->src[i] + ( block-1-y) * stride, p->src[i] + ( y+block ) * stride, stride); > - memcpy(p->src[i] + (h+block +y) * stride, p->src[i] + (h-y+block-1) * stride, stride); > - } > - > - p->frame->linesize[i] = stride; > - memset(p->temp[i], 0, (h + 2 * block) * stride * sizeof(int16_t)); > - } > - > - if (p->qp) > - p->frame->quality = p->qp * FF_QP2LAMBDA; > - else { > - int qpsum=0; > - int qpcount = (height>>4) * (height>>4); > - > - for (y = 0; y < (height>>4); y++) { > - for (x = 0; x < (width>>4); x++) > - qpsum += qp_store[x + y * qp_stride]; > - } > - p->frame->quality = ff_norm_qscale((qpsum + qpcount/2) / qpcount, p->qscale_type) * FF_QP2LAMBDA; > - } > -// init per MB qscale stuff FIXME > - p->frame->height = height + BLOCK; > - p->frame->width = width + BLOCK; > - > - for (i = 0; i < count; i++) { > - const int x1 = offset[i+count-1][0]; > - const int y1 = offset[i+count-1][1]; > - const int x1c = x1 >> p->hsub; > - const int y1c = y1 >> p->vsub; > - const int BLOCKc = BLOCK >> p->hsub; > - int offset; > - AVPacket *pkt = p->pkt; > - int got_pkt_ptr; > - > - av_packet_unref(pkt); > - pkt->data = p->outbuf; > - pkt->size = p->outbuf_size; > - > - p->frame->data[0] = p->src[0] + x1 + y1 * p->frame->linesize[0]; > - p->frame->data[1] = p->src[1] + x1c + y1c * p->frame->linesize[1]; > - p->frame->data[2] = p->src[2] + x1c + y1c * p->frame->linesize[2]; > - p->frame->format = p->avctx_enc[i]->pix_fmt; > - > - ret = avcodec_encode_video2(p->avctx_enc[i], pkt, p->frame, &got_pkt_ptr); > - if (ret < 0) { > - av_log(p->avctx_enc[i], AV_LOG_ERROR, "Encoding failed\n"); > - continue; > - } > - av_packet_unref(pkt); > - > - p->frame_dec = p->avctx_enc[i]->coded_frame; > - > - offset = (BLOCK-x1) + (BLOCK-y1) * p->frame_dec->linesize[0]; > - > - for (y = 0; y < height; y++) > - for (x = 0; x < width; x++) > - p->temp[0][x + y * p->temp_stride[0]] += p->frame_dec->data[0][x + y * p->frame_dec->linesize[0] + offset]; > - > - if (!src[2] || !dst[2]) > - continue; > - > - offset = (BLOCKc-x1c) + (BLOCKc-y1c) * p->frame_dec->linesize[1]; > - > - for (y = 0; y < AV_CEIL_RSHIFT(height, p->vsub); y++) { > - for (x = 0; x < AV_CEIL_RSHIFT(width, p->hsub); x++) { > - p->temp[1][x + y * p->temp_stride[1]] += p->frame_dec->data[1][x + y * p->frame_dec->linesize[1] + offset]; > - p->temp[2][x + y * p->temp_stride[2]] += p->frame_dec->data[2][x + y * p->frame_dec->linesize[2] + offset]; > - } > - } > - } > - > - for (j = 0; j < 3; j++) { > - int is_chroma = !!j; > - if (!dst[j]) > - continue; > - store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j], > - AV_CEIL_RSHIFT(width, is_chroma ? p->hsub : 0), > - AV_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0), > - 8-p->log2_count); > - } > -} > - > -static const enum AVPixelFormat pix_fmts[] = { > - AV_PIX_FMT_YUV444P, > - AV_PIX_FMT_YUV420P, > - AV_PIX_FMT_YUV410P, > - AV_PIX_FMT_YUVJ444P, > - AV_PIX_FMT_YUVJ420P, > - AV_PIX_FMT_GRAY8, > - AV_PIX_FMT_NONE > -}; > - > -static int config_input(AVFilterLink *inlink) > -{ > - > - AVFilterContext *ctx = inlink->dst; > - USPPContext *uspp = ctx->priv; > - const int height = inlink->h; > - const int width = inlink->w; > - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > - int i; > - > - const AVCodec *enc = avcodec_find_encoder(AV_CODEC_ID_SNOW); > - if (!enc) { > - av_log(ctx, AV_LOG_ERROR, "SNOW encoder not found.\n"); > - return AVERROR(EINVAL); > - } > - > - uspp->hsub = desc->log2_chroma_w; > - uspp->vsub = desc->log2_chroma_h; > - > - for (i = 0; i < 3; i++) { > - int is_chroma = !!i; > - int w = (width + 4 * BLOCK-1) & (~(2 * BLOCK-1)); > - int h = (height + 4 * BLOCK-1) & (~(2 * BLOCK-1)); > - > - if (is_chroma) { > - w = AV_CEIL_RSHIFT(w, uspp->hsub); > - h = AV_CEIL_RSHIFT(h, uspp->vsub); > - } > - > - uspp->temp_stride[i] = w; > - if (!(uspp->temp[i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(int16_t)))) > - return AVERROR(ENOMEM); > - if (!(uspp->src [i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(uint8_t)))) > - return AVERROR(ENOMEM); > - } > - > - for (i = 0; i < (1<log2_count); i++) { > - AVCodecContext *avctx_enc; > - AVDictionary *opts = NULL; > - int ret; > - > - if (!(uspp->avctx_enc[i] = avcodec_alloc_context3(NULL))) > - return AVERROR(ENOMEM); > - > - avctx_enc = uspp->avctx_enc[i]; > - avctx_enc->width = width + BLOCK; > - avctx_enc->height = height + BLOCK; > - avctx_enc->time_base = (AVRational){1,25}; // meaningless > - avctx_enc->gop_size = INT_MAX; > - avctx_enc->max_b_frames = 0; > - avctx_enc->pix_fmt = inlink->format; > - avctx_enc->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY; > - avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; > - avctx_enc->global_quality = 123; > - av_dict_set(&opts, "no_bitstream", "1", 0); > - ret = avcodec_open2(avctx_enc, enc, &opts); > - av_dict_free(&opts); > - if (ret < 0) > - return ret; > - av_assert0(avctx_enc->codec); > - } > - > - uspp->outbuf_size = (width + BLOCK) * (height + BLOCK) * 10; > - if (!(uspp->frame = av_frame_alloc())) > - return AVERROR(ENOMEM); > - if (!(uspp->pkt = av_packet_alloc())) > - return AVERROR(ENOMEM); > - if (!(uspp->outbuf = av_malloc(uspp->outbuf_size))) > - return AVERROR(ENOMEM); > - > - return 0; > -} > - > -static int filter_frame(AVFilterLink *inlink, AVFrame *in) > -{ > - AVFilterContext *ctx = inlink->dst; > - USPPContext *uspp = ctx->priv; > - AVFilterLink *outlink = ctx->outputs[0]; > - AVFrame *out = in; > - > - int qp_stride = 0; > - int8_t *qp_table = NULL; > - int ret = 0; > - > - /* if we are not in a constant user quantizer mode and we don't want to use > - * the quantizers from the B-frames (B-frames often have a higher QP), we > - * need to save the qp table from the last non B-frame; this is what the > - * following code block does */ > - if (!uspp->qp && (uspp->use_bframe_qp || in->pict_type != AV_PICTURE_TYPE_B)) { > - ret = ff_qp_table_extract(in, &qp_table, &qp_stride, NULL, &uspp->qscale_type); > - if (ret < 0) { > - av_frame_free(&in); > - return ret; > - } > - > - if (!uspp->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) { > - av_freep(&uspp->non_b_qp_table); > - uspp->non_b_qp_table = qp_table; > - uspp->non_b_qp_stride = qp_stride; > - } > - } > - > - if (uspp->log2_count && !ctx->is_disabled) { > - if (!uspp->use_bframe_qp && uspp->non_b_qp_table) { > - qp_table = uspp->non_b_qp_table; > - qp_stride = uspp->non_b_qp_stride; > - } > - > - if (qp_table || uspp->qp) { > - > - /* get a new frame if in-place is not possible or if the dimensions > - * are not multiple of 8 */ > - if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) { > - const int aligned_w = FFALIGN(inlink->w, 8); > - const int aligned_h = FFALIGN(inlink->h, 8); > - > - out = ff_get_video_buffer(outlink, aligned_w, aligned_h); > - if (!out) { > - av_frame_free(&in); > - if (qp_table != uspp->non_b_qp_table) > - av_free(qp_table); > - return AVERROR(ENOMEM); > - } > - av_frame_copy_props(out, in); > - out->width = in->width; > - out->height = in->height; > - } > - > - filter(uspp, out->data, in->data, out->linesize, in->linesize, > - inlink->w, inlink->h, qp_table, qp_stride); > - } > - } > - > - if (in != out) { > - if (in->data[3]) > - av_image_copy_plane(out->data[3], out->linesize[3], > - in ->data[3], in ->linesize[3], > - inlink->w, inlink->h); > - av_frame_free(&in); > - } > - ret = ff_filter_frame(outlink, out); > - if (qp_table != uspp->non_b_qp_table) > - av_freep(&qp_table); > - return ret; > -} > - > -static av_cold void uninit(AVFilterContext *ctx) > -{ > - USPPContext *uspp = ctx->priv; > - int i; > - > - for (i = 0; i < 3; i++) { > - av_freep(&uspp->temp[i]); > - av_freep(&uspp->src[i]); > - } > - > - for (i = 0; i < (1 << uspp->log2_count); i++) > - avcodec_free_context(&uspp->avctx_enc[i]); > - > - av_freep(&uspp->non_b_qp_table); > - av_freep(&uspp->outbuf); > - av_packet_free(&uspp->pkt); > - av_frame_free(&uspp->frame); > -} > - > -static const AVFilterPad uspp_inputs[] = { > - { > - .name = "default", > - .type = AVMEDIA_TYPE_VIDEO, > - .config_props = config_input, > - .filter_frame = filter_frame, > - }, > -}; > - > -static const AVFilterPad uspp_outputs[] = { > - { > - .name = "default", > - .type = AVMEDIA_TYPE_VIDEO, > - }, > -}; > - > -const AVFilter ff_vf_uspp = { > - .name = "uspp", > - .description = NULL_IF_CONFIG_SMALL("Apply Ultra Simple / Slow Post-processing filter."), > - .priv_size = sizeof(USPPContext), > - .uninit = uninit, > - FILTER_INPUTS(uspp_inputs), > - FILTER_OUTPUTS(uspp_outputs), > - FILTER_PIXFMTS_ARRAY(pix_fmts), > - .priv_class = &uspp_class, > - .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL, > -}; > diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak > index 704087b835..426e27f61e 100644 > --- a/tests/fate/filter-video.mak > +++ b/tests/fate/filter-video.mak > @@ -29,14 +29,6 @@ fate-filter-w3fdif-complex: CMD = framecrc -flags bitexact -idct simple -i $(TAR > > FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, W3FDIF, MPEGTS, MPEG2VIDEO) += $(FATE_W3FDIF) > > -FATE_MCDEINT += fate-filter-mcdeint-fast > -fate-filter-mcdeint-fast: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_SAMPLES)/mpeg2/mpeg2_field_encoding.ts -frames:v 30 -vf mcdeint=fast > - > -FATE_MCDEINT += fate-filter-mcdeint-medium > -fate-filter-mcdeint-medium: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_SAMPLES)/mpeg2/mpeg2_field_encoding.ts -frames:v 30 -vf mcdeint=mode=medium > - > -FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, MCDEINT, MPEGTS, MPEG2VIDEO, SNOW_ENCODER) += $(FATE_MCDEINT) > - > FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, CODECVIEW, RM, RV40) += fate-filter-codecview-mvs > fate-filter-codecview-mvs: CMD = framecrc -flags2 +export_mvs -i $(TARGET_SAMPLES)/real/spygames-2MB.rmvb -vf codecview=mv=pf+bf+bb -frames:v 60 -an > > diff --git a/tests/ref/fate/filter-mcdeint-fast b/tests/ref/fate/filter-mcdeint-fast > deleted file mode 100644 > index e4c2f8a337..0000000000 > --- a/tests/ref/fate/filter-mcdeint-fast > +++ /dev/null > @@ -1,35 +0,0 @@ > -#tb 0: 1/25 > -#media_type 0: video > -#codec_id 0: rawvideo > -#dimensions 0: 720x576 > -#sar 0: 16/15 > -0, 9, 9, 1, 622080, 0xff496bf5 > -0, 10, 10, 1, 622080, 0x513c8bd9 > -0, 11, 11, 1, 622080, 0x4e474368 > -0, 12, 12, 1, 622080, 0x1248abe9 > -0, 13, 13, 1, 622080, 0xa705c158 > -0, 14, 14, 1, 622080, 0xf9048e95 > -0, 15, 15, 1, 622080, 0x78b5c1a2 > -0, 16, 16, 1, 622080, 0x0efa8be8 > -0, 17, 17, 1, 622080, 0xd3396eac > -0, 18, 18, 1, 622080, 0x5870cbdd > -0, 19, 19, 1, 622080, 0x086fa311 > -0, 20, 20, 1, 622080, 0x7ce9bced > -0, 21, 21, 1, 622080, 0xe7e0e0e1 > -0, 22, 22, 1, 622080, 0x5af3e14b > -0, 23, 23, 1, 622080, 0xbf221d96 > -0, 24, 24, 1, 622080, 0x43d90a62 > -0, 25, 25, 1, 622080, 0x267a57b6 > -0, 26, 26, 1, 622080, 0x88d942eb > -0, 27, 27, 1, 622080, 0x34ff87bf > -0, 28, 28, 1, 622080, 0xa849b5ec > -0, 29, 29, 1, 622080, 0x8302f51f > -0, 30, 30, 1, 622080, 0xac9e7315 > -0, 31, 31, 1, 622080, 0x38b284fc > -0, 32, 32, 1, 622080, 0x1ff0c6c4 > -0, 33, 33, 1, 622080, 0x50bf1ba5 > -0, 34, 34, 1, 622080, 0xe9bd1240 > -0, 35, 35, 1, 622080, 0x22116da3 > -0, 36, 36, 1, 622080, 0x6f3e887a > -0, 37, 37, 1, 622080, 0x46b82bc5 > -0, 38, 38, 1, 622080, 0xeaaf69ee > diff --git a/tests/ref/fate/filter-mcdeint-medium b/tests/ref/fate/filter-mcdeint-medium > deleted file mode 100644 > index 1b0261960e..0000000000 > --- a/tests/ref/fate/filter-mcdeint-medium > +++ /dev/null > @@ -1,35 +0,0 @@ > -#tb 0: 1/25 > -#media_type 0: video > -#codec_id 0: rawvideo > -#dimensions 0: 720x576 > -#sar 0: 16/15 > -0, 9, 9, 1, 622080, 0xff496bf5 > -0, 10, 10, 1, 622080, 0xc0e4912c > -0, 11, 11, 1, 622080, 0xa8aedd7e > -0, 12, 12, 1, 622080, 0x2054deb9 > -0, 13, 13, 1, 622080, 0x1005d0ca > -0, 14, 14, 1, 622080, 0x60f085dc > -0, 15, 15, 1, 622080, 0x4da0d261 > -0, 16, 16, 1, 622080, 0x968e940e > -0, 17, 17, 1, 622080, 0x86687b04 > -0, 18, 18, 1, 622080, 0xd63bc93d > -0, 19, 19, 1, 622080, 0x7ab0a6e6 > -0, 20, 20, 1, 622080, 0x883dab85 > -0, 21, 21, 1, 622080, 0x9f6ef6b5 > -0, 22, 22, 1, 622080, 0xceccee25 > -0, 23, 23, 1, 622080, 0x2aa823a5 > -0, 24, 24, 1, 622080, 0xb20d0f48 > -0, 25, 25, 1, 622080, 0x571560b9 > -0, 26, 26, 1, 622080, 0xc0904764 > -0, 27, 27, 1, 622080, 0xdb5b89c3 > -0, 28, 28, 1, 622080, 0x707aadc5 > -0, 29, 29, 1, 622080, 0x6383ef1b > -0, 30, 30, 1, 622080, 0xf9e56040 > -0, 31, 31, 1, 622080, 0x86ce7ff0 > -0, 32, 32, 1, 622080, 0x0c76bd84 > -0, 33, 33, 1, 622080, 0xd7192781 > -0, 34, 34, 1, 622080, 0x83b70cdc > -0, 35, 35, 1, 622080, 0xaae87453 > -0, 36, 36, 1, 622080, 0xfafa92e2 > -0, 37, 37, 1, 622080, 0x28323354 > -0, 38, 38, 1, 622080, 0x34d47484 Will apply this patch tomorrow unless there are objections. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".