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 (6)
......@@ -34,189 +34,147 @@
#include <vlc_mouse.h>
#include <vlc_picture.h>
static void HFlip(int *sx, int *sy, int w, int h, int dx, int dy)
static void vflip(void *restrict dst, ptrdiff_t dst_stride,
const void *restrict src, ptrdiff_t src_stride,
int width, int height, int order)
{
VLC_UNUSED( h );
*sx = w - 1 - dx;
*sy = dy;
}
static void VFlip(int *sx, int *sy, int w, int h, int dx, int dy)
{
VLC_UNUSED( w );
*sx = dx;
*sy = h - 1 - dy;
}
static void Transpose(int *sx, int *sy, int w, int h, int dx, int dy)
{
VLC_UNUSED( h ); VLC_UNUSED( w );
*sx = dy;
*sy = dx;
}
static void AntiTranspose(int *sx, int *sy, int w, int h, int dx, int dy)
{
*sx = h - 1 - dy;
*sy = w - 1 - dx;
}
static void R90(int *sx, int *sy, int w, int h, int dx, int dy)
{
VLC_UNUSED( h );
*sx = dy;
*sy = w - 1 - dx;
}
static void R180(int *sx, int *sy, int w, int h, int dx, int dy)
{
*sx = w - 1 - dx;
*sy = h - 1 - dy;
}
static void R270(int *sx, int *sy, int w, int h, int dx, int dy)
{
VLC_UNUSED( w );
*sx = h - 1 - dy;
*sy = dx;
}
typedef void (*convert_t)(int *, int *, int, int, int, int);
const unsigned char *src_pixels = src;
unsigned char *restrict dst_pixels = dst;
size_t visible_pitch = width << order;
#define PLANE(f,bits) \
static void Plane##bits##_##f(plane_t *restrict dst, const plane_t *restrict src) \
{ \
const uint##bits##_t *src_pixels = (const void *)src->p_pixels; \
uint##bits##_t *restrict dst_pixels = (void *)dst->p_pixels; \
const unsigned src_width = src->i_pitch / sizeof (*src_pixels); \
const unsigned dst_width = dst->i_pitch / sizeof (*dst_pixels); \
const unsigned dst_visible_width = dst->i_visible_pitch / sizeof (*dst_pixels); \
\
for (int y = 0; y < dst->i_visible_lines; y++) { \
for (unsigned x = 0; x < dst_visible_width; x++) { \
int sx, sy; \
(f)(&sx, &sy, dst_visible_width, dst->i_visible_lines, x, y); \
dst_pixels[y * dst_width + x] = \
src_pixels[sy * src_width + sx]; \
} \
} \
}
dst_pixels += dst_stride * height;
static void Plane_VFlip(plane_t *restrict dst, const plane_t *restrict src)
{
const uint8_t *src_pixels = src->p_pixels;
uint8_t *restrict dst_pixels = dst->p_pixels;
dst_pixels += dst->i_pitch * dst->i_visible_lines;
for (int y = 0; y < dst->i_visible_lines; y++) {
dst_pixels -= dst->i_pitch;
memcpy(dst_pixels, src_pixels, dst->i_visible_pitch);
src_pixels += src->i_pitch;
for (int y = 0; y < height; y++) {
dst_pixels -= dst_stride;
memcpy(dst_pixels, src_pixels, visible_pitch);
src_pixels += src_stride;
}
}
#define I422(f) \
static void Plane422_##f(plane_t *restrict dst, const plane_t *restrict src) \
#define TRANSFORMS(bits) \
static void hflip_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, ptrdiff_t src_stride, \
int width, int height) \
{ \
for (int y = 0; y < dst->i_visible_lines; y += 2) { \
for (int x = 0; x < dst->i_visible_pitch; x++) { \
int sx, sy, uv; \
(f)(&sx, &sy, dst->i_visible_pitch, dst->i_visible_lines / 2, \
x, y / 2); \
uv = (1 + src->p_pixels[2 * sy * src->i_pitch + sx] + \
src->p_pixels[(2 * sy + 1) * src->i_pitch + sx]) / 2; \
dst->p_pixels[y * dst->i_pitch + x] = uv; \
dst->p_pixels[(y + 1) * dst->i_pitch + x] = uv; \
} \
const uint##bits##_t *restrict src_pixels = src; \
uint##bits##_t *restrict dst_pixels = dst; \
\
dst_stride /= bits / 8; \
src_stride /= bits / 8; \
dst_pixels += width - 1; \
\
for (int y = 0; y < height; y++) { \
for (int x = 0; x < width; x++) \
dst_pixels[-x] = src_pixels[x]; \
\
src_pixels += src_stride; \
dst_pixels += dst_stride; \
} \
}
#define YUY2(f) \
static void PlaneYUY2_##f(plane_t *restrict dst, const plane_t *restrict src) \
} \
\
static void vflip_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, ptrdiff_t src_stride, \
int width, int height) \
{ \
vflip(dst, dst_stride, src, src_stride, width, height, ctz(bits / 8)); \
} \
\
static void r180_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, ptrdiff_t src_stride, \
int width, int height) \
{ \
const unsigned char *src_pixels = src; \
\
src_pixels += (height - 1) * src_stride; \
src_stride *= -1; \
hflip_##bits(dst, dst_stride, src_pixels, src_stride, width, height); \
} \
\
static void transpose_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, ptrdiff_t src_stride, \
int src_width, int src_height) \
{ \
unsigned dst_visible_width = dst->i_visible_pitch / 2; \
\
for (int y = 0; y < dst->i_visible_lines; y += 2) { \
for (unsigned x = 0; x < dst_visible_width; x+= 2) { \
int sx0, sy0, sx1, sy1; \
(f)(&sx0, &sy0, dst_visible_width, dst->i_visible_lines, x, y); \
(f)(&sx1, &sy1, dst_visible_width, dst->i_visible_lines, \
x + 1, y + 1); \
dst->p_pixels[(y + 0) * dst->i_pitch + 2 * (x + 0)] = \
src->p_pixels[sy0 * src->i_pitch + 2 * sx0]; \
dst->p_pixels[(y + 0) * dst->i_pitch + 2 * (x + 1)] = \
src->p_pixels[sy1 * src->i_pitch + 2 * sx0]; \
dst->p_pixels[(y + 1) * dst->i_pitch + 2 * (x + 0)] = \
src->p_pixels[sy0 * src->i_pitch + 2 * sx1]; \
dst->p_pixels[(y + 1) * dst->i_pitch + 2 * (x + 1)] = \
src->p_pixels[sy1 * src->i_pitch + 2 * sx1]; \
\
int sx, sy, u, v; \
(f)(&sx, &sy, dst_visible_width / 2, dst->i_visible_lines / 2, \
x / 2, y / 2); \
u = (1 + src->p_pixels[2 * sy * src->i_pitch + 4 * sx + 1] + \
src->p_pixels[(2 * sy + 1) * src->i_pitch + 4 * sx + 1]) / 2; \
v = (1 + src->p_pixels[2 * sy * src->i_pitch + 4 * sx + 3] + \
src->p_pixels[(2 * sy + 1) * src->i_pitch + 4 * sx + 3]) / 2; \
dst->p_pixels[(y + 0) * dst->i_pitch + 2 * x + 1] = u; \
dst->p_pixels[(y + 0) * dst->i_pitch + 2 * x + 3] = v; \
dst->p_pixels[(y + 1) * dst->i_pitch + 2 * x + 1] = u; \
dst->p_pixels[(y + 1) * dst->i_pitch + 2 * x + 3] = v; \
} \
const uint##bits##_t *restrict src_pixels = src; \
uint##bits##_t *restrict dst_pixels = dst; \
\
dst_stride /= bits / 8; \
src_stride /= bits / 8; \
\
for (int y = 0; y < src_height; y++) { \
for (int x = 0; x < src_width; x++) \
dst_pixels[x * dst_stride] = src_pixels[x]; \
src_pixels += src_stride; \
dst_pixels++; \
} \
} \
\
static void r270_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, ptrdiff_t src_stride, \
int src_width, int src_height) \
{ \
unsigned char *dst_pixels = dst; \
\
dst_pixels += (src_width - 1) * dst_stride; \
dst_stride *= -1; \
transpose_##bits(dst_pixels, dst_stride, src, src_stride, \
src_width, src_height); \
} \
\
static void r90_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, ptrdiff_t src_stride, \
int src_width, int src_height) \
{ \
const unsigned char *src_pixels = src; \
\
src_pixels += (src_height - 1) * src_stride; \
src_stride *= -1; \
transpose_##bits(dst, dst_stride, src_pixels, src_stride, \
src_width, src_height); \
} \
\
static void antitranspose_##bits(void *restrict dst, ptrdiff_t dst_stride, \
const void *restrict src, \
ptrdiff_t src_stride, \
int src_width, int src_height) \
{ \
const unsigned char *src_pixels = src; \
\
src_pixels += (src_height - 1) * src_stride; \
src_stride *= -1; \
r270_##bits(dst, dst_stride, src_pixels, src_stride, \
src_width, src_height);\
}
#undef PLANES // already exists on Windows
#define PLANES(f) \
PLANE(f,8) PLANE(f,16) PLANE(f,32)
PLANES(HFlip)
#define Plane8_VFlip Plane_VFlip
#define Plane16_VFlip Plane_VFlip
#define Plane32_VFlip Plane_VFlip
PLANES(Transpose)
PLANES(AntiTranspose)
PLANES(R90)
PLANES(R180)
PLANES(R270)
#define Plane422_HFlip Plane16_HFlip
#define Plane422_VFlip Plane_VFlip
#define Plane422_R180 Plane16_R180
I422(Transpose)
I422(AntiTranspose)
I422(R90)
I422(R270)
#define PlaneYUY2_HFlip Plane32_HFlip
#define PlaneYUY2_VFlip Plane_VFlip
#define PlaneYUY2_R180 Plane32_R180
YUY2(Transpose)
YUY2(AntiTranspose)
YUY2(R90)
YUY2(R270)
TRANSFORMS(8)
TRANSFORMS(16)
TRANSFORMS(32)
typedef void (*plane_transform_cb)(void *, ptrdiff_t, const void *, ptrdiff_t,
int, int);
typedef struct {
convert_t convert;
void (*plane8) (plane_t *dst, const plane_t *src);
void (*plane16)(plane_t *dst, const plane_t *src);
void (*plane32)(plane_t *dst, const plane_t *src);
void (*i422)(plane_t *dst, const plane_t *src);
void (*yuyv)(plane_t *dst, const plane_t *src);
plane_transform_cb plane8;
plane_transform_cb plane16;
plane_transform_cb plane32;
} transform_description_t;
#define DESC(f) \
{ f, Plane8_##f, Plane16_##f, Plane32_##f, \
Plane422_##f, PlaneYUY2_##f }
#define DESC(g) \
{ g##_8, g##_16, g##_32, }
static const transform_description_t descriptions[] = {
[TRANSFORM_R90] = DESC(R90),
[TRANSFORM_R180] = DESC(R180),
[TRANSFORM_R270] = DESC(R270),
[TRANSFORM_HFLIP] = DESC(HFlip),
[TRANSFORM_VFLIP] = DESC(VFlip),
[TRANSFORM_TRANSPOSE] = DESC(Transpose),
[TRANSFORM_ANTI_TRANSPOSE] = DESC(AntiTranspose),
[TRANSFORM_R90] = DESC(r90),
[TRANSFORM_R180] = DESC(r180),
[TRANSFORM_R270] = DESC(r270),
[TRANSFORM_HFLIP] = DESC(hflip),
[TRANSFORM_VFLIP] = DESC(vflip),
[TRANSFORM_TRANSPOSE] = DESC(transpose),
[TRANSFORM_ANTI_TRANSPOSE] = DESC(antitranspose),
};
typedef struct
{
const vlc_chroma_description_t *chroma;
void (*plane[PICTURE_PLANE_MAX])(plane_t *, const plane_t *);
convert_t convert;
video_transform_t transform;
plane_transform_cb plane[PICTURE_PLANE_MAX];
} filter_sys_t;
static picture_t *Filter(filter_t *filter, picture_t *src)
......@@ -225,10 +183,11 @@ static picture_t *Filter(filter_t *filter, picture_t *src)
picture_t *dst = filter_NewPicture(filter);
if (likely(dst != NULL)) {
const vlc_chroma_description_t *chroma = sys->chroma;
for (unsigned i = 0; i < chroma->plane_count; i++)
(sys->plane[i])(&dst->p[i], &src->p[i]);
for (int i = 0; i < src->i_planes; i++)
(sys->plane[i])(dst->p[i].p_pixels, dst->p[i].i_pitch,
src->p[i].p_pixels, src->p[i].i_pitch,
src->p[i].i_visible_pitch / src->p[i].i_pixel_pitch,
src->p[i].i_visible_lines);
picture_CopyProperties(dst, src);
}
......@@ -244,10 +203,54 @@ static int Mouse(filter_t *filter, vlc_mouse_t *mouse,
const video_format_t *fmt = &filter->fmt_out.video;
const filter_sys_t *sys = filter->p_sys;
int dw = fmt->i_visible_width, dh = fmt->i_visible_height;
int dx = mouse->i_x, dy = mouse->i_y;
int sx, sy;
switch (sys->transform) {
case TRANSFORM_HFLIP:
case TRANSFORM_R180:
sx = dw - 1 - dx;
break;
//case TRANSFORM_IDENTITY:
case TRANSFORM_VFLIP:
sx = dx;
break;
case TRANSFORM_TRANSPOSE:
case TRANSFORM_R90:
sx = dy;
break;
case TRANSFORM_R270:
case TRANSFORM_ANTI_TRANSPOSE:
sx = dh - 1 - dy;
break;
default:
vlc_assert_unreachable();
}
switch (sys->transform) {
//case TRANSFORM_IDENTITY:
case TRANSFORM_HFLIP:
sy = dy;
break;
case TRANSFORM_VFLIP:
case TRANSFORM_R180:
sy = dh - 1 - dy;
break;
case TRANSFORM_TRANSPOSE:
case TRANSFORM_R270:
sy = dx;
break;
case TRANSFORM_R90:
case TRANSFORM_ANTI_TRANSPOSE:
sy = dw - 1 - dx;
break;
default:
vlc_assert_unreachable();
}
sys->convert(&mouse->i_x, &mouse->i_y,
fmt->i_visible_width, fmt->i_visible_height,
mouse->i_x, mouse->i_y);
mouse->i_x = sx;
mouse->i_y = sy;
return VLC_SUCCESS;
}
......@@ -284,7 +287,7 @@ static int Open(filter_t *filter)
const transform_description_t *const dsc = &descriptions[transform];
sys->chroma = chroma;
sys->transform = transform;
switch (chroma->pixel_size) {
case 1:
......@@ -302,36 +305,19 @@ static int Open(filter_t *filter)
for (unsigned i = 1; i < PICTURE_PLANE_MAX; i++)
sys->plane[i] = sys->plane[0];
sys->convert = dsc->convert;
if (ORIENT_IS_SWAP(transform)) {
switch (src->i_chroma) {
case VLC_CODEC_I422:
case VLC_CODEC_J422:
sys->plane[2] = sys->plane[1] = dsc->i422;
break;
default:
for (unsigned i = 0; i < chroma->plane_count; i++)
if (chroma->p[i].w.num * chroma->p[i].h.den
!= chroma->p[i].h.num * chroma->p[i].w.den)
return VLC_ENOTSUP;
}
}
if (ORIENT_IS_SWAP(transform)) /* Cannot transform non-square samples */
for (unsigned i = 0; i < chroma->plane_count; i++)
if (chroma->p[i].w.num * chroma->p[i].h.den
!= chroma->p[i].h.num * chroma->p[i].w.den)
return VLC_ENOTSUP;
/* Deal with weird packed formats */
switch (src->i_chroma) {
case VLC_CODEC_UYVY:
case VLC_CODEC_VYUY:
if (ORIENT_IS_SWAP(transform))
return VLC_ENOTSUP;
/* fallthrough */
case VLC_CODEC_YUYV:
case VLC_CODEC_YVYU:
sys->plane[0] = dsc->yuyv; /* 32-bits, not 16-bits! */
break;
case VLC_CODEC_NV12:
case VLC_CODEC_NV21:
return VLC_ENOTSUP;
sys->plane[1] = dsc->plane16;
break;
}
static const struct vlc_filter_operations filter_ops =
......