On Fri, 25 Apr 2014, Luca Barbato wrote:

On 25/04/14 08:12, Martin Storsjö wrote:
On Fri, 25 Apr 2014, Luca Barbato wrote:

Makes the two protocols nearly seamless.
---

It isn't complete and some options might be mapped in better ways.

libavformat/librtmp.c | 114
++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 111 insertions(+), 3 deletions(-)

diff --git a/libavformat/librtmp.c b/libavformat/librtmp.c
index 7133bd6..1996ba9 100644
--- a/libavformat/librtmp.c
+++ b/libavformat/librtmp.c
@@ -37,7 +37,21 @@ typedef struct LibRTMPContext {
    const AVClass *class;
    RTMP rtmp;
    char *app;
+    char *conn;
+    char *subscribe;
    char *playpath;
+    char *tcurl;                      ///< url of the target stream
+    char *flashver;                   ///< version of the flash plugin
+    char *swfhash;                    ///< SHA256 hash of the
decompressed SWF file (32 bytes)
+    char *swfurl;
+    char *swfverify;
+    char *pageurl;
+    char *client_buffer_time;
+    int flush_interval;
+    int swfsize;
+    int live;
+    int listen;
+    int listen_timeout;
} LibRTMPContext;

static void rtmp_log(int level, const char *fmt, va_list args)
@@ -99,7 +113,40 @@ static int rtmp_open(URLContext *s, const char
*uri, int flags)
    if (ctx->app || ctx->playpath) {
        int len = strlen(s->filename) + 1;
        if (ctx->app)      len += strlen(ctx->app)      + sizeof("
app=");
-        if (ctx->playpath) len += strlen(ctx->playpath) + sizeof("
playpath=");
+        if (ctx->tcurl)    len += strlen(ctx->tcurl)    + sizeof("
tcUrl=");
+        if (ctx->pageurl)  len += strlen(ctx->pageurl)  + sizeof("
pageUrl=");
+        if (ctx->swfurl)   len += strlen(ctx->swfurl)   + sizeof("
swfUrl=");
+        if (ctx->flashver) len += strlen(ctx->flashver) + sizeof("
flashver=");
+
+        if (ctx->conn) {
+            char *sep, *p = ctx->conn;
+            int options = 0;
+
+            while (p) {
+                options++;
+                p += strspn(p, " ");
+                if (!*p)
+                    break;
+                sep = strchr(p, ' ');
+                if (sep)
+                    p = sep + 1;
+                else
+                    break;
+            }
+            len += options * sizeof(" conn=");
+            len += strlen(ctx->conn);
+        }
+
+        if (ctx->playpath)
+            len += strlen(ctx->playpath) + sizeof(" playpath=");
+        if (ctx->live)
+            len += sizeof(" live=1");
+        if (ctx->subscribe)
+            len += strlen(ctx->subscribe) + sizeof(" subscribe=");
+
+        if (ctx->client_buffer_time)
+            len += strlen(ctx->client_buffer_time) + sizeof(" buffer=");
+

        if (!(filename = av_malloc(len)))
            return AVERROR(ENOMEM);
@@ -109,10 +156,53 @@ static int rtmp_open(URLContext *s, const char
*uri, int flags)
            av_strlcat(filename, " app=", len);
            av_strlcat(filename, ctx->app, len);
        }
+        if (ctx->tcurl) {
+            av_strlcat(filename, " tcUrl=", len);
+            av_strlcat(filename, ctx->tcurl, len);
+        }
+        if (ctx->pageurl) {
+            av_strlcat(filename, " pageUrl=", len);
+            av_strlcat(filename, ctx->pageurl, len);
+        }
+        if (ctx->swfurl) {
+            av_strlcat(filename, " swfUrl=", len);
+            av_strlcat(filename, ctx->pageurl, len);
+        }
+        if (ctx->flashver) {
+            av_strlcat(filename, " flashVer=", len);
+            av_strlcat(filename, ctx->flashver, len);
+        }
+        if (ctx->conn) {
+            char *sep, *p = ctx->conn;
+            while (p) {
+                av_strlcat(filename, " conn=", len);
+                p += strspn(p, " ");
+                if (!*p)
+                    break;
+                sep = strchr(p, ' ');
+                if (sep)
+                    *sep = '\0';
+                av_strlcat(filename, p, len);
+
+                if (sep)
+                    p = sep + 1;
+            }
+        }

Did you test that librtmp actually can handle multiple conn values
passed this way? I tried to read the source briefly but I'm not sure if
the later options are appended on top of the existing ones, or just
overwrite them.

yes and the manpage agrees as well =)


+
        if (ctx->playpath) {
            av_strlcat(filename, " playpath=", len);
            av_strlcat(filename, ctx->playpath, len);
        }
+        if (ctx->live)
+            av_strlcat(filename, " live=1", len);

Can't the live field be -2, -1 or 0, where only the -1 value should set
live=1 here?

I mapped -2 -1 to live=1 since live is boolean in librtmp.

Right. This is a change in the defaults for the librtmp wrapping, since this would start setting live=1 by default (since the default for rtmp_live is -2). This is closer to what we do with the native rtmp code, but it's a change in behaviour and should at least be mentioned as such in the commit message.

Other than that, this looks quite ok, and sure is a useful feature.

Are you ok with leaving the other options as unsupported?

Oh, I didn't see those initially. I'd rather not add them to the avoptions list unless they're actually supported, otherwise it's just confusing.

// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to