From patchwork Tue May 3 06:37:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 35556 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a885:b0:7f:4be2:bd17 with SMTP id ca5csp257607pzb; Mon, 2 May 2022 23:39:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzMe9mJhyZ/l4+yDetH79Yg9MIrq54SfeKxwMWh8WMu68BeIV20aveLxftKODKzELPHGPg4 X-Received: by 2002:a17:907:c22:b0:6f4:2cb6:7ba9 with SMTP id ga34-20020a1709070c2200b006f42cb67ba9mr11031259ejc.29.1651559976499; Mon, 02 May 2022 23:39:36 -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 qf39-20020a1709077f2700b006f496889e5dsi689544ejc.516.2022.05.02.23.39.36; Mon, 02 May 2022 23:39:36 -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=YnvO38ca; 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 6B80368B3B3; Tue, 3 May 2022 09:39:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075011.outbound.protection.outlook.com [40.92.75.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9E01B68B28D for ; Tue, 3 May 2022 09:39:18 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lU8G9RjlEJ1OecU8/gSc2Vn1KJ/tbbWdP+2M6/hf+l7IgaZk4OfAyKqE+l8lr3JXJoo7KT+aVIu8dyDWK0/3H7x79xAPU/f6Yaie+73EKYycutbfJyx1SqYCKJXsANZsvj+qHvcAl2Zn2/2bbszn1pr+B4RgUyG0Ohny7TkJ97IdKt4BL/YQySeG3nkRWxIPLee14R1pBqL0/yn+XigTGK9Ykr9BP22ye+fC46JYgiEfDPnDM66thJ4egd6uCpB2LuXCTZkBiOIjkv+m9JoNB3dcd97F8K21S508X11Lxp1zDhDrM6DNxaehu+YvdDJfwS8Du5pkt6EcvIalYD0kbQ== 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=8TBGz+RAOrkyCRvU/BtJ1LgthdmlRdhiAbP4HGMrv6g=; b=jwg6+WfMfN4yp6dqhXe8N1D6Tvj2zaBTRd0XYtrOZC9kO+/rYRz55KsEPaR8BYCRYjbXmWj/Lbe4N0PSjc/XqX+JMvRT7N6qZ0Ds0CAyfiIXCicPVWS4mkUvUEEmjlAPSp6x6XYk13/9lfgpoTJpI5fleopcgM0HmWMuwTlo5rbDJEEfpx+VVrrr/AEdJSMoRdoxeiBe9CJHe0zLPZo2O0hCF6vcJC3frMVrn+h/tbfuc1+1GdWxnuSSEifCGU1PuUz6Veckikk1GTGj2G5PyCWNkInogYzq6znNk/gmvFecPuVdTj4jCUr66JcuV7wc3iXZXI1qSwlLnn+wlJhr/g== 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=8TBGz+RAOrkyCRvU/BtJ1LgthdmlRdhiAbP4HGMrv6g=; b=YnvO38caXPOMU/NKhHnjUI1xSZyZnkI2U00DnaOVBNP/655jYdsfzPtwSYE86wwc4MHbctgAi5TDezae4ojWahHksGahzn3ZdNbJX7qpcJAAxGQqYJIOuGIYDaFtm5SMvaiEwGhYNVj8MGPhR9icEsfcD7Oas6sNx12Ejdq+TnJ/8juzjz9+TLhvZKO7ZZTZleaJhtraciTiMDCJOuHs6lqieYLqUUKiV39QSeUAp741UfwQOXaJmnUn649KymqaTEOth++7QG6Ba1k24Pk81N0pvmfpbxwFXijShEeGvHQgkk9InPDLYcZrcFrBOUWkd51ZVUBnYK5vi7ULcqEibg== Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) by VI1PR0102MB3230.eurprd01.prod.exchangelabs.com (2603:10a6:803:8::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.24; Tue, 3 May 2022 06:39:16 +0000 Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::1854:2c30:7ba1:c431]) by AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::1854:2c30:7ba1:c431%6]) with mapi id 15.20.5206.024; Tue, 3 May 2022 06:39:16 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 3 May 2022 08:37:47 +0200 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [sewS9mvEbzz0HjmumwLSkrQSUIZUzw2X] X-ClientProxiedBy: ZR0P278CA0014.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:16::24) To AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) X-Microsoft-Original-Message-ID: <20220503063751.2261222-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: abad0d7b-cd9f-4fab-5cae-08da2ccfa47e X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiTQEkMEhbgfP1CXQyS+IofoA8939WrUHOZbU2KC5WHQ2T4YwY14J+FGl43KMqmNWNwwZnLJh5jdgXpQcIxSSccTdH0IFKAe8b9rQYoJlfMDZMGAdPU4mdObxR7it2FwD5RZVEvxNgKIsEM1Jj8P7NSY+5mPtKrBUTxgaZcUCAUFRN+sOf9ZiwOiw5yFG5R/i/xShDWjWi/YsdA+Vz0jeteauz7Qdy8YSa74IYgvuMxZIaQ5aVnV6H3QGEZk8P60bmaWstONcmEc3d5e9N43XXawENQ8k4ozA13pp5zpSvShm6481xWyLxzCOjE6IETWCbROwD2YTqrRkXJuOmQmsLgUgSLDbCsQRBEi1DPbKmmZXx8UfgR2pjzPNYiq8wk/8GA7i+Vv0vpA3FjEa9bI7wTWUBae/21CzHug/+rqJoPuTgK5okeRvPGDt1AWLwCZymK6TzPAGP8LrBXBZTekLYKaz0hX4KVrDYcdxooyi9y1GKHJEQXTUmnUYLTvU3dFEOUeJepdxvd+ktL6NF5jvMC0nthKtro5t6JztslJZP1nF8fvwcXLpm87xwRlKiFS+omut67fGzRRnSO7Ec3g/BaqXHCWfvXDyC9QpsClnKHwh5G89+vWH3DBhqgR5oTgBNvdN1RCgzV6/DPbKkpg2DAcvU0PwaFQrTIQyoLO5No1F7s0kNqTyN1knft5JFZBGr4Wwgzaru1zRjPPzoTPNgmI+uth7hxQFAx+W7ENbMOlvcWP4OXb5D+jbQU3XdgB6ak= X-MS-TrafficTypeDiagnostic: VI1PR0102MB3230:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: tUD2K9U+pBNjzNrk+doH/WCTZTjmI6GMr89xf7CbunsHmQ1inK9Cxaq7ISN7RdaVxxmzU3vov0hbplFVJwSMK9sB7TgmFw9Td3Jr2NigQDQ4aOEj0ESY+MES31IOmd1Oi6VJHfCL3xHqhiX/vCfLMoAIiKrQeMw96utthcH4gta+8R6CfIiLPZ6zX+5b6yBreBFTZl1i/86hxeBIotLi0xTxTXio8VCCesiFg/ReehqF6GqCCl8m9w2tEbupW60A5fgKeoRRssSHOl3v/EE/1RIiSDg/oujUPU9x0OLUae04PvNRshyDd8eyQhggWmu1a6YsCGMu8kZGroJCapTymg4EGqQP4hs+w5wr2jLmYa6+ir1cP1GxVRNMdaEob6vWUcBGUChB7TOUsyPlY1I0OnO5ONEUeVZdR61CE84duU//WFLdfzXOX7rPPXcxQpmIJNcLHCyf2icOaMMxMV9YSkSDi3jAO91/pZ6Yy3299ereXcl8fwUH0X01EyZBhib4VpOLtB5D/EzgbBNOppLY+YeMPz6dEDbAKUZHaiUqhaXEvinAoW7otkAT+KSQxSCw3wHqR49sc7mSO903w/ZnLg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DsTDEOY+if37j7tfQhgx4APbZ8Ki2riCwpFN5eDnbgalzXzPJsbbFhlHlmHaE6LrBeV7bWrCQzdK0e5VpWvHNM1D8xAtXUUL8Z4Tb49ZuUyzuM0AqVOOn8CMZT6SCd6e82vOalrvm/ep55k0ajt4Ye1i5jd8beA7P+YOJuAeacNNe9EfWjW/dYEangV7wQWAeyR8ARfF7uCKVsh1+8x+RnAk/EYgQV50yrKDaow6mU+ZxNemJixM2ouy27o/6F84vlsG9OvgwloKXk4sfyzgeN4hkvzCPPPxsc6xIppt+AF+J/4hlG7K+QHszseX8a+otS3BxMFyFPvDBbLvlGDYQhwGVsSgQY9o8lK2pQbiJJqsL30hJ9bNGzCbE2EJY13ZEJRUsAdV3CXfRlfXmJNE71EXCgP8TzBjLq8B/S1LmBiyw+StKjSK5GFdQx6P3bLCRxsv0NOay8YpbmEb6YRYPBvgEQCYJx09pA6OpsjMMZiWIsukyB34quLRGZK4Jcyu7c3eLJejqBK0gwibWmpTFtAOWVEjUQV8aB0Dqha+5VuylbZWx8LLWUu3qF8nnUaGz+VXVEHNab0CUwoJzX1tHqMSOtwVNHCCSfVVFeXt/QCtH0Lk1QmnqWHnY3R3vkvVbSDNX9E2IBD0SYpPcjpxuBBgfr9hGEV7GrB3YvKFFvbXiFh7Qb+sgwWRL5YssQikCwm6J0ofnDB9pVbj7r91Kkb5wodskchzKdedFBB/sF4srTxT55e61tMpGWRuPmj+JB6w+rvvNTPabhhGfQmu8w34mJHQngJzl1Mp7/8dl1g5WCHbUSmAJlWzl2GroortYQUxUGstZYBbFGWDYUoMgBZrcvYk9GYt/0fGTJybUnw0yu0HizPFVcDCX/x6Wrbroepw1fM81ezRoVGdd3FcIg0f+WhUxxrmTwWkqThzeWyv0NAt2BerdbXlUOMorRV07yzBcGAwSG2Bc90xmPUnt0ibf3vL7ojcHzAP1t/oS8aedq9eVPoVjxYRLn1i8JLgptTgGR5IjFkTdQTxEv+u/6pLIFfElaogy1QDzfPU1W/sSNJGyJEGZ2jwd6jFodL3f+2FqbLBDKqdA0kE1j+dj8pqZsOphI2UiGaxWhRtbzEZf4NmTku3WE9l7CYOb/VwFJAO96nSedXWtsNMcvZoaZGG7Fub9XGvDtBxJZUp1wDVIggRd38hBWBK3ExfTkEsEBAC9KuOD0ABnVx3IbyfYrjQXt7/sJU5AVX2r0fuyY0SKDZ0Hv3Iihenl3UYv5A6oRb20AHJQld3U2yESMkLDJBq9ScMPoiEQZw7fkTOy0LFlCHUOIiXm4BbDv2n3i2qQk+87iKjBvlO5pwPY51Kkqv60jiHMOainfADv7khVs2hI46tCJ4Wxr1skPp/ZgnYCxdUgn2RW2DFsyeZoLUq6Tj1z3UGOM3+mgL0SRKm3m1+x7TmcAkJn8RfFTOXYh7XVifOO5se/lyvjWB1F3u14A== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: abad0d7b-cd9f-4fab-5cae-08da2ccfa47e X-MS-Exchange-CrossTenant-AuthSource: AS8PR01MB7944.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2022 06:39:16.4552 (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: VI1PR0102MB3230 Subject: [FFmpeg-devel] [PATCH 06/10] avfilter/vf_hflip: Move ff_hflip_init into a header 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: ZEqj11mNDM12 This removes a dependency of checkasm on lavfi/vf_hflip.o and also allows to inline ff_hflip_init() irrespectively of interposing. Signed-off-by: Andreas Rheinhardt --- libavfilter/hflip.h | 1 - libavfilter/vf_hflip.c | 88 +---------------------------- libavfilter/vf_hflip_init.h | 110 ++++++++++++++++++++++++++++++++++++ tests/checkasm/vf_hflip.c | 1 + 4 files changed, 112 insertions(+), 88 deletions(-) create mode 100644 libavfilter/vf_hflip_init.h diff --git a/libavfilter/hflip.h b/libavfilter/hflip.h index a40b98470b..8532dc0f46 100644 --- a/libavfilter/hflip.h +++ b/libavfilter/hflip.h @@ -34,7 +34,6 @@ typedef struct FlipContext { void (*flip_line[4])(const uint8_t *src, uint8_t *dst, int w); } FlipContext; -int ff_hflip_init(FlipContext *s, int step[4], int nb_planes); void ff_hflip_init_x86(FlipContext *s, int step[4], int nb_planes); #endif /* AVFILTER_HFLIP_H */ diff --git a/libavfilter/vf_hflip.c b/libavfilter/vf_hflip.c index 0362660679..8517b87889 100644 --- a/libavfilter/vf_hflip.c +++ b/libavfilter/vf_hflip.c @@ -31,6 +31,7 @@ #include "formats.h" #include "hflip.h" #include "internal.h" +#include "vf_hflip_init.h" #include "video.h" #include "libavutil/pixdesc.h" #include "libavutil/internal.h" @@ -61,70 +62,6 @@ static int query_formats(AVFilterContext *ctx) return ff_set_common_formats(ctx, pix_fmts); } -static void hflip_byte_c(const uint8_t *src, uint8_t *dst, int w) -{ - int j; - - for (j = 0; j < w; j++) - dst[j] = src[-j]; -} - -static void hflip_short_c(const uint8_t *ssrc, uint8_t *ddst, int w) -{ - const uint16_t *src = (const uint16_t *)ssrc; - uint16_t *dst = (uint16_t *)ddst; - int j; - - for (j = 0; j < w; j++) - dst[j] = src[-j]; -} - -static void hflip_dword_c(const uint8_t *ssrc, uint8_t *ddst, int w) -{ - const uint32_t *src = (const uint32_t *)ssrc; - uint32_t *dst = (uint32_t *)ddst; - int j; - - for (j = 0; j < w; j++) - dst[j] = src[-j]; -} - -static void hflip_b24_c(const uint8_t *src, uint8_t *dst, int w) -{ - const uint8_t *in = src; - uint8_t *out = dst; - int j; - - for (j = 0; j < w; j++, out += 3, in -= 3) { - int32_t v = AV_RB24(in); - - AV_WB24(out, v); - } -} - -static void hflip_b48_c(const uint8_t *src, uint8_t *dst, int w) -{ - const uint8_t *in = src; - uint8_t *out = dst; - int j; - - for (j = 0; j < w; j++, out += 6, in -= 6) { - int64_t v = AV_RB48(in); - - AV_WB48(out, v); - } -} - -static void hflip_qword_c(const uint8_t *ssrc, uint8_t *ddst, int w) -{ - const uint64_t *src = (const uint64_t *)ssrc; - uint64_t *dst = (uint64_t *)ddst; - int j; - - for (j = 0; j < w; j++) - dst[j] = src[-j]; -} - static int config_props(AVFilterLink *inlink) { FlipContext *s = inlink->dst->priv; @@ -145,29 +82,6 @@ static int config_props(AVFilterLink *inlink) return ff_hflip_init(s, s->max_step, nb_planes); } -int ff_hflip_init(FlipContext *s, int step[4], int nb_planes) -{ - int i; - - for (i = 0; i < nb_planes; i++) { - step[i] *= s->bayer_plus1; - switch (step[i]) { - case 1: s->flip_line[i] = hflip_byte_c; break; - case 2: s->flip_line[i] = hflip_short_c; break; - case 3: s->flip_line[i] = hflip_b24_c; break; - case 4: s->flip_line[i] = hflip_dword_c; break; - case 6: s->flip_line[i] = hflip_b48_c; break; - case 8: s->flip_line[i] = hflip_qword_c; break; - default: - return AVERROR_BUG; - } - } - if (ARCH_X86) - ff_hflip_init_x86(s, step, nb_planes); - - return 0; -} - typedef struct ThreadData { AVFrame *in, *out; } ThreadData; diff --git a/libavfilter/vf_hflip_init.h b/libavfilter/vf_hflip_init.h new file mode 100644 index 0000000000..b58cfec901 --- /dev/null +++ b/libavfilter/vf_hflip_init.h @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2007 Benoit Fouet + * Copyright (c) 2010 Stefano Sabatini + * + * 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 + */ + +#ifndef AVFILTER_HFLIP_INIT_H +#define AVFILTER_HFLIP_INIT_H + +#include + +#include "config.h" +#include "libavutil/attributes.h" +#include "libavutil/intreadwrite.h" +#include "hflip.h" + +static void hflip_byte_c(const uint8_t *src, uint8_t *dst, int w) +{ + for (int j = 0; j < w; j++) + dst[j] = src[-j]; +} + +static void hflip_short_c(const uint8_t *ssrc, uint8_t *ddst, int w) +{ + const uint16_t *src = (const uint16_t *)ssrc; + uint16_t *dst = (uint16_t *)ddst; + + for (int j = 0; j < w; j++) + dst[j] = src[-j]; +} + +static void hflip_dword_c(const uint8_t *ssrc, uint8_t *ddst, int w) +{ + const uint32_t *src = (const uint32_t *)ssrc; + uint32_t *dst = (uint32_t *)ddst; + + for (int j = 0; j < w; j++) + dst[j] = src[-j]; +} + +static void hflip_b24_c(const uint8_t *src, uint8_t *dst, int w) +{ + const uint8_t *in = src; + uint8_t *out = dst; + + for (int j = 0; j < w; j++, out += 3, in -= 3) { + int32_t v = AV_RB24(in); + + AV_WB24(out, v); + } +} + +static void hflip_b48_c(const uint8_t *src, uint8_t *dst, int w) +{ + const uint8_t *in = src; + uint8_t *out = dst; + + for (int j = 0; j < w; j++, out += 6, in -= 6) { + int64_t v = AV_RB48(in); + + AV_WB48(out, v); + } +} + +static void hflip_qword_c(const uint8_t *ssrc, uint8_t *ddst, int w) +{ + const uint64_t *src = (const uint64_t *)ssrc; + uint64_t *dst = (uint64_t *)ddst; + + for (int j = 0; j < w; j++) + dst[j] = src[-j]; +} + +static av_unused int ff_hflip_init(FlipContext *s, int step[4], int nb_planes) +{ + for (int i = 0; i < nb_planes; i++) { + step[i] *= s->bayer_plus1; + switch (step[i]) { + case 1: s->flip_line[i] = hflip_byte_c; break; + case 2: s->flip_line[i] = hflip_short_c; break; + case 3: s->flip_line[i] = hflip_b24_c; break; + case 4: s->flip_line[i] = hflip_dword_c; break; + case 6: s->flip_line[i] = hflip_b48_c; break; + case 8: s->flip_line[i] = hflip_qword_c; break; + default: + return AVERROR_BUG; + } + } + if (ARCH_X86) + ff_hflip_init_x86(s, step, nb_planes); + + return 0; +} + +#endif /* AVFILTER_HFLIP_INIT_H */ diff --git a/tests/checkasm/vf_hflip.c b/tests/checkasm/vf_hflip.c index a3b6e613d5..96614d12c5 100644 --- a/tests/checkasm/vf_hflip.c +++ b/tests/checkasm/vf_hflip.c @@ -19,6 +19,7 @@ #include #include "checkasm.h" #include "libavfilter/hflip.h" +#include "libavfilter/vf_hflip_init.h" #include "libavutil/intreadwrite.h" #include "libavutil/mem_internal.h"