Okay, so I was successful with getting libVLC to play a video in full screen in just a few lines of code. This was a great success. However, when using a play list, each item is shown in a window.
Tonight I haven’t the time to set up a full screen window and attach libVLC to it, so I will try that tomorrow. There’s tons of Linux windowing API’s I can use. Just a standard X11 window will be fine as there will be no user input at all.
It’s no use having a black background as a desktop as some videos will end with a different coloured background.
Ah well. Plod on tomorrow. Almost there.
If I fail then it will be a minimal build of ffmpeg or maybe just the OGV libraries and I will write a player myself which will take a tad longer than I wanted.
Sample C code on Linux:
#include <X11/X.h>
#include <X11/Xlib.h>
#include <strings.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern "C" {
#include <vlc/vlc.h>
}
const char *files[] = {
"/media/wlgfx/WLGfx/WLGfxMedia/2017July/WLGfxJul/wlgfx.ogv",
"/media/wlgfx/WLGfx/WLGfxMedia/2017July/sample1/sample.ogv"
};
const int files_count = 2;
void play_media(libvlc_instance_t *inst, const char *uri, uint32_t win) {
libvlc_media_t *m = libvlc_media_new_path(inst, uri);
libvlc_media_player_t *mp = libvlc_media_player_new_from_media(m);
libvlc_set_fullscreen(mp, 1);
libvlc_media_player_set_xwindow(mp, win);
libvlc_media_player_play(mp);
sleep(1); // enough time to start
while (libvlc_media_get_state(m) == libvlc_Playing) usleep(200);
libvlc_media_release(m);
libvlc_media_player_release(mp);
}
int main() {
Display* dis = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 0, 0, 10, 10,
0, BlackPixel (dis, 0), BlackPixel(dis, 0));
Screen *screen; // get screen size
screen = ScreenOfDisplay(dis, 0);
int dwid = screen->width;
int dhgt = screen->height;
Window root; // position mouse to bottom left (hide it)
root = XRootWindow(dis, 0);
XSelectInput(dis, root, KeyReleaseMask);
XWarpPointer(dis, None, root, 0, 0, 0, 0, dwid, dhgt);
XFlush(dis);
XInitThreads();
Atom wm_state = XInternAtom(dis, "_NET_WM_STATE", False);
Atom fullscreen = XInternAtom(dis, "_NET_WM_STATE_FULLSCREEN", False);
XEvent xev;
memset(&xev, 0, sizeof(xev));
xev.type = ClientMessage;
xev.xclient.window = win;
xev.xclient.message_type = wm_state;
xev.xclient.format = 32;
xev.xclient.data.l[0] = 1;
xev.xclient.data.l[1] = fullscreen;
xev.xclient.data.l[2] = 0;
XMapWindow(dis, win);
XSendEvent (dis, DefaultRootWindow(dis), False,
SubstructureRedirectMask | SubstructureNotifyMask, &xev);
XFlush(dis);
printf("XWindow initialised with threading enabled\n");
libvlc_instance_t *vlc_instance = libvlc_new(0, NULL);
printf("Playing media files in vlc attached to window\n");
uint32_t id = (uint32_t) win;
play_media(vlc_instance, files[0], id);
play_media(vlc_instance, files[1], id);
play_media(vlc_instance, files[0], id);
play_media(vlc_instance, files[1], id);
libvlc_release(vlc_instance);
printf("Hopefully all was successful\n");
return 0;
}