lavd/xv: add window id param

Device is able to use existing window, that can be a
part of existing GUI - instead of newly created one.

Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
This commit is contained in:
Lukasz Marek 2014-04-19 01:53:20 +02:00
parent 5053897b6a
commit 9fcdfac894
2 changed files with 14 additions and 2 deletions

View File

@ -388,19 +388,26 @@ For example, @code{dual-headed:0.1} would specify screen 1 of display
Check the X11 specification for more detailed information about the Check the X11 specification for more detailed information about the
display name format. display name format.
@item window_id
When set to non-zero value then device doesn't create new window,
but uses existing one with provided @var{window_id}. By default
this options is set to zero and device creates its own window.
@item window_size @item window_size
Set the created window size, can be a string of the form Set the created window size, can be a string of the form
@var{width}x@var{height} or a video size abbreviation. If not @var{width}x@var{height} or a video size abbreviation. If not
specified it defaults to the size of the input video. specified it defaults to the size of the input video.
Ignored when @var{window_id} is set.
@item window_x @item window_x
@item window_y @item window_y
Set the X and Y window offsets for the created window. They are both Set the X and Y window offsets for the created window. They are both
set to 0 by default. The values may be ignored by the window manager. set to 0 by default. The values may be ignored by the window manager.
Ignored when @var{window_id} is set.
@item window_title @item window_title
Set the window title, if not specified default to the filename Set the window title, if not specified default to the filename
specified for the output device. specified for the output device. Ignored when @var{window_id} is set.
@end table @end table
For more information about XVideo see @url{http://www.x.org/}. For more information about XVideo see @url{http://www.x.org/}.

View File

@ -24,7 +24,6 @@
* *
* TODO: * TODO:
* - add support to more formats * - add support to more formats
* - add support to window id specification
*/ */
#include <X11/Xlib.h> #include <X11/Xlib.h>
@ -44,6 +43,7 @@ typedef struct {
GC gc; GC gc;
Window window; Window window;
int64_t window_id;
char *window_title; char *window_title;
int window_width, window_height; int window_width, window_height;
int window_x, window_y; int window_x, window_y;
@ -144,6 +144,8 @@ static int xv_write_header(AVFormatContext *s)
xv->window_height = av_rescale(xv->window_height, sar.den, sar.num); xv->window_height = av_rescale(xv->window_height, sar.den, sar.num);
} }
} }
if (!xv->window_id) {
//TODO: reident
xv->window = XCreateSimpleWindow(xv->display, DefaultRootWindow(xv->display), xv->window = XCreateSimpleWindow(xv->display, DefaultRootWindow(xv->display),
xv->window_x, xv->window_y, xv->window_x, xv->window_y,
xv->window_width, xv->window_height, xv->window_width, xv->window_height,
@ -156,6 +158,8 @@ static int xv_write_header(AVFormatContext *s)
} }
XStoreName(xv->display, xv->window, xv->window_title); XStoreName(xv->display, xv->window, xv->window_title);
XMapWindow(xv->display, xv->window); XMapWindow(xv->display, xv->window);
} else
xv->window = xv->window_id;
if (XvQueryAdaptors(xv->display, DefaultRootWindow(xv->display), &num_adaptors, &ai) != Success) { if (XvQueryAdaptors(xv->display, DefaultRootWindow(xv->display), &num_adaptors, &ai) != Success) {
ret = AVERROR_EXTERNAL; ret = AVERROR_EXTERNAL;
@ -315,6 +319,7 @@ static int xv_write_frame(AVFormatContext *s, int stream_index, AVFrame **frame,
#define OFFSET(x) offsetof(XVContext, x) #define OFFSET(x) offsetof(XVContext, x)
static const AVOption options[] = { static const AVOption options[] = {
{ "display_name", "set display name", OFFSET(display_name), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, { "display_name", "set display name", OFFSET(display_name), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
{ "window_id", "set existing window id", OFFSET(window_id), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM },
{ "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, { "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
{ "window_title", "set window title", OFFSET(window_title), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, { "window_title", "set window title", OFFSET(window_title), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
{ "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, { "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },