mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Add support for fullscreen mode.
This commit is contained in:
parent
92bb00c410
commit
7f7de8678f
@ -1,6 +1,7 @@
|
|||||||
User johns
|
User johns
|
||||||
Date:
|
Date:
|
||||||
|
|
||||||
|
Add support for fullscreen and fullscreen toogle.
|
||||||
Instant update deinterlace configuration changes.
|
Instant update deinterlace configuration changes.
|
||||||
Fix subtitle position.
|
Fix subtitle position.
|
||||||
Add SVDRP support.
|
Add SVDRP support.
|
||||||
|
@ -33,7 +33,7 @@ A software and GPU emulated HD output device plugin for VDR.
|
|||||||
o Audio FFMpeg/Alsa/Analog
|
o Audio FFMpeg/Alsa/Analog
|
||||||
o Audio FFMpeg/Alsa/Digital
|
o Audio FFMpeg/Alsa/Digital
|
||||||
o Audio FFMpeg/OSS/Analog
|
o Audio FFMpeg/OSS/Analog
|
||||||
o planned: Alsa HDMI/SPDIF Passthrough
|
o Alsa HDMI/SPDIF Passthrough
|
||||||
o planned: OSS HDMI/SPDIF Passthrough
|
o planned: OSS HDMI/SPDIF Passthrough
|
||||||
|
|
||||||
To compile you must have the 'requires' installed.
|
To compile you must have the 'requires' installed.
|
||||||
@ -149,6 +149,9 @@ Commandline:
|
|||||||
Running:
|
Running:
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
Click into video window to toggle fullscreen/window mode, only if you
|
||||||
|
have a window manager running.
|
||||||
|
|
||||||
Warning:
|
Warning:
|
||||||
--------
|
--------
|
||||||
libav is not supported, expect many bugs with it.
|
libav is not supported, expect many bugs with it.
|
||||||
|
21
Todo
21
Todo
@ -19,14 +19,9 @@ GNU Affero General Public License for more details.
|
|||||||
$Id: $
|
$Id: $
|
||||||
|
|
||||||
missing:
|
missing:
|
||||||
video out with xv
|
|
||||||
video out with opengl
|
|
||||||
software decoder for xv / opengl
|
|
||||||
software deinterlace
|
software deinterlace
|
||||||
auto crop
|
auto crop
|
||||||
atmolight
|
|
||||||
zoom/fit-zoom 4:3 (SetVideoDisplayFormat, SetVideoFormat?)
|
zoom/fit-zoom 4:3 (SetVideoDisplayFormat, SetVideoFormat?)
|
||||||
multistream handling
|
|
||||||
ITU BT601, ITU BT709 (HD), RGB studio levels (16-235)?
|
ITU BT601, ITU BT709 (HD), RGB studio levels (16-235)?
|
||||||
suspend output / energie saver: stop audio, stop video, configurable
|
suspend output / energie saver: stop audio, stop video, configurable
|
||||||
Option deinterlace off / deinterlace force!
|
Option deinterlace off / deinterlace force!
|
||||||
@ -59,9 +54,6 @@ libva-vdpau-driver:
|
|||||||
libva-xvba-driver:
|
libva-xvba-driver:
|
||||||
|
|
||||||
x11:
|
x11:
|
||||||
support resize of x11 window
|
|
||||||
support fullscreen window
|
|
||||||
support fullscreen / window toggle
|
|
||||||
disable screensaver
|
disable screensaver
|
||||||
|
|
||||||
audio/alsa:
|
audio/alsa:
|
||||||
@ -98,6 +90,17 @@ setup:
|
|||||||
Setup of output type.
|
Setup of output type.
|
||||||
Setup of display type.
|
Setup of display type.
|
||||||
Setup 4:3 zoom type
|
Setup 4:3 zoom type
|
||||||
Setup parameters are not used until restart.
|
Some setup parameters are not used until restart.
|
||||||
Can a notice be added to the setup menu?
|
Can a notice be added to the setup menu?
|
||||||
576i, 720p, fake 1080i, 1080i
|
576i, 720p, fake 1080i, 1080i
|
||||||
|
|
||||||
|
future features (not planed for 1.0 - 1.5)
|
||||||
|
|
||||||
|
video out with xv
|
||||||
|
video out with opengl
|
||||||
|
video out with xvba
|
||||||
|
software decoder for xv / opengl
|
||||||
|
atmolight support
|
||||||
|
multistream handling
|
||||||
|
|
||||||
|
upmix stereo to AC-3
|
||||||
|
27
softhddev.c
27
softhddev.c
@ -57,10 +57,11 @@ static char ConfigVdpauDecoder = 1; ///< use vdpau decoder, if possible
|
|||||||
#define ConfigVdpauDecoder 0 ///< no vdpau decoder configured
|
#define ConfigVdpauDecoder 0 ///< no vdpau decoder configured
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static char ConfigFullscreen; ///< fullscreen modus
|
||||||
static char ConfigSuspendClose = 1; ///< suspend should close devices
|
static char ConfigSuspendClose = 1; ///< suspend should close devices
|
||||||
static char ConfigSuspendX11 = 1; ///< suspend should stop x11
|
static char ConfigSuspendX11 = 1; ///< suspend should stop x11
|
||||||
|
|
||||||
static pthread_mutex_t SuspendLockMutex;///< suspend lock mutex
|
static pthread_mutex_t SuspendLockMutex; ///< suspend lock mutex
|
||||||
|
|
||||||
static volatile char VideoFreezed; ///< video freezed
|
static volatile char VideoFreezed; ///< video freezed
|
||||||
|
|
||||||
@ -580,11 +581,15 @@ int VideoDecode(void)
|
|||||||
/**
|
/**
|
||||||
** Try video start.
|
** Try video start.
|
||||||
**
|
**
|
||||||
** Could be called, when already started.
|
** NOT TRUE: Could be called, when already started.
|
||||||
*/
|
*/
|
||||||
static void StartVideo(void)
|
static void StartVideo(void)
|
||||||
{
|
{
|
||||||
VideoInit(X11DisplayName);
|
VideoInit(X11DisplayName);
|
||||||
|
if (ConfigFullscreen) {
|
||||||
|
// FIXME: not good looking, mapped and then resized.
|
||||||
|
VideoSetFullscreen(1);
|
||||||
|
}
|
||||||
VideoOsdInit();
|
VideoOsdInit();
|
||||||
if (!MyVideoDecoder) {
|
if (!MyVideoDecoder) {
|
||||||
VideoHwDecoder *hw_decoder;
|
VideoHwDecoder *hw_decoder;
|
||||||
@ -946,6 +951,7 @@ const char *CommandLineHelp(void)
|
|||||||
{
|
{
|
||||||
return " -a device\taudio device (fe. alsa: hw:0,0 oss: /dev/dsp)\n"
|
return " -a device\taudio device (fe. alsa: hw:0,0 oss: /dev/dsp)\n"
|
||||||
" -d display\tdisplay of x11 server (fe. :0.0)\n"
|
" -d display\tdisplay of x11 server (fe. :0.0)\n"
|
||||||
|
" -f\t\tstart with fullscreen window (only with window manager)\n"
|
||||||
" -g geometry\tx11 window geometry wxh+x+y\n"
|
" -g geometry\tx11 window geometry wxh+x+y\n"
|
||||||
" -x\t\tstart x11 server\n";
|
" -x\t\tstart x11 server\n";
|
||||||
}
|
}
|
||||||
@ -962,13 +968,16 @@ int ProcessArgs(int argc, char *const argv[])
|
|||||||
// Parse arguments.
|
// Parse arguments.
|
||||||
//
|
//
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (getopt(argc, argv, "-a:d:g:x")) {
|
switch (getopt(argc, argv, "-a:d:fg:x")) {
|
||||||
case 'a': // audio device
|
case 'a': // audio device
|
||||||
AudioSetDevice(optarg);
|
AudioSetDevice(optarg);
|
||||||
continue;
|
continue;
|
||||||
case 'd': // x11 display name
|
case 'd': // x11 display name
|
||||||
X11DisplayName = optarg;
|
X11DisplayName = optarg;
|
||||||
continue;
|
continue;
|
||||||
|
case 'f': // fullscreen mode
|
||||||
|
ConfigFullscreen = 1;
|
||||||
|
continue;
|
||||||
case 'g': // geometry
|
case 'g': // geometry
|
||||||
if (VideoSetGeometry(optarg) < 0) {
|
if (VideoSetGeometry(optarg) < 0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -1175,7 +1184,7 @@ void MainThreadHook(void)
|
|||||||
void Suspend(void)
|
void Suspend(void)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&SuspendLockMutex);
|
pthread_mutex_lock(&SuspendLockMutex);
|
||||||
if( SkipVideo && SkipAudio ) { // already suspended
|
if (SkipVideo && SkipAudio) { // already suspended
|
||||||
pthread_mutex_unlock(&SuspendLockMutex);
|
pthread_mutex_unlock(&SuspendLockMutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1186,13 +1195,13 @@ void Suspend(void)
|
|||||||
SkipAudio = 1;
|
SkipAudio = 1;
|
||||||
pthread_mutex_unlock(&SuspendLockMutex);
|
pthread_mutex_unlock(&SuspendLockMutex);
|
||||||
|
|
||||||
if ( ConfigSuspendClose ) {
|
if (ConfigSuspendClose) {
|
||||||
pthread_mutex_lock(&SuspendLockMutex);
|
pthread_mutex_lock(&SuspendLockMutex);
|
||||||
// FIXME: close audio
|
// FIXME: close audio
|
||||||
// FIXME: close video
|
// FIXME: close video
|
||||||
pthread_mutex_unlock(&SuspendLockMutex);
|
pthread_mutex_unlock(&SuspendLockMutex);
|
||||||
}
|
}
|
||||||
if ( ConfigSuspendX11 ) {
|
if (ConfigSuspendX11) {
|
||||||
// FIXME: stop x11, if started
|
// FIXME: stop x11, if started
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1202,15 +1211,15 @@ void Suspend(void)
|
|||||||
*/
|
*/
|
||||||
void Resume(void)
|
void Resume(void)
|
||||||
{
|
{
|
||||||
if (!SkipVideo && !SkipAudio) { // we are not suspended
|
if (!SkipVideo && !SkipAudio) { // we are not suspended
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug(3, "[softhddev]%s:\n", __FUNCTION__);
|
Debug(3, "[softhddev]%s:\n", __FUNCTION__);
|
||||||
|
|
||||||
if ( ConfigSuspendX11 ) {
|
if (ConfigSuspendX11) {
|
||||||
}
|
}
|
||||||
if ( ConfigSuspendClose ) {
|
if (ConfigSuspendClose) {
|
||||||
pthread_mutex_lock(&SuspendLockMutex);
|
pthread_mutex_lock(&SuspendLockMutex);
|
||||||
pthread_mutex_unlock(&SuspendLockMutex);
|
pthread_mutex_unlock(&SuspendLockMutex);
|
||||||
}
|
}
|
||||||
|
53
video.c
53
video.c
@ -93,6 +93,7 @@
|
|||||||
#include <xcb/xcb_image.h>
|
#include <xcb/xcb_image.h>
|
||||||
#include <xcb/xcb_event.h>
|
#include <xcb/xcb_event.h>
|
||||||
#include <xcb/xcb_atom.h>
|
#include <xcb/xcb_atom.h>
|
||||||
|
#include <xcb/xcb_ewmh.h>
|
||||||
#include <xcb/xcb_icccm.h>
|
#include <xcb/xcb_icccm.h>
|
||||||
#include <xcb/xcb_keysyms.h>
|
#include <xcb/xcb_keysyms.h>
|
||||||
#endif
|
#endif
|
||||||
@ -242,6 +243,8 @@ static VideoZoomModes Video4to3ZoomMode;
|
|||||||
static char Video60HzMode; ///< handle 60hz displays
|
static char Video60HzMode; ///< handle 60hz displays
|
||||||
|
|
||||||
static xcb_atom_t WmDeleteWindowAtom; ///< WM delete message
|
static xcb_atom_t WmDeleteWindowAtom; ///< WM delete message
|
||||||
|
static xcb_atom_t NetWmState; ///< wm-state message atom
|
||||||
|
static xcb_atom_t NetWmStateFullscreen; ///< fullscreen wm-state message atom
|
||||||
|
|
||||||
extern uint32_t VideoSwitch; ///< ticks for channel switch
|
extern uint32_t VideoSwitch; ///< ticks for channel switch
|
||||||
|
|
||||||
@ -6119,6 +6122,9 @@ static void VideoEvent(void)
|
|||||||
VideoSetVideoMode(event.xconfigure.x, event.xconfigure.y,
|
VideoSetVideoMode(event.xconfigure.x, event.xconfigure.y,
|
||||||
event.xconfigure.width, event.xconfigure.height);
|
event.xconfigure.width, event.xconfigure.height);
|
||||||
break;
|
break;
|
||||||
|
case ButtonPress:
|
||||||
|
VideoSetFullscreen(-1);
|
||||||
|
break;
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
keysym = XLookupKeysym(&event.xkey, 0);
|
keysym = XLookupKeysym(&event.xkey, 0);
|
||||||
#if 0
|
#if 0
|
||||||
@ -6690,6 +6696,22 @@ static void VideoCreateWindow(xcb_window_t parent, xcb_visualid_t visual,
|
|||||||
free(reply);
|
free(reply);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
// prepare fullscreen.
|
||||||
|
//
|
||||||
|
if ((reply =
|
||||||
|
xcb_intern_atom_reply(Connection, xcb_intern_atom(Connection, 0,
|
||||||
|
sizeof("_NET_WM_STATE") - 1, "_NET_WM_STATE"), NULL))) {
|
||||||
|
NetWmState = reply->atom;
|
||||||
|
free(reply);
|
||||||
|
}
|
||||||
|
if ((reply =
|
||||||
|
xcb_intern_atom_reply(Connection, xcb_intern_atom(Connection, 0,
|
||||||
|
sizeof("_NET_WM_STATE_FULLSCREEN") - 1,
|
||||||
|
"_NET_WM_STATE_FULLSCREEN"), NULL))) {
|
||||||
|
NetWmStateFullscreen = reply->atom;
|
||||||
|
free(reply);
|
||||||
|
}
|
||||||
|
|
||||||
xcb_map_window(Connection, VideoWindow);
|
xcb_map_window(Connection, VideoWindow);
|
||||||
|
|
||||||
@ -6792,6 +6814,37 @@ void VideoSetVideoMode(int x, int y, int width, int height)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Send fullscreen message to window.
|
||||||
|
///
|
||||||
|
/// @param onoff -1 toggle, true turn on, false turn off
|
||||||
|
///
|
||||||
|
void VideoSetFullscreen(int onoff)
|
||||||
|
{
|
||||||
|
xcb_client_message_event_t event;
|
||||||
|
|
||||||
|
memset(&event, 0, sizeof(event));
|
||||||
|
event.response_type = XCB_CLIENT_MESSAGE;
|
||||||
|
event.format = 32;
|
||||||
|
event.window = VideoWindow;
|
||||||
|
event.type = NetWmState;
|
||||||
|
if (onoff < 0) {
|
||||||
|
event.data.data32[0] = XCB_EWMH_WM_STATE_TOGGLE;
|
||||||
|
} else if (onoff) {
|
||||||
|
event.data.data32[0] = XCB_EWMH_WM_STATE_ADD;
|
||||||
|
} else {
|
||||||
|
event.data.data32[0] = XCB_EWMH_WM_STATE_REMOVE;
|
||||||
|
}
|
||||||
|
event.data.data32[1] = NetWmStateFullscreen;
|
||||||
|
|
||||||
|
xcb_send_event(Connection, XCB_SEND_EVENT_DEST_POINTER_WINDOW,
|
||||||
|
DefaultRootWindow(XlibDisplay),
|
||||||
|
XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
|
||||||
|
XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (void *)&event);
|
||||||
|
Debug(3, "video/x11: send fullscreen message %x %x\n",
|
||||||
|
event.data.data32[0], event.data.data32[1]);
|
||||||
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Set deinterlace mode.
|
/// Set deinterlace mode.
|
||||||
///
|
///
|
||||||
|
3
video.h
3
video.h
@ -76,6 +76,9 @@ extern void VideoSetOutputPosition(int, int, int, int);
|
|||||||
/// Set video mode.
|
/// Set video mode.
|
||||||
extern void VideoSetVideoMode(int, int, int, int);
|
extern void VideoSetVideoMode(int, int, int, int);
|
||||||
|
|
||||||
|
/// Set video fullscreen mode.
|
||||||
|
extern void VideoSetFullscreen(int);
|
||||||
|
|
||||||
/// Set deinterlace.
|
/// Set deinterlace.
|
||||||
extern void VideoSetDeinterlace(int[]);
|
extern void VideoSetDeinterlace(int[]);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user