diff mbox

[FFmpeg-devel,PATCHv2,2/2] avdevice/sdl2 : add option to set window position

Message ID 20181020005754.31998-1-cus@passwd.hu
State New
Headers show

Commit Message

Marton Balint Oct. 20, 2018, 12:57 a.m. UTC
From: Dave Rice <dave@dericed.com>

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>
---
 doc/outdevs.texi      |  4 ++++
 libavdevice/sdl2.c    | 15 ++++++++++-----
 libavdevice/version.h |  4 ++--
 3 files changed, 16 insertions(+), 7 deletions(-)

Comments

Marton Balint Oct. 22, 2018, 8:14 p.m. UTC | #1
On Sat, 20 Oct 2018, Marton Balint wrote:

> From: Dave Rice <dave@dericed.com>
>
> 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>
> ---
> doc/outdevs.texi      |  4 ++++
> libavdevice/sdl2.c    | 15 ++++++++++-----
> libavdevice/version.h |  4 ++--
> 3 files changed, 16 insertions(+), 7 deletions(-)

Will apply soon.

Regards,
Marton
Marton Balint Oct. 23, 2018, 5:59 p.m. UTC | #2
On Mon, 22 Oct 2018, Marton Balint wrote:

>
>
> On Sat, 20 Oct 2018, Marton Balint wrote:
>
>> From: Dave Rice <dave@dericed.com>
>>
>> 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>
>> ---
>> doc/outdevs.texi      |  4 ++++
>> libavdevice/sdl2.c    | 15 ++++++++++-----
>> libavdevice/version.h |  4 ++--
>> 3 files changed, 16 insertions(+), 7 deletions(-)
>
> Will apply soon.

Applied.

Regards,
Marton
diff mbox

Patch

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_MINOR   4
-#define LIBAVDEVICE_VERSION_MICRO 105
+#define LIBAVDEVICE_VERSION_MINOR   5
+#define LIBAVDEVICE_VERSION_MICRO 100
 
 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
                                                LIBAVDEVICE_VERSION_MINOR, \