[Libav-user] Sendcmd command to change filter args during runtime is not understood when send from STDIN but is when send from zeromq
Martti
desinformatsioon at gmail.com
Sat May 2 00:14:56 EEST 2020
So after debugging I see that there is no way to access lavfi filters from
STDIN commands as ZMQ filter does it.
Filter that can be accessed drom STDIN command are contained in
'filtergraphs' global.
accessing:
https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/fftools/ffmpeg.c#L3938
```
for (i = 0; i < nb_filtergraphs; i++) {
FilterGraph *fg = filtergraphs[i];
if (fg->graph) {
```
Those graphs are populated with init_simple_filtergraph() function when
output file is created:
```
(gdb) bt
#0 init_simple_filtergraph (ist=0x555557975b10, ost=0x5555579755e0) at
fftools/ffmpeg_filter.c:199
#1 0x0000555555665aba in open_output_file (o=0x7fffffffd250,
filename=0x7fffffffdf95 "/var/www/html/stream/index.m3u8") at
fftools/ffmpeg_opt.c:2526
#2 0x0000555555668df1 in open_files (l=0x555557969150,
inout=0x555556a009cd "output", open_file=0x555555663fcc <open_output_file>)
at fftools/ffmpeg_opt.c:3347
#3 0x0000555555669023 in ffmpeg_parse_options (argc=40,
argv=0x7fffffffd8b8) at fftools/ffmpeg_opt.c:3401
#4 0x000055555568910e in main (argc=40, argv=0x7fffffffd8b8) at
fftools/ffmpeg.c:4881
(gdb) up
#1 0x0000555555665aba in open_output_file (o=0x7fffffffd250,
filename=0x7fffffffdf95 "/var/www/html/stream/index.m3u8") at
fftools/ffmpeg_opt.c:2526
2526 err = init_simple_filtergraph(ist, ost);
```
These `filtergraphs` filtergraphs do not contain `Parsed_drawtext_1` filter
that I need. But filters that I need, that are drawing 'filter_frame()',
are in Lavfi graph. which is accessible globally as ` (LavfiContext *)
input_files->*input_files->ctx->priv_data`
I can see with GDB that this graph has filter named `Parsed_drawtext_1`
```
(gdb) print *((LavfiContext
*)(*((*input_files[0])->ctx))->priv_data)->graph->filters[1]
$11 = {av_class = 0x555556e4c900 <avfilter_class>, filter = 0x555556f14b60
<ff_vf_drawtext>, name = 0x55555796b850 "Parsed_drawtext_1", input_pads =
0x55555796b7e0,
inputs = 0x55555796b830, nb_inputs = 1, output_pads = 0x55555796c6e0,
outputs = 0x55555796b750, nb_outputs = 1, priv = 0x55555796ba70, graph =
0x5555579698c0, thread_type = 0,
internal = 0x55555796b770, command_queue = 0x0, enable_str = 0x0, enable
= 0x0, var_values = 0x0, is_disabled = 0, hw_device_ctx = 0x0, nb_threads =
0, ready = 300,
extra_hw_frames = -1}
```
which is sad because I really wanted to change these things from stdin and
without using zeromq etc
On Fri, May 1, 2020 at 9:51 AM Martti <desinformatsioon at gmail.com> wrote:
> I'm trying to change filter arguments (text value) during runtime with
> sendcmd commands but I'm having trouble sendcmd and drawtext understanding
> sent input. Same thing works when sent from zmq filter.
>
> ffmpeg is started as:
> ```
> ffmpeg -stdin -dumpgraph 1 -y -fflags nobuffer -f lavfi -re \
> -i
> "testsrc=size=1280x720:rate=25[x];[x]drawtext=fontsize=30:text=hello:x=(w-text_w)/2:y=(h-text_h)/2"
> \
> -an -c:v libx264 -r 25 -crf 30 -preset fast -pix_fmt yuv420p -flags
> +cgop -g 50 \
> -f hls -segment_list_flags live \
> -hls_flags delete_segments+append_list \
> -hls_time 2 \
> -hls_list_size 5 \
> -hls_delete_threshold 5 \
> -hls_wrap 5 \
> -hls_segment_filename /var/www/html/stream/%d.ts \
> /var/www/html/stream/index.m3u8
> ```
>
> Filter that I want to change during runtime is `Parsed_drawtext_1`
>
> So I press ```C``` and copy/paste into window ```Parsed_drawtext_1 -1
> reinit text='test'```
>
> and it instead of changing text displayed I see
> ```
> Enter command: <target>|all <time>|-1 <command>[ <argument>]
> Parsed_drawtext_1 -1 reinit text='test'^M
> Command reply for stream 0: ret:-38 res:
> ```
>
> So far looking at code I assume sendcmd finds filter and sends to drawtext
> filter, but drawtext returns exit code 38 (not implemented)
>
> What I'm doing wrong? This filter can be changed when I send with ZeroMq
> `Parsed_drawtext_1 reinit text='test'` and ZeroMq filter uses pretty much
> same code as sendcmd.
>
>
> ffmpeg executable stdin handling:
> https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/fftools/ffmpeg.c#L3942
>
> sendcmd code:
>
> 1. find matching filter
> https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/avfiltergraph.c#L1297
> 2. calls 'process_command' on filter
> https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/avfilter.c#L555
> 3. drawtext command
> https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/vf_drawtext.c#L877
>
> vs
> zmq filter code:
> https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/f_zmq.c#L177
>
>
> Full Program output:
> ```
> user at user:~/$ ffmpeg -stdin -dumpgraph 1 -y -fflags nobuffer -f lavfi -re
> -i
> "testsrc=size=1280x720:rate=25[x];[x]drawtext=fontsize=30:text=hello:x=(w-text_w)/2:y=(h-text_h)/2"
> -an -c:v libx264 -r 25 -crf 30 -preset fast -pix_fmt yuv420p -flags +cgop
> -g 50 -f hls -segment_list_flags live -hls_flags
> delete_segments+append_list -hls_time 2 -hls_list_size 5
> -hls_delete_threshold 5 -hls_wrap 5 -hls_segment_filename
> /var/www/html/stream/%d.ts /var/www/html/stream/index.m3u8
> ffmpeg version 4.1.4-1build2 Copyright (c) 2000-2019 the FFmpeg developers
> built with gcc 9 (Ubuntu 9.2.1-4ubuntu1)
> configuration: --prefix=/usr --extra-version=1build2
> --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu
> --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl
> --disable-stripping --enable-avresample --disable-filter=resample
> --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom
> --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca
> --enable-libcdio --enable-libcodec2 --enable-libflite
> --enable-libfontconfig --enable-libfreetype --enable-libfribidi
> --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame
> --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt
> --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband
> --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex
> --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab
> --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp
> --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq
> --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl
> --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883
> --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
> libavutil 56. 22.100 / 56. 22.100
> libavcodec 58. 35.100 / 58. 35.100
> libavformat 58. 20.100 / 58. 20.100
> libavdevice 58. 5.100 / 58. 5.100
> libavfilter 7. 40.101 / 7. 40.101
> libavresample 4. 0. 0 / 4. 0. 0
> libswscale 5. 3.100 / 5. 3.100
> libswresample 3. 3.100 / 3. 3.100
> libpostproc 55. 3.100 / 55. 3.100
> [Parsed_drawtext_1 @ 0x55e4e3337e40] Using
> "/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf"
> +------------------+
> | Parsed_testsrc_0 |default--[1280x720 1:1
> rgb24]--Parsed_drawtext_1:default
> | (testsrc) |
> +------------------+
>
>
> +-------------------+
> Parsed_testsrc_0:default--[1280x720 1:1 rgb24]--default| Parsed_drawtext_1
> |default--[1280x720 1:1 rgb24]--out:default
> | (drawtext)
> |
>
> +-------------------+
>
> +--------------+
> Parsed_drawtext_1:default--[1280x720 1:1 rgb24]--default| out |
> | (buffersink) |
> +--------------+
>
> Input #0, lavfi, from
> 'testsrc=size=1280x720:rate=25[x];[x]drawtext=fontsize=30:text=hello:x=(w-text_w)/2:y=(h-text_h)/2':
> Duration: N/A, start: 0.000000, bitrate: N/A
> Stream #0:0: Video: rawvideo (RGB[24] / 0x18424752), rgb24, 1280x720
> [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
> Stream mapping:
> Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
> Press [q] to stop, [?] for help
> [libx264 @ 0x55e4e33947c0] using SAR=1/1
> [libx264 @ 0x55e4e33947c0] using cpu capabilities: MMX2 SSE2Fast SSSE3
> SSE4.2 AVX FMA3 BMI2 AVX2
> [libx264 @ 0x55e4e33947c0] profile High, level 3.1
> [libx264 @ 0x55e4e33947c0] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC
> codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options:
> cabac=1 ref=2 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=6 psy=1
> psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1
> cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=9
> lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0
> bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
> b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=50 keyint_min=5
> scenecut=40 intra_refresh=0 rc_lookahead=30 rc=crf mbtree=1 crf=30.0
> qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
> [hls @ 0x55e4e333d040] Opening '/var/www/html/stream/1.ts' for writing
> Output #0, hls, to '/var/www/html/stream/index.m3u8':
> Metadata:
> encoder : Lavf58.20.100
> Stream #0:0: Video: h264 (libx264), yuv420p, 1280x720 [SAR 1:1 DAR
> 16:9], q=-1--1, 25 fps, 90k tbn, 25 tbc
> Metadata:
> encoder : Lavc58.35.100 libx264
> Side data:
> cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
> frame= 63 fps= 25 q=35.0 size=N/A time=00:00:00.76 bitrate=N/A
> speed=0.301x
> Enter command: <target>|all <time>|-1 <command>[ <argument>]
> Parsed_drawtext_1 -1 reinit text='test'^M
> Command reply for stream 0: ret:-38 res:
> [hls muxer @ 0x55e4e3399800] Duplicated segment filename detected:
> 1.ts0.204x
> [hls @ 0x55e4e333d040] Opening '/var/www/html/stream/2.ts' for writing
> [hls @ 0x55e4e333d040] Cannot use rename on non file protocol, this may
> lead to races and temporary partial files
> [hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 2.ts
> [hls @ 0x55e4e333d040] Opening '/var/www/html/stream/3.ts' for writing
> [hls muxer @ 0x55e4e3399800] Duplicated segment filename detected:
> 3.ts0.768x
> [hls @ 0x55e4e333d040] Opening '/var/www/html/stream/4.ts' for writing
> [hls muxer @ 0x55e4e3399800] Duplicated segment filename detected:
> 4.ts0.78x
> [hls @ 0x55e4e333d040] Opening '/var/www/html/stream/0.ts' for writing
> [hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 0.ts
> frame= 209 fps= 25 q=-1.0 Lsize=N/A time=00:00:08.32 bitrate=N/A
> speed=0.982x
> video:106kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
> muxing overhead: unknown
> [libx264 @ 0x55e4e33947c0] frame I:5 Avg QP:17.10 size: 6972
> [libx264 @ 0x55e4e33947c0] frame P:54 Avg QP:21.75 size: 656
> [libx264 @ 0x55e4e33947c0] frame B:150 Avg QP:22.64 size: 252
> [libx264 @ 0x55e4e33947c0] consecutive B-frames: 4.3% 0.0% 0.0% 95.7%
> [libx264 @ 0x55e4e33947c0] mb I I16..4: 77.5% 18.6% 3.8%
> [libx264 @ 0x55e4e33947c0] mb P I16..4: 2.7% 0.3% 0.1% P16..4: 5.5%
> 0.2% 0.0% 0.0% 0.0% skip:91.2%
> [libx264 @ 0x55e4e33947c0] mb B I16..4: 1.3% 0.2% 0.0% B16..8: 1.1%
> 0.0% 0.0% direct: 0.8% skip:96.7% L0:49.6% L1:43.8% BI: 6.5%
> [libx264 @ 0x55e4e33947c0] 8x8 transform intra:15.0% inter:77.8%
> [libx264 @ 0x55e4e33947c0] coded y,uvDC,uvAC intra: 2.2% 18.6% 7.3% inter:
> 0.0% 1.0% 0.0%
> [libx264 @ 0x55e4e33947c0] i16 v,h,dc,p: 84% 11% 2% 2%
> [libx264 @ 0x55e4e33947c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 54% 13% 32% 0%
> 0% 0% 0% 0% 0%
> [libx264 @ 0x55e4e33947c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 30% 28% 3%
> 2% 3% 0% 3% 0%
> [libx264 @ 0x55e4e33947c0] i8c dc,h,v,p: 45% 12% 37% 6%
> [libx264 @ 0x55e4e33947c0] Weighted P-Frames: Y:0.0% UV:0.0%
> [libx264 @ 0x55e4e33947c0] ref P L0: 47.7% 52.3%
> [libx264 @ 0x55e4e33947c0] ref B L0: 60.3% 39.7%
> [libx264 @ 0x55e4e33947c0] ref B L1: 90.8% 9.2%
> [libx264 @ 0x55e4e33947c0] kb/s:103.41
> Exiting normally, received signal 2.
> ```
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20200502/fbb01963/attachment.html>
More information about the Libav-user
mailing list