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.

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

Are you ok with leaving the other options as unsupported?

lu



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

Reply via email to