I understand your m3u8 patch, and have already enabled the relevant option.
av_dict_set(&options, "m3u8_hold_counters", "0", 0); I think it has indeed helped to get rid of one place where I block, but there appear to be several., The stack that it's being blocked on now is DNS-related. I would have assumed that the AVIOInterruptCB would have worked for that too, but it hasn't. Perhaps timeouts are the wrong approach? I really just need a way to make ffmpeg's functions to immediately return so I can exit. Currently my termination halts waiting for ffmpeg to return so I can join the thread. On 18/11/19 9:21 pm, Steven Liu wrote: > >> 在 2019年11月18日,18:16,Steven Liu <l...@chinaffmpeg.org> 写道: >> >> >> >>> 在 2019年11月18日,17:58,Tom Gaudasiński <t...@records.headdesk.com.au> 写道: >>> >> hls can hold to option after the patch: >> >> rw_timeout >> -rw_timeout <int64> ED........ Timeout for IO operations (in >> microseconds) (from 0 to I64_MAX) (default 0) >> This can be used when you downloading segment or m3u8 file, the http >> response too long time. >> > liuqideMBP:dash liuqi$ ./ffmpeg -http_multiple 0 -http_persistent 0 -y > -rw_timeout 500000 -i > "http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on" > -c copy a.ts > ffmpeg version N-95731-ge94edd85c6 Copyright (c) 2000-2019 the FFmpeg > developers > built with Apple LLVM version 10.0.0 (clang-1000.11.45.5) > configuration: --enable-fontconfig --enable-gpl --enable-libass > --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libspeex > --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-version3 > --enable-nonfree --enable-videotoolbox --enable-libxml2 --samples=fate-suite/ > --enable-libopencv > libavutil 56. 35.101 / 56. 35.101 > libavcodec 58. 62.100 / 58. 62.100 > libavformat 58. 35.100 / 58. 35.100 > libavdevice 58. 9.100 / 58. 9.100 > libavfilter 7. 66.100 / 7. 66.100 > libswscale 5. 6.100 / 5. 6.100 > libswresample 3. 6.100 / 3. 6.100 > libpostproc 55. 6.100 / 55. 6.100 > [hls @ 0x7fd4fe801800] Skip ('#EXT-X-ALLOW-CACHE:YES') > [hls @ 0x7fd4fe801800] Skip ('#EXT-X-VERSION:3') > [hls @ 0x7fd4fe801800] Opening > 'http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/segment157407238_32_a-p.ts?sd=10&rebase=on' > for reading > Input #0, hls, from > 'http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on': > Duration: N/A, start: 14578.026844, bitrate: N/A > Program 0 > Metadata: > variant_bitrate : 0 > Stream #0:0: Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 32000 Hz, > stereo, fltp > Metadata: > variant_bitrate : 0 > Stream #0:1: Data: timed_id3 (ID3 / 0x20334449) > Metadata: > variant_bitrate : 0 > [mpegts @ 0x7fd4ff009c00] frame size not set > Output #0, mpegts, to 'a.ts': > Metadata: > encoder : Lavf58.35.100 > Stream #0:0: Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 32000 Hz, > stereo, fltp > Metadata: > variant_bitrate : 0 > Stream mapping: > Stream #0:0 -> #0:0 (copy) > Press [q] to stop, [?] for help > [hls @ 0x7fd4fe801800] Opening > 'http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/segment157407239_32_a-p.ts?sd=10&rebase=on' > for reading > [hls @ 0x7fd4fe801800] Opening > 'http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/segment157407240_32_a-p.ts?sd=10&rebase=on' > for reading > [hls @ 0x7fd4fe801800] Failed to reload playlist 0ts/s speed=11.6x > [hls @ 0x7fd4fe801800] Skip ('#EXT-X-ALLOW-CACHE:YES') > [hls @ 0x7fd4fe801800] Skip ('#EXT-X-VERSION:3') > [hls @ 0x7fd4fe801800] Opening > 'http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/segment157407241_32_a-p.ts?sd=10&rebase=on' > for reading > http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on: > Operation timed out > size= 164kB time=00:00:29.88 bitrate= 45.1kbits/s speed=2.63x > video:0kB audio:117kB subtitle:0kB other streams:0kB global headers:0kB > muxing overhead: 40.635853% > liuqideMBP:dash liuqi$ > > > >> -m3u8_hold_counters <int> .D........ Maximum number of times >> requests when the m3u8 file not be refresh (from 0 to INT_MAX) (default 1000) >> this can be used when you can success download m3u8 but the m3u8 always >> refresh without new segments. > > liuqideMBP:dash liuqi$ ./ffmpeg -m3u8_hold_counters 5 -i > http://127.0.0.1/output.m3u8 -c copy a.m3u8 > ffmpeg version N-95731-ge94edd85c6 Copyright (c) 2000-2019 the FFmpeg > developers > built with Apple LLVM version 10.0.0 (clang-1000.11.45.5) > configuration: --enable-fontconfig --enable-gpl --enable-libass > --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libspeex > --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-version3 > --enable-nonfree --enable-videotoolbox --enable-libxml2 --samples=fate-suite/ > --enable-libopencv > libavutil 56. 35.101 / 56. 35.101 > libavcodec 58. 62.100 / 58. 62.100 > libavformat 58. 35.100 / 58. 35.100 > libavdevice 58. 9.100 / 58. 9.100 > libavfilter 7. 66.100 / 7. 66.100 > libswscale 5. 6.100 / 5. 6.100 > libswresample 3. 6.100 / 3. 6.100 > libpostproc 55. 6.100 / 55. 6.100 > [hls @ 0x7ff6ac001000] Skip ('#EXT-X-VERSION:3') > [hls @ 0x7ff6ac001000] Opening 'http://127.0.0.1/output7.ts' for reading > [hls @ 0x7ff6ac001000] Opening 'http://127.0.0.1/output8.ts' for reading > [http @ 0x7ff6ac00e400] Opening 'http://127.0.0.1/output9.ts' for reading > Input #0, hls, from 'http://127.0.0.1/output.m3u8': > Duration: N/A, start: 15.480000, bitrate: N/A > Program 0 > Metadata: > variant_bitrate : 0 > Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, > 176x144 [SAR 1:1 DAR 11:9], 25 fps, 25 tbr, 90k tbn, 50 tbc > Metadata: > variant_bitrate : 0 > Output #0, hls, to 'a.m3u8': > Metadata: > encoder : Lavf58.35.100 > Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, > 176x144 [SAR 1:1 DAR 11:9], q=2-31, 25 fps, 25 tbr, 90k tbn, 25 tbc > Metadata: > variant_bitrate : 0 > Stream mapping: > Stream #0:0 -> #0:0 (copy) > Press [q] to stop, [?] for help > [hls @ 0x7ff6ac817a00] Opening 'a0.ts' for writing > [hls @ 0x7ff6ac817a00] Opening 'a.m3u8.tmp' for writing > [hls @ 0x7ff6ac817a00] Opening 'a1.ts' for writing > [hls @ 0x7ff6ac817a00] Opening 'a.m3u8.tmp' for writing > [hls @ 0x7ff6ac001000] Skip ('#EXT-X-VERSION:3') > [http @ 0x7ff6ac82de00] Opening 'http://127.0.0.1/output.m3u8' for reading > [hls @ 0x7ff6ac001000] Skip ('#EXT-X-VERSION:3') > [http @ 0x7ff6ac82de00] Opening 'http://127.0.0.1/output.m3u8' for reading > [hls @ 0x7ff6ac001000] Skip ('#EXT-X-VERSION:3') > [http @ 0x7ff6ac82de00] Opening 'http://127.0.0.1/output.m3u8' for reading > [hls @ 0x7ff6ac001000] Skip ('#EXT-X-VERSION:3') > [http @ 0x7ff6ac82de00] Opening 'http://127.0.0.1/output.m3u8' for reading > [hls @ 0x7ff6ac001000] Skip ('#EXT-X-VERSION:3') > [hls @ 0x7ff6ac817a00] Opening 'a2.ts' for writing92 bitrate=N/A speed=0.959x > [hls @ 0x7ff6ac817a00] Opening 'a.m3u8.tmp' for writing > frame= 150 fps= 24 q=-1.0 Lsize=N/A time=00:00:05.92 bitrate=N/A speed=0.958x > video:130kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB > muxing overhead: unknown > liuqideMBP:dash liuqi$ >> >>> So I have applied Steven's m3u8 patch, and have installed an >>> AVIOInterruptCB, but I'm still getting blocked here: >>> >>> >>> >>> #0 0x00007ffff791d729 in __GI___poll (fds=fds@entry=0x7fffcf663118, >>> nfds=nfds@entry=1, timeout=4999, >>> timeout@entry=<error reading variable: That operation is not >>> available on integers of more than 8 bytes.>) >>> at ../sysdeps/unix/sysv/linux/poll.c:29 >>> #1 0x00007ffff47951ab in send_dg (ansp2_malloced=<optimised out>, >>> resplen2=<optimised out>, >>> anssizp2=<optimised out>, ansp2=<optimised out>, anscp=<optimised >>> out>, gotsomewhere=<synthetic pointer>, >>> v_circuit=<synthetic pointer>, ns=<optimised out>, >>> terrno=0x7fffcf6630e8, anssizp=0x7fffcf663210, >>> ansp=0x7fffcf6630d8, buflen2=<optimised out>, buf2=<optimised out>, >>> buflen=<optimised out>, >>> buf=<optimised out>, statp=<optimised out>) at res_send.c:1112 >>> #2 __res_context_send (ctx=ctx@entry=0x7fffc0050e00, >>> buf=buf@entry=0x7fffcf663240 "̦\001", >>> buflen=buflen@entry=60, buf2=buf2@entry=0x7fffcf66327c >>> "\344\272\001", buflen2=buflen2@entry=60, >>> ans=<optimised out>, ans@entry=0x7fffcf663e50 "̦\201\202", >>> anssiz=<optimised out>, ansp=<optimised out>, >>> ansp2=<optimised out>, nansp2=<optimised out>, resplen2=<optimised >>> out>, ansp2_malloced=<optimised out>) >>> at res_send.c:519 >>> #3 0x00007ffff47927a3 in __GI___res_context_query >>> (ctx=ctx@entry=0x7fffc0050e00, >>> name=name@entry=0x7fffcf665070 "abcradiolivehls-lh.akamaihd.net", >>> class=class@entry=1, >>> type=type@entry=439963904, answer=answer@entry=0x7fffcf663e50 >>> "̦\201\202", anslen=anslen@entry=2048, >>> answerp=0x7fffcf6646a0, answerp2=0x7fffcf6646a8, >>> nanswerp2=0x7fffcf664690, resplen2=0x7fffcf664694, >>> answerp2_malloced=0x7fffcf664698) at res_query.c:216 >>> #4 0x00007ffff47933cc in __res_context_querydomain >>> (answerp2_malloced=0x7fffcf664698, resplen2=0x7fffcf664694, >>> nanswerp2=0x7fffcf664690, answerp2=0x7fffcf6646a8, >>> answerp=0x7fffcf6646a0, anslen=2048, >>> answer=0x7fffcf663e50 "̦\201\202", type=439963904, class=1, domain=0x0, >>> name=0x7fffcf665070 "abcradiolivehls-lh.akamaihd.net", >>> ctx=0x7fffc0050e00) at res_query.c:601 >>> #5 __GI___res_context_search (ctx=ctx@entry=0x7fffc0050e00, >>> name=name@entry=0x7fffcf665070 "abcradiolivehls-lh.akamaihd.net", >>> class=class@entry=1, >>> type=type@entry=439963904, answer=answer@entry=0x7fffcf663e50 >>> "̦\201\202", anslen=anslen@entry=2048, >>> answerp=<optimised out>, answerp2=<optimised out>, >>> nanswerp2=<optimised out>, resplen2=<optimised out>, >>> answerp2_malloced=<optimised out>) at res_query.c:370 >>> #6 0x00007ffff007b07a in _nss_dns_gethostbyname4_r ( >>> name=name@entry=0x7fffcf665070 "abcradiolivehls-lh.akamaihd.net", >>> pat=pat@entry=0x7fffcf6647f8, >>> buffer=0x7fffcf664a80 "\377\002", buflen=1024, >>> errnop=errnop@entry=0x7fffcf66e658, >>> herrnop=herrnop@entry=0x7fffcf66e6bc, ttlp=0x0) at >>> nss_dns/dns-host.c:371 >>> #7 0x00007ffff79100b2 in gaih_inet (name=<optimised out>, >>> name@entry=0x7fffcf665070 "abcradiolivehls-lh.akamaihd.net", >>> service=service@entry=0x7fffcf664a20, >>> req=req@entry=0x7fffcf664f30, pai=pai@entry=0x7fffcf664a08, >>> naddrs=naddrs@entry=0x7fffcf664a04, >>> tmpbuf=tmpbuf@entry=0x7fffcf664a70) at >>> ../sysdeps/posix/getaddrinfo.c:770 >>> #8 0x00007ffff79110a7 in __GI_getaddrinfo (name=<optimised out>, >>> service=<optimised out>, hints=0x7fffcf664f30, >>> pai=0x7fffcf664f08) at ../sysdeps/posix/getaddrinfo.c:2265 >>> #9 0x00007ffff074b97f in tcp_open (h=0x7fffc05ba140, >>> uri=0x7fffc05ba1a0 "tcp://abcradiolivehls-lh.akamaihd.net:80", >>> flags=3) at libavformat/tcp.c:151 >>> #10 0x00007ffff05a3a8e in ffurl_connect (uc=0x7fffc05ba140, >>> options=0x7fffcf669458) at libavformat/avio.c:210 >>> #11 0x00007ffff05a4214 in ffurl_open_whitelist (puc=0x7fffc0be9088, >>> filename=0x7fffcf666db0 "tcp://abcradiolivehls-lh.akamaihd.net:80", >>> flags=3, int_cb=0x7fffc05baeb0, >>> options=0x7fffcf669458, whitelist=0x7fffc05b32c0 >>> "http,https,tls,rtp,tcp,udp,crypto,httpproxy", >>> blacklist=0x0, parent=0x7fffc05bae80) at libavformat/avio.c:344 >>> #12 0x00007ffff0607397 in http_open_cnx_internal (h=0x7fffc05bae80, >>> options=0x7fffcf669458) >>> at libavformat/http.c:236 >>> #13 0x00007ffff060749b in http_open_cnx (h=0x7fffc05bae80, >>> options=0x7fffcf669458) at libavformat/http.c:263 >>> #14 0x00007ffff060842f in http_open (h=0x7fffc05bae80, >>> uri=0x7fffc05baee0 >>> "http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on", >>> flags=1, options=0x7fffcf669458) at libavformat/http.c:580 >>> #15 0x00007ffff05a3a64 in ffurl_connect (uc=0x7fffc05bae80, >>> options=0x7fffcf669458) at libavformat/avio.c:206 >>> #16 0x00007ffff05a4214 in ffurl_open_whitelist (puc=0x7fffcf669360, >>> filename=0x7fffc0005700 >>> "http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on", >>> flags=1, int_cb=0x7fffc0001148, options=0x7fffcf669458, >>> whitelist=0x7fffc000d210 >>> "http,https,tls,rtp,tcp,udp,crypto,httpproxy", blacklist=0x0, parent=0x0) >>> at libavformat/avio.c:344 >>> #17 0x00007ffff05a87a3 in ffio_open_whitelist (s=0x7fffcf6693e0, >>> filename=0x7fffc0005700 >>> "http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on", >>> flags=1, int_cb=0x7fffc0001148, options=0x7fffcf669458, >>> whitelist=0x7fffc000d210 >>> "http,https,tls,rtp,tcp,udp,crypto,httpproxy", blacklist=0x0) >>> at libavformat/aviobuf.c:1200 >>> #18 0x00007ffff06db328 in io_open_default (s=0x7fffc0000c80, >>> pb=0x7fffcf6693e0, >>> url=0x7fffc0005700 >>> "http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on", >>> flags=1, options=0x7fffcf669458) at libavformat/options.c:124 >>> #19 0x00007ffff05f602e in parse_playlist (c=0x7fffc0005200, >>> url=0x7fffc0005700 >>> "http://abcradiolivehls-lh.akamaihd.net/i/abcjazz_1@327288/index_32_a-p.m3u8?sd=10&rebase=on", >>> pls=0x7fffc0005700, in=0x0) at libavformat/hls.c:740 >>> #20 0x00007ffff05f847d in read_data (opaque=0x7fffc0005700, >>> buf=0x7fffc006e928 "", buf_size=32768) >>> at libavformat/hls.c:1417 >>> #21 0x00007ffff05a66d8 in read_packet_wrapper (s=0x7fffc0006700, >>> buf=0x7fffc006e928 "", size=32768) >>> at libavformat/aviobuf.c:538 >>> #22 0x00007ffff05a697f in fill_buffer (s=0x7fffc0006700) at >>> libavformat/aviobuf.c:587 >>> #23 0x00007ffff05a5f45 in avio_feof (s=0x7fffc0006700) at >>> libavformat/aviobuf.c:367 >>> #24 0x00007ffff05fa878 in hls_read_packet (s=0x7fffc0000c80, >>> pkt=0x7fffc0015a80) at libavformat/hls.c:2107 >>> #25 0x00007ffff075ac84 in ff_read_packet (s=0x7fffc0000c80, >>> pkt=0x7fffc0015a80) at libavformat/utils.c:859 >>> #26 0x00007ffff075dc49 in read_frame_internal (s=0x7fffc0000c80, >>> pkt=0x7fffc0015a80) at libavformat/utils.c:1586 >>> #27 0x00007ffff075ea61 in av_read_frame (s=0x7fffc0000c80, >>> pkt=0x7fffc0015a80) at libavformat/utils.c:1788 >>> >>> >>> >>> Is there a way for AVIOInterruptCB to also control the timeout of >>> tcp_open()? >>> >>> >>> >>> On 18/11/19 8:44 pm, Tom Gaudasiński wrote: >>>> Okay, I will try it. Thank you. >>>> >>>> On 18/11/19 8:43 pm, Steven Liu wrote: >>>>>> 在 2019年11月18日,17:32,Tom Gaudasiński <t...@records.headdesk.com.au> 写道: >>>>>> >>>>>> How do I append “#EXT-X-ENDLIST” to the end of the m3u8 using the API? >>>>>> The URL I get ffmpeg to open is the m3u8 file, so I somehow need to do >>>>>> it in memory, I presume? >>>>>> >>>>> Hello Tom, >>>>> >>>>> Can you try this patch please: >>>>> https://patchwork.ffmpeg.org/patch/16316/ >>>>>> On 18/11/19 8:00 pm, Steven Liu wrote: >>>>>>>> 在 2019年11月18日,16:44,Tom Gaudasiński <t...@records.headdesk.com.au> 写道: >>>>>>>> >>>>>>>> That would probably work in the one case where it's looking at the next >>>>>>>> entry in the list. It's actually blocking on a read, so I need some way >>>>>>>> to interrupt it. I will try AVIOInterruptCB and see how I go. >>>>>>> AVIOInterruptCB maybe ok if that is blocking. But is dose not useful if >>>>>>> it always refresh m3u8. >>>>>>>> On 18/11/19 7:36 pm, Steven Liu wrote: >>>>>>>>>> 在 2019年11月18日,16:11,Tom Gaudasiński <t...@records.headdesk.com.au> >>>>>>>>>> 写道: >>>>>>>>>> >>>>>>>>>> I essentially have a thread that I need to have exit immediately. I >>>>>>>>>> thought tweaking timeouts would be one way to get this done, but I'm >>>>>>>>>> starting to think that's a bad approach. >>>>>>>>>> >>>>>>>>>> So, let me, maybe, rephrase the question: Is there a way I can tell >>>>>>>>>> ffmpeg to terminate? Like, closing its sockets, or something like >>>>>>>>>> that? >>>>>>>>>> This is all from another thread. >>>>>>>>> Just append an “#EXT-X-ENDLIST” into the m3u8 list is ok. >>>>>>>>> >>>>>>>>>> On 18/11/19 7:06 pm, Steven Liu wrote: >>>>>>>>>>>> 在 2019年11月18日,15:37,Tom Gaudasiński <t...@records.headdesk.com.au> >>>>>>>>>>>> 写道: >>>>>>>>>>>> >>>>>>>>>>>> That seems to change the call-stack a bit, but it still gets stuck >>>>>>>>>>>> on >>>>>>>>>>>> something in hls.c. >>>>>>>>>>>> >>>>>>>>>>>> I'm looking into what it is. I've also tried connect_timeout. >>>>>>>>>>>> >>>>>>>>>>>> I really just need to terminate the av_read_frame call, so that it >>>>>>>>>>>> returns immediately when I need it to, but av_read_frame appears to >>>>>>>>>>>> reconnect internally. >>>>>>>>>>> Ah, maybe i get your point, do you mean you don’t like the hls >>>>>>>>>>> always retry >>>>>>>>>>> get the m3u8 list when the last segment don’t update living mode? >>>>>>>>>>> >>>>>>>>>>>> On 18/11/19 6:02 pm, Steven Liu wrote: >>>>>>>>>>>>>> 在 2019年11月18日,14:56,Tom Gaudasiński >>>>>>>>>>>>>> <t...@records.headdesk.com.au> 写道: >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'm trying to set a read timeout for a http/https stream through >>>>>>>>>>>>>> the >>>>>>>>>>>>>> API. Currently I'm passing... >>>>>>>>>>>>>> >>>>>>>>>>>>>> av_dict_set(&options, "timeout", "100000", 0); >>>>>>>>>>>>>> >>>>>>>>>>>>>> ... to avformat_open_input(). >>>>>>>>>>>>>> >>>>>>>>>>>>>> This appears to not work once the connection has been >>>>>>>>>>>>>> established. The >>>>>>>>>>>>>> protocol call-stack appears to be >>>>>>>>>>>>>> >>>>>>>>>>>>>> hls.c -> http.c -> avio.c -> tcp.c -> network.c >>>>>>>>>>>>> What about use rw_timeout ? >>>>>>>>>>>>>> The issue, I think, is that tcp.c only gets it's timeout from a >>>>>>>>>>>>>> ?key=val&key=val string at the end of the URL supplied to >>>>>>>>>>>>>> tcp.c, but >>>>>>>>>>>>>> http.c or avio.c don't supply this. In fact, when I see what was >>>>>>>>>>>>>> passed >>>>>>>>>>>>>> down, it's just "tcp://hostname.tld:80". >>>>>>>>>>>>>> >>>>>>>>>>>>>> Am I missing something? Is there a way to get ffmpeg to set >>>>>>>>>>>>>> tcp-timeout >>>>>>>>>>>>>> from the very top-level API calls? I can't see it. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thank you. >>>>>>>>>>>>>> >>>>>>>>>>>>>> --Tom G. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>> ffmpeg-devel mailing list >>>>>>>>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>>>>>>>> >>>>>>>>>>>>>> To unsubscribe, visit link above, or email >>>>>>>>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>>>>>>>> Thanks >>>>>>>>>>>>> Steven >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>> ffmpeg-devel mailing list >>>>>>>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>>>>>>> >>>>>>>>>>>>> To unsubscribe, visit link above, or email >>>>>>>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>> ffmpeg-devel mailing list >>>>>>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>>>>>> >>>>>>>>>>>> To unsubscribe, visit link above, or email >>>>>>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>>>>>> Thanks >>>>>>>>>>> Steven >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> ffmpeg-devel mailing list >>>>>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>>>>> >>>>>>>>>>> To unsubscribe, visit link above, or email >>>>>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>>>>> _______________________________________________ >>>>>>>>>> ffmpeg-devel mailing list >>>>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>>>> >>>>>>>>>> To unsubscribe, visit link above, or email >>>>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>>>> Thanks >>>>>>>>> Steven >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> ffmpeg-devel mailing list >>>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>>> >>>>>>>>> To unsubscribe, visit link above, or email >>>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>>> _______________________________________________ >>>>>>>> ffmpeg-devel mailing list >>>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>>> >>>>>>>> To unsubscribe, visit link above, or email >>>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>>> Thanks >>>>>>> Steven >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> ffmpeg-devel mailing list >>>>>>> ffmpeg-devel@ffmpeg.org >>>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>>> >>>>>>> To unsubscribe, visit link above, or email >>>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>>> _______________________________________________ >>>>>> ffmpeg-devel mailing list >>>>>> ffmpeg-devel@ffmpeg.org >>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>>> >>>>>> To unsubscribe, visit link above, or email >>>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>>> Thanks >>>>> Steven >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> ffmpeg-devel mailing list >>>>> ffmpeg-devel@ffmpeg.org >>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>> >>>>> To unsubscribe, visit link above, or email >>>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>>> _______________________________________________ >>>> ffmpeg-devel mailing list >>>> ffmpeg-devel@ffmpeg.org >>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> >>>> To unsubscribe, visit link above, or email >>>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >>> >>> _______________________________________________ >>> ffmpeg-devel mailing list >>> ffmpeg-devel@ffmpeg.org >>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>> >>> To unsubscribe, visit link above, or email >>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". >> Thanks >> Steven >> >> >> >> >> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >> To unsubscribe, visit link above, or email >> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > Thanks > Steven > > > > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".