summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--README.txt5
-rw-r--r--Todo21
-rw-r--r--softhddev.c27
-rw-r--r--video.c53
-rw-r--r--video.h3
6 files changed, 91 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 4959043..453d3ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
User johns
Date:
+ Add support for fullscreen and fullscreen toogle.
Instant update deinterlace configuration changes.
Fix subtitle position.
Add SVDRP support.
diff --git a/README.txt b/README.txt
index d1d7c00..e9b797b 100644
--- a/README.txt
+++ b/README.txt
@@ -33,7 +33,7 @@ A software and GPU emulated HD output device plugin for VDR.
o Audio FFMpeg/Alsa/Analog
o Audio FFMpeg/Alsa/Digital
o Audio FFMpeg/OSS/Analog
- o planned: Alsa HDMI/SPDIF Passthrough
+ o Alsa HDMI/SPDIF Passthrough
o planned: OSS HDMI/SPDIF Passthrough
To compile you must have the 'requires' installed.
@@ -149,6 +149,9 @@ Commandline:
Running:
--------
+ Click into video window to toggle fullscreen/window mode, only if you
+ have a window manager running.
+
Warning:
--------
libav is not supported, expect many bugs with it.
diff --git a/Todo b/Todo
index eacb6cd..c73e7f8 100644
--- a/Todo
+++ b/Todo
@@ -19,14 +19,9 @@ GNU Affero General Public License for more details.
$Id: $
missing:
- video out with xv
- video out with opengl
- software decoder for xv / opengl
software deinterlace
auto crop
- atmolight
zoom/fit-zoom 4:3 (SetVideoDisplayFormat, SetVideoFormat?)
- multistream handling
ITU BT601, ITU BT709 (HD), RGB studio levels (16-235)?
suspend output / energie saver: stop audio, stop video, configurable
Option deinterlace off / deinterlace force!
@@ -59,9 +54,6 @@ libva-vdpau-driver:
libva-xvba-driver:
x11:
- support resize of x11 window
- support fullscreen window
- support fullscreen / window toggle
disable screensaver
audio/alsa:
@@ -98,6 +90,17 @@ setup:
Setup of output type.
Setup of display 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?
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
diff --git a/softhddev.c b/softhddev.c
index 7573049..e8ad079 100644
--- a/softhddev.c
+++ b/softhddev.c
@@ -57,10 +57,11 @@ static char ConfigVdpauDecoder = 1; ///< use vdpau decoder, if possible
#define ConfigVdpauDecoder 0 ///< no vdpau decoder configured
#endif
+static char ConfigFullscreen; ///< fullscreen modus
static char ConfigSuspendClose = 1; ///< suspend should close devices
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
@@ -580,11 +581,15 @@ int VideoDecode(void)
/**
** Try video start.
**
-** Could be called, when already started.
+** NOT TRUE: Could be called, when already started.
*/
static void StartVideo(void)
{
VideoInit(X11DisplayName);
+ if (ConfigFullscreen) {
+ // FIXME: not good looking, mapped and then resized.
+ VideoSetFullscreen(1);
+ }
VideoOsdInit();
if (!MyVideoDecoder) {
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"
" -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"
" -x\t\tstart x11 server\n";
}
@@ -962,13 +968,16 @@ int ProcessArgs(int argc, char *const argv[])
// Parse arguments.
//
for (;;) {
- switch (getopt(argc, argv, "-a:d:g:x")) {
+ switch (getopt(argc, argv, "-a:d:fg:x")) {
case 'a': // audio device
AudioSetDevice(optarg);
continue;
case 'd': // x11 display name
X11DisplayName = optarg;
continue;
+ case 'f': // fullscreen mode
+ ConfigFullscreen = 1;
+ continue;
case 'g': // geometry
if (VideoSetGeometry(optarg) < 0) {
fprintf(stderr,
@@ -1175,7 +1184,7 @@ void MainThreadHook(void)
void Suspend(void)
{
pthread_mutex_lock(&SuspendLockMutex);
- if( SkipVideo && SkipAudio ) { // already suspended
+ if (SkipVideo && SkipAudio) { // already suspended
pthread_mutex_unlock(&SuspendLockMutex);
return;
}
@@ -1186,13 +1195,13 @@ void Suspend(void)
SkipAudio = 1;
pthread_mutex_unlock(&SuspendLockMutex);
- if ( ConfigSuspendClose ) {
+ if (ConfigSuspendClose) {
pthread_mutex_lock(&SuspendLockMutex);
// FIXME: close audio
// FIXME: close video
pthread_mutex_unlock(&SuspendLockMutex);
}
- if ( ConfigSuspendX11 ) {
+ if (ConfigSuspendX11) {
// FIXME: stop x11, if started
}
}
@@ -1202,15 +1211,15 @@ void Suspend(void)
*/
void Resume(void)
{
- if (!SkipVideo && !SkipAudio) { // we are not suspended
+ if (!SkipVideo && !SkipAudio) { // we are not suspended
return;
}
Debug(3, "[softhddev]%s:\n", __FUNCTION__);
- if ( ConfigSuspendX11 ) {
+ if (ConfigSuspendX11) {
}
- if ( ConfigSuspendClose ) {
+ if (ConfigSuspendClose) {
pthread_mutex_lock(&SuspendLockMutex);
pthread_mutex_unlock(&SuspendLockMutex);
}
diff --git a/video.c b/video.c
index 02ecde1..444ff2d 100644
--- a/video.c
+++ b/video.c
@@ -93,6 +93,7 @@
#include <xcb/xcb_image.h>
#include <xcb/xcb_event.h>
#include <xcb/xcb_atom.h>
+#include <xcb/xcb_ewmh.h>
#include <xcb/xcb_icccm.h>
#include <xcb/xcb_keysyms.h>
#endif
@@ -242,6 +243,8 @@ static VideoZoomModes Video4to3ZoomMode;
static char Video60HzMode; ///< handle 60hz displays
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
@@ -6119,6 +6122,9 @@ static void VideoEvent(void)
VideoSetVideoMode(event.xconfigure.x, event.xconfigure.y,
event.xconfigure.width, event.xconfigure.height);
break;
+ case ButtonPress:
+ VideoSetFullscreen(-1);
+ break;
case KeyPress:
keysym = XLookupKeysym(&event.xkey, 0);
#if 0
@@ -6690,6 +6696,22 @@ static void VideoCreateWindow(xcb_window_t parent, xcb_visualid_t visual,
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);
@@ -6793,6 +6815,37 @@ void VideoSetVideoMode(int x, int y, int width, int height)
}
///
+/// 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.
///
void VideoSetDeinterlace(int mode[VideoResolutionMax])
diff --git a/video.h b/video.h
index f517ad6..b76dc5c 100644
--- a/video.h
+++ b/video.h
@@ -76,6 +76,9 @@ extern void VideoSetOutputPosition(int, int, int, int);
/// Set video mode.
extern void VideoSetVideoMode(int, int, int, int);
+ /// Set video fullscreen mode.
+extern void VideoSetFullscreen(int);
+
/// Set deinterlace.
extern void VideoSetDeinterlace(int[]);