From: Dave Rice
Allows arrangement of multiple windows such as:
ffmpeg -re -f lavfi -i mandelbrot -f sdl -window_x 1 -window_y 1 mandelbrot -vf
waveform,format=yuv420p -f sdl -window_x 641 -window_y 1 waveform -vf
vectorscope,format=yuv420p -f sdl -window_x 1 -window_y 481 vectorscop
Some changes by Marton Balint:
- allow negative position (partially or fully out-of-screen positions seem to
be sanitized automatically by SDL (or my WM?), so no special handling is
needed)
- only show window after the position is set
- do not use resizable and borderless flags at the same time, that caused
issues in ffplay
- add docs
Signed-off-by: Marton Balint
---
doc/outdevs.texi | 4
libavdevice/sdl2.c| 15 ++-
libavdevice/version.h | 4 ++--
3 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/doc/outdevs.texi b/doc/outdevs.texi
index 2518f9b559..7509ac695d 100644
--- a/doc/outdevs.texi
+++ b/doc/outdevs.texi
@@ -398,6 +398,10 @@ Set the SDL window size, can be a string of the form
If not specified it defaults to the size of the input video,
downscaled according to the aspect ratio.
+@item window_x
+@item window_y
+Set the position of the window on the screen.
+
@item window_fullscreen
Set fullscreen mode when non-zero value is provided.
Default value is zero.
diff --git a/libavdevice/sdl2.c b/libavdevice/sdl2.c
index da5143078e..72ebca90d8 100644
--- a/libavdevice/sdl2.c
+++ b/libavdevice/sdl2.c
@@ -40,6 +40,7 @@ typedef struct {
SDL_Renderer *renderer;
char *window_title;
int window_width, window_height; /**< size of the window */
+int window_x, window_y; /**< position of the window */
int window_fullscreen;
int window_borderless;
int enable_quit_action;
@@ -155,8 +156,6 @@ static int sdl2_write_trailer(AVFormatContext *s)
return 0;
}
-#define SDL_BASE_FLAGS (SDL_SWSURFACE|SDL_WINDOW_RESIZABLE)
-
static int sdl2_write_header(AVFormatContext *s)
{
SDLContext *sdl = s->priv_data;
@@ -196,8 +195,9 @@ static int sdl2_write_header(AVFormatContext *s)
}
/* resize texture to width and height from the codec context information */
-flags = SDL_BASE_FLAGS | (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN :
0) |
- (sdl->window_borderless ? SDL_WINDOW_BORDERLESS :
0);
+flags = SDL_WINDOW_HIDDEN |
+(sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) |
+(sdl->window_borderless ? SDL_WINDOW_BORDERLESS :
SDL_WINDOW_RESIZABLE);
/* initialization */
if (!sdl->inited){
@@ -210,12 +210,15 @@ static int sdl2_write_header(AVFormatContext *s)
compute_texture_rect(s);
if (SDL_CreateWindowAndRenderer(sdl->window_width, sdl->window_height,
-flags, &sdl->window, &sdl->renderer) != 0){
+flags, &sdl->window,
+&sdl->renderer) != 0) {
av_log(sdl, AV_LOG_ERROR, "Couldn't create window and renderer: %s\n",
SDL_GetError());
goto fail;
}
SDL_SetWindowTitle(sdl->window, sdl->window_title);
+SDL_SetWindowPosition(sdl->window, sdl->window_x, sdl->window_y);
+SDL_ShowWindow(sdl->window);
sdl->texture = SDL_CreateTexture(sdl->renderer, sdl->texture_fmt,
SDL_TEXTUREACCESS_STREAMING,
codecpar->width, codecpar->height);
@@ -337,6 +340,8 @@ static int sdl2_write_packet(AVFormatContext *s, AVPacket
*pkt)
static const AVOption options[] = {
{ "window_title", "set SDL window title", OFFSET(window_title),
AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
{ "window_size", "set SDL window forced size", OFFSET(window_width),
AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
+{ "window_x", "set SDL window x position", OFFSET(window_x),
AV_OPT_TYPE_INT,{ .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX,
AV_OPT_FLAG_ENCODING_PARAM },
+{ "window_y", "set SDL window y position", OFFSET(window_y),
AV_OPT_TYPE_INT,{ .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX,
AV_OPT_FLAG_ENCODING_PARAM },
{ "window_fullscreen", "set SDL window fullscreen",
OFFSET(window_fullscreen), AV_OPT_TYPE_BOOL, { .i64 = 0 },0, 1,
AV_OPT_FLAG_ENCODING_PARAM },
{ "window_borderless", "set SDL window border off",
OFFSET(window_borderless), AV_OPT_TYPE_BOOL, { .i64 = 0 },0, 1,
AV_OPT_FLAG_ENCODING_PARAM },
{ "window_enable_quit", "set if quit action is available",
OFFSET(enable_quit_action), AV_OPT_TYPE_INT, {.i64=1}, 0, 1,
AV_OPT_FLAG_ENCODING_PARAM },
diff --git a/libavdevice/version.h b/libavdevice/version.h
index e6ee009cc4..bce104b905 100644
--- a/libavdevice/version.h
+++ b/libavdevice/version.h
@@ -28,8 +28,8 @@
#include "libavutil/version.h"
#define LIBAVDEVICE_VERSION_MAJOR 58
-#define LIBAVDEVICE_VERSION_MI