<div dir="ltr"><br>So after debugging I see that there is no way to access lavfi filters from STDIN commands as ZMQ filter does it.<br><br><br>Filter that can be accessed drom STDIN command are contained in 'filtergraphs' global.<br><br>accessing:<br><a href="https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/fftools/ffmpeg.c#L3938">https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/fftools/ffmpeg.c#L3938</a><br>```<br>            for (i = 0; i < nb_filtergraphs; i++) {<br>                FilterGraph *fg = filtergraphs[i];<br>                if (fg->graph) {<br>```<br><br>Those graphs are populated with init_simple_filtergraph() function when output file is created:<br>```<br>(gdb) bt<br>#0  init_simple_filtergraph (ist=0x555557975b10, ost=0x5555579755e0) at fftools/ffmpeg_filter.c:199<br>#1  0x0000555555665aba in open_output_file (o=0x7fffffffd250, filename=0x7fffffffdf95 "/var/www/html/stream/index.m3u8") at fftools/ffmpeg_opt.c:2526<br>#2  0x0000555555668df1 in open_files (l=0x555557969150, inout=0x555556a009cd "output", open_file=0x555555663fcc <open_output_file>) at fftools/ffmpeg_opt.c:3347<br>#3  0x0000555555669023 in ffmpeg_parse_options (argc=40, argv=0x7fffffffd8b8) at fftools/ffmpeg_opt.c:3401<br>#4  0x000055555568910e in main (argc=40, argv=0x7fffffffd8b8) at fftools/ffmpeg.c:4881<br>(gdb) up<br>#1  0x0000555555665aba in open_output_file (o=0x7fffffffd250, filename=0x7fffffffdf95 "/var/www/html/stream/index.m3u8") at fftools/ffmpeg_opt.c:2526<br>2526                    err = init_simple_filtergraph(ist, ost);<br>```<br><br>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`<div><br></div><div><br>I can see with GDB that this graph has filter named `Parsed_drawtext_1`<br>```<br>(gdb) print *((LavfiContext *)(*((*input_files[0])->ctx))->priv_data)->graph->filters[1]<br><br>$11 = {av_class = 0x555556e4c900 <avfilter_class>, filter = 0x555556f14b60 <ff_vf_drawtext>, name = 0x55555796b850 "Parsed_drawtext_1", input_pads = 0x55555796b7e0, <br>  inputs = 0x55555796b830, nb_inputs = 1, output_pads = 0x55555796c6e0, outputs = 0x55555796b750, nb_outputs = 1, priv = 0x55555796ba70, graph = 0x5555579698c0, thread_type = 0, <br>  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, <br>  extra_hw_frames = -1}<br>```<br></div><div><br></div><div>which is sad because I really wanted to change these things from stdin and without using zeromq etc</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 1, 2020 at 9:51 AM Martti <<a href="mailto:desinformatsioon@gmail.com">desinformatsioon@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">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.<br><br>ffmpeg is started as:<br>```<br>ffmpeg -stdin -dumpgraph 1 -y -fflags nobuffer -f lavfi -re \<br>  -i "testsrc=size=1280x720:rate=25[x];[x]drawtext=fontsize=30:text=hello:x=(w-text_w)/2:y=(h-text_h)/2" \<br>  -an -c:v libx264 -r 25 -crf 30 -preset fast -pix_fmt yuv420p -flags +cgop -g 50 \<br>  -f hls  -segment_list_flags live \<br>  -hls_flags delete_segments+append_list \<br>  -hls_time 2  \<br>  -hls_list_size 5  \<br>  -hls_delete_threshold 5  \<br>  -hls_wrap 5  \<br>  -hls_segment_filename /var/www/html/stream/%d.ts \<br>  /var/www/html/stream/index.m3u8<br>```<br><br>Filter that I want to change during runtime is `Parsed_drawtext_1`<br><br>So I press ```C``` and copy/paste into window ```Parsed_drawtext_1 -1 reinit text='test'```<br><br>and it instead of changing text displayed I see <br>```<br>Enter command: <target>|all <time>|-1 <command>[ <argument>]<br>Parsed_drawtext_1 -1 reinit text='test'^M<br>Command reply for stream 0: ret:-38 res:<br>```<br><br>So far looking at code I assume sendcmd finds filter and sends to drawtext filter, but drawtext returns exit code 38 (not implemented)<br><br>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.<br><br><br>ffmpeg executable stdin handling: <a href="https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/fftools/ffmpeg.c#L3942" target="_blank">https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/fftools/ffmpeg.c#L3942</a><br><br>sendcmd code: <br><br>1. find matching filter <a href="https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/avfiltergraph.c#L1297" target="_blank">https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/avfiltergraph.c#L1297</a><br>2. calls 'process_command' on filter <a href="https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/avfilter.c#L555" target="_blank">https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/avfilter.c#L555</a><br>3. drawtext command <a href="https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/vf_drawtext.c#L877" target="_blank">https://github.com/FFmpeg/FFmpeg/blob/b577968cabae4a0927adcf5d7c24fca5a7a8385d/libavfilter/vf_drawtext.c#L877</a><br><br>vs<br>zmq filter code: <a href="https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/f_zmq.c#L177" target="_blank">https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/f_zmq.c#L177</a><br><br><br>Full Program output:<br>```<br>user@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<br>ffmpeg version 4.1.4-1build2 Copyright (c) 2000-2019 the FFmpeg developers<br>  built with gcc 9 (Ubuntu 9.2.1-4ubuntu1)<br>  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<br>  libavutil      56. 22.100 / 56. 22.100<br>  libavcodec     58. 35.100 / 58. 35.100<br>  libavformat    58. 20.100 / 58. 20.100<br>  libavdevice    58.  5.100 / 58.  5.100<br>  libavfilter     7. 40.101 /  7. 40.101<br>  libavresample   4.  0.  0 /  4.  0.  0<br>  libswscale      5.  3.100 /  5.  3.100<br>  libswresample   3.  3.100 /  3.  3.100<br>  libpostproc    55.  3.100 / 55.  3.100<br>[Parsed_drawtext_1 @ 0x55e4e3337e40] Using "/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf"<br>+------------------+<br>| Parsed_testsrc_0 |default--[1280x720 1:1 rgb24]--Parsed_drawtext_1:default<br>|    (testsrc)     |<br>+------------------+<br><br>                                                       +-------------------+<br>Parsed_testsrc_0:default--[1280x720 1:1 rgb24]--default| Parsed_drawtext_1 |default--[1280x720 1:1 rgb24]--out:default<br>                                                       |    (drawtext)     |<br>                                                       +-------------------+<br><br>                                                        +--------------+<br>Parsed_drawtext_1:default--[1280x720 1:1 rgb24]--default|     out      |<br>                                                        | (buffersink) |<br>                                                        +--------------+<br><br>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':<br>  Duration: N/A, start: 0.000000, bitrate: N/A<br>    Stream #0:0: Video: rawvideo (RGB[24] / 0x18424752), rgb24, 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc<br>Stream mapping:<br>  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))<br>Press [q] to stop, [?] for help<br>[libx264 @ 0x55e4e33947c0] using SAR=1/1<br>[libx264 @ 0x55e4e33947c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2<br>[libx264 @ 0x55e4e33947c0] profile High, level 3.1<br>[libx264 @ 0x55e4e33947c0] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - <a href="http://www.videolan.org/x264.html" target="_blank">http://www.videolan.org/x264.html</a> - 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<br>[hls @ 0x55e4e333d040] Opening '/var/www/html/stream/1.ts' for writing<br>Output #0, hls, to '/var/www/html/stream/index.m3u8':<br>  Metadata:<br>    encoder         : Lavf58.20.100<br>    Stream #0:0: Video: h264 (libx264), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 90k tbn, 25 tbc<br>    Metadata:<br>      encoder         : Lavc58.35.100 libx264<br>    Side data:<br>      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1<br>frame=   63 fps= 25 q=35.0 size=N/A time=00:00:00.76 bitrate=N/A speed=0.301x    <br>Enter command: <target>|all <time>|-1 <command>[ <argument>]<br>Parsed_drawtext_1 -1 reinit text='test'^M<br>Command reply for stream 0: ret:-38 res:<br>[hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 1.ts0.204x    <br>[hls @ 0x55e4e333d040] Opening '/var/www/html/stream/2.ts' for writing<br>[hls @ 0x55e4e333d040] Cannot use rename on non file protocol, this may lead to races and temporary partial files<br>[hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 2.ts<br>[hls @ 0x55e4e333d040] Opening '/var/www/html/stream/3.ts' for writing<br>[hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 3.ts0.768x    <br>[hls @ 0x55e4e333d040] Opening '/var/www/html/stream/4.ts' for writing<br>[hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 4.ts0.78x    <br>[hls @ 0x55e4e333d040] Opening '/var/www/html/stream/0.ts' for writing<br>[hls muxer @ 0x55e4e3399800] Duplicated segment filename detected: 0.ts<br>frame=  209 fps= 25 q=-1.0 Lsize=N/A time=00:00:08.32 bitrate=N/A speed=0.982x    <br>video:106kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown<br>[libx264 @ 0x55e4e33947c0] frame I:5     Avg QP:17.10  size:  6972<br>[libx264 @ 0x55e4e33947c0] frame P:54    Avg QP:21.75  size:   656<br>[libx264 @ 0x55e4e33947c0] frame B:150   Avg QP:22.64  size:   252<br>[libx264 @ 0x55e4e33947c0] consecutive B-frames:  4.3%  0.0%  0.0% 95.7%<br>[libx264 @ 0x55e4e33947c0] mb I  I16..4: 77.5% 18.6%  3.8%<br>[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%<br>[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%<br>[libx264 @ 0x55e4e33947c0] 8x8 transform intra:15.0% inter:77.8%<br>[libx264 @ 0x55e4e33947c0] coded y,uvDC,uvAC intra: 2.2% 18.6% 7.3% inter: 0.0% 1.0% 0.0%<br>[libx264 @ 0x55e4e33947c0] i16 v,h,dc,p: 84% 11%  2%  2%<br>[libx264 @ 0x55e4e33947c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 54% 13% 32%  0%  0%  0%  0%  0%  0%<br>[libx264 @ 0x55e4e33947c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 30% 28%  3%  2%  3%  0%  3%  0%<br>[libx264 @ 0x55e4e33947c0] i8c dc,h,v,p: 45% 12% 37%  6%<br>[libx264 @ 0x55e4e33947c0] Weighted P-Frames: Y:0.0% UV:0.0%<br>[libx264 @ 0x55e4e33947c0] ref P L0: 47.7% 52.3%<br>[libx264 @ 0x55e4e33947c0] ref B L0: 60.3% 39.7%<br>[libx264 @ 0x55e4e33947c0] ref B L1: 90.8%  9.2%<br>[libx264 @ 0x55e4e33947c0] kb/s:103.41<br>Exiting normally, received signal 2.<br>```<br></div>
</blockquote></div>