Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (9)
Showing
with 391 additions and 123 deletions
......@@ -31,6 +31,7 @@ include hw/d3d11/Makefile.am
include hw/vaapi/Makefile.am
include hw/vdpau/Makefile.am
include hw/mmal/Makefile.am
include isa/aarch64/Makefile.am
include isa/arm/Makefile.am
include isa/riscv/Makefile.am
include keystore/Makefile.am
......
aarch64dir = $(pluginsdir)/aarch64
aarch64_LTLIBRARIES =
libdeinterlace_aarch64_plugin_la_SOURCES = \
isa/aarch64/simd/deinterlace.c isa/aarch64/simd/merge.S
if HAVE_ARM64
aarch64_LTLIBRARIES += \
libdeinterlace_aarch64_plugin.la
endif
libdeinterlace_sve_plugin_la_SOURCES = \
isa/aarch64/sve/deinterlace.c isa/aarch64/sve/merge.S
if HAVE_SVE
aarch64_LTLIBRARIES += \
libdeinterlace_sve_plugin.la
endif
/*****************************************************************************
* deinterlace.c: AArch64 AdvSIMD deinterlacing functions
*****************************************************************************
* Copyright (C) 2022 Rémi Denis-Courmont
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_cpu.h>
#include <vlc_plugin.h>
#include "../../../video_filter/deinterlace/merge.h"
void merge8_arm64(void *, const void *, const void *, size_t);
void merge16_arm64(void *, const void *, const void *, size_t);
static void Probe(void *data)
{
if (vlc_CPU_ARM_NEON()) {
struct deinterlace_functions *const f = data;
f->merges[0] = merge8_arm64;
f->merges[1] = merge16_arm64;
}
}
vlc_module_begin()
set_description("AArch64 AvdSIMD optimisation for deinterlacing")
set_cpu_funcs("deinterlace functions", Probe, 10)
vlc_module_end()
//*****************************************************************************
// merge_arm64.S : ARM64 NEON mean
// merge.S : AArch64 Advanced SIMD mean
//*****************************************************************************
// Copyright (C) 2009-2012 Rémi Denis-Courmont
// Copyright (C) 2016- Janne Grunau
......@@ -19,7 +19,7 @@
// Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
//****************************************************************************/
#include "../../isa/arm/asm.S"
#include "../../arm/asm.S"
.arch armv8-a+simd
.text
......@@ -32,7 +32,7 @@
.align 2
// NOTE: Offset and pitch must be multiple of 16-bytes in VLC.
function merge8_arm64_neon
function merge8_arm64
bti c
ands x5, SIZE, #~63
b.eq 2f
......@@ -69,7 +69,7 @@ function merge8_arm64_neon
ret
.align 2
function merge16_arm64_neon
function merge16_arm64
bti c
ands x5, SIZE, #~63
b.eq 2f
......
/*****************************************************************************
* deinterlace.c: AArch64 Scalable Vector Extension deinterlacing functions
*****************************************************************************
* Copyright (C) 2022 Rémi Denis-Courmont
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_cpu.h>
#include <vlc_plugin.h>
#include "../../../video_filter/deinterlace/merge.h"
void merge8_arm_sve(void *, const void *, const void *, size_t);
void merge16_arm_sve(void *, const void *, const void *, size_t);
static void Probe(void *data)
{
if (vlc_CPU_ARM_SVE()) {
struct deinterlace_functions *const f = data;
f->merges[0] = merge8_arm_sve;
f->merges[1] = merge16_arm_sve;
}
}
vlc_module_begin()
set_description("AArch64 SVE optimisation for deinterlacing")
set_cpu_funcs("deinterlace functions", Probe, 20)
vlc_module_end()
/******************************************************************************
* merge_sve.S : ARM SVE mean
* merge.S : ARM SVE mean
******************************************************************************
* Copyright (C) 2018 Rémi Denis-Courmont
*
......@@ -18,13 +18,14 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "../../isa/arm/asm.S"
#include "../../arm/asm.S"
.arch armv8-a+sve
.arch armv8-a+sve
/* TODO: prefetch, unroll */
.text
.align 2
bti_advertise
function merge8_arm_sve
bti c
......
armdir = $(pluginsdir)/arm
neondir = $(pluginsdir)/arm_neon
libdeinterlace_arm_simd_plugin_la_SOURCES = \
isa/arm/simd/deinterlace.c isa/arm/simd/merge.S
# TODO? use dedicated conditional, or purge
if HAVE_NEON
arm_LTLIBRARIES = \
libdeinterlace_arm_simd_plugin.la
endif
libchroma_yuv_neon_plugin_la_SOURCES = \
isa/arm/neon/deinterleave_chroma.S \
isa/arm/neon/i420_yuyv.S \
......@@ -9,6 +19,9 @@ libchroma_yuv_neon_plugin_la_SOURCES = \
libchroma_yuv_neon_plugin_la_CFLAGS = $(AM_CFLAGS)
libchroma_yuv_neon_plugin_LIBTOOLFLAGS = --tag=CC
libdeinterlace_neon_plugin_la_SOURCES = \
isa/arm/neon/deinterlace.c isa/arm/neon/merge.S
libvolume_neon_plugin_la_SOURCES = isa/arm/neon/volume.c isa/arm/neon/amplify.S
libvolume_neon_plugin_la_CFLAGS = $(AM_CFLAGS)
libvolume_neon_plugin_LIBTOOLFLAGS = --tag=CC
......@@ -25,6 +38,7 @@ libyuv_rgb_neon_plugin_LIBTOOLFLAGS = --tag=CC
if HAVE_NEON
neon_LTLIBRARIES = \
libchroma_yuv_neon_plugin.la \
libdeinterlace_neon_plugin.la \
libvolume_neon_plugin.la \
libyuv_rgb_neon_plugin.la
endif
......
/*****************************************************************************
* deinterlace.c: ARM NEON deinterlacing functions
*****************************************************************************
* Copyright (C) 2022 Rémi Denis-Courmont
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_cpu.h>
#include <vlc_plugin.h>
#include "../../../video_filter/deinterlace/merge.h"
void merge8_arm_neon(void *, const void *, const void *, size_t);
void merge16_arm_neon(void *, const void *, const void *, size_t);
static void Probe(void *data)
{
if (vlc_CPU_ARM_NEON()) {
struct deinterlace_functions *const f = data;
f->merges[0] = merge8_arm_neon;
f->merges[1] = merge16_arm_neon;
}
}
vlc_module_begin()
set_description("ARM NEON optimisation for deinterlacing")
set_cpu_funcs("deinterlace functions", Probe, 20)
vlc_module_end()
@*****************************************************************************
@ merge_arm.S : ARM NEON mean
@ merge.S : ARM NEON mean
@*****************************************************************************
@ Copyright (C) 2009-2012 Rémi Denis-Courmont
@
......@@ -18,11 +18,11 @@
@ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
@****************************************************************************/
#include "../../isa/arm/asm.S"
#include "../asm.S"
.syntax unified
#if HAVE_AS_ARCH_DIRECTIVE
.arch armv6
.arch armv7-a
#endif
#if HAVE_AS_FPU_DIRECTIVE
.fpu neon
......@@ -114,45 +114,3 @@ function merge16_arm_neon
vhadd.u16 q0, q0, q8
vst1.u16 {q0}, [DEST,:128]!
bx lr
.align 2
function merge8_armv6
push {r4-r9,lr}
1:
pld [SRC1, #64]
ldm SRC1!, {r4-r5}
pld [SRC2, #64]
ldm SRC2!, {r8-r9}
subs SIZE, SIZE, #16
uhadd8 r4, r4, r8
ldm SRC1!, {r6-r7}
uhadd8 r5, r5, r9
ldm SRC2!, {ip,lr}
uhadd8 r6, r6, ip
stm DEST!, {r4-r5}
uhadd8 r7, r7, lr
stm DEST!, {r6-r7}
it eq
popeq {r4-r9,pc}
b 1b
.align 2
function merge16_armv6
push {r4-r9,lr}
1:
pld [SRC1, #64]
ldm SRC1!, {r4-r5}
pld [SRC2, #64]
ldm SRC2!, {r8-r9}
subs SIZE, SIZE, #16
uhadd16 r4, r4, r8
ldm SRC1!, {r6-r7}
uhadd16 r5, r5, r9
ldm SRC2!, {ip,lr}
uhadd16 r6, r6, ip
stm DEST!, {r4-r5}
uhadd16 r7, r7, lr
stm DEST!, {r6-r7}
it eq
popeq {r4-r9,pc}
b 1b
/*****************************************************************************
* deinterlace.c: ARMv6 SIMD deinterlacing functions
*****************************************************************************
* Copyright (C) 2022 Rémi Denis-Courmont
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_cpu.h>
#include <vlc_plugin.h>
#include "../../../video_filter/deinterlace/merge.h"
void merge8_armv6(void *, const void *, const void *, size_t);
void merge16_armv6(void *, const void *, const void *, size_t);
static void Probe(void *data)
{
if (vlc_CPU_ARMv6()) {
struct deinterlace_functions *const f = data;
f->merges[0] = merge8_armv6;
f->merges[1] = merge16_armv6;
}
}
vlc_module_begin()
set_description("ARM SIMD optimisation for deinterlacing")
set_cpu_funcs("deinterlace functions", Probe, 10)
vlc_module_end()
@*****************************************************************************
@ merge.S: ARMv6 SIMD mean
@*****************************************************************************
@ Copyright (C) 2009-2012 Rémi Denis-Courmont
@
@ This program 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.
@
@ This program 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 this program; if not, write to the Free Software Foundation,
@ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
@****************************************************************************/
#include "../asm.S"
.syntax unified
#if HAVE_AS_ARCH_DIRECTIVE
.arch armv6
#endif
.text
#define DEST r0
#define SRC1 r1
#define SRC2 r2
#define SIZE r3
.align 2
function merge8_armv6
push {r4-r9,lr}
1:
pld [SRC1, #64]
ldm SRC1!, {r4-r5}
pld [SRC2, #64]
ldm SRC2!, {r8-r9}
subs SIZE, SIZE, #16
uhadd8 r4, r4, r8
ldm SRC1!, {r6-r7}
uhadd8 r5, r5, r9
ldm SRC2!, {ip,lr}
uhadd8 r6, r6, ip
stm DEST!, {r4-r5}
uhadd8 r7, r7, lr
stm DEST!, {r6-r7}
it eq
popeq {r4-r9,pc}
b 1b
.align 2
function merge16_armv6
push {r4-r9,lr}
1:
pld [SRC1, #64]
ldm SRC1!, {r4-r5}
pld [SRC2, #64]
ldm SRC2!, {r8-r9}
subs SIZE, SIZE, #16
uhadd16 r4, r4, r8
ldm SRC1!, {r6-r7}
uhadd16 r5, r5, r9
ldm SRC2!, {ip,lr}
uhadd16 r6, r6, ip
stm DEST!, {r4-r5}
uhadd16 r7, r7, lr
stm DEST!, {r6-r7}
it eq
popeq {r4-r9,pc}
b 1b
riscvdir = $(pluginsdir)/riscv
libdeinterlace_rvv_plugin_la_SOURCES = \
isa/riscv/deinterlace.c isa/riscv/rvv_merge.S
libtransform_rvv_plugin_la_SOURCES = \
isa/riscv/transform.c isa/riscv/rvv_transform.S
......@@ -8,6 +10,7 @@ libvolume_rvv_plugin_la_LIBADD = $(AM_LIBADD) $(LIBM)
if HAVE_RVV
riscv_LTLIBRARIES = \
libdeinterlace_rvv_plugin.la \
libtransform_rvv_plugin.la \
libvolume_rvv_plugin.la
endif
/*****************************************************************************
* deinterlace.c: RISC-V V deinterlacing functions
*****************************************************************************
* Copyright (C) 2022 Rémi Denis-Courmont
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_cpu.h>
#include <vlc_plugin.h>
#include "../../video_filter/deinterlace/merge.h"
void merge8_rvv(void *, const void *, const void *, size_t);
void merge16_rvv(void *, const void *, const void *, size_t);
static void Probe(void *data)
{
if (vlc_CPU_RV_V()) {
struct deinterlace_functions *const f = data;
f->merges[0] = merge8_rvv;
f->merges[1] = merge16_rvv;
}
}
vlc_module_begin()
set_description("RISC-V V optimisation for deinterlacing")
set_cpu_funcs("deinterlace functions", Probe, 10)
vlc_module_end()
/******************************************************************************
* merge_rvv.S: RISC-V Vector mean
* rvv_merge.S: RISC-V Vector mean
******************************************************************************
* Copyright (C) 2022 Rémi Denis-Courmont
*
......@@ -37,6 +37,7 @@ merge8_rvv:
add a0, a0, t0
bnez a3, 1b
ret
.size merge8_rvv, . - merge8_rvv
.globl merge16_rvv
.type merge16_rvv, %function
......@@ -55,4 +56,5 @@ merge16_rvv:
add a0, a0, t1
bnez a3, 1b
ret
.size merge16_rvv, . - merge16_rvv
......@@ -179,22 +179,6 @@ libdeinterlace_plugin_la_SOURCES += video_filter/deinterlace/yadif_x86.asm
# inline ASM doesn't build with -O0
libdeinterlace_plugin_la_CFLAGS += -O2
endif
if HAVE_NEON
libdeinterlace_plugin_la_SOURCES += video_filter/deinterlace/merge_arm.S
libdeinterlace_plugin_la_CPPFLAGS += -DCAN_COMPILE_ARM
endif
if HAVE_ARM64
libdeinterlace_plugin_la_SOURCES += video_filter/deinterlace/merge_arm64.S
libdeinterlace_plugin_la_CPPFLAGS += -DCAN_COMPILE_ARM64
endif
if HAVE_SVE
libdeinterlace_plugin_la_SOURCES += video_filter/deinterlace/merge_sve.S
libdeinterlace_plugin_la_CPPFLAGS += -DCAN_COMPILE_SVE
endif
if HAVE_RVV
libdeinterlace_plugin_la_SOURCES += video_filter/deinterlace/merge_rvv.S
libdeinterlace_plugin_la_CPPFLAGS += -DCAN_COMPILE_RVV
endif
libdeinterlace_plugin_la_LIBADD = libdeinterlace_common.la
video_filter_LTLIBRARIES += libdeinterlace_plugin.la
......
......@@ -488,6 +488,10 @@ static const struct vlc_filter_operations filter_ops = {
.close = Close,
};
static struct deinterlace_functions funcs = {
{ Merge8BitGeneric, Merge16BitGeneric, },
};
/*****************************************************************************
* Open
*****************************************************************************/
......@@ -560,32 +564,10 @@ notsupp:
p_sys->pf_end_merge = EndSSE;
}
else
#endif
#if defined(CAN_COMPILE_ARM)
if( vlc_CPU_ARM_NEON() )
p_sys->pf_merge = pixel_size == 1 ? merge8_arm_neon : merge16_arm_neon;
else
if( vlc_CPU_ARMv6() )
p_sys->pf_merge = pixel_size == 1 ? merge8_armv6 : merge16_armv6;
else
#endif
#if defined(CAN_COMPILE_SVE)
if( vlc_CPU_ARM_SVE() )
p_sys->pf_merge = pixel_size == 1 ? merge8_arm_sve : merge16_arm_sve;
else
#endif
#if defined(CAN_COMPILE_ARM64)
if( vlc_CPU_ARM_NEON() )
p_sys->pf_merge = pixel_size == 1 ? merge8_arm64_neon : merge16_arm64_neon;
else
#endif
#if defined(CAN_COMPILE_RVV)
if( vlc_CPU_RV_V() )
p_sys->pf_merge = pixel_size == 1 ? merge8_rvv : merge16_rvv;
else
#endif
{
p_sys->pf_merge = pixel_size == 1 ? Merge8BitGeneric : Merge16BitGeneric;
vlc_CPU_functions_init_once("deinterlace functions", &funcs);
p_sys->pf_merge = funcs.merges[vlc_ctz(pixel_size)];
#if defined(__i386__) || defined(__x86_64__)
p_sys->pf_end_merge = NULL;
#endif
......
......@@ -31,6 +31,35 @@
* Merge (line blending) routines for the VLC deinterlacer.
*/
/**
* Average two vectors.
*
* This callback shall compute the element-wise rounded average of two vectors.
* This is used for blending scan lines of two fields for deinterlacing.
*
* The size of element is specified by the context,
* namely \see deinterlace_functions.
* Currently 8-bit and 16-bit elements are supported.
*
* \param d Output vector
* \param s1 First source vector
* \param s2 Second source vector
* \param len size of vectors in bytes
*/
typedef void (*merge_cb)(void *d, const void *s1, const void *s2, size_t len);
/**
* Deinterlacing optimisation callbacks.
*/
struct deinterlace_functions {
/** Element-wise vector average
*
* The first array entries are indexed by the binary order of magnitude
* of the element size in bytes: 0 for 8-bit, 1 for 16-bit. */
merge_cb merges[2];
};
/*****************************************************************************
* Macros
*****************************************************************************/
......@@ -133,35 +162,6 @@ void Merge8BitSSE2( void *, const void *, const void *, size_t );
void Merge16BitSSE2( void *, const void *, const void *, size_t );
#endif
#if defined(CAN_COMPILE_ARM)
/**
* ARM NEON routine to blend pixels from two picture lines.
*/
void merge8_arm_neon (void *, const void *, const void *, size_t);
void merge16_arm_neon (void *, const void *, const void *, size_t);
/**
* ARMv6 SIMD routine to blend pixels from two picture lines.
*/
void merge8_armv6 (void *, const void *, const void *, size_t);
void merge16_armv6 (void *, const void *, const void *, size_t);
#endif
#if defined(CAN_COMPILE_ARM64)
/**
* ARM64 NEON routine to blend pixels from two picture lines.
*/
void merge8_arm64_neon (void *, const void *, const void *, size_t);
void merge16_arm64_neon (void *, const void *, const void *, size_t);
#endif
void merge8_arm_sve(void *, const void *, const void *, size_t);
void merge16_arm_sve(void *, const void *, const void *, size_t);
void merge8_rvv(void *, const void *, const void *, size_t);
void merge16_rvv(void *, const void *, const void *, size_t);
/*****************************************************************************
* EndMerge routines
*****************************************************************************/
......
......@@ -299,7 +299,8 @@ void vlc_CPU_functions_init(const char *capability, void *restrict funcs)
module_t **mods;
ssize_t n = vlc_module_match(capability, NULL, false, &mods, NULL);
for (ssize_t i = 0; i < n; i++) {
/* Descending order so higher priorities override the lower ones */
for (ssize_t i = n - 1; i >= 0; i--) {
void (*init)(void *) = vlc_module_map(NULL, mods[i]);
if (likely(init != NULL))
init(funcs);
......