[vlc-devel] libvcl: screen:// does not work
Jens Kallup
kallup.jens at web.de
Tue Sep 10 14:53:50 CEST 2019
Hello List Member's,
I have did some little changes.
the screen:// capture error seems to be not fired.
but the screen is not displayed in the little box.
Also, I don't get gtk drawable error.
Is there something missing?
Jens
// video.h
#pragma once
#include <glib.h>
#include <glib/gprintf.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mutex.h>
#include <vlc/vlc.h>
#include <vlc/libvlc.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
extern libvlc_instance_t * inst;
extern libvlc_media_t * m ;
extern libvlc_media_player_t * mp ;
extern GtkWidget * video, *vpane;
extern GMainContext * context;
extern SDL_Surface *screen, * empty;
extern SDL_Rect rect;
struct ctx {
SDL_Surface *surf;
SDL_mutex *mutex;
};
extern struct ctx ctx;
// EOF - video.h
#include <stdio.h>
#include <assert.h>
#include <math.h>
#undef HAVE_STRINGS_H
#include "fe-gtk.h"
#include "video.h"
struct ctx ctx;
#define VIDEOWIDTH 160
#define VIDEOHEIGHT 100
bool videoinit = false;
libvlc_instance_t * inst = NULL;
libvlc_media_t * m = NULL;
libvlc_media_player_t * mp = NULL;
libvlc_media_list_t * ml = NULL;
libvlc_media_list_player_t * mlp = NULL;
GdkPixmap * pixmap = NULL;
GtkWidget * video, *vpane;
GMainContext * context;
GThread * thread ;
SDL_Surface * screen,* empty;
SDL_Rect rect;
typedef void (*OnExit_ptr)(void*);
void OnExit(void*d)
{
libvlc_media_player_stop(mp);
libvlc_media_player_release(mp);
libvlc_release(inst);
SDL_DestroyMutex(ctx.mutex);
SDL_FreeSurface(ctx.surf);
SDL_FreeSurface(empty);
SDL_Quit();
}
OnExit_ptr on_exit_ptr = OnExit;
static gboolean
update_process(gpointer user_data)
{
SDL_LockMutex(ctx.mutex);
SDL_BlitSurface(ctx.surf, NULL, screen, &rect);
SDL_UnlockMutex(ctx.mutex);
SDL_Flip(screen);
SDL_Delay(10);
SDL_BlitSurface(empty, NULL, screen, &rect);
return G_SOURCE_REMOVE;
}
static gpointer
thread_func(gpointer user_data)
{
GSource * source;
rect.w = 0;
rect.h = 0;
source = g_idle_source_new();
g_source_set_callback(source, update_process, NULL, NULL);
g_source_attach(source, context);
g_source_unref(source);
return NULL;
}
static void *lock(void *data, void **p_pixels)
{
struct ctx *ctx = data;
SDL_LockMutex(ctx->mutex);
SDL_LockSurface(ctx->surf);
*p_pixels = ctx->surf->pixels;
return NULL; /* picture identifier, not needed here */
}
static void unlock(void *data, void *id, void *const *p_pixels)
{
struct ctx *ctx = data;
/* VLC just rendered the video, but we can also render stuff */
uint16_t *pixels = *p_pixels;
int x, y;
for(y = 10; y < 40; y++)
for(x = 10; x < 40; x++)
if(x < 13 || y < 13 || x > 36 || y > 36)
pixels[y * VIDEOWIDTH + x] = 0xffff;
else
pixels[y * VIDEOWIDTH + x] = 0x0;
SDL_UnlockSurface(ctx->surf);
SDL_UnlockMutex(ctx->mutex);
assert(id == NULL); /* picture identifier, not needed here */
}
static void display(void *data, void *id)
{
/* VLC wants to display the video */
(void) data;
assert(id == NULL);
}
void init_video(GtkWidget * box)
{
libvlc_media_t *md1;
char const *vlc_argv[] = {
"-vv"
};
int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
int n = 0;
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTTHREAD) == -1) {
g_printf("cannot initialize SDL\n");
return EXIT_FAILURE;
}
empty = SDL_CreateRGBSurface(SDL_SWSURFACE, VIDEOWIDTH,
VIDEOHEIGHT, 32, 0, 0, 0, 0);
ctx.surf = SDL_CreateRGBSurface(SDL_SWSURFACE, VIDEOWIDTH,
VIDEOHEIGHT, 16, 0x001f, 0x07e0, 0xf800, 0);
ctx.mutex = SDL_CreateMutex();
int options = SDL_ANYFORMAT | SDL_HWSURFACE | SDL_DOUBLEBUF;
screen = SDL_SetVideoMode(VIDEOWIDTH, VIDEOHEIGHT, 0, options);
if (!screen) {
printf("cannot set video mode\n");
return EXIT_FAILURE;
}
video =
gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(video),GTK_SHADOW_ETCHED_OUT);
gtk_container_add(GTK_CONTAINER(box),video);
on_exit_ptr = OnExit;
libvlc_clearerr();
inst = libvlc_new(vlc_argc,vlc_argv);
libvlc_set_exit_handler(inst,on_exit_ptr,NULL);
ml = libvlc_media_list_new (inst);
md1 = libvlc_media_new_location (inst,"screen://");
libvlc_media_list_add_media (ml,md1);
libvlc_media_release(md1);
mlp = libvlc_media_list_player_new (inst);
mp = libvlc_media_player_new (inst);
libvlc_media_list_player_set_media_list (mlp, ml);
libvlc_media_list_player_set_media_player(mlp, mp);
libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx);
libvlc_video_set_format (mp, "RV16", VIDEOWIDTH, VIDEOHEIGHT,
VIDEOWIDTH*2);
gtk_widget_realize(video);
gtk_widget_show(video);
pixmap = gdk_pixmap_new(video->window,VIDEOWIDTH, VIDEOHEIGHT,16);
libvlc_media_player_set_xwindow (mp,GDK_WINDOW_XID(pixmap));
context = g_main_context_default();
thread = g_thread_new(NULL, thread_func, GINT_TO_POINTER(n));
libvlc_media_player_play(mp);
}
[0000564a8d847c00] main libvlc debug: VLC media player - 4.0.0-dev Otto
Chriek
[0000564a8d847c00] main libvlc debug: Copyright © 1996-2018 the VideoLAN
team
[0000564a8d847c00] main libvlc debug: revision 4.0.0-dev-4567-g92c146a
[0000564a8d847c00] main libvlc debug: configured with ./configure
'--disable-lua' '--disable-xcb'
[0000564a8d847c00] main libvlc debug: searching plug-in modules
[0000564a8d847c00] main libvlc debug: loading plugins cache file
/usr/local/lib/vlc/plugins/plugins.dat
[0000564a8d847c00] main libvlc debug: recursively browsing
`/usr/local/lib/vlc/plugins'
[0000564a8d847c00] main libvlc debug: plug-ins loaded: 394 modules
[0000564a8d847f10] main logger debug: looking for logger module matching
"any": 3 candidates
[0000564a8d847f10] main logger debug: using logger module "console"
[0000564a8d847c00] main libvlc debug: translation test: code is "de"
[0000564a8dcbcf10] main keystore debug: looking for keystore module
matching "memory": 3 candidates
[0000564a8dcbcf10] main keystore debug: using keystore module "memory"
[0000564a8d847c00] main libvlc debug: CPU has capabilities MMX MMXEXT
SSE SSE2 SSE3 SSSE3 FPU
[0000564a8dc9d390] main generic debug: creating audio output
[0000564a8dcbc0a0] main audio output debug: looking for audio output
module matching "any": 5 candidates
[0000564a8dcbc0a0] vlcpulse audio output debug: using library version 4.0.0
[0000564a8dcbc0a0] vlcpulse audio output debug: (compiled with version
4.0.0, protocol 28)
[0000564a8dcbc0a0] vlcpulse audio output debug: connected locally to
unix:/run/user/1006/pulse/native as client #78
[0000564a8dcbc0a0] vlcpulse audio output debug: using protocol 28,
server protocol 28
[0000564a8dcbc0a0] pulse audio output debug: adding sink 0:
alsa_output.pci-0000_20_00.1.hdmi-stereo (RV620 HDMI Audio [Radeon HD
3400 Series] Digital Stereo (HDMI))
[0000564a8dcbc0a0] main audio output debug: using audio output module
"pulse"
[0000564a8dc9d390] main generic debug: keeping audio output
[0000564a8dca4620] main generic debug: creating audio output
[0000564a8dc1f1a0] main audio output debug: looking for audio output
module matching "any": 5 candidates
[0000564a8dc1f1a0] vlcpulse audio output debug: using library version 4.0.0
[0000564a8dc1f1a0] vlcpulse audio output debug: (compiled with version
4.0.0, protocol 28)
[0000564a8dc1f1a0] vlcpulse audio output debug: connected locally to
unix:/run/user/1006/pulse/native as client #79
[0000564a8dc1f1a0] vlcpulse audio output debug: using protocol 28,
server protocol 28
[0000564a8dc1f1a0] pulse audio output debug: adding sink 0:
alsa_output.pci-0000_20_00.1.hdmi-stereo (RV620 HDMI Audio [Radeon HD
3400 Series] Digital Stereo (HDMI))
[0000564a8dc1f1a0] main audio output debug: using audio output module
"pulse"
[0000564a8dca4620] main generic debug: keeping audio output
[0000564a8dcbc0a0] main audio output debug: removing module "pulse"
Jens
More information about the vlc-devel
mailing list