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 (14)
......@@ -49,6 +49,19 @@ enum vlc_gl_api_type {
VLC_OPENGL_ES2,
};
struct vlc_gl_operations
{
union {
void (*swap)(vlc_gl_t *);
picture_t *(*swap_offscreen)(vlc_gl_t *);
};
int (*make_current)(vlc_gl_t *gl);
void (*release_current)(vlc_gl_t *gl);
void (*resize)(vlc_gl_t *gl, unsigned width, unsigned height);
void*(*get_proc_address)(vlc_gl_t *gl, const char *symbol);
void (*close)(vlc_gl_t *gl);
};
struct vlc_gl_t
{
struct vlc_object_t obj;
......@@ -59,13 +72,9 @@ struct vlc_gl_t
struct vlc_decoder_device *device;
union {
struct { /* on-screen */
void (*swap)(vlc_gl_t *);
struct vout_window_t *surface;
};
struct { /* off-screen */
picture_t *(*swap_offscreen)(vlc_gl_t *);
vlc_fourcc_t offscreen_chroma_out;
struct vlc_video_context *offscreen_vctx_out;
/* Flag to indicate if the OpenGL implementation produces upside-down
......@@ -74,14 +83,10 @@ struct vlc_gl_t
};
};
int (*make_current)(vlc_gl_t *);
void (*release_current)(vlc_gl_t *);
void (*resize)(vlc_gl_t *, unsigned, unsigned);
void*(*get_proc_address)(vlc_gl_t *, const char *);
void (*destroy)(vlc_gl_t *);
/* Defined by the core for libvlc_opengl API loading. */
enum vlc_gl_api_type api_type;
const struct vlc_gl_operations *ops;
};
/**
......@@ -105,33 +110,33 @@ VLC_API void vlc_gl_Delete(vlc_gl_t *);
static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl)
{
return gl->make_current(gl);
return gl->ops->make_current(gl);
}
static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl)
{
gl->release_current(gl);
gl->ops->release_current(gl);
}
static inline void vlc_gl_Resize(vlc_gl_t *gl, unsigned w, unsigned h)
{
if (gl->resize != NULL)
gl->resize(gl, w, h);
if (gl->ops->resize != NULL)
gl->ops->resize(gl, w, h);
}
static inline void vlc_gl_Swap(vlc_gl_t *gl)
{
gl->swap(gl);
gl->ops->swap(gl);
}
static inline picture_t *vlc_gl_SwapOffscreen(vlc_gl_t *gl)
{
return gl->swap_offscreen(gl);
return gl->ops->swap_offscreen(gl);
}
static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name)
{
return gl->get_proc_address(gl, name);
return gl->ops->get_proc_address(gl, name);
}
VLC_API vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *,
......
......@@ -396,12 +396,15 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
goto error1;
}
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = NULL;
gl->swap_offscreen = Swap;
gl->get_proc_address = GetSymbol;
gl->destroy = Close;
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.swap_offscreen = Swap,
.get_proc_address = GetSymbol,
.close = Close,
};
gl->ops = &gl_ops;
gl->offscreen_vflip = true;
vlc_gl_MakeCurrent(gl);
......
......@@ -367,12 +367,15 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
goto error2;
}
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = NULL;
gl->swap_offscreen = SwapOffscreen;
gl->get_proc_address = GetSymbol;
gl->destroy = Close;
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.swap_offscreen = SwapOffscreen,
.get_proc_address = GetSymbol,
.close = Close,
};
gl->ops = &gl_ops;
struct video_ctx *vctx = GetVCtx(gl);
......
......@@ -345,12 +345,16 @@ static void FreeCVBuffer(picture_t *picture)
if ([self resize:CGSizeMake(width, height)] != VLC_SUCCESS)
return nil;
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = Resize;
gl->swap_offscreen = Swap;
gl->get_proc_address = GetSymbol;
gl->destroy = Close;
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.resize = Resize,
.swap_offscreen = Swap,
.get_proc_address = GetSymbol,
.close = Close,
};
gl->ops = &gl_ops;
gl->offscreen_vflip = true;
gl->offscreen_vctx_out = _vctx_out;
gl->offscreen_chroma_out = VLC_CODEC_CVPX_BGRA;
......
......@@ -229,12 +229,16 @@ static void Close(vlc_gl_t *gl)
/* Setup the usual vlc_gl_t callbacks before loading the API since we need
* the get_proc_address symbol and a current context. */
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = Resize;
gl->swap = Swap;
gl->get_proc_address = GetSymbol;
gl->destroy = Close;
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.resize = Resize,
.swap = Swap,
.get_proc_address = GetSymbol,
.close = Close,
};
gl->ops = &gl_ops;
return self;
}
......
......@@ -326,10 +326,14 @@ static int Open (vout_display_t *vd,
if (unlikely(!sys->gl))
goto error;
sys->gl->make_current = gl_cb_MakeCurrent;
sys->gl->release_current = gl_cb_ReleaseCurrent;
sys->gl->swap = gl_cb_Swap;
sys->gl->get_proc_address = gl_cb_GetProcAddress;
static const struct vlc_gl_operations gl_ops =
{
.make_current = gl_cb_MakeCurrent,
.release_current = gl_cb_ReleaseCurrent,
.swap = gl_cb_Swap,
.get_proc_address = gl_cb_GetProcAddress,
};
sys->gl->ops = &gl_ops;
sys->gl->api_type = VLC_OPENGL;
struct vlc_gl_sys *glsys = sys->gl->sys = malloc(sizeof(*glsys));
......
......@@ -230,13 +230,17 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
sys->restore_forget_gravity = false;
/* Initialize OpenGL callbacks */
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.resize = NULL,
.swap = SwapBuffers,
.get_proc_address = GetSymbol,
.close = Close,
};
gl->sys = sys;
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = NULL;
gl->swap = SwapBuffers;
gl->get_proc_address = GetSymbol;
gl->destroy = Close;
gl->ops = &gl_ops;
bool is_swap_interval_set = false;
......
......@@ -212,10 +212,15 @@ static int Open (vout_display_t *vd,
}
glsys->locked_ctx = NULL;
glsys->glView = sys->glView;
sys->gl->make_current = OpenglLock;
sys->gl->release_current = OpenglUnlock;
sys->gl->swap = OpenglSwap;
sys->gl->get_proc_address = OurGetProcAddress;
static const struct vlc_gl_operations gl_ops =
{
.make_current = OpenglLock,
.release_current = OpenglUnlock,
.swap = OpenglSwap,
.get_proc_address = OurGetProcAddress,
};
sys->gl->ops = &gl_ops;
sys->gl->api_type = VLC_OPENGL;
const vlc_fourcc_t *subpicture_chromas;
......
......@@ -457,12 +457,16 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
sys->context = ctx;
/* Initialize OpenGL callbacks */
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = Resize;
gl->swap = SwapBuffers;
gl->get_proc_address = GetSymbol;
gl->destroy = Close;
static const struct vlc_gl_operations ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.resize = Resize,
.swap = SwapBuffers,
.get_proc_address = GetSymbol,
.close = Close,
};
gl->ops = &ops;
return VLC_SUCCESS;
......
......@@ -142,13 +142,6 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
SET_CALLBACK_ADDR(sys->makeCurrentCb, "vout-cb-make-current");
SET_CALLBACK_ADDR(sys->getProcAddressCb, "vout-cb-get-proc-address");
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = Resize;
gl->swap = VglSwapBuffers;
gl->get_proc_address = OurGetProcAddress;
gl->destroy = Close;
if( sys->setupCb )
{
libvlc_video_setup_device_cfg_t setup_cfg = {};
......@@ -159,8 +152,19 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
return VLC_EGENERIC;
}
}
Resize(gl, width, height);
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.resize = Resize,
.swap = VglSwapBuffers,
.get_proc_address = OurGetProcAddress,
.close = Close,
};
gl->ops = &gl_ops;
return VLC_SUCCESS;
}
......
......@@ -218,12 +218,16 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
wglMakeCurrent(sys->hGLDC, NULL);
gl->make_current = MakeCurrent;
gl->release_current = ReleaseCurrent;
gl->resize = NULL;
gl->swap = Swap;
gl->get_proc_address = OurGetProcAddress;
gl->destroy = Close;
static const struct vlc_gl_operations gl_ops =
{
.make_current = MakeCurrent,
.release_current = ReleaseCurrent,
.resize = NULL,
.swap = Swap,
.get_proc_address = OurGetProcAddress,
.close = Close,
};
gl->ops = &gl_ops;
(void) width; (void) height;
return VLC_SUCCESS;
......
......@@ -91,8 +91,12 @@ vlc_gl_t *vlc_gl_Create(const struct vout_display_cfg *restrict cfg,
vlc_object_delete(gl);
return NULL;
}
assert(gl->make_current && gl->release_current && gl->swap
&& gl->get_proc_address);
assert(gl->ops);
assert(gl->ops->make_current);
assert(gl->ops->release_current);
assert(gl->ops->swap);
assert(gl->ops->get_proc_address);
return &glpriv->gl;
}
......@@ -146,18 +150,19 @@ vlc_gl_t *vlc_gl_CreateOffscreen(vlc_object_t *parent,
/* The implementation must initialize the output chroma */
assert(gl->offscreen_chroma_out != VLC_CODEC_UNKNOWN);
assert(gl->make_current);
assert(gl->release_current);
assert(gl->swap_offscreen);
assert(gl->get_proc_address);
assert(gl->ops);
assert(gl->ops->make_current);
assert(gl->ops->release_current);
assert(gl->ops->swap_offscreen);
assert(gl->ops->get_proc_address);
return &glpriv->gl;
}
void vlc_gl_Delete(vlc_gl_t *gl)
{
if (gl->destroy != NULL)
gl->destroy(gl);
if (gl->ops->close != NULL)
gl->ops->close(gl);
if (gl->device)
vlc_decoder_device_Release(gl->device);
......
......@@ -35,6 +35,7 @@ check_PROGRAMS = \
test_src_misc_epg \
test_src_misc_keystore \
test_src_video_output \
test_src_video_output_opengl \
test_modules_packetizer_helpers \
test_modules_packetizer_hxxx \
test_modules_packetizer_h264 \
......@@ -173,6 +174,8 @@ test_src_video_output_SOURCES = \
src/video_output/video_output.h \
src/video_output/video_output_scenarios.c
test_src_video_output_LDADD = $(LIBVLCCORE) $(LIBVLC)
test_src_video_output_opengl_SOURCES = src/video_output/opengl.c
test_src_video_output_opengl_LDADD = $(LIBVLCCORE) $(LIBVLC)
checkall:
$(MAKE) check_PROGRAMS="$(check_PROGRAMS) $(EXTRA_PROGRAMS)" check
......
/*****************************************************************************
* opengl.c: test for the OpenGL provider
*****************************************************************************
* Copyright (C) 2022 VideoLabs
*
* 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
/* Define a builtin module for mocked parts */
#define MODULE_NAME test_offscreen_mock
#define MODULE_STRING "test_offscreen_mock"
#undef __PLUGIN__
#include "../../libvlc/test.h"
#include "../../../lib/libvlc_internal.h"
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_codec.h>
#include <vlc_opengl.h>
#include <vlc_filter.h>
#include <vlc_modules.h>
#include <vlc_vout_display.h>
static char dummy;
static bool swapped;
static bool swapped_offscreen;
/**
* Dummy decoder device implementation
*/
static void DecoderDeviceClose(struct vlc_decoder_device *device)
{ VLC_UNUSED(device); }
static const struct vlc_decoder_device_operations decoder_device_ops =
{ .close = DecoderDeviceClose, };
static int OpenDecoderDevice(
struct vlc_decoder_device *device,
vout_window_t *window
) {
VLC_UNUSED(window);
/* Note: the decoder device type could be anything since we'll hook
* it in the test code below. */
device->type = VLC_DECODER_DEVICE_VAAPI;
device->ops = &decoder_device_ops;
return VLC_SUCCESS;
}
/**
* Dummy vout_window implementation
*/
static const struct vout_window_operations wnd_ops = {
.destroy = NULL,
};
static int OpenWindow(vout_window_t *wnd)
{
wnd->type = VOUT_WINDOW_TYPE_DUMMY;
wnd->ops = &wnd_ops;
return VLC_SUCCESS;
}
/**
* Dummy OpenGL provider
*/
static int OpenGLMakeCurrent(vlc_gl_t *gl)
{
VLC_UNUSED(gl);
return VLC_SUCCESS;
}
static void OpenGLReleaseCurrent(vlc_gl_t *gl)
{
(void)gl;
}
static void OpenGLSwap(vlc_gl_t *gl)
{
(void)gl;
swapped = true;
}
static picture_t *OpenGLSwapOffscreen(vlc_gl_t *gl)
{
(void)gl;
swapped_offscreen = true;
return NULL;
}
static void *OpenGLGetSymbol(vlc_gl_t *gl, const char *procname)
{
(void)gl; (void)procname;
if (strcmp(procname, "dummy") == 0)
return &dummy;
return NULL;
}
static void OpenGLClose(vlc_gl_t *gl)
{
(void)gl;
}
static int
OpenOpenGLCommon(
vlc_gl_t *gl, unsigned width, unsigned height,
bool offscreen, enum vlc_gl_api_type api_type)
{
(void)width; (void)height;
assert(gl->api_type == api_type);
static const struct vlc_gl_operations onscreen_ops =
{
.make_current = OpenGLMakeCurrent,
.release_current = OpenGLReleaseCurrent,
.resize = NULL,
.get_proc_address = OpenGLGetSymbol,
.swap = OpenGLSwap,
.close = OpenGLClose,
};
static const struct vlc_gl_operations offscreen_ops =
{
.make_current = OpenGLMakeCurrent,
.release_current = OpenGLReleaseCurrent,
.resize = NULL,
.get_proc_address = OpenGLGetSymbol,
.swap_offscreen = OpenGLSwapOffscreen,
.close = OpenGLClose,
};
gl->ops = offscreen ? &offscreen_ops : &onscreen_ops;
return VLC_SUCCESS;
}
static int
OpenOpenGL(vlc_gl_t *gl, unsigned width, unsigned height)
{ return OpenOpenGLCommon(gl, width, height, false, VLC_OPENGL); };
static int
OpenOpenGLES(vlc_gl_t *gl, unsigned width, unsigned height)
{ return OpenOpenGLCommon(gl, width, height, false, VLC_OPENGL_ES2); };
static int
OpenOpenGLOffscreen(vlc_gl_t *gl, unsigned width, unsigned height)
{ return OpenOpenGLCommon(gl, width, height, true, VLC_OPENGL); };
static int
OpenOpenGLESOffscreen(vlc_gl_t *gl, unsigned width, unsigned height)
{ return OpenOpenGLCommon(gl, width, height, true, VLC_OPENGL_ES2); };
/* Helper typedef for vlc_static_modules */
typedef int (*vlc_plugin_cb)(vlc_set_cb, void*);
/**
* Inject the mocked modules as a static plugin:
* - decoder device for generating video context and testing release
* - opengl offscreen for generating video context and using decoder device
**/
vlc_module_begin()
set_callback(OpenDecoderDevice)
set_capability("decoder device", 1000)
add_shortcut("test_offscreen")
add_submodule()
set_callback(OpenWindow)
set_capability("vout window", 1)
add_submodule()
set_callback(OpenOpenGL)
set_capability("opengl", 1)
add_submodule()
set_callback(OpenOpenGLES)
set_capability("opengl es2", 1)
add_submodule()
set_callback(OpenOpenGLOffscreen)
set_capability("opengl offscreen", 1)
add_submodule()
set_callback(OpenOpenGLESOffscreen)
set_capability("opengl es2 offscreen", 1)
vlc_module_end()
VLC_EXPORT vlc_plugin_cb
vlc_static_modules[] = { vlc_entry__test_offscreen_mock, NULL };
static void test_opengl_offscreen(vlc_object_t *root, enum vlc_gl_api_type api_type)
{
struct vlc_decoder_device *device =
vlc_decoder_device_Create(root, NULL);
assert(device != NULL);
vlc_gl_t *gl = vlc_gl_CreateOffscreen(
root, device, 800, 600, api_type, MODULE_STRING);
assert(gl != NULL);
vlc_decoder_device_Release(device);
assert(vlc_gl_MakeCurrent(gl) == VLC_SUCCESS);
assert(vlc_gl_GetProcAddress(gl, "dummy") == &dummy);
vlc_gl_ReleaseCurrent(gl);
swapped_offscreen = false;
vlc_gl_SwapOffscreen(gl);
assert(swapped_offscreen == true);
vlc_gl_Delete(gl);
}
static void test_opengl(vlc_object_t *root, enum vlc_gl_api_type api_type)
{
const vout_window_cfg_t wnd_cfg = { .width = 800, .height = 600, };
const vout_window_owner_t owner = { .sys = NULL };
vout_window_t *wnd = vout_window_New(root, MODULE_STRING, &owner, &wnd_cfg);
assert(wnd != NULL && wnd->ops == &wnd_ops);
const vout_display_cfg_t cfg = {
.window = wnd,
.display.width = wnd_cfg.width,
.display.height = wnd_cfg.height,
};
vlc_gl_t *gl = vlc_gl_Create(&cfg, api_type, MODULE_STRING);
assert(gl != NULL);
assert(vlc_gl_MakeCurrent(gl) == VLC_SUCCESS);
assert(vlc_gl_GetProcAddress(gl, "dummy") == &dummy);
vlc_gl_ReleaseCurrent(gl);
swapped = false;
vlc_gl_Swap(gl);
assert(swapped == true);
vlc_gl_Delete(gl);
vout_window_Delete(wnd);
}
int main( int argc, char **argv )
{
(void)argc; (void)argv;
test_init();
const char * const vlc_argv[] = {
"-vvv", "--aout=dummy", "--text-renderer=dummy",
};
libvlc_instance_t *vlc = libvlc_new(ARRAY_SIZE(vlc_argv), vlc_argv);
vlc_object_t *root = &vlc->p_libvlc_int->obj;
test_opengl(root, VLC_OPENGL);
test_opengl(root, VLC_OPENGL_ES2);
test_opengl_offscreen(root, VLC_OPENGL);
test_opengl_offscreen(root, VLC_OPENGL_ES2);
libvlc_release(vlc);
return 0;
}