[rtmpdump] [PATCH] Allow rtmpsrv to respect live streams
Howard Chu
hyc at highlandsun.com
Sat Jun 2 01:49:36 CEST 2012
Steven Penny wrote:
> Currently rtmpsrv does not add the "--live" parameter even when reading a live
> stream. This ultimately causes rtmpdump to fail. Current workarounds involve
> adding "--live" to the printed command and re-running rtmpdump. I pulled this
> code from KSV repo
>
> http://github.com/K-S-V/Scripts/downloads
>
> Change has been tested to work with
>
> http://www.ar.aljazeerasport.tv
>
> but any live stream should also be affected.
AVcopy is invalid, it's returning a variable on its local stack to its caller.
Come on people, learn how to write proper C code.
> ---
> rtmpsrv.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 42 insertions(+), 0 deletions(-)
>
> diff --git a/rtmpsrv.c b/rtmpsrv.c
> index 9aa62f3..13d3e94 100644
> --- a/rtmpsrv.c
> +++ b/rtmpsrv.c
> @@ -96,6 +96,7 @@ STREAMING_SERVER *rtmpServer = 0; // server structure pointer
> STREAMING_SERVER *startStreaming(const char *address, int port);
> void stopStreaming(STREAMING_SERVER * server);
> void AVreplace(AVal *src, const AVal *orig, const AVal *repl);
> +AVal AVcopy(AVal src);
>
> static const AVal av_dquote = AVC("\"");
> static const AVal av_escdquote = AVC("\\\"");
> @@ -599,6 +600,17 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int
> if (obj.o_num > 5)
> r->Link.length = AMFProp_GetNumber(AMF_GetProp(&obj, NULL, 5));
> */
> + double StartFlag = 0;
> + AMFObjectProperty *Start = AMF_GetProp(&obj, NULL, 4);
> + if (!(Start->p_type == AMF_INVALID))
> + StartFlag = AMFProp_GetNumber(Start);
> + r->Link.app = AVcopy(r->Link.app);
> + if (StartFlag == -1000 || (r->Link.app.av_val && strstr(r->Link.app.av_val, "live")))
> + {
> + StartFlag = -1000;
> + server->arglen += 7;
> + server->argc += 1;
> + }
> if (r->Link.tcUrl.av_len)
> {
> len = server->arglen + r->Link.playpath.av_len + 4 +
> @@ -666,6 +678,17 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int
> ptr = dumpAMF(&r->Link.extras, ptr, argv, &argc);
> AMF_Reset(&r->Link.extras);
> }
> + if (StartFlag == -1000)
> + {
> + argv[argc].av_val = ptr + 1;
> + argv[argc++].av_len = 6;
> + ptr += sprintf(ptr, " --live");
> + }
> + if (r->Link.extras.o_num)
> + {
> + ptr = dumpAMF(&r->Link.extras, ptr, argv, &argc);
> + AMF_Reset(&r->Link.extras);
> + }
> argv[argc].av_val = ptr + 1;
> argv[argc++].av_len = 2;
> argv[argc].av_val = ptr + 5;
> @@ -1178,3 +1201,22 @@ AVreplace(AVal *src, const AVal *orig, const AVal *repl)
> src->av_val = dest;
> src->av_len = dptr - dest;
> }
> +
> +AVal
> +AVcopy(AVal src)
> +{
> + AVal dst;
> + if (src.av_len)
> + {
> + dst.av_val = malloc(src.av_len + 1);
> + memcpy(dst.av_val, src.av_val, src.av_len);
> + dst.av_val[src.av_len] = '\0';
> + dst.av_len = src.av_len;
> + }
> + else
> + {
> + dst.av_val = NULL;
> + dst.av_len = 0;
> + }
> + return dst;
> +}
>
More information about the rtmpdump
mailing list