[FFmpeg-devel] [RFC] Reconnect and PUT file continue by ffmpeg base https on windows

Steven Liu lq at chinaffmpeg.org
Sat Sep 11 12:45:06 EEST 2021


Hello everyone,

    There have two tickets about Reconnect and PUT file continue by hlsenc.
    The first one is https://trac.ffmpeg.org/ticket/7975.
    It be fixed use the way ff_http_get_shutdown_status after furl_shutdown,
    But it get second problem.
    The ff_http_get_shutdown_status will block in Schannel on windows operating system in http_persistent mode.
    It’s ok by other operating system or non http_persistent mode.
    I think three ways to fix the new problem https://trac.ffmpeg.org/ticket/9010 but i cannot sure which way should better.


First way:
set socket flags of tcp NONBLOCK
-----------------------------------------
$ git diff
diff --git a/libavformat/tls_schannel.c b/libavformat/tls_schannel.c
index d4959f75fa..f5d048f9e5 100644
--- a/libavformat/tls_schannel.c
+++ b/libavformat/tls_schannel.c
@@ -414,14 +414,15 @@ static int tls_read(URLContext *h, uint8_t *buf, int len)
                return ret;
            }
        }
-
+    c->tls_shared.tcp->flags &= ~AVIO_FLAG_NONBLOCK;
+    c->tls_shared.tcp->flags |= h->flags & AVIO_FLAG_NONBLOCK;
        ret = ffurl_read(s->tcp, c->enc_buf + c->enc_buf_offset,
                         c->enc_buf_size - c->enc_buf_offset);
        if (ret == AVERROR_EOF) {
            c->connection_closed = 1;
            ret = 0;
        } else if (ret < 0) {
-            av_log(h, AV_LOG_ERROR, "Unable to read from socket\n");
+            av_log(h, AV_LOG_ERROR, "Unable to read from socket ret = [%s]\n", av_err2str(ret));
            return ret;
        }

-----------------------------------------
This way will get error code when ret < 0,
but all the hls PUT will success process,
there maybe have some risk for other module if merge this modify,
-----------------------------------------
Second way:
$ git diff
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 7c37bc50b9..86cdb897a4 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -314,9 +314,11 @@ static int hlsenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filename)
#if CONFIG_HTTP_PROTOCOL
    } else {
        URLContext *http_url_context = ffio_geturlcontext(*pb);
+        const char *proto = avio_find_protocol_name(filename);
        av_assert0(http_url_context);
        avio_flush(*pb);
        ffurl_shutdown(http_url_context, AVIO_FLAG_WRITE);
+    if (av_strcasecmp(proto, "https"))
        ret = ff_http_get_shutdown_status(http_url_context);
#endif
    }

-----------------------------------------
This way can fix the problem too,
But this will ignore all the http status which return from server base on all operating systems.


Third way:
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 7c37bc50b9..0ede8856a4 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -317,7 +317,9 @@ static int hlsenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filename)
        av_assert0(http_url_context);
        avio_flush(*pb);
        ffurl_shutdown(http_url_context, AVIO_FLAG_WRITE);
+#if !CONFIG_SCHANNEL
        ret = ff_http_get_shutdown_status(http_url_context);
+#endif
#endif
    }
    return ret;
-----------------------------------------
I think this is not pretty. :(
There maybe have some other ways, Do you have some suggestions.

Thanks
Steven






More information about the ffmpeg-devel mailing list