avdevice/sdl2: add option to set window position

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 <cus@passwd.hu>
This commit is contained in:
Dave Rice 2018-10-01 17:17:24 -04:00 committed by Marton Balint
parent 3f2103ec73
commit 110b4a4918
3 changed files with 13 additions and 5 deletions

View File

@ -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, If not specified it defaults to the size of the input video,
downscaled according to the aspect ratio. downscaled according to the aspect ratio.
@item window_x
@item window_y
Set the position of the window on the screen.
@item window_fullscreen @item window_fullscreen
Set fullscreen mode when non-zero value is provided. Set fullscreen mode when non-zero value is provided.
Default value is zero. Default value is zero.

View File

@ -40,6 +40,7 @@ typedef struct {
SDL_Renderer *renderer; SDL_Renderer *renderer;
char *window_title; char *window_title;
int window_width, window_height; /**< size of the window */ int window_width, window_height; /**< size of the window */
int window_x, window_y; /**< position of the window */
int window_fullscreen; int window_fullscreen;
int window_borderless; int window_borderless;
int enable_quit_action; int enable_quit_action;
@ -155,8 +156,6 @@ static int sdl2_write_trailer(AVFormatContext *s)
return 0; return 0;
} }
#define SDL_BASE_FLAGS (SDL_SWSURFACE|SDL_WINDOW_RESIZABLE)
static int sdl2_write_header(AVFormatContext *s) static int sdl2_write_header(AVFormatContext *s)
{ {
SDLContext *sdl = s->priv_data; 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 */ /* resize texture to width and height from the codec context information */
flags = SDL_BASE_FLAGS | (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) | flags = SDL_WINDOW_HIDDEN |
(sdl->window_borderless ? SDL_WINDOW_BORDERLESS : 0); (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) |
(sdl->window_borderless ? SDL_WINDOW_BORDERLESS : SDL_WINDOW_RESIZABLE);
/* initialization */ /* initialization */
if (!sdl->inited){ if (!sdl->inited){
@ -216,6 +216,8 @@ static int sdl2_write_header(AVFormatContext *s)
} }
SDL_SetWindowTitle(sdl->window, sdl->window_title); 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, sdl->texture = SDL_CreateTexture(sdl->renderer, sdl->texture_fmt, SDL_TEXTUREACCESS_STREAMING,
codecpar->width, codecpar->height); codecpar->width, codecpar->height);
@ -337,6 +339,8 @@ static int sdl2_write_packet(AVFormatContext *s, AVPacket *pkt)
static const AVOption options[] = { 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_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_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_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_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 }, { "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 },

View File

@ -29,7 +29,7 @@
#define LIBAVDEVICE_VERSION_MAJOR 58 #define LIBAVDEVICE_VERSION_MAJOR 58
#define LIBAVDEVICE_VERSION_MINOR 4 #define LIBAVDEVICE_VERSION_MINOR 4
#define LIBAVDEVICE_VERSION_MICRO 105 #define LIBAVDEVICE_VERSION_MICRO 106
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \ LIBAVDEVICE_VERSION_MINOR, \