[FFmpeg-devel] ffplay: added option always on top for video window

Submitted by Daniel Kucera on May 10, 2019, 10:12 a.m.

Details

Message ID 20190510101217.871-1-daniel.kucera@gmail.com
State New
Headers show

Commit Message

Daniel Kucera May 10, 2019, 10:12 a.m.
From: Daniel Kucera <github@danman.eu>

Signed-off-by: Daniel Kucera <github@danman.eu>
---
 doc/ffplay.texi  | 2 ++
 fftools/ffplay.c | 4 ++++
 2 files changed, 6 insertions(+)

Comments

Gyan May 10, 2019, 7:10 p.m.
On 10-05-2019 03:42 PM, Daniel Kucera wrote:
> From: Daniel Kucera <github@danman.eu>
>
> Signed-off-by: Daniel Kucera <github@danman.eu>
> ---
>   doc/ffplay.texi  | 2 ++
>   fftools/ffplay.c | 4 ++++
>   2 files changed, 6 insertions(+)
>
> diff --git a/doc/ffplay.texi b/doc/ffplay.texi
> index c305465078..a37c02dc0d 100644
> --- a/doc/ffplay.texi
> +++ b/doc/ffplay.texi
> @@ -66,6 +66,8 @@ Set custom interval, in seconds, for seeking using left/right keys. Default is 1
>   Disable graphical display.
>   @item -noborder
>   Borderless window.
> +@item -alwaysontop
> +Window always on top.
>   @item -volume
>   Set the startup volume. 0 means silence, 100 means no volume reduction or
>   amplification. Negative values are treated as 0, values above 100 are treated
> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> index 8f050e16e6..931dc08e2d 100644
> --- a/fftools/ffplay.c
> +++ b/fftools/ffplay.c
> @@ -324,6 +324,7 @@ static int seek_by_bytes = -1;
>   static float seek_interval = 10;
>   static int display_disable;
>   static int borderless;
> +static int alwaysontop;
>   static int startup_volume = 100;
>   static int show_status = 1;
>   static int av_sync_type = AV_SYNC_AUDIO_MASTER;
> @@ -3581,6 +3582,7 @@ static const OptionDef options[] = {
>       { "seek_interval", OPT_FLOAT | HAS_ARG, { &seek_interval }, "set seek interval for left/right keys, in seconds", "seconds" },
>       { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
>       { "noborder", OPT_BOOL, { &borderless }, "borderless window" },
> +    { "alwaysontop", OPT_BOOL, { &alwaysontop }, "window always on top" },
>       { "volume", OPT_INT | HAS_ARG, { &startup_volume}, "set startup volume 0=min 100=max", "volume" },
>       { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
>       { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
> @@ -3722,6 +3724,8 @@ int main(int argc, char **argv)
>   
>       if (!display_disable) {
>           int flags = SDL_WINDOW_HIDDEN;
> +        if (alwaysontop)
> +            flags |= SDL_WINDOW_ALWAYS_ON_TOP;
>           if (borderless)
>               flags |= SDL_WINDOW_BORDERLESS;
>           else
Can you also add a keypress event to make it switchable during play?

Thanks,
Gyan
Daniel Kucera May 10, 2019, 7:58 p.m.
> Can you also add a keypress event to make it switchable during play?
>
> Thanks,
> Gyan

I haven't found a function which would allow to modify window flags
after creation:

https://wiki.libsdl.org/SDL_GetWindowFlags
Michael Niedermayer May 11, 2019, 3:33 p.m.
On Fri, May 10, 2019 at 12:12:17PM +0200, Daniel Kucera wrote:
> From: Daniel Kucera <github@danman.eu>
> 
> Signed-off-by: Daniel Kucera <github@danman.eu>
> ---
>  doc/ffplay.texi  | 2 ++
>  fftools/ffplay.c | 4 ++++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/doc/ffplay.texi b/doc/ffplay.texi
> index c305465078..a37c02dc0d 100644
> --- a/doc/ffplay.texi
> +++ b/doc/ffplay.texi
> @@ -66,6 +66,8 @@ Set custom interval, in seconds, for seeking using left/right keys. Default is 1
>  Disable graphical display.
>  @item -noborder
>  Borderless window.
> +@item -alwaysontop
> +Window always on top.
>  @item -volume
>  Set the startup volume. 0 means silence, 100 means no volume reduction or
>  amplification. Negative values are treated as 0, values above 100 are treated
> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> index 8f050e16e6..931dc08e2d 100644
> --- a/fftools/ffplay.c
> +++ b/fftools/ffplay.c
> @@ -324,6 +324,7 @@ static int seek_by_bytes = -1;
>  static float seek_interval = 10;
>  static int display_disable;
>  static int borderless;
> +static int alwaysontop;
>  static int startup_volume = 100;
>  static int show_status = 1;
>  static int av_sync_type = AV_SYNC_AUDIO_MASTER;
> @@ -3581,6 +3582,7 @@ static const OptionDef options[] = {
>      { "seek_interval", OPT_FLOAT | HAS_ARG, { &seek_interval }, "set seek interval for left/right keys, in seconds", "seconds" },
>      { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
>      { "noborder", OPT_BOOL, { &borderless }, "borderless window" },
> +    { "alwaysontop", OPT_BOOL, { &alwaysontop }, "window always on top" },
>      { "volume", OPT_INT | HAS_ARG, { &startup_volume}, "set startup volume 0=min 100=max", "volume" },
>      { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
>      { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
> @@ -3722,6 +3724,8 @@ int main(int argc, char **argv)
>  
>      if (!display_disable) {
>          int flags = SDL_WINDOW_HIDDEN;
> +        if (alwaysontop)
> +            flags |= SDL_WINDOW_ALWAYS_ON_TOP;

fails to build

fftools/ffplay.c: In function ‘main’:
fftools/ffplay.c:3728:22: error: ‘SDL_WINDOW_ALWAYS_ON_TOP’ undeclared (first use in this function)
             flags |= SDL_WINDOW_ALWAYS_ON_TOP;


[...]
Gyan May 11, 2019, 3:59 p.m.
On 11-05-2019 09:03 PM, Michael Niedermayer wrote:
> On Fri, May 10, 2019 at 12:12:17PM +0200, Daniel Kucera wrote:
>> From: Daniel Kucera <github@danman.eu>
>>
>> Signed-off-by: Daniel Kucera <github@danman.eu>
>> ---
>>   doc/ffplay.texi  | 2 ++
>>   fftools/ffplay.c | 4 ++++
>>   2 files changed, 6 insertions(+)
>>
>> diff --git a/doc/ffplay.texi b/doc/ffplay.texi
>> index c305465078..a37c02dc0d 100644
>> --- a/doc/ffplay.texi
>> +++ b/doc/ffplay.texi
>> @@ -66,6 +66,8 @@ Set custom interval, in seconds, for seeking using left/right keys. Default is 1
>>   Disable graphical display.
>>   @item -noborder
>>   Borderless window.
>> +@item -alwaysontop
>> +Window always on top.
>>   @item -volume
>>   Set the startup volume. 0 means silence, 100 means no volume reduction or
>>   amplification. Negative values are treated as 0, values above 100 are treated
>> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
>> index 8f050e16e6..931dc08e2d 100644
>> --- a/fftools/ffplay.c
>> +++ b/fftools/ffplay.c
>> @@ -324,6 +324,7 @@ static int seek_by_bytes = -1;
>>   static float seek_interval = 10;
>>   static int display_disable;
>>   static int borderless;
>> +static int alwaysontop;
>>   static int startup_volume = 100;
>>   static int show_status = 1;
>>   static int av_sync_type = AV_SYNC_AUDIO_MASTER;
>> @@ -3581,6 +3582,7 @@ static const OptionDef options[] = {
>>       { "seek_interval", OPT_FLOAT | HAS_ARG, { &seek_interval }, "set seek interval for left/right keys, in seconds", "seconds" },
>>       { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
>>       { "noborder", OPT_BOOL, { &borderless }, "borderless window" },
>> +    { "alwaysontop", OPT_BOOL, { &alwaysontop }, "window always on top" },
>>       { "volume", OPT_INT | HAS_ARG, { &startup_volume}, "set startup volume 0=min 100=max", "volume" },
>>       { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
>>       { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
>> @@ -3722,6 +3724,8 @@ int main(int argc, char **argv)
>>   
>>       if (!display_disable) {
>>           int flags = SDL_WINDOW_HIDDEN;
>> +        if (alwaysontop)
>> +            flags |= SDL_WINDOW_ALWAYS_ON_TOP;
> fails to build
>
> fftools/ffplay.c: In function ‘main’:
> fftools/ffplay.c:3728:22: error: ‘SDL_WINDOW_ALWAYS_ON_TOP’ undeclared (first use in this function)
>               flags |= SDL_WINDOW_ALWAYS_ON_TOP;

Is qualified as 'X11 only, >= SDL 2.0.5' at 
https://wiki.libsdl.org/SDL_WindowFlags

Gyan
Daniel Kucera May 11, 2019, 6:26 p.m.
Dňa so 11. 5. 2019, 18:00 Gyan <ffmpeg@gyani.pro> napísal(a):

>
>
> On 11-05-2019 09:03 PM, Michael Niedermayer wrote:
> > On Fri, May 10, 2019 at 12:12:17PM +0200, Daniel Kucera wrote:
> >> From: Daniel Kucera <github@danman.eu>
> >>
> >> Signed-off-by: Daniel Kucera <github@danman.eu>
> >> ---
> >>   doc/ffplay.texi  | 2 ++
> >>   fftools/ffplay.c | 4 ++++
> >>   2 files changed, 6 insertions(+)
> >>
> >> diff --git a/doc/ffplay.texi b/doc/ffplay.texi
> >> index c305465078..a37c02dc0d 100644
> >> --- a/doc/ffplay.texi
> >> +++ b/doc/ffplay.texi
> >> @@ -66,6 +66,8 @@ Set custom interval, in seconds, for seeking using
> left/right keys. Default is 1
> >>   Disable graphical display.
> >>   @item -noborder
> >>   Borderless window.
> >> +@item -alwaysontop
> >> +Window always on top.
> >>   @item -volume
> >>   Set the startup volume. 0 means silence, 100 means no volume
> reduction or
> >>   amplification. Negative values are treated as 0, values above 100 are
> treated
> >> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> >> index 8f050e16e6..931dc08e2d 100644
> >> --- a/fftools/ffplay.c
> >> +++ b/fftools/ffplay.c
> >> @@ -324,6 +324,7 @@ static int seek_by_bytes = -1;
> >>   static float seek_interval = 10;
> >>   static int display_disable;
> >>   static int borderless;
> >> +static int alwaysontop;
> >>   static int startup_volume = 100;
> >>   static int show_status = 1;
> >>   static int av_sync_type = AV_SYNC_AUDIO_MASTER;
> >> @@ -3581,6 +3582,7 @@ static const OptionDef options[] = {
> >>       { "seek_interval", OPT_FLOAT | HAS_ARG, { &seek_interval }, "set
> seek interval for left/right keys, in seconds", "seconds" },
> >>       { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical
> display" },
> >>       { "noborder", OPT_BOOL, { &borderless }, "borderless window" },
> >> +    { "alwaysontop", OPT_BOOL, { &alwaysontop }, "window always on
> top" },
> >>       { "volume", OPT_INT | HAS_ARG, { &startup_volume}, "set startup
> volume 0=min 100=max", "volume" },
> >>       { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt"
> },
> >>       { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg =
> opt_frame_pix_fmt }, "set pixel format", "format" },
> >> @@ -3722,6 +3724,8 @@ int main(int argc, char **argv)
> >>
> >>       if (!display_disable) {
> >>           int flags = SDL_WINDOW_HIDDEN;
> >> +        if (alwaysontop)
> >> +            flags |= SDL_WINDOW_ALWAYS_ON_TOP;
> > fails to build
> >
> > fftools/ffplay.c: In function ‘main’:
> > fftools/ffplay.c:3728:22: error: ‘SDL_WINDOW_ALWAYS_ON_TOP’ undeclared
> (first use in this function)
> >               flags |= SDL_WINDOW_ALWAYS_ON_TOP;
>
> Is qualified as 'X11 only, >= SDL 2.0.5' at
> https://wiki.libsdl.org/SDL_WindowFlags
>
> Gyan
>

Since 2.0.6 it works on Windows too.

>
Daniel Kucera May 13, 2019, 7:19 a.m.
>>
>> Is qualified as 'X11 only, >= SDL 2.0.5' at
>> https://wiki.libsdl.org/SDL_WindowFlags
>>
>> Gyan
>
>
> Since 2.0.6 it works on Windows too.

Ping.
Gyan May 13, 2019, 7:24 a.m.
On 13-05-2019 12:49 PM, Daniel Kučera wrote:
>>> Is qualified as 'X11 only, >= SDL 2.0.5' at
>>> https://wiki.libsdl.org/SDL_WindowFlags
>>>
>>> Gyan
>>
>> Since 2.0.6 it works on Windows too.
> Ping.

Michael needs to confirm whether the build failure he had was due to his 
SDL version < 2.0.5

Gyan
Moritz Barsnick May 13, 2019, 7:58 a.m.
On Mon, May 13, 2019 at 12:54:58 +0530, Gyan wrote:
> >> Since 2.0.6 it works on Windows too.
> > Ping.
>
> Michael needs to confirm whether the build failure he had was due to his
> SDL version < 2.0.5

I can at least confirm that 2.0.4, which I have installed on one
machine, doesn't define this in the provided headers, and that ffmpeg
doesn't build against 2.0.4 with this patch. So there should be an
#ifdef SDL_WINDOW_ALWAYS_ON_TOP guard around this, and possibly around
the options definition. (And the docs should mention it?)

https://hg.libsdl.org/SDL/annotate/3beca914a2ad/include/SDL_video.h

Not sure how Windows behaves if compiled against 2.0.5 with
availability of the flag, but not the feature. ;-) [*]

BTW, would this also be an option which could go into the "sdl2" output
device? (I'm not happy with separate code bases for these, personally.)

Moritz

[*] My guess is that Windows just ignored this flag before its
implementation:
https://hg.libsdl.org/SDL/rev/2653833db94e
Daniel Kucera May 13, 2019, 9:07 a.m.
>
> I can at least confirm that 2.0.4, which I have installed on one
> machine, doesn't define this in the provided headers, and that ffmpeg
> doesn't build against 2.0.4 with this patch. So there should be an
> #ifdef SDL_WINDOW_ALWAYS_ON_TOP guard around this, and possibly around
> the options definition. (And the docs should mention it?)
>
> https://hg.libsdl.org/SDL/annotate/3beca914a2ad/include/SDL_video.h
>
> Not sure how Windows behaves if compiled against 2.0.5 with
> availability of the flag, but not the feature. ;-) [*]
>
> BTW, would this also be an option which could go into the "sdl2" output
> device? (I'm not happy with separate code bases for these, personally.)
>
> Moritz
>

Thanks Moritz, I submited a new patch according to your
recommendations. This patch compiles with 2.0.5 on Windows but doesn't
have any effect (tested). I updated the docs to make this clear.

Regarding libavdevice/sdl2 - this doesn't share the implementation of
windows creation (which is shame) so this is a separate task to
implement.

Patch hide | download patch | download mbox

diff --git a/doc/ffplay.texi b/doc/ffplay.texi
index c305465078..a37c02dc0d 100644
--- a/doc/ffplay.texi
+++ b/doc/ffplay.texi
@@ -66,6 +66,8 @@  Set custom interval, in seconds, for seeking using left/right keys. Default is 1
 Disable graphical display.
 @item -noborder
 Borderless window.
+@item -alwaysontop
+Window always on top.
 @item -volume
 Set the startup volume. 0 means silence, 100 means no volume reduction or
 amplification. Negative values are treated as 0, values above 100 are treated
diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index 8f050e16e6..931dc08e2d 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -324,6 +324,7 @@  static int seek_by_bytes = -1;
 static float seek_interval = 10;
 static int display_disable;
 static int borderless;
+static int alwaysontop;
 static int startup_volume = 100;
 static int show_status = 1;
 static int av_sync_type = AV_SYNC_AUDIO_MASTER;
@@ -3581,6 +3582,7 @@  static const OptionDef options[] = {
     { "seek_interval", OPT_FLOAT | HAS_ARG, { &seek_interval }, "set seek interval for left/right keys, in seconds", "seconds" },
     { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
     { "noborder", OPT_BOOL, { &borderless }, "borderless window" },
+    { "alwaysontop", OPT_BOOL, { &alwaysontop }, "window always on top" },
     { "volume", OPT_INT | HAS_ARG, { &startup_volume}, "set startup volume 0=min 100=max", "volume" },
     { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
@@ -3722,6 +3724,8 @@  int main(int argc, char **argv)
 
     if (!display_disable) {
         int flags = SDL_WINDOW_HIDDEN;
+        if (alwaysontop)
+            flags |= SDL_WINDOW_ALWAYS_ON_TOP;
         if (borderless)
             flags |= SDL_WINDOW_BORDERLESS;
         else