--- Begin Message ---
Package: release.debian.org
Severity: normal
User: [email protected]
Usertags: unblock
Please unblock package rtmpdump. In jessie streaming to YouTube over RTMP is
broken with timestamps longer thant 24 bits. Also authenticating to Wozwa
servers is broken. These two issues have been fixed upstream.
The fixes are rather small and I'd like to get them included into jessie. Full
debdiff is attached. The changelog is:
rtmpdump (2.4+20150115.gita107cef-1) unstable; urgency=medium
* Team upload.
* New upstream snapshot fixing multiple issues when streaming to YouTube and
Wowza:
- Fix RTMP streams with timestamps longer than 24 bits.
- Fix authentication with Wowza 4.x servers.
* debian/patches/03_suppress_warning.diff: Suppress warning about 24-bit
timestamps. Thanks to William King.
-- Sebastian Ramacher <[email protected]> Sun, 29 Mar 2015 18:27:52 +0200
unblock rtmpdump/2.4+20150115.gita107cef-1
Cheers
--
Sebastian Ramacher
diff -Nru rtmpdump-2.4+20131018.git79459a2/debian/changelog
rtmpdump-2.4+20150115.gita107cef/debian/changelog
--- rtmpdump-2.4+20131018.git79459a2/debian/changelog 2014-11-11
15:56:13.000000000 +0100
+++ rtmpdump-2.4+20150115.gita107cef/debian/changelog 2015-03-29
18:29:14.000000000 +0200
@@ -1,3 +1,15 @@
+rtmpdump (2.4+20150115.gita107cef-1) unstable; urgency=medium
+
+ * Team upload.
+ * New upstream snapshot fixing multiple issues when streaming to YouTube and
+ Wowza:
+ - Fix RTMP streams with timestamps longer than 24 bits.
+ - Fix authentication with Wowza 4.x servers.
+ * debian/patches/03_suppress_warning.diff: Suppress warning about 24-bit
+ timestamps. Thanks to William King.
+
+ -- Sebastian Ramacher <[email protected]> Sun, 29 Mar 2015 18:27:52 +0200
+
rtmpdump (2.4+20131018.git79459a2-5) unstable; urgency=medium
* Team upload.
diff -Nru
rtmpdump-2.4+20131018.git79459a2/debian/patches/03_suppress_warning.diff
rtmpdump-2.4+20150115.gita107cef/debian/patches/03_suppress_warning.diff
--- rtmpdump-2.4+20131018.git79459a2/debian/patches/03_suppress_warning.diff
1970-01-01 01:00:00.000000000 +0100
+++ rtmpdump-2.4+20150115.gita107cef/debian/patches/03_suppress_warning.diff
2015-03-29 15:38:38.000000000 +0200
@@ -0,0 +1,14 @@
+Description: Suppress warning
+Author: William King <[email protected]>
+Last-Update: 2015-03-29
+
+--- rtmpdump-2.4+20150115.gita107cef.orig/librtmp/rtmp.c
++++ rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.c
+@@ -3969,7 +3969,6 @@ RTMP_SendPacket(RTMP *r, RTMPPacket *pac
+ {
+ header -= 4;
+ hSize += 4;
+- RTMP_Log(RTMP_LOGWARNING, "Larger timestamp than 24-bit: 0x%x", t);
+ }
+
+ hptr = header;
diff -Nru rtmpdump-2.4+20131018.git79459a2/debian/patches/series
rtmpdump-2.4+20150115.gita107cef/debian/patches/series
--- rtmpdump-2.4+20131018.git79459a2/debian/patches/series 2014-10-24
00:49:28.000000000 +0200
+++ rtmpdump-2.4+20150115.gita107cef/debian/patches/series 2015-03-29
15:38:53.000000000 +0200
@@ -1,2 +1,3 @@
01_unbreak_makefile.diff
02_gnutls_requires.private.diff
+03_suppress_warning.diff
diff -Nru rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.c
rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.c
--- rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.c 2014-04-08
02:56:09.000000000 +0200
+++ rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.c 2015-01-15
09:24:28.000000000 +0100
@@ -142,6 +142,8 @@
static int HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len);
static int HTTP_read(RTMP *r, int fill);
+static void CloseInternal(RTMP *r, int reconnect);
+
#ifndef _WIN32
static int clk_tck;
#endif
@@ -2538,7 +2540,6 @@
{
if (strstr(r->Link.app.av_val, av_authmod_adobe.av_val) != NULL) {
RTMP_Log(RTMP_LOGERROR, "%s, wrong pubUser & pubPasswd for
publisher auth", __FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
} else if(r->Link.pubUser.av_len && r->Link.pubPasswd.av_len) {
pubToken.av_val = malloc(r->Link.pubUser.av_len +
av_authmod_adobe.av_len + 8);
@@ -2546,10 +2547,8 @@
av_authmod_adobe.av_val,
r->Link.pubUser.av_val);
RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken1: %s", __FUNCTION__,
pubToken.av_val);
- r->Link.pFlags |= RTMP_PUB_NAME;
} else {
RTMP_Log(RTMP_LOGERROR, "%s, need to set pubUser & pubPasswd for
publisher auth", __FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
}
@@ -2639,25 +2638,21 @@
opaque.av_len ? opaque.av_val : "");
RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken2: %s", __FUNCTION__,
pubToken.av_val);
free(orig_ptr);
- r->Link.pFlags |= RTMP_PUB_RESP|RTMP_PUB_CLATE;
}
else if(strstr(description->av_val, "?reason=authfailed") != NULL)
{
RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: wrong password",
__FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
else if(strstr(description->av_val, "?reason=nosuchuser") != NULL)
{
RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: no such user",
__FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
else
{
RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: unknown auth
mode: %s",
__FUNCTION__, description->av_val);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
@@ -2665,7 +2660,7 @@
strncpy(ptr, r->Link.app.av_val, r->Link.app.av_len);
strncpy(ptr + r->Link.app.av_len, pubToken.av_val, pubToken.av_len);
r->Link.app.av_len += pubToken.av_len;
- if(r->Link.pFlags & RTMP_PUB_ALLOC)
+ if(r->Link.lFlags & RTMP_LF_FAPU)
free(r->Link.app.av_val);
r->Link.app.av_val = ptr;
@@ -2673,12 +2668,12 @@
strncpy(ptr, r->Link.tcUrl.av_val, r->Link.tcUrl.av_len);
strncpy(ptr + r->Link.tcUrl.av_len, pubToken.av_val, pubToken.av_len);
r->Link.tcUrl.av_len += pubToken.av_len;
- if(r->Link.pFlags & RTMP_PUB_ALLOC)
+ if(r->Link.lFlags & RTMP_LF_FTCU)
free(r->Link.tcUrl.av_val);
r->Link.tcUrl.av_val = ptr;
free(pubToken.av_val);
- r->Link.pFlags |= RTMP_PUB_ALLOC;
+ r->Link.lFlags |= RTMP_LF_FTCU | RTMP_LF_FAPU;
RTMP_Log(RTMP_LOGDEBUG, "%s, new app: %.*s tcUrl: %.*s playpath: %s",
__FUNCTION__,
r->Link.app.av_len, r->Link.app.av_val,
@@ -2693,7 +2688,6 @@
if (strstr(r->Link.app.av_val, av_authmod_llnw.av_val) != NULL) {
RTMP_Log(RTMP_LOGERROR, "%s, wrong pubUser & pubPasswd for
publisher auth", __FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
} else if(r->Link.pubUser.av_len && r->Link.pubPasswd.av_len) {
pubToken.av_val = malloc(r->Link.pubUser.av_len +
av_authmod_llnw.av_len + 8);
@@ -2701,10 +2695,8 @@
av_authmod_llnw.av_val,
r->Link.pubUser.av_val);
RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken1: %s", __FUNCTION__,
pubToken.av_val);
- r->Link.pFlags |= RTMP_PUB_NAME;
} else {
RTMP_Log(RTMP_LOGERROR, "%s, need to set pubUser & pubPasswd for
publisher auth", __FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
}
@@ -2828,27 +2820,23 @@
nonce.av_val, cnonce, nchex, hash3);
pubToken.av_len = strlen(pubToken.av_val);
RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken2: %s", __FUNCTION__,
pubToken.av_val);
- r->Link.pFlags |= RTMP_PUB_RESP|RTMP_PUB_CLATE;
free(orig_ptr);
}
else if(strstr(description->av_val, "?reason=authfail") != NULL)
{
RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed", __FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
else if(strstr(description->av_val, "?reason=nosuchuser") != NULL)
{
RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: no such user",
__FUNCTION__);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
else
{
RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: unknown auth
mode: %s",
__FUNCTION__, description->av_val);
- r->Link.pFlags |= RTMP_PUB_CLEAN;
return 0;
}
@@ -2856,7 +2844,7 @@
strncpy(ptr, r->Link.app.av_val, r->Link.app.av_len);
strncpy(ptr + r->Link.app.av_len, pubToken.av_val, pubToken.av_len);
r->Link.app.av_len += pubToken.av_len;
- if(r->Link.pFlags & RTMP_PUB_ALLOC)
+ if(r->Link.lFlags & RTMP_LF_FAPU)
free(r->Link.app.av_val);
r->Link.app.av_val = ptr;
@@ -2864,12 +2852,12 @@
strncpy(ptr, r->Link.tcUrl.av_val, r->Link.tcUrl.av_len);
strncpy(ptr + r->Link.tcUrl.av_len, pubToken.av_val, pubToken.av_len);
r->Link.tcUrl.av_len += pubToken.av_len;
- if(r->Link.pFlags & RTMP_PUB_ALLOC)
+ if(r->Link.lFlags & RTMP_LF_FTCU)
free(r->Link.tcUrl.av_val);
r->Link.tcUrl.av_val = ptr;
free(pubToken.av_val);
- r->Link.pFlags |= RTMP_PUB_ALLOC;
+ r->Link.lFlags |= RTMP_LF_FTCU | RTMP_LF_FAPU;
RTMP_Log(RTMP_LOGDEBUG, "%s, new app: %.*s tcUrl: %.*s playpath: %s",
__FUNCTION__,
r->Link.app.av_len, r->Link.app.av_val,
@@ -3091,7 +3079,12 @@
AMFProp_GetString(AMF_GetProp(&obj2, &av_description, -1),
&description);
RTMP_Log(RTMP_LOGDEBUG, "%s, error description: %s",
__FUNCTION__, description.av_val);
/* if PublisherAuth returns 1, then reconnect */
- PublisherAuth(r, &description);
+ if (PublisherAuth(r, &description) == 1)
+ {
+ CloseInternal(r, 1);
+ if (!RTMP_Connect(r, NULL) || !RTMP_ConnectStream(r, 0))
+ goto leave;
+ }
}
}
else
@@ -3107,22 +3100,6 @@
{
RTMP_Log(RTMP_LOGERROR, "rtmp server requested close");
RTMP_Close(r);
-#ifdef CRYPTO
- if ((r->Link.protocol & RTMP_FEATURE_WRITE) &&
- !(r->Link.pFlags & RTMP_PUB_CLEAN) &&
- ( !(r->Link.pFlags & RTMP_PUB_NAME) ||
- !(r->Link.pFlags & RTMP_PUB_RESP) ||
- (r->Link.pFlags & RTMP_PUB_CLATE) ) )
- {
- /* clean later */
- if(r->Link.pFlags & RTMP_PUB_CLATE)
- r->Link.pFlags |= RTMP_PUB_CLEAN;
- RTMP_Log(RTMP_LOGERROR, "authenticating publisher");
-
- if (!RTMP_Connect(r, NULL) || !RTMP_ConnectStream(r, 0))
- goto leave;
- }
-#endif
}
else if (AVMATCH(&method, &av_onStatus))
{
@@ -3988,10 +3965,11 @@
hSize += cSize;
}
- if (nSize > 1 && t >= 0xffffff)
+ if (t >= 0xffffff)
{
header -= 4;
hSize += 4;
+ RTMP_Log(RTMP_LOGWARNING, "Larger timestamp than 24-bit: 0x%x", t);
}
hptr = header;
@@ -4030,7 +4008,7 @@
if (nSize > 8)
hptr += EncodeInt32LE(hptr, packet->m_nInfoField2);
- if (nSize > 1 && t >= 0xffffff)
+ if (t >= 0xffffff)
hptr = AMF_EncodeInt32(hptr, hend, t);
nSize = packet->m_nBodySize;
@@ -4085,6 +4063,11 @@
header -= cSize;
hSize += cSize;
}
+ if (t >= 0xffffff)
+ {
+ header -= 4;
+ hSize += 4;
+ }
*header = (0xc0 | c);
if (cSize)
{
@@ -4093,6 +4076,11 @@
if (cSize == 2)
header[2] = tmp >> 8;
}
+ if (t >= 0xffffff)
+ {
+ char* extendedTimestamp = header + 1 + cSize;
+ AMF_EncodeInt32(extendedTimestamp, extendedTimestamp + 4, t);
+ }
}
}
if (tbuf)
@@ -4136,6 +4124,12 @@
void
RTMP_Close(RTMP *r)
{
+ CloseInternal(r, 0);
+}
+
+static void
+CloseInternal(RTMP *r, int reconnect)
+{
int i;
if (RTMP_IsConnected(r))
@@ -4215,28 +4209,25 @@
r->m_resplen = 0;
r->m_unackd = 0;
- if (r->Link.lFlags & RTMP_LF_FTCU)
+ if (r->Link.lFlags & RTMP_LF_FTCU && !reconnect)
{
free(r->Link.tcUrl.av_val);
r->Link.tcUrl.av_val = NULL;
r->Link.lFlags ^= RTMP_LF_FTCU;
}
+ if (r->Link.lFlags & RTMP_LF_FAPU && !reconnect)
+ {
+ free(r->Link.app.av_val);
+ r->Link.app.av_val = NULL;
+ r->Link.lFlags ^= RTMP_LF_FAPU;
+ }
-#ifdef CRYPTO
- if (!(r->Link.protocol & RTMP_FEATURE_WRITE) || (r->Link.pFlags &
RTMP_PUB_CLEAN))
+ if (!reconnect)
{
free(r->Link.playpath0.av_val);
r->Link.playpath0.av_val = NULL;
}
- if ((r->Link.protocol & RTMP_FEATURE_WRITE) &&
- (r->Link.pFlags & RTMP_PUB_CLEAN) &&
- (r->Link.pFlags & RTMP_PUB_ALLOC))
- {
- free(r->Link.app.av_val);
- r->Link.app.av_val = NULL;
- free(r->Link.tcUrl.av_val);
- r->Link.tcUrl.av_val = NULL;
- }
+#ifdef CRYPTO
if (r->Link.dh)
{
MDH_free(r->Link.dh);
@@ -4252,9 +4243,6 @@
RC4_free(r->Link.rc4keyOut);
r->Link.rc4keyOut = NULL;
}
-#else
- free(r->Link.playpath0.av_val);
- r->Link.playpath0.av_val = NULL;
#endif
}
diff -Nru rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.h
rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.h
--- rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.h 2014-04-08
02:56:09.000000000 +0200
+++ rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.h 2015-01-15
09:24:28.000000000 +0100
@@ -171,6 +171,7 @@
#define RTMP_LF_PLST 0x0008 /* send playlist before play */
#define RTMP_LF_BUFX 0x0010 /* toggle stream on BufferEmpty msg */
#define RTMP_LF_FTCU 0x0020 /* free tcUrl on close */
+#define RTMP_LF_FAPU 0x0040 /* free app on close */
int lFlags;
int swfAge;
@@ -178,12 +179,7 @@
int protocol;
int timeout; /* connection timeout in seconds */
-#define RTMP_PUB_NAME 0x0001 /* send login to server */
-#define RTMP_PUB_RESP 0x0002 /* send salted password hash */
-#define RTMP_PUB_ALLOC 0x0004 /* allocated data for new tcUrl & app */
-#define RTMP_PUB_CLEAN 0x0008 /* need to free allocated data for newer tcUrl
& app at exit */
-#define RTMP_PUB_CLATE 0x0010 /* late clean tcUrl & app at exit */
- int pFlags;
+ int pFlags; /* unused, but kept to avoid breaking
ABI */
unsigned short socksport;
unsigned short port;
signature.asc
Description: Digital signature
--- End Message ---