diff options
-rw-r--r-- | src/librtmp-1-v2.4.patch | 2587 | ||||
-rw-r--r-- | src/librtmp-2-master.patch | 5371 | ||||
-rw-r--r-- | src/librtmp.mk | 21 |
3 files changed, 8 insertions, 7971 deletions
diff --git a/src/librtmp-1-v2.4.patch b/src/librtmp-1-v2.4.patch deleted file mode 100644 index fcf61e1..0000000 --- a/src/librtmp-1-v2.4.patch +++ /dev/null @@ -1,2587 +0,0 @@ -This file is part of MXE. -See index.html for further information. - -From 272a91d06d71c2a326996f62797ed9ab42f69859 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Wed, 30 Jun 2010 22:34:59 +0000 -Subject: [PATCH 01/34] zlib dependency is only when CRYPTO is enabled - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@536 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/Makefile b/Makefile -index 7470eb4..c7767b4 100644 ---- a/Makefile -+++ b/Makefile -@@ -11,9 +11,10 @@ SYS=posix - CRYPTO=OPENSSL - #CRYPTO=POLARSSL - #CRYPTO=GNUTLS --LIB_GNUTLS=-lgnutls -lgcrypt --LIB_OPENSSL=-lssl -lcrypto --LIB_POLARSSL=-lpolarssl -+LIBZ=-lz -+LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) -+LIB_OPENSSL=-lssl -lcrypto$ (LIBZ) -+LIB_POLARSSL=-lpolarssl $(LIBZ) - CRYPTO_LIB=$(LIB_$(CRYPTO)) - DEF_=-DNO_CRYPTO - CRYPTO_DEF=$(DEF_$(CRYPTO)) -@@ -33,7 +34,7 @@ MANDIR=$(DESTDIR)$(mandir) - - LIBS_posix= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 --LIBS=$(CRYPTO_LIB) -lz $(LIBS_$(SYS)) $(XLIBS) -+LIBS=$(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) - - THREADLIB_posix=-lpthread - THREADLIB_mingw= -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 06d2bbb..277f21c 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -66,10 +66,10 @@ - extern void RTMP_TLS_Init(); - extern TLS_CTX RTMP_TLS_ctx; - --#endif /* CRYPTO */ -- - #include <zlib.h> - -+#endif /* CRYPTO */ -+ - #define AGENT "Mozilla/5.0" - - HTTPResult --- -1.7.10.4 - - -From 6556b9f9328acb1199dc1cc3f22fa82c86b51c8a Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 1 Jul 2010 12:00:43 +0000 -Subject: [PATCH 02/34] Fix typo - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@537 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/Makefile b/Makefile -index c7767b4..1fcdd78 100644 ---- a/Makefile -+++ b/Makefile -@@ -13,7 +13,7 @@ CRYPTO=OPENSSL - #CRYPTO=GNUTLS - LIBZ=-lz - LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) --LIB_OPENSSL=-lssl -lcrypto$ (LIBZ) -+LIB_OPENSSL=-lssl -lcrypto $(LIBZ) - LIB_POLARSSL=-lpolarssl $(LIBZ) - CRYPTO_LIB=$(LIB_$(CRYPTO)) - DEF_=-DNO_CRYPTO --- -1.7.10.4 - - -From 8a5901c8a74280c898deb4ebf1a2f5d6f68bce42 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Sat, 3 Jul 2010 10:25:48 +0000 -Subject: [PATCH 03/34] Document the escape coding used for special characters - in values - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@538 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/librtmp.3 b/librtmp/librtmp.3 -index 055b52b..a5a7558 100644 ---- a/librtmp/librtmp.3 -+++ b/librtmp/librtmp.3 -@@ -57,14 +57,19 @@ The session handle is freed using - .BR RTMP_Free (). - - All data is transferred using FLV format. The basic session requires --an RTMP URL. Additional options may be specified by appending --space-separated key=value pairs to the URL. The RTMP URL format --is of the form -+an RTMP URL. The RTMP URL format is of the form - .nf - rtmp[t][e|s]://hostname[:port][/app[/playpath]] - .fi - - Plain rtmp, as well as tunneled and encrypted sessions are supported. -+ -+Additional options may be specified by appending space-separated -+key=value pairs to the URL. Special characters in values may need -+to be escaped to prevent misinterpretation by the option parser. -+The escape encoding uses a backslash followed by two hexadecimal digits -+representing the ASCII value of the character. E.g., spaces must -+be escaped as \fB\\20\fP and backslashes must be escaped as \fB\\5c\fP. - .SH OPTIONS - .SS "Network Parameters" - These options define how to connect to the media server. --- -1.7.10.4 - - -From c41568f57bec297581e8508a7e6a3d1e470dc81d Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Sat, 3 Jul 2010 10:28:57 +0000 -Subject: [PATCH 04/34] Update from prev commit - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@539 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/librtmp.3 b/librtmp/librtmp.3 -index a5a7558..66197d5 100644 ---- a/librtmp/librtmp.3 -+++ b/librtmp/librtmp.3 -@@ -1,4 +1,4 @@ --.TH LIBRTMP 3 "2010-05-29" "RTMPDump v2.2e" -+.TH LIBRTMP 3 "2010-07-03" "RTMPDump v2.3" - .\" Copyright 2010 Howard Chu. - .\" Copying permitted according to the GNU General Public License V2. - .SH NAME -diff --git a/librtmp/librtmp.3.html b/librtmp/librtmp.3.html -index daf636f..e5e6f4b 100644 ---- a/librtmp/librtmp.3.html -+++ b/librtmp/librtmp.3.html -@@ -6,7 +6,7 @@ - <tr><td>LIBRTMP(3)<td align="center"><td align="right">LIBRTMP(3) - </thead> - <tfoot> --<tr><td>RTMPDump v2.2e<td align="center">2010-05-29<td align="right">LIBRTMP(3) -+<tr><td>RTMPDump v2.3<td align="center">2010-07-03<td align="right">LIBRTMP(3) - </tfoot> - <tbody><tr><td colspan="3"><br><br><ul> - <!-- Copyright 2010 Howard Chu. -@@ -75,14 +75,19 @@ The session handle is freed using - <b>RTMP_Free</b>(). - <p> - All data is transferred using FLV format. The basic session requires --an RTMP URL. Additional options may be specified by appending --space-separated key=value pairs to the URL. The RTMP URL format --is of the form -+an RTMP URL. The RTMP URL format is of the form - <pre> - rtmp[t][e|s]://hostname[:port][/app[/playpath]] - </pre> - <p> - Plain rtmp, as well as tunneled and encrypted sessions are supported. -+<p> -+Additional options may be specified by appending space-separated -+key=value pairs to the URL. Special characters in values may need -+to be escaped to prevent misinterpretation by the option parser. -+The escape encoding uses a backslash followed by two hexadecimal digits -+representing the ASCII value of the character. E.g., spaces must -+be escaped as <b>\20</b> and backslashes must be escaped as <b>\5c</b>. - </ul> - - <h3>OPTIONS</h3><ul> --- -1.7.10.4 - - -From f1c4f0ed07659cbeae4ffaa78ca8cce7500afa58 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Mon, 5 Jul 2010 20:07:39 +0000 -Subject: [PATCH 05/34] Hide strtime() - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@541 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 277f21c..23e754b 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -435,7 +435,7 @@ make_unix_time(char *s) - /* Convert a Unix time to a network time string - * Weekday, DD-MMM-YYYY HH:MM:SS GMT - */ --void -+static void - strtime(time_t * t, char *s) - { - struct tm *tm; --- -1.7.10.4 - - -From da78eba764eda23fb3bf9aa91bd6c5fee1839932 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Mon, 5 Jul 2010 20:16:55 +0000 -Subject: [PATCH 06/34] Remove obsolete XBOX defs - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@542 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 0874cbe..6a3f215 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -24,17 +24,14 @@ - - #ifdef _WIN32 - --#ifdef _XBOX --#include <xtl.h> --#include <winsockx.h> -+#include <winsock2.h> -+#include <ws2tcpip.h> -+ -+#ifdef _MSC_VER /* MSVC */ - #define snprintf _snprintf - #define strcasecmp stricmp - #define strncasecmp strnicmp - #define vsnprintf _vsnprintf -- --#else /* !_XBOX */ --#include <winsock2.h> --#include <ws2tcpip.h> - #endif - - #define GetSockError() WSAGetLastError() --- -1.7.10.4 - - -From eef87483b92036a1631c98c9c85dc3cae66411ee Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Mon, 5 Jul 2010 20:17:16 +0000 -Subject: [PATCH 07/34] Update XBOX/XBMC support - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@543 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 23e754b..3c56b69 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -466,7 +466,7 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash, - - date[0] = '\0'; - #ifdef _WIN32 --#ifdef _XBOX -+#ifdef XBMC4XBOX - hpre.av_val = "Q:"; - hpre.av_len = 2; - home.av_val = "\\UserData"; --- -1.7.10.4 - - -From 24f7e724fc10d737a0f14c7741711b6b542c9d45 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 8 Jul 2010 10:38:33 +0000 -Subject: [PATCH 08/34] Don't link explicitly against static library - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@544 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/Makefile b/Makefile -index 1fcdd78..741e438 100644 ---- a/Makefile -+++ b/Makefile -@@ -34,7 +34,7 @@ MANDIR=$(DESTDIR)$(mandir) - - LIBS_posix= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 --LIBS=$(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) -+LIBS=-L librtmp -lrtmp $(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) - - THREADLIB_posix=-lpthread - THREADLIB_mingw= -@@ -48,9 +48,11 @@ EXT_posix= - EXT_mingw=.exe - EXT=$(EXT_$(SYS)) - --all: $(LIBRTMP) progs -+PROGS=rtmpdump rtmpgw rtmpsrv rtmpsuck - --progs: rtmpdump rtmpgw rtmpsrv rtmpsuck -+all: $(LIBRTMP) $(PROGS) -+ -+$(PROGS): $(LIBRTMP) - - install: progs - -mkdir -p $(BINDIR) $(SBINDIR) $(MANDIR)/man1 $(MANDIR)/man8 -@@ -69,20 +71,17 @@ FORCE: - $(LIBRTMP): FORCE - @cd librtmp; $(MAKE) all - --# note: $^ is GNU Make's equivalent to BSD $> --# we use both since either make will ignore the one it doesn't recognize -- --rtmpdump: rtmpdump.o $(LIBRTMP) -- $(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(LIBS) -+rtmpdump: rtmpdump.o -+ $(CC) $(LDFLAGS) -o $@$(EXT) $@.o $(LIBS) - --rtmpsrv: rtmpsrv.o thread.o $(LIBRTMP) -- $(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(SLIBS) -+rtmpsrv: rtmpsrv.o thread.o -+ $(CC) $(LDFLAGS) -o $@$(EXT) $@.o thread.o $(SLIBS) - --rtmpsuck: rtmpsuck.o thread.o $(LIBRTMP) -- $(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(SLIBS) -+rtmpsuck: rtmpsuck.o thread.o -+ $(CC) $(LDFLAGS) -o $@$(EXT) $@.o thread.o $(SLIBS) - --rtmpgw: rtmpgw.o thread.o $(LIBRTMP) -- $(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(SLIBS) -+rtmpgw: rtmpgw.o thread.o -+ $(CC) $(LDFLAGS) -o $@$(EXT) $@.o thread.o $(SLIBS) - - rtmpgw.o: rtmpgw.c $(INCRTMP) Makefile - rtmpdump.o: rtmpdump.c $(INCRTMP) Makefile --- -1.7.10.4 - - -From 5a3d6003a9745595583015c5b3b24e7bea818790 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 8 Jul 2010 11:11:47 +0000 -Subject: [PATCH 09/34] Fix install target - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@545 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/Makefile b/Makefile -index 741e438..75628dd 100644 ---- a/Makefile -+++ b/Makefile -@@ -54,7 +54,7 @@ all: $(LIBRTMP) $(PROGS) - - $(PROGS): $(LIBRTMP) - --install: progs -+install: $(PROGS) - -mkdir -p $(BINDIR) $(SBINDIR) $(MANDIR)/man1 $(MANDIR)/man8 - cp rtmpdump$(EXT) $(BINDIR) - cp rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT) $(SBINDIR) --- -1.7.10.4 - - -From 2340f0e27cd21d624d5f915fc42182750be6fca6 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Mon, 12 Jul 2010 08:20:04 +0000 -Subject: [PATCH 10/34] MacOSX/Darwin shared library flags - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@546 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/Makefile b/Makefile -index 75628dd..fda3c74 100644 ---- a/Makefile -+++ b/Makefile -@@ -33,10 +33,12 @@ SBINDIR=$(DESTDIR)$(sbindir) - MANDIR=$(DESTDIR)$(mandir) - - LIBS_posix= -+LIBS_darwin= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 - LIBS=-L librtmp -lrtmp $(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) - - THREADLIB_posix=-lpthread -+THREADLIB_darwin=-lpthread - THREADLIB_mingw= - THREADLIB=$(THREADLIB_$(SYS)) - SLIBS=$(THREADLIB) $(LIBS) -@@ -45,6 +47,7 @@ LIBRTMP=librtmp/librtmp.a - INCRTMP=librtmp/rtmp_sys.h librtmp/rtmp.h librtmp/log.h librtmp/amf.h - - EXT_posix= -+EXT_darwin= - EXT_mingw=.exe - EXT=$(EXT_$(SYS)) - -diff --git a/README b/README -index 6607a1d..5689853 100644 ---- a/README -+++ b/README -@@ -10,7 +10,11 @@ To compile type "make" with SYS=<platform name>, e.g. - - $ make SYS=posix - --for Linux, MacOSX, Unix, etc. or -+for Linux, Unix, etc. or -+ -+ $ make SYS=darwin -+ -+for MacOSX or - - $ make SYS=mingw - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 6774db7..2fd5869 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -17,6 +17,7 @@ REQ_GNUTLS=gnutls - REQ_OPENSSL=libssl,libcrypto - LIBZ=-lz - LIBS_posix= -+LIBS_darwin= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 - LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) - LIB_OPENSSL=-lssl -lcrypto $(LIBZ) -@@ -26,9 +27,16 @@ CRYPTO_REQ=$(REQ_$(CRYPTO)) - CRYPTO_DEF=$(DEF_$(CRYPTO)) - - SO_posix=so.0 -+SO_darwin=so.0 - SO_mingw=dll - SO_EXT=$(SO_$(SYS)) - -+SO_LDFLAGS_posix=-shared -Wl,-soname,$@ -+SO_LDFLAGS_darwin=-bundle -flat_namespace -undefined suppress -fno-common \ -+ -headerpad_max_install_names -+SO_LDFLAGS_mingw= -+SO_LDFLAGS=$(SO_LDFLAGS_$(SYS)) -+ - SHARED=yes - SODEF_yes=-fPIC - SOLIB_yes=librtmp.$(SO_EXT) -@@ -40,6 +48,7 @@ SO_INST=$(SOINST_$(SHARED)) - DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF) - OPT=-O2 - CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT) $(SO_DEF) -+LDFLAGS=$(XLDFLAGS) - - incdir=$(prefix)/include/librtmp - bindir=$(prefix)/bin -@@ -61,7 +70,7 @@ librtmp.a: $(OBJS) - $(AR) rs $@ $? - - librtmp.$(SO_EXT): $(OBJS) -- $(CC) -shared -Wl,-soname,$@ $(LDFLAGS) -o $@ $^ $> $(CRYPTO_LIB) -+ $(CC) $(SO_LDFLAGS) $(LDFLAGS) -o $@ $^ $> $(CRYPTO_LIB) - ln -sf $@ librtmp.so - - log.o: log.c log.h Makefile --- -1.7.10.4 - - -From 13798268e10fc8c56eecf5fce297375f7fca1526 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Mon, 9 Aug 2010 21:46:31 +0000 -Subject: [PATCH 11/34] Fixes for Darwin - use dylib, not bundle for shared - lib - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@547 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/Makefile b/Makefile -index fda3c74..c322e9a 100644 ---- a/Makefile -+++ b/Makefile -@@ -35,7 +35,7 @@ MANDIR=$(DESTDIR)$(mandir) - LIBS_posix= - LIBS_darwin= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 --LIBS=-L librtmp -lrtmp $(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) -+LIBS=-Llibrtmp -lrtmp $(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) - - THREADLIB_posix=-lpthread - THREADLIB_darwin=-lpthread -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 2fd5869..a4bf67e 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -26,13 +26,14 @@ CRYPTO_LIB=$(LIB_$(CRYPTO)) $(LIBS_$(SYS)) - CRYPTO_REQ=$(REQ_$(CRYPTO)) - CRYPTO_DEF=$(DEF_$(CRYPTO)) - --SO_posix=so.0 --SO_darwin=so.0 -+SO_VERSION=0 -+SO_posix=so.$(SO_VERSION) -+SO_darwin=$(SO_VERSION).dylib - SO_mingw=dll - SO_EXT=$(SO_$(SYS)) - - SO_LDFLAGS_posix=-shared -Wl,-soname,$@ --SO_LDFLAGS_darwin=-bundle -flat_namespace -undefined suppress -fno-common \ -+SO_LDFLAGS_darwin=-dynamiclib -flat_namespace -undefined suppress -fno-common \ - -headerpad_max_install_names - SO_LDFLAGS_mingw= - SO_LDFLAGS=$(SO_LDFLAGS_$(SYS)) -@@ -92,9 +93,13 @@ install_base: librtmp.a librtmp.pc - cp librtmp.pc $(LIBDIR)/pkgconfig - cp librtmp.3 $(MANDIR)/man3 - --install_so.0: librtmp.so.0 -- cp librtmp.so.0 $(LIBDIR) -- cd $(LIBDIR); ln -sf librtmp.so.0 librtmp.so -+install_so.$(SO_VERSION): librtmp.$(SO_EXT) -+ cp librtmp.$(SO_EXT) $(LIBDIR) -+ cd $(LIBDIR); ln -sf librtmp.$(SO_EXT) librtmp.so -+ -+install_$(SO_VERSION).dylib: librtmp.$(SO_EXT) -+ cp librtmp.$(SO_EXT) $(LIBDIR) -+ cd $(LIBDIR); ln -sf librtmp.$(SO_EXT) librtmp.dylib - - install_dll: librtmp.dll - cp librtmp.dll $(BINDIR) --- -1.7.10.4 - - -From eb806247dc8eab25d8a675a4f633d3feaf2b2045 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Tue, 10 Aug 2010 06:41:50 +0000 -Subject: [PATCH 12/34] More dynlib tweaks - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@548 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index a4bf67e..6a1b08b 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -2,6 +2,15 @@ VERSION=v2.3 - - prefix=/usr/local - -+incdir=$(prefix)/include/librtmp -+bindir=$(prefix)/bin -+libdir=$(prefix)/lib -+mandir=$(prefix)/man -+BINDIR=$(DESTDIR)$(bindir) -+INCDIR=$(DESTDIR)$(incdir) -+LIBDIR=$(DESTDIR)$(libdir) -+MANDIR=$(DESTDIR)$(mandir) -+ - CC=$(CROSS_COMPILE)gcc - LD=$(CROSS_COMPILE)ld - AR=$(CROSS_COMPILE)ar -@@ -27,11 +36,20 @@ CRYPTO_REQ=$(REQ_$(CRYPTO)) - CRYPTO_DEF=$(DEF_$(CRYPTO)) - - SO_VERSION=0 --SO_posix=so.$(SO_VERSION) --SO_darwin=$(SO_VERSION).dylib -+SOX_posix=so -+SOX_darwin=dylib -+SOX_mingw=so # useless -+SOX=$(SOX_$(SYS)) -+SO_posix=$(SOX).$(SO_VERSION) -+SO_darwin=$(SO_VERSION).$(SOX) - SO_mingw=dll - SO_EXT=$(SO_$(SYS)) - -+SODIR_posix=$(LIBDIR) -+SODIR_darwin=$(LIBDIR) -+SODIR_mingw=$(BINDIR) -+SODIR=$(SODIR_$(SYS)) -+ - SO_LDFLAGS_posix=-shared -Wl,-soname,$@ - SO_LDFLAGS_darwin=-dynamiclib -flat_namespace -undefined suppress -fno-common \ - -headerpad_max_install_names -@@ -41,7 +59,7 @@ SO_LDFLAGS=$(SO_LDFLAGS_$(SYS)) - SHARED=yes - SODEF_yes=-fPIC - SOLIB_yes=librtmp.$(SO_EXT) --SOINST_yes=install_$(SO_EXT) -+SOINST_yes=install_so - SO_DEF=$(SODEF_$(SHARED)) - SO_LIB=$(SOLIB_$(SHARED)) - SO_INST=$(SOINST_$(SHARED)) -@@ -51,28 +69,20 @@ OPT=-O2 - CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT) $(SO_DEF) - LDFLAGS=$(XLDFLAGS) - --incdir=$(prefix)/include/librtmp --bindir=$(prefix)/bin --libdir=$(prefix)/lib --mandir=$(prefix)/man --BINDIR=$(DESTDIR)$(bindir) --INCDIR=$(DESTDIR)$(incdir) --LIBDIR=$(DESTDIR)$(libdir) --MANDIR=$(DESTDIR)$(mandir) - - OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o - - all: librtmp.a $(SO_LIB) - - clean: -- rm -f *.o *.a *.so *.$(SO_EXT) -+ rm -f *.o *.a *.$(SOX) *.$(SO_EXT) - - librtmp.a: $(OBJS) - $(AR) rs $@ $? - - librtmp.$(SO_EXT): $(OBJS) - $(CC) $(SO_LDFLAGS) $(LDFLAGS) -o $@ $^ $> $(CRYPTO_LIB) -- ln -sf $@ librtmp.so -+ ln -sf $@ librtmp.$(SOX) - - log.o: log.c log.h Makefile - rtmp.o: rtmp.c rtmp.h rtmp_sys.h handshake.h dh.h log.h amf.h Makefile -@@ -93,13 +103,7 @@ install_base: librtmp.a librtmp.pc - cp librtmp.pc $(LIBDIR)/pkgconfig - cp librtmp.3 $(MANDIR)/man3 - --install_so.$(SO_VERSION): librtmp.$(SO_EXT) -- cp librtmp.$(SO_EXT) $(LIBDIR) -- cd $(LIBDIR); ln -sf librtmp.$(SO_EXT) librtmp.so -- --install_$(SO_VERSION).dylib: librtmp.$(SO_EXT) -- cp librtmp.$(SO_EXT) $(LIBDIR) -- cd $(LIBDIR); ln -sf librtmp.$(SO_EXT) librtmp.dylib -+install_so: librtmp.$(SO_EXT) -+ cp librtmp.$(SO_EXT) $(SODIR) -+ cd $(SODIR); ln -sf librtmp.$(SO_EXT) librtmp.$(SOX) - --install_dll: librtmp.dll -- cp librtmp.dll $(BINDIR) --- -1.7.10.4 - - -From 08bdebed5423602d195fa981b3f2663e62820677 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Fri, 13 Aug 2010 20:05:35 +0000 -Subject: [PATCH 13/34] Substitute libdir in pkgconfig file - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@549 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 6a1b08b..7cba62a 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -91,7 +91,8 @@ hashswf.o: hashswf.c http.h rtmp.h rtmp_sys.h Makefile - parseurl.o: parseurl.c rtmp.h rtmp_sys.h log.h Makefile - - librtmp.pc: librtmp.pc.in Makefile -- sed -e "s;@prefix@;$(prefix);" -e "s;@VERSION@;$(VERSION);" \ -+ sed -e "s;@prefix@;$(prefix);" -e "s;@libdir@;$(libdir);" \ -+ -e "s;@VERSION@;$(VERSION);" \ - -e "s;@CRYPTO_REQ@;$(CRYPTO_REQ);" librtmp.pc.in > $@ - - install: install_base $(SO_INST) -diff --git a/librtmp/librtmp.pc.in b/librtmp/librtmp.pc.in -index d58e269..70bd268 100644 ---- a/librtmp/librtmp.pc.in -+++ b/librtmp/librtmp.pc.in -@@ -1,6 +1,6 @@ - prefix=@prefix@ - exec_prefix=${prefix} --libdir=${exec_prefix}/lib -+libdir=@libdir@ - incdir=${prefix}/include - - Name: librtmp --- -1.7.10.4 - - -From 59ca19036ed45667b08d98f09e4d4a7a727b77b3 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Fri, 13 Aug 2010 20:34:58 +0000 -Subject: [PATCH 14/34] Less case-sensitive check for Content-length: header - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@550 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index f152648..5c678fd 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3664,11 +3664,15 @@ HTTP_read(RTMP *r, int fill) - return -1; - if (strncmp(r->m_sb.sb_start, "HTTP/1.1 200 ", 13)) - return -1; -- ptr = strstr(r->m_sb.sb_start, "Content-Length:"); -+ ptr = r->m_sb.sb_start + sizeof("HTTP/1.1 200"); -+ while ((ptr = strstr(ptr, "Content-"))) { -+ if (!strncasecmp(ptr+8, "length:", 7)) break; -+ ptr += 8; -+ } - if (!ptr) - return -1; - hlen = atoi(ptr+16); -- ptr = strstr(ptr, "\r\n\r\n"); -+ ptr = strstr(ptr+16, "\r\n\r\n"); - if (!ptr) - return -1; - ptr += 4; --- -1.7.10.4 - - -From 8afb3681407a0a83dcb1fec449b83854da440738 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Fri, 8 Oct 2010 07:45:54 +0000 -Subject: [PATCH 15/34] Log error message for unsupported SWF Verification - types - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@551 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 5c678fd..3e4e00a 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2789,11 +2789,17 @@ HandleCtrl(RTMP *r, const RTMPPacket *packet) - if (nType == 0x1A) - { - RTMP_Log(RTMP_LOGDEBUG, "%s, SWFVerification ping received: ", __FUNCTION__); -+ if (packet->m_nBodySize > 2 && packet->m_body[2] > 0x01) -+ { -+ RTMP_Log(RTMP_LOGERROR, -+ "%s: SWFVerification Type %d request not supported! Patches welcome...", -+ __FUNCTION__, packet->m_body[2]); -+ } - #ifdef CRYPTO - /*RTMP_LogHex(packet.m_body, packet.m_nBodySize); */ - - /* respond with HMAC SHA256 of decompressed SWF, key is the 30byte player key, also the last 30 bytes of the server handshake are applied */ -- if (r->Link.SWFSize) -+ else if (r->Link.SWFSize) - { - RTMP_SendCtrl(r, 0x1B, 0, 0); - } --- -1.7.10.4 - - -From 9ca7e22d94c6e07e8ef05acbf636809a5914f50c Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Tue, 26 Oct 2010 23:51:10 +0000 -Subject: [PATCH 16/34] Timeout fix from Antti Ajanki - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@552 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 3e4e00a..db882dc 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1019,6 +1019,9 @@ RTMP_ToggleStream(RTMP *r) - - if (!r->m_pausing) - { -+ if (RTMP_IsTimedout(r) && r->m_read.status == RTMP_READ_EOF) -+ r->m_read.status = 0; -+ - res = RTMP_SendPause(r, TRUE, r->m_pauseStamp); - if (!res) - return res; -diff --git a/rtmpdump.c b/rtmpdump.c -index 7aa19ab..c1cd95b 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -583,7 +583,7 @@ Download(RTMP * rtmp, // connected RTMP object - #endif - - } -- while (!RTMP_ctrlC && nRead > -1 && RTMP_IsConnected(rtmp)); -+ while (!RTMP_ctrlC && nRead > -1 && RTMP_IsConnected(rtmp) && !RTMP_IsTimedout(rtmp)); - free(buffer); - if (nRead < 0) - nRead = rtmp->m_read.status; --- -1.7.10.4 - - -From 1379a2c0d22f238d97970a7e7420287a9bd794de Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Fri, 24 Dec 2010 22:35:35 +0000 -Subject: [PATCH 17/34] Fix infinite loop on Error/Close - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@554 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index db882dc..e6e8ed8 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3395,10 +3395,10 @@ RTMP_Close(RTMP *r) - { - if (r->m_stream_id > 0) - { -- if ((r->Link.protocol & RTMP_FEATURE_WRITE)) -- SendFCUnpublish(r); - i = r->m_stream_id; - r->m_stream_id = 0; -+ if ((r->Link.protocol & RTMP_FEATURE_WRITE)) -+ SendFCUnpublish(r); - SendDeleteStream(r, i); - } - if (r->m_clientID.av_val) --- -1.7.10.4 - - -From 8c713f4c5c8e72369b48d15772e19d1c9ebd5a19 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Fri, 25 Feb 2011 05:51:40 +0000 -Subject: [PATCH 18/34] Fix FLV timestamps during resume - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@557 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index e6e8ed8..e2925a7 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -4083,7 +4083,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - /* grab first timestamp and see if it needs fixing */ - nTimeStamp = AMF_DecodeInt24(packetBody + 4); - nTimeStamp |= (packetBody[7] << 24); -- delta = packet.m_nTimeStamp - nTimeStamp; -+ delta = packet.m_nTimeStamp - nTimeStamp + r->m_read.nResumeTS; - - while (pos + 11 < nPacketLen) - { --- -1.7.10.4 - - -From bca1ef01727cac659f7ac171c791490efe4e48d6 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 10 Mar 2011 14:30:06 +0000 -Subject: [PATCH 19/34] Add Libs.private to pkgconfig for Windows - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@558 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 7cba62a..87618af 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -31,7 +31,8 @@ LIBS_mingw=-lws2_32 -lwinmm -lgdi32 - LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) - LIB_OPENSSL=-lssl -lcrypto $(LIBZ) - LIB_POLARSSL=-lpolarssl $(LIBZ) --CRYPTO_LIB=$(LIB_$(CRYPTO)) $(LIBS_$(SYS)) -+PRIVATE_LIBS=$(LIBS_$(SYS)) -+CRYPTO_LIB=$(LIB_$(CRYPTO)) $(PRIVATE_LIBS) - CRYPTO_REQ=$(REQ_$(CRYPTO)) - CRYPTO_DEF=$(DEF_$(CRYPTO)) - -@@ -93,7 +94,8 @@ parseurl.o: parseurl.c rtmp.h rtmp_sys.h log.h Makefile - librtmp.pc: librtmp.pc.in Makefile - sed -e "s;@prefix@;$(prefix);" -e "s;@libdir@;$(libdir);" \ - -e "s;@VERSION@;$(VERSION);" \ -- -e "s;@CRYPTO_REQ@;$(CRYPTO_REQ);" librtmp.pc.in > $@ -+ -e "s;@CRYPTO_REQ@;$(CRYPTO_REQ);" \ -+ -e "s;@PRIVATE_LIBS@;$(PRIVATE_LIBS));" librtmp.pc.in > $@ - - install: install_base $(SO_INST) - -diff --git a/librtmp/librtmp.pc.in b/librtmp/librtmp.pc.in -index 70bd268..5933ca1 100644 ---- a/librtmp/librtmp.pc.in -+++ b/librtmp/librtmp.pc.in -@@ -9,4 +9,5 @@ Version: @VERSION@ - Requires: @CRYPTO_REQ@ - URL: http://rtmpdump.mplayerhq.hu - Libs: -L${libdir} -lrtmp -lz -+Libs.private; @PRIVATE_LIBS@ - Cflags: -I${incdir} --- -1.7.10.4 - - -From 25447a0f675cc6e9eefc8eb420ad3a2725be8ab1 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 10 Mar 2011 14:33:32 +0000 -Subject: [PATCH 20/34] Fix typos in prev commit - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@559 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 87618af..1ea31a0 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -95,7 +95,7 @@ librtmp.pc: librtmp.pc.in Makefile - sed -e "s;@prefix@;$(prefix);" -e "s;@libdir@;$(libdir);" \ - -e "s;@VERSION@;$(VERSION);" \ - -e "s;@CRYPTO_REQ@;$(CRYPTO_REQ);" \ -- -e "s;@PRIVATE_LIBS@;$(PRIVATE_LIBS));" librtmp.pc.in > $@ -+ -e "s;@PRIVATE_LIBS@;$(PRIVATE_LIBS);" librtmp.pc.in > $@ - - install: install_base $(SO_INST) - -diff --git a/librtmp/librtmp.pc.in b/librtmp/librtmp.pc.in -index 5933ca1..a82beca 100644 ---- a/librtmp/librtmp.pc.in -+++ b/librtmp/librtmp.pc.in -@@ -9,5 +9,5 @@ Version: @VERSION@ - Requires: @CRYPTO_REQ@ - URL: http://rtmpdump.mplayerhq.hu - Libs: -L${libdir} -lrtmp -lz --Libs.private; @PRIVATE_LIBS@ -+Libs.private: @PRIVATE_LIBS@ - Cflags: -I${incdir} --- -1.7.10.4 - - -From 0a219ffeeb0094111fd00c509fce3ddd6eba2de2 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Mon, 14 Mar 2011 06:48:09 +0000 -Subject: [PATCH 21/34] Bump up play command buffer sizes - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@560 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index f2af85b..4d5699f 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -266,7 +266,7 @@ static int - SendPlayStart(RTMP *r) - { - RTMPPacket packet; -- char pbuf[384], *pend = pbuf+sizeof(pbuf); -+ char pbuf[512], *pend = pbuf+sizeof(pbuf); - - packet.m_nChannel = 0x03; // control channel (invoke) - packet.m_headerType = 1; /* RTMP_PACKET_SIZE_MEDIUM; */ -@@ -298,7 +298,7 @@ static int - SendPlayStop(RTMP *r) - { - RTMPPacket packet; -- char pbuf[384], *pend = pbuf+sizeof(pbuf); -+ char pbuf[512], *pend = pbuf+sizeof(pbuf); - - packet.m_nChannel = 0x03; // control channel (invoke) - packet.m_headerType = 1; /* RTMP_PACKET_SIZE_MEDIUM; */ --- -1.7.10.4 - - -From a1bcab1da064cca8a534d26970333220b57a72f0 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Wed, 16 Mar 2011 12:11:21 +0000 -Subject: [PATCH 22/34] Fix rtmpt read hangs - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@561 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index e2925a7..3042c7f 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -877,7 +877,13 @@ RTMP_Connect1(RTMP *r, RTMPPacket *cp) - r->m_clientID.av_val = NULL; - r->m_clientID.av_len = 0; - HTTP_Post(r, RTMPT_OPEN, "", 1); -- HTTP_read(r, 1); -+ if (HTTP_read(r, 1) != 0) -+ { -+ r->m_msgCounter = 0; -+ RTMP_Log(RTMP_LOGDEBUG, "%s, Could not connect for handshake", __FUNCTION__); -+ RTMP_Close(r); -+ return 0; -+ } - r->m_msgCounter = 0; - } - RTMP_Log(RTMP_LOGDEBUG, "%s, ... connected, handshaking", __FUNCTION__); -@@ -1284,7 +1290,12 @@ ReadN(RTMP *r, char *buffer, int n) - return 0; - } - } -- HTTP_read(r, 0); -+ if (HTTP_read(r, 0) == -1) -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "%s, No valid HTTP response found", __FUNCTION__); -+ RTMP_Close(r); -+ return 0; -+ } - } - if (r->m_resplen && !r->m_sb.sb_size) - RTMPSockBuf_Fill(&r->m_sb); -@@ -3670,7 +3681,7 @@ HTTP_read(RTMP *r, int fill) - if (fill) - RTMPSockBuf_Fill(&r->m_sb); - if (r->m_sb.sb_size < 144) -- return -1; -+ return -2; - if (strncmp(r->m_sb.sb_start, "HTTP/1.1 200 ", 13)) - return -1; - ptr = r->m_sb.sb_start + sizeof("HTTP/1.1 200"); --- -1.7.10.4 - - -From aa2825fbb1d1f70652d558a730baed28149ebbdd Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Sat, 19 Mar 2011 23:32:53 +0000 -Subject: [PATCH 23/34] Drop back on the handshake version, avoid rtmpe 9 - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@562 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/handshake.h b/librtmp/handshake.h -index 958579a..d4d2913 100644 ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -400,8 +400,10 @@ HandShake(RTMP * r, int FP9HandShake) - /* set version to at least 9.0.115.0 */ - if (encrypted) - { -- clientsig[4] = 128; -- clientsig[6] = 3; -+/* clientsig[4] = 128; -+ clientsig[6] = 3; */ -+ clientsig[4] = 0x7c; -+ clientsig[6] = 0x2; - } - else - { --- -1.7.10.4 - - -From ac1843db901184bef349615e3b67d7d2fcebdb7f Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Tue, 22 Mar 2011 15:13:18 +0000 -Subject: [PATCH 24/34] Fix prev commit - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@563 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/handshake.h b/librtmp/handshake.h -index d4d2913..b172dbf 100644 ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -402,8 +402,8 @@ HandShake(RTMP * r, int FP9HandShake) - { - /* clientsig[4] = 128; - clientsig[6] = 3; */ -- clientsig[4] = 0x7c; -- clientsig[6] = 0x2; -+ clientsig[4] = 9; -+ clientsig[6] = 0x7c; - } - else - { --- -1.7.10.4 - - -From 495e1e64106f10a7a1c15f0e2f870a02aa90605c Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 7 Apr 2011 19:07:31 +0000 -Subject: [PATCH 25/34] Handle Play.PublishNotify like Play.Start - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@566 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 3042c7f..286b6ae 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2282,6 +2282,8 @@ static const AVal av_NetStream_Play_Complete = AVC("NetStream.Play.Complete"); - static const AVal av_NetStream_Play_Stop = AVC("NetStream.Play.Stop"); - static const AVal av_NetStream_Seek_Notify = AVC("NetStream.Seek.Notify"); - static const AVal av_NetStream_Pause_Notify = AVC("NetStream.Pause.Notify"); -+static const AVal av_NetStream_Play_PublishNotify = -+AVC("NetStream.Play.PublishNotify"); - static const AVal av_NetStream_Play_UnpublishNotify = - AVC("NetStream.Play.UnpublishNotify"); - static const AVal av_NetStream_Publish_Start = AVC("NetStream.Publish.Start"); -@@ -2449,7 +2451,8 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - RTMP_Log(RTMP_LOGERROR, "Closing connection: %s", code.av_val); - } - -- else if (AVMATCH(&code, &av_NetStream_Play_Start)) -+ else if (AVMATCH(&code, &av_NetStream_Play_Start) -+ || AVMATCH(&code, &av_NetStream_Play_PublishNotify)) - { - int i; - r->m_bPlaying = TRUE; --- -1.7.10.4 - - -From 041cf3f2c927b26dc4b27b5e802fbb89362ea3e2 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 7 Apr 2011 19:11:13 +0000 -Subject: [PATCH 26/34] Handle multiple sessions at once (ugly) - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@567 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/rtmpsuck.c b/rtmpsuck.c -index ce6d879..3293e8b 100644 ---- a/rtmpsuck.c -+++ b/rtmpsuck.c -@@ -718,15 +718,15 @@ controlServerThread(void *unused) - TFRET(); - } - --void doServe(STREAMING_SERVER * server, // server socket and state (our listening socket) -- int sockfd // client connection socket -- ) -+TFTYPE doServe(void *arg) // server socket and state (our listening socket) - { -+ STREAMING_SERVER *server = arg; - RTMPPacket pc = { 0 }, ps = { 0 }; - RTMPChunk rk = { 0 }; - char *buf = NULL; - unsigned int buflen = 131072; - int paused = FALSE; -+ int sockfd = server->socket; - - // timeout for http requests - fd_set rfds; -@@ -990,7 +990,7 @@ quit: - if (server->state == STREAMING_IN_PROGRESS) - server->state = STREAMING_ACCEPTING; - -- return; -+ TFRET(); - } - - TFTYPE -@@ -1003,6 +1003,7 @@ serverThread(void *arg) - { - struct sockaddr_in addr; - socklen_t addrlen = sizeof(struct sockaddr_in); -+ STREAMING_SERVER *srv2 = malloc(sizeof(STREAMING_SERVER)); - int sockfd = - accept(server->socket, (struct sockaddr *) &addr, &addrlen); - -@@ -1020,8 +1021,10 @@ serverThread(void *arg) - RTMP_Log(RTMP_LOGDEBUG, "%s: accepted connection from %s\n", __FUNCTION__, - inet_ntoa(addr.sin_addr)); - #endif -+ *srv2 = *server; -+ srv2->socket = sockfd; - /* Create a new thread and transfer the control to that */ -- doServe(server, sockfd); -+ ThreadCreate(doServe, srv2); - RTMP_Log(RTMP_LOGDEBUG, "%s: processed request\n", __FUNCTION__); - } - else --- -1.7.10.4 - - -From 6155179b296f9749f713bb9bf47e9ca1fdb1a201 Mon Sep 17 00:00:00 2001 -From: hyc <hyc@400ebc74-4327-4243-bc38-086b20814532> -Date: Thu, 7 Apr 2011 19:33:28 +0000 -Subject: [PATCH 27/34] Use symbolic constants for packet types. From Peter - Miller @ opensource.org.au - -git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@568 400ebc74-4327-4243-bc38-086b20814532 - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 286b6ae..5ef3ae9 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1103,32 +1103,32 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - int bHasMediaPacket = 0; - switch (packet->m_packetType) - { -- case 0x01: -+ case RTMP_PACKET_TYPE_CHUNK_SIZE: - /* chunk size */ - HandleChangeChunkSize(r, packet); - break; - -- case 0x03: -+ case RTMP_PACKET_TYPE_BYTES_READ_REPORT: - /* bytes read report */ - RTMP_Log(RTMP_LOGDEBUG, "%s, received: bytes read report", __FUNCTION__); - break; - -- case 0x04: -+ case RTMP_PACKET_TYPE_CONTROL: - /* ctrl */ - HandleCtrl(r, packet); - break; - -- case 0x05: -+ case RTMP_PACKET_TYPE_SERVER_BW: - /* server bw */ - HandleServerBW(r, packet); - break; - -- case 0x06: -+ case RTMP_PACKET_TYPE_CLIENT_BW: - /* client bw */ - HandleClientBW(r, packet); - break; - -- case 0x08: -+ case RTMP_PACKET_TYPE_AUDIO: - /* audio data */ - /*RTMP_Log(RTMP_LOGDEBUG, "%s, received: audio %lu bytes", __FUNCTION__, packet.m_nBodySize); */ - HandleAudio(r, packet); -@@ -1139,7 +1139,7 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - r->m_mediaStamp = packet->m_nTimeStamp; - break; - -- case 0x09: -+ case RTMP_PACKET_TYPE_VIDEO: - /* video data */ - /*RTMP_Log(RTMP_LOGDEBUG, "%s, received: video %lu bytes", __FUNCTION__, packet.m_nBodySize); */ - HandleVideo(r, packet); -@@ -1150,19 +1150,22 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - r->m_mediaStamp = packet->m_nTimeStamp; - break; - -- case 0x0F: /* flex stream send */ -+ case RTMP_PACKET_TYPE_FLEX_STREAM_SEND: -+ /* flex stream send */ - RTMP_Log(RTMP_LOGDEBUG, - "%s, flex stream send, size %lu bytes, not supported, ignoring", - __FUNCTION__, packet->m_nBodySize); - break; - -- case 0x10: /* flex shared object */ -+ case RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT: -+ /* flex shared object */ - RTMP_Log(RTMP_LOGDEBUG, - "%s, flex shared object, size %lu bytes, not supported, ignoring", - __FUNCTION__, packet->m_nBodySize); - break; - -- case 0x11: /* flex message */ -+ case RTMP_PACKET_TYPE_FLEX_MESSAGE: -+ /* flex message */ - { - RTMP_Log(RTMP_LOGDEBUG, - "%s, flex message, size %lu bytes, not fully supported", -@@ -1185,7 +1188,7 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - bHasMediaPacket = 2; - break; - } -- case 0x12: -+ case RTMP_PACKET_TYPE_INFO: - /* metadata (notify) */ - RTMP_Log(RTMP_LOGDEBUG, "%s, received: notify %lu bytes", __FUNCTION__, - packet->m_nBodySize); -@@ -1193,12 +1196,12 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - bHasMediaPacket = 1; - break; - -- case 0x13: -+ case RTMP_PACKET_TYPE_SHARED_OBJECT: - RTMP_Log(RTMP_LOGDEBUG, "%s, shared object, not supported, ignoring", - __FUNCTION__); - break; - -- case 0x14: -+ case RTMP_PACKET_TYPE_INVOKE: - /* invoke */ - RTMP_Log(RTMP_LOGDEBUG, "%s, received: invoke %lu bytes", __FUNCTION__, - packet->m_nBodySize); -@@ -1208,7 +1211,7 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - bHasMediaPacket = 2; - break; - -- case 0x16: -+ case RTMP_PACKET_TYPE_FLASH_VIDEO: - { - /* go through FLV packets and handle metadata packets */ - unsigned int pos = 0; -@@ -1448,7 +1451,7 @@ SendConnectPacket(RTMP *r, RTMPPacket *cp) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1559,7 +1562,7 @@ SendBGHasStream(RTMP *r, double dId, AVal *playpath) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1591,7 +1594,7 @@ RTMP_SendCreateStream(RTMP *r) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1617,7 +1620,7 @@ SendFCSubscribe(RTMP *r, AVal *subscribepath) - char *enc; - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1649,7 +1652,7 @@ SendReleaseStream(RTMP *r) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1679,7 +1682,7 @@ SendFCPublish(RTMP *r) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1709,7 +1712,7 @@ SendFCUnpublish(RTMP *r) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1741,7 +1744,7 @@ SendPublish(RTMP *r) - - packet.m_nChannel = 0x04; /* source channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = r->m_stream_id; - packet.m_hasAbsTimestamp = 0; -@@ -1776,7 +1779,7 @@ SendDeleteStream(RTMP *r, double dStreamId) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1805,7 +1808,7 @@ RTMP_SendPause(RTMP *r, int DoPause, int iTime) - - packet.m_nChannel = 0x08; /* video channel */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* invoke */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1842,7 +1845,7 @@ RTMP_SendSeek(RTMP *r, int iTime) - - packet.m_nChannel = 0x08; /* video channel */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* invoke */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1870,7 +1873,7 @@ RTMP_SendServerBW(RTMP *r) - - packet.m_nChannel = 0x02; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x05; /* Server BW */ -+ packet.m_packetType = RTMP_PACKET_TYPE_SERVER_BW; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1890,7 +1893,7 @@ RTMP_SendClientBW(RTMP *r) - - packet.m_nChannel = 0x02; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x06; /* Client BW */ -+ packet.m_packetType = RTMP_PACKET_TYPE_CLIENT_BW; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1911,7 +1914,7 @@ SendBytesReceived(RTMP *r) - - packet.m_nChannel = 0x02; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x03; /* bytes in */ -+ packet.m_packetType = RTMP_PACKET_TYPE_BYTES_READ_REPORT; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1937,7 +1940,7 @@ SendCheckBW(RTMP *r) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; /* RTMP_GetTime(); */ - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1965,7 +1968,7 @@ SendCheckBWResult(RTMP *r, double txn) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0x16 * r->m_nBWCheckCounter; /* temp inc value. till we figure it out. */ - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -1994,7 +1997,7 @@ SendPong(RTMP *r, double txn) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0x16 * r->m_nBWCheckCounter; /* temp inc value. till we figure it out. */ - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -2021,7 +2024,7 @@ SendPlay(RTMP *r) - - packet.m_nChannel = 0x08; /* we make 8 our stream channel */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = r->m_stream_id; /*0x01000000; */ - packet.m_hasAbsTimestamp = 0; -@@ -2089,7 +2092,7 @@ SendPlaylist(RTMP *r) - - packet.m_nChannel = 0x08; /* we make 8 our stream channel */ - packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -- packet.m_packetType = 0x14; /* INVOKE */ -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = r->m_stream_id; /*0x01000000; */ - packet.m_hasAbsTimestamp = 0; -@@ -2127,7 +2130,7 @@ SendSecureTokenResponse(RTMP *r, AVal *resp) - - packet.m_nChannel = 0x03; /* control channel (invoke) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x14; -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -2174,7 +2177,7 @@ RTMP_SendCtrl(RTMP *r, short nType, unsigned int nObject, unsigned int nTime) - - packet.m_nChannel = 0x02; /* control channel (ping) */ - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -- packet.m_packetType = 0x04; /* ctrl */ -+ packet.m_packetType = RTMP_PACKET_TYPE_CONTROL; - packet.m_nTimeStamp = 0; /* RTMP_GetTime(); */ - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -3372,7 +3375,7 @@ RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue) - } - - /* we invoked a remote method */ -- if (packet->m_packetType == 0x14) -+ if (packet->m_packetType == RTMP_PACKET_TYPE_INVOKE) - { - AVal method; - char *ptr; -@@ -3748,8 +3751,8 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - char *packetBody = packet.m_body; - unsigned int nPacketLen = packet.m_nBodySize; - -- /* Return -3 if this was completed nicely with invoke message -- * Play.Stop or Play.Complete -+ /* Return RTMP_READ_COMPLETE if this was completed nicely with -+ * invoke message Play.Stop or Play.Complete - */ - if (rtnGetNextMediaPacket == 2) - { -@@ -3760,17 +3763,17 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - break; - } - -- r->m_read.dataType |= (((packet.m_packetType == 0x08) << 2) | -- (packet.m_packetType == 0x09)); -+ r->m_read.dataType |= (((packet.m_packetType == RTMP_PACKET_TYPE_AUDIO) << 2) | -+ (packet.m_packetType == RTMP_PACKET_TYPE_VIDEO)); - -- if (packet.m_packetType == 0x09 && nPacketLen <= 5) -+ if (packet.m_packetType == RTMP_PACKET_TYPE_VIDEO && nPacketLen <= 5) - { - RTMP_Log(RTMP_LOGDEBUG, "ignoring too small video packet: size: %d", - nPacketLen); - ret = RTMP_READ_IGNORE; - break; - } -- if (packet.m_packetType == 0x08 && nPacketLen <= 1) -+ if (packet.m_packetType == RTMP_PACKET_TYPE_AUDIO && nPacketLen <= 1) - { - RTMP_Log(RTMP_LOGDEBUG, "ignoring too small audio packet: size: %d", - nPacketLen); -@@ -3787,7 +3790,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - RTMP_Log(RTMP_LOGDEBUG, "type: %02X, size: %d, TS: %d ms, abs TS: %d", - packet.m_packetType, nPacketLen, packet.m_nTimeStamp, - packet.m_hasAbsTimestamp); -- if (packet.m_packetType == 0x09) -+ if (packet.m_packetType == RTMP_PACKET_TYPE_VIDEO) - RTMP_Log(RTMP_LOGDEBUG, "frametype: %02X", (*packetBody & 0xf0)); - #endif - -@@ -3797,7 +3800,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - if (packet.m_nTimeStamp == 0) - { - if (r->m_read.nMetaHeaderSize > 0 -- && packet.m_packetType == 0x12) -+ && packet.m_packetType == RTMP_PACKET_TYPE_INFO) - { - AMFObject metaObj; - int nRes = -@@ -3858,7 +3861,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - * in the first FLV stream chunk and we have to compare - * it and filter it out !! - */ -- if (packet.m_packetType == 0x16) -+ if (packet.m_packetType == RTMP_PACKET_TYPE_FLASH_VIDEO) - { - /* basically we have to find the keyframe with the - * correct TS being nResumeTS -@@ -3970,7 +3973,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - * (seeking might put us somewhere before it) - */ - if (!(r->m_read.flags & RTMP_READ_GOTKF) && -- packet.m_packetType != 0x16) -+ packet.m_packetType != RTMP_PACKET_TYPE_FLASH_VIDEO) - { - RTMP_Log(RTMP_LOGWARNING, - "Stream does not start with requested frame, ignoring data... "); -@@ -3983,7 +3986,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - } - /* ok, do the same for FLV streams */ - if (!(r->m_read.flags & RTMP_READ_GOTFLVK) && -- packet.m_packetType == 0x16) -+ packet.m_packetType == RTMP_PACKET_TYPE_FLASH_VIDEO) - { - RTMP_Log(RTMP_LOGWARNING, - "Stream does not start with requested FLV frame, ignoring data... "); -@@ -4002,9 +4005,11 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - * the preceding if clause) - */ - if (!(r->m_read.flags & RTMP_READ_NO_IGNORE) && -- packet.m_packetType != 0x16) -- { /* exclude type 0x16 (FLV) since it can -- * contain several FLV packets */ -+ packet.m_packetType != RTMP_PACKET_TYPE_FLASH_VIDEO) -+ { -+ /* exclude type RTMP_PACKET_TYPE_FLASH_VIDEO since it can -+ * contain several FLV packets -+ */ - if (packet.m_nTimeStamp == 0) - { - ret = RTMP_READ_IGNORE; -@@ -4020,9 +4025,10 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - - /* calculate packet size and allocate slop buffer if necessary */ - size = nPacketLen + -- ((packet.m_packetType == 0x08 || packet.m_packetType == 0x09 -- || packet.m_packetType == 0x12) ? 11 : 0) + -- (packet.m_packetType != 0x16 ? 4 : 0); -+ ((packet.m_packetType == RTMP_PACKET_TYPE_AUDIO -+ || packet.m_packetType == RTMP_PACKET_TYPE_VIDEO -+ || packet.m_packetType == RTMP_PACKET_TYPE_INFO) ? 11 : 0) + -+ (packet.m_packetType != RTMP_PACKET_TYPE_FLASH_VIDEO ? 4 : 0); - - if (size + 4 > buflen) - { -@@ -4048,8 +4054,9 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - - /* audio (0x08), video (0x09) or metadata (0x12) packets : - * construct 11 byte header then add rtmp packet's data */ -- if (packet.m_packetType == 0x08 || packet.m_packetType == 0x09 -- || packet.m_packetType == 0x12) -+ if (packet.m_packetType == RTMP_PACKET_TYPE_AUDIO -+ || packet.m_packetType == RTMP_PACKET_TYPE_VIDEO -+ || packet.m_packetType == RTMP_PACKET_TYPE_INFO) - { - nTimeStamp = r->m_read.nResumeTS + packet.m_nTimeStamp; - prevTagSize = 11 + nPacketLen; -@@ -4059,7 +4066,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - ptr = AMF_EncodeInt24(ptr, pend, nPacketLen); - - #if 0 -- if(packet.m_packetType == 0x09) { /* video */ -+ if(packet.m_packetType == RTMP_PACKET_TYPE_VIDEO) { - - /* H264 fix: */ - if((packetBody[0] & 0x0f) == 7) { /* CodecId = H264 */ -@@ -4089,7 +4096,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - len = nPacketLen; - - /* correct tagSize and obtain timestamp if we have an FLV stream */ -- if (packet.m_packetType == 0x16) -+ if (packet.m_packetType == RTMP_PACKET_TYPE_FLASH_VIDEO) - { - unsigned int pos = 0; - int delta; -@@ -4167,7 +4174,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - } - ptr += len; - -- if (packet.m_packetType != 0x16) -+ if (packet.m_packetType != RTMP_PACKET_TYPE_FLASH_VIDEO) - { - /* FLV tag packets contain their own prevTagSize */ - AMF_EncodeInt32(ptr, pend, prevTagSize); -@@ -4352,11 +4359,12 @@ RTMP_Write(RTMP *r, const char *buf, int size) - buf += 3; - s2 -= 11; - -- if (((pkt->m_packetType == 0x08 || pkt->m_packetType == 0x09) && -- !pkt->m_nTimeStamp) || pkt->m_packetType == 0x12) -+ if (((pkt->m_packetType == RTMP_PACKET_TYPE_AUDIO -+ || pkt->m_packetType == RTMP_PACKET_TYPE_VIDEO) && -+ !pkt->m_nTimeStamp) || pkt->m_packetType == RTMP_PACKET_TYPE_INFO) - { - pkt->m_headerType = RTMP_PACKET_SIZE_LARGE; -- if (pkt->m_packetType == 0x12) -+ if (pkt->m_packetType == RTMP_PACKET_TYPE_INFO) - pkt->m_nBodySize += 16; - } - else -@@ -4371,7 +4379,7 @@ RTMP_Write(RTMP *r, const char *buf, int size) - } - enc = pkt->m_body; - pend = enc + pkt->m_nBodySize; -- if (pkt->m_packetType == 0x12) -+ if (pkt->m_packetType == RTMP_PACKET_TYPE_INFO) - { - enc = AMF_EncodeString(enc, pend, &av_setDataFrame); - pkt->m_nBytesRead = enc - pkt->m_body; -diff --git a/librtmp/rtmp.h b/librtmp/rtmp.h -index de0b795..1ece207 100644 ---- a/librtmp/rtmp.h -+++ b/librtmp/rtmp.h -@@ -71,9 +71,29 @@ extern "C" - - uint32_t RTMP_GetTime(void); - --#define RTMP_PACKET_TYPE_AUDIO 0x08 --#define RTMP_PACKET_TYPE_VIDEO 0x09 --#define RTMP_PACKET_TYPE_INFO 0x12 -+/* RTMP_PACKET_TYPE_... 0x00 */ -+#define RTMP_PACKET_TYPE_CHUNK_SIZE 0x01 -+/* RTMP_PACKET_TYPE_... 0x02 */ -+#define RTMP_PACKET_TYPE_BYTES_READ_REPORT 0x03 -+#define RTMP_PACKET_TYPE_CONTROL 0x04 -+#define RTMP_PACKET_TYPE_SERVER_BW 0x05 -+#define RTMP_PACKET_TYPE_CLIENT_BW 0x06 -+/* RTMP_PACKET_TYPE_... 0x07 */ -+#define RTMP_PACKET_TYPE_AUDIO 0x08 -+#define RTMP_PACKET_TYPE_VIDEO 0x09 -+/* RTMP_PACKET_TYPE_... 0x0A */ -+/* RTMP_PACKET_TYPE_... 0x0B */ -+/* RTMP_PACKET_TYPE_... 0x0C */ -+/* RTMP_PACKET_TYPE_... 0x0D */ -+/* RTMP_PACKET_TYPE_... 0x0E */ -+#define RTMP_PACKET_TYPE_FLEX_STREAM_SEND 0x0F -+#define RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT 0x10 -+#define RTMP_PACKET_TYPE_FLEX_MESSAGE 0x11 -+#define RTMP_PACKET_TYPE_INFO 0x12 -+#define RTMP_PACKET_TYPE_SHARED_OBJECT 0x13 -+#define RTMP_PACKET_TYPE_INVOKE 0x14 -+/* RTMP_PACKET_TYPE_... 0x15 */ -+#define RTMP_PACKET_TYPE_FLASH_VIDEO 0x16 - - #define RTMP_MAX_HEADER_SIZE 18 - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index 4d5699f..f1b6c66 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -175,7 +175,7 @@ SendConnectResult(RTMP *r, double txn) - - packet.m_nChannel = 0x03; // control channel (invoke) - packet.m_headerType = 1; /* RTMP_PACKET_SIZE_MEDIUM; */ -- packet.m_packetType = 0x14; // INVOKE -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -236,7 +236,7 @@ SendResultNumber(RTMP *r, double txn, double ID) - - packet.m_nChannel = 0x03; // control channel (invoke) - packet.m_headerType = 1; /* RTMP_PACKET_SIZE_MEDIUM; */ -- packet.m_packetType = 0x14; // INVOKE -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -270,7 +270,7 @@ SendPlayStart(RTMP *r) - - packet.m_nChannel = 0x03; // control channel (invoke) - packet.m_headerType = 1; /* RTMP_PACKET_SIZE_MEDIUM; */ -- packet.m_packetType = 0x14; // INVOKE -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -@@ -302,7 +302,7 @@ SendPlayStop(RTMP *r) - - packet.m_nChannel = 0x03; // control channel (invoke) - packet.m_headerType = 1; /* RTMP_PACKET_SIZE_MEDIUM; */ -- packet.m_packetType = 0x14; // INVOKE -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; - packet.m_nTimeStamp = 0; - packet.m_nInfoField2 = 0; - packet.m_hasAbsTimestamp = 0; -diff --git a/rtmpsuck.c b/rtmpsuck.c -index 3293e8b..661e64b 100644 ---- a/rtmpsuck.c -+++ b/rtmpsuck.c -@@ -461,67 +461,71 @@ ServePacket(STREAMING_SERVER *server, int which, RTMPPacket *packet) - - switch (packet->m_packetType) - { -- case 0x01: -+ case RTMP_PACKET_TYPE_CHUNK_SIZE: - // chunk size - // HandleChangeChunkSize(r, packet); - break; - -- case 0x03: -+ case RTMP_PACKET_TYPE_BYTES_READ_REPORT: - // bytes read report - break; - -- case 0x04: -+ case RTMP_PACKET_TYPE_CONTROL: - // ctrl - // HandleCtrl(r, packet); - break; - -- case 0x05: -+ case RTMP_PACKET_TYPE_SERVER_BW: - // server bw - // HandleServerBW(r, packet); - break; - -- case 0x06: -+ case RTMP_PACKET_TYPE_CLIENT_BW: - // client bw - // HandleClientBW(r, packet); - break; - -- case 0x08: -+ case RTMP_PACKET_TYPE_AUDIO: - // audio data - //RTMP_Log(RTMP_LOGDEBUG, "%s, received: audio %lu bytes", __FUNCTION__, packet.m_nBodySize); - break; - -- case 0x09: -+ case RTMP_PACKET_TYPE_VIDEO: - // video data - //RTMP_Log(RTMP_LOGDEBUG, "%s, received: video %lu bytes", __FUNCTION__, packet.m_nBodySize); - break; - -- case 0x0F: // flex stream send -+ case RTMP_PACKET_TYPE_FLEX_STREAM_SEND: -+ // flex stream send - break; - -- case 0x10: // flex shared object -+ case RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT: -+ // flex shared object - break; - -- case 0x11: // flex message -+ case RTMP_PACKET_TYPE_FLEX_MESSAGE: -+ // flex message - { - ret = ServeInvoke(server, which, packet, packet->m_body + 1); - break; - } -- case 0x12: -+ case RTMP_PACKET_TYPE_INFO: - // metadata (notify) - break; - -- case 0x13: -+ case RTMP_PACKET_TYPE_SHARED_OBJECT: - /* shared object */ - break; - -- case 0x14: -+ case RTMP_PACKET_TYPE_INVOKE: - // invoke - ret = ServeInvoke(server, which, packet, packet->m_body); - break; - -- case 0x16: -+ case RTMP_PACKET_TYPE_FLASH_VIDEO: - /* flv */ - break; -+ - default: - RTMP_Log(RTMP_LOGDEBUG, "%s, unknown packet type received: 0x%02x", __FUNCTION__, - packet->m_packetType); -@@ -547,21 +551,21 @@ WriteStream(char **buf, // target pointer, maybe preallocated - unsigned int nPacketLen = packet->m_nBodySize; - - // skip video info/command packets -- if (packet->m_packetType == 0x09 && -+ if (packet->m_packetType == RTMP_PACKET_TYPE_VIDEO && - nPacketLen == 2 && ((*packetBody & 0xf0) == 0x50)) - { - ret = 0; - break; - } - -- if (packet->m_packetType == 0x09 && nPacketLen <= 5) -+ if (packet->m_packetType == RTMP_PACKET_TYPE_VIDEO && nPacketLen <= 5) - { - RTMP_Log(RTMP_LOGWARNING, "ignoring too small video packet: size: %d", - nPacketLen); - ret = 0; - break; - } -- if (packet->m_packetType == 0x08 && nPacketLen <= 1) -+ if (packet->m_packetType == RTMP_PACKET_TYPE_AUDIO && nPacketLen <= 1) - { - RTMP_Log(RTMP_LOGWARNING, "ignoring too small audio packet: size: %d", - nPacketLen); -@@ -571,19 +575,22 @@ WriteStream(char **buf, // target pointer, maybe preallocated - #ifdef _DEBUG - RTMP_Log(RTMP_LOGDEBUG, "type: %02X, size: %d, TS: %d ms", packet->m_packetType, - nPacketLen, packet->m_nTimeStamp); -- if (packet->m_packetType == 0x09) -+ if (packet->m_packetType == RTMP_PACKET_TYPE_VIDEO) - RTMP_Log(RTMP_LOGDEBUG, "frametype: %02X", (*packetBody & 0xf0)); - #endif - - // calculate packet size and reallocate buffer if necessary - unsigned int size = nPacketLen - + -- ((packet->m_packetType == 0x08 || packet->m_packetType == 0x09 -- || packet->m_packetType == 0x12) ? 11 : 0) + (packet->m_packetType != -- 0x16 ? 4 : 0); -+ ((packet->m_packetType == RTMP_PACKET_TYPE_AUDIO -+ || packet->m_packetType == RTMP_PACKET_TYPE_VIDEO -+ || packet->m_packetType == RTMP_PACKET_TYPE_INFO) ? 11 : 0) -+ + (packet->m_packetType != 0x16 ? 4 : 0); - - if (size + 4 > len) -- { // the extra 4 is for the case of an FLV stream without a last prevTagSize (we need extra 4 bytes to append it) -+ { -+ /* The extra 4 is for the case of an FLV stream without a last -+ * prevTagSize (we need extra 4 bytes to append it). */ - *buf = (char *) realloc(*buf, size + 4); - if (*buf == 0) - { -@@ -594,13 +601,15 @@ WriteStream(char **buf, // target pointer, maybe preallocated - } - char *ptr = *buf, *pend = ptr + size+4; - -- // audio (0x08), video (0x09) or metadata (0x12) packets : -- // construct 11 byte header then add rtmp packet's data -- if (packet->m_packetType == 0x08 || packet->m_packetType == 0x09 -- || packet->m_packetType == 0x12) -+ /* audio (RTMP_PACKET_TYPE_AUDIO), video (RTMP_PACKET_TYPE_VIDEO) -+ * or metadata (RTMP_PACKET_TYPE_INFO) packets: construct 11 byte -+ * header then add rtmp packet's data. */ -+ if (packet->m_packetType == RTMP_PACKET_TYPE_AUDIO -+ || packet->m_packetType == RTMP_PACKET_TYPE_VIDEO -+ || packet->m_packetType == RTMP_PACKET_TYPE_INFO) - { - // set data type -- //*dataType |= (((packet->m_packetType == 0x08)<<2)|(packet->m_packetType == 0x09)); -+ //*dataType |= (((packet->m_packetType == RTMP_PACKET_TYPE_AUDIO)<<2)|(packet->m_packetType == RTMP_PACKET_TYPE_VIDEO)); - - (*nTimeStamp) = packet->m_nTimeStamp; - prevTagSize = 11 + nPacketLen; -@@ -619,7 +628,7 @@ WriteStream(char **buf, // target pointer, maybe preallocated - unsigned int len = nPacketLen; - - // correct tagSize and obtain timestamp if we have an FLV stream -- if (packet->m_packetType == 0x16) -+ if (packet->m_packetType == RTMP_PACKET_TYPE_FLASH_VIDEO) - { - unsigned int pos = 0; - -@@ -629,8 +638,11 @@ WriteStream(char **buf, // target pointer, maybe preallocated - *nTimeStamp = AMF_DecodeInt24(packetBody + pos + 4); - *nTimeStamp |= (packetBody[pos + 7] << 24); - -- // set data type -- //*dataType |= (((*(packetBody+pos) == 0x08)<<2)|(*(packetBody+pos) == 0x09)); -+#if 0 -+ /* set data type */ -+ *dataType |= (((*(packetBody+pos) == RTMP_PACKET_TYPE_AUDIO) << 2) -+ | (*(packetBody+pos) == RTMP_PACKET_TYPE_VIDEO)); -+#endif - - if (pos + 11 + dataSize + 4 > nPacketLen) - { -@@ -680,7 +692,7 @@ WriteStream(char **buf, // target pointer, maybe preallocated - } - ptr += len; - -- if (packet->m_packetType != 0x16) -+ if (packet->m_packetType != RTMP_PACKET_TYPE_FLASH_VIDEO) - { // FLV tag packets contain their own prevTagSize - AMF_EncodeInt32(ptr, pend, prevTagSize); - //ptr += 4; -@@ -828,7 +840,7 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - if (RTMPPacket_IsReady(&ps)) - { - /* change chunk size */ -- if (ps.m_packetType == 0x01) -+ if (ps.m_packetType == RTMP_PACKET_TYPE_CHUNK_SIZE) - { - if (ps.m_nBodySize >= 4) - { -@@ -839,7 +851,7 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - } - } - /* bytes received */ -- else if (ps.m_packetType == 0x03) -+ else if (ps.m_packetType == RTMP_PACKET_TYPE_BYTES_READ_REPORT) - { - if (ps.m_nBodySize >= 4) - { -@@ -849,7 +861,7 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - } - } - /* ctrl */ -- else if (ps.m_packetType == 0x04) -+ else if (ps.m_packetType == RTMP_PACKET_TYPE_CONTROL) - { - short nType = AMF_DecodeInt16(ps.m_body); - /* UpdateBufferMS */ -@@ -875,13 +887,16 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - } - } - } -- else if (ps.m_packetType == 0x11 || ps.m_packetType == 0x14) -- if (ServePacket(server, 0, &ps) && server->f_cur) -- { -- fclose(server->f_cur->f_file); -- server->f_cur->f_file = NULL; -- server->f_cur = NULL; -- } -+ else if (ps.m_packetType == RTMP_PACKET_TYPE_FLEX_MESSAGE -+ || ps.m_packetType == RTMP_PACKET_TYPE_INVOKE) -+ { -+ if (ServePacket(server, 0, &ps) && server->f_cur) -+ { -+ fclose(server->f_cur->f_file); -+ server->f_cur->f_file = NULL; -+ server->f_cur = NULL; -+ } -+ } - RTMP_SendPacket(&server->rc, &ps, FALSE); - RTMPPacket_Free(&ps); - break; -@@ -902,7 +917,7 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - server->rc.m_pausing = 0; - } - /* change chunk size */ -- if (pc.m_packetType == 0x01) -+ if (pc.m_packetType == RTMP_PACKET_TYPE_CHUNK_SIZE) - { - if (pc.m_nBodySize >= 4) - { -@@ -912,7 +927,7 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - server->rs.m_outChunkSize = server->rc.m_inChunkSize; - } - } -- else if (pc.m_packetType == 0x04) -+ else if (pc.m_packetType == RTMP_PACKET_TYPE_CONTROL) - { - short nType = AMF_DecodeInt16(pc.m_body); - /* SWFverification */ -@@ -929,17 +944,18 @@ TFTYPE doServe(void *arg) // server socket and state (our listening socket) - #endif - } - else if (server->f_cur && ( -- pc.m_packetType == 0x08 || -- pc.m_packetType == 0x09 || -- pc.m_packetType == 0x12 || -- pc.m_packetType == 0x16) && -+ pc.m_packetType == RTMP_PACKET_TYPE_AUDIO || -+ pc.m_packetType == RTMP_PACKET_TYPE_VIDEO || -+ pc.m_packetType == RTMP_PACKET_TYPE_INFO || -+ pc.m_packetType == RTMP_PACKET_TYPE_FLASH_VIDEO) && - RTMP_ClientPacket(&server->rc, &pc)) - { - int len = WriteStream(&buf, &buflen, &server->stamp, &pc); - if (len > 0 && fwrite(buf, 1, len, server->f_cur->f_file) != len) - goto cleanup; - } -- else if ( pc.m_packetType == 0x11 || pc.m_packetType == 0x14) -+ else if (pc.m_packetType == RTMP_PACKET_TYPE_FLEX_MESSAGE || -+ pc.m_packetType == RTMP_PACKET_TYPE_INVOKE) - { - if (ServePacket(server, 1, &pc) && server->f_cur) - { --- -1.7.10.4 - - -From e09abc08504988e5c286ffc9c92da3ba76f95a20 Mon Sep 17 00:00:00 2001 -From: Compn <tempn@twmi.rr.com> -Date: Tue, 5 Jul 2011 09:48:23 -0400 -Subject: [PATCH 28/34] add -shared to mingw ldflags, fixes compilation error - patch by Martin Storsjo - - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 1ea31a0..785e869 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -54,7 +54,7 @@ SODIR=$(SODIR_$(SYS)) - SO_LDFLAGS_posix=-shared -Wl,-soname,$@ - SO_LDFLAGS_darwin=-dynamiclib -flat_namespace -undefined suppress -fno-common \ - -headerpad_max_install_names --SO_LDFLAGS_mingw= -+SO_LDFLAGS_mingw=-shared - SO_LDFLAGS=$(SO_LDFLAGS_$(SYS)) - - SHARED=yes --- -1.7.10.4 - - -From 0e9b4917c1163227c48cd83e081aa972ed7d3111 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@symas.com> -Date: Mon, 11 Jul 2011 14:41:11 -0700 -Subject: [PATCH 29/34] Revert "Drop back on the handshake version, avoid - rtmpe 9" - -This reverts commit aa2825fbb1d1f70652d558a730baed28149ebbdd. - -Conflicts: - - librtmp/handshake.h - -diff --git a/librtmp/handshake.h b/librtmp/handshake.h -index b172dbf..958579a 100644 ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -400,10 +400,8 @@ HandShake(RTMP * r, int FP9HandShake) - /* set version to at least 9.0.115.0 */ - if (encrypted) - { --/* clientsig[4] = 128; -- clientsig[6] = 3; */ -- clientsig[4] = 9; -- clientsig[6] = 0x7c; -+ clientsig[4] = 128; -+ clientsig[6] = 3; - } - else - { --- -1.7.10.4 - - -From d1f14b147e03aa17c968b96d6573320410a5252c Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@symas.com> -Date: Mon, 11 Jul 2011 16:12:39 -0700 -Subject: [PATCH 30/34] Add RTMPE type 9 handshake signature - - -diff --git a/librtmp/handshake.h b/librtmp/handshake.h -index 958579a..98bf3c8 100644 ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -358,6 +358,337 @@ static void rtmpe8_sig(uint8_t *in, uint8_t *out, int keyid) - out[7] = v1; - } - -+/* RTMPE type 9 uses Blowfish on the regular signature -+ * http://en.wikipedia.org/wiki/Blowfish_(cipher) -+ */ -+#define BF_ROUNDS 16 -+typedef struct bf_key { -+ uint32_t s[4][256]; -+ uint32_t p[BF_ROUNDS+2]; -+} bf_key; -+ -+static const uint32_t bf_sinit[][256] = { -+ -+ /* S-Box 0 */ -+ { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, -+ 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, -+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, -+ 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, -+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, -+ 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, -+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, -+ 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, -+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, -+ 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, -+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, -+ 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, -+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, -+ 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, -+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, -+ 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, -+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, -+ 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, -+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, -+ 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, -+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, -+ 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, -+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, -+ 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, -+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, -+ 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, -+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, -+ 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, -+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, -+ 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, -+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, -+ 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, -+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, -+ 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, -+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, -+ 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, -+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, -+ 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, -+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, -+ 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, -+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, -+ 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, -+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, }, -+ -+ /* S-Box 1 */ -+ { 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, -+ 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, -+ 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, -+ 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, -+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, -+ 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, -+ 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, -+ 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, -+ 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, -+ 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, -+ 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, -+ 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, -+ 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, -+ 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, -+ 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, -+ 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, -+ 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, -+ 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, -+ 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, -+ 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, -+ 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, -+ 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, -+ 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, -+ 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, -+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, -+ 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, -+ 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, -+ 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, -+ 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, -+ 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, -+ 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, -+ 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, -+ 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, -+ 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, -+ 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, -+ 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, -+ 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, -+ 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, -+ 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, -+ 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, -+ 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, -+ 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, -+ 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, }, -+ -+ /* S-Box 2 */ -+ { 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, -+ 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, -+ 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, -+ 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, -+ 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, -+ 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, -+ 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, -+ 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, -+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, -+ 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, -+ 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, -+ 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, -+ 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, -+ 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, -+ 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, -+ 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, -+ 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, -+ 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, -+ 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, -+ 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, -+ 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, -+ 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, -+ 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, -+ 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, -+ 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, -+ 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, -+ 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, -+ 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, -+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, -+ 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, -+ 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, -+ 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, -+ 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, -+ 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, -+ 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, -+ 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, -+ 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, -+ 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, -+ 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, -+ 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, -+ 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, -+ 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, -+ 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, }, -+ -+ /* S-Box 3 */ -+ { 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, -+ 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, -+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, -+ 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, -+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, -+ 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, -+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, -+ 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, -+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, -+ 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, -+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, -+ 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, -+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, -+ 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, -+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, -+ 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, -+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, -+ 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, -+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, -+ 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, -+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, -+ 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, -+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, -+ 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, -+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, -+ 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, -+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, -+ 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, -+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, -+ 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, -+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, -+ 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, -+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, -+ 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, -+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, -+ 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, -+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, -+ 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, -+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, -+ 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, -+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, -+ 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, -+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, }, -+}; -+ -+static const uint32_t bf_pinit[] = { -+ /* P-Box */ -+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, -+ 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, -+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, -+}; -+ -+#define KEYBYTES 24 -+ -+static const unsigned char rtmpe9_keys[16][KEYBYTES] = { -+ { 0x79, 0x34, 0x77, 0x4c, 0x67, 0xd1, 0x38, 0x3a, 0xdf, 0xb3, 0x56, 0xbe, -+ 0x8b, 0x7b, 0xd0, 0x24, 0x38, 0xe0, 0x73, 0x58, 0x41, 0x5d, 0x69, 0x67, }, -+ { 0x46, 0xf6, 0xb4, 0xcc, 0x01, 0x93, 0xe3, 0xa1, 0x9e, 0x7d, 0x3c, 0x65, -+ 0x55, 0x86, 0xfd, 0x09, 0x8f, 0xf7, 0xb3, 0xc4, 0x6f, 0x41, 0xca, 0x5c, }, -+ { 0x1a, 0xe7, 0xe2, 0xf3, 0xf9, 0x14, 0x79, 0x94, 0xc0, 0xd3, 0x97, 0x43, -+ 0x08, 0x7b, 0xb3, 0x84, 0x43, 0x2f, 0x9d, 0x84, 0x3f, 0x21, 0x01, 0x9b, }, -+ { 0xd3, 0xe3, 0x54, 0xb0, 0xf7, 0x1d, 0xf6, 0x2b, 0x5a, 0x43, 0x4d, 0x04, -+ 0x83, 0x64, 0x3e, 0x0d, 0x59, 0x2f, 0x61, 0xcb, 0xb1, 0x6a, 0x59, 0x0d, }, -+ { 0xc8, 0xc1, 0xe9, 0xb8, 0x16, 0x56, 0x99, 0x21, 0x7b, 0x5b, 0x36, 0xb7, -+ 0xb5, 0x9b, 0xdf, 0x06, 0x49, 0x2c, 0x97, 0xf5, 0x95, 0x48, 0x85, 0x7e, }, -+ { 0xeb, 0xe5, 0xe6, 0x2e, 0xa4, 0xba, 0xd4, 0x2c, 0xf2, 0x16, 0xe0, 0x8f, -+ 0x66, 0x23, 0xa9, 0x43, 0x41, 0xce, 0x38, 0x14, 0x84, 0x95, 0x00, 0x53, }, -+ { 0x66, 0xdb, 0x90, 0xf0, 0x3b, 0x4f, 0xf5, 0x6f, 0xe4, 0x9c, 0x20, 0x89, -+ 0x35, 0x5e, 0xd2, 0xb2, 0xc3, 0x9e, 0x9f, 0x7f, 0x63, 0xb2, 0x28, 0x81, }, -+ { 0xbb, 0x20, 0xac, 0xed, 0x2a, 0x04, 0x6a, 0x19, 0x94, 0x98, 0x9b, 0xc8, -+ 0xff, 0xcd, 0x93, 0xef, 0xc6, 0x0d, 0x56, 0xa7, 0xeb, 0x13, 0xd9, 0x30, }, -+ { 0xbc, 0xf2, 0x43, 0x82, 0x09, 0x40, 0x8a, 0x87, 0x25, 0x43, 0x6d, 0xe6, -+ 0xbb, 0xa4, 0xb9, 0x44, 0x58, 0x3f, 0x21, 0x7c, 0x99, 0xbb, 0x3f, 0x24, }, -+ { 0xec, 0x1a, 0xaa, 0xcd, 0xce, 0xbd, 0x53, 0x11, 0xd2, 0xfb, 0x83, 0xb6, -+ 0xc3, 0xba, 0xab, 0x4f, 0x62, 0x79, 0xe8, 0x65, 0xa9, 0x92, 0x28, 0x76, }, -+ { 0xc6, 0x0c, 0x30, 0x03, 0x91, 0x18, 0x2d, 0x7b, 0x79, 0xda, 0xe1, 0xd5, -+ 0x64, 0x77, 0x9a, 0x12, 0xc5, 0xb1, 0xd7, 0x91, 0x4f, 0x96, 0x4c, 0xa3, }, -+ { 0xd7, 0x7c, 0x2a, 0xbf, 0xa6, 0xe7, 0x85, 0x7c, 0x45, 0xad, 0xff, 0x12, -+ 0x94, 0xd8, 0xde, 0xa4, 0x5c, 0x3d, 0x79, 0xa4, 0x44, 0x02, 0x5d, 0x22, }, -+ { 0x16, 0x19, 0x0d, 0x81, 0x6a, 0x4c, 0xc7, 0xf8, 0xb8, 0xf9, 0x4e, 0xcd, -+ 0x2c, 0x9e, 0x90, 0x84, 0xb2, 0x08, 0x25, 0x60, 0xe1, 0x1e, 0xae, 0x18, }, -+ { 0xe9, 0x7c, 0x58, 0x26, 0x1b, 0x51, 0x9e, 0x49, 0x82, 0x60, 0x61, 0xfc, -+ 0xa0, 0xa0, 0x1b, 0xcd, 0xf5, 0x05, 0xd6, 0xa6, 0x6d, 0x07, 0x88, 0xa3, }, -+ { 0x2b, 0x97, 0x11, 0x8b, 0xd9, 0x4e, 0xd9, 0xdf, 0x20, 0xe3, 0x9c, 0x10, -+ 0xe6, 0xa1, 0x35, 0x21, 0x11, 0xf9, 0x13, 0x0d, 0x0b, 0x24, 0x65, 0xb2, }, -+ { 0x53, 0x6a, 0x4c, 0x54, 0xac, 0x8b, 0x9b, 0xb8, 0x97, 0x29, 0xfc, 0x60, -+ 0x2c, 0x5b, 0x3a, 0x85, 0x68, 0xb5, 0xaa, 0x6a, 0x44, 0xcd, 0x3f, 0xa7, }, -+}; -+ -+#define BF_ENC(X,S) \ -+ (((S[0][X>>24] + S[1][X>>16 & 0xff]) ^ S[2][(X>>8) & 0xff]) + S[3][X & 0xff]) -+ -+static void bf_enc(uint32_t *x, bf_key *key) -+{ -+ uint32_t Xl; -+ uint32_t Xr; -+ uint32_t temp; -+ int i; -+ -+ Xl = x[0]; -+ Xr = x[1]; -+ -+ for (i = 0; i < BF_ROUNDS; ++i) { -+ Xl ^= key->p[i]; -+ Xr ^= BF_ENC(Xl,key->s); -+ -+ temp = Xl; -+ Xl = Xr; -+ Xr = temp; -+ } -+ -+ Xl ^= key->p[BF_ROUNDS]; -+ Xr ^= key->p[BF_ROUNDS + 1]; -+ -+ x[0] = Xr; -+ x[1] = Xl; -+} -+ -+static void bf_setkey(const unsigned char *kp, int keybytes, bf_key *key) -+{ -+ int i; -+ int j; -+ int k; -+ uint32_t data; -+ uint32_t d[2]; -+ -+ memcpy(key->p, bf_pinit, sizeof(key->p)); -+ memcpy(key->s, bf_sinit, sizeof(key->s)); -+ -+ j = 0; -+ for (i = 0; i < BF_ROUNDS + 2; ++i) { -+ data = 0x00000000; -+ for (k = 0; k < 4; ++k) { -+ data = (data << 8) | kp[j]; -+ j = j + 1; -+ if (j >= keybytes) { -+ j = 0; -+ } -+ } -+ key->p[i] ^= data; -+ } -+ -+ d[0] = 0x00000000; -+ d[1] = 0x00000000; -+ -+ for (i = 0; i < BF_ROUNDS + 2; i += 2) { -+ bf_enc(d, key); -+ -+ key->p[i] = d[0]; -+ key->p[i + 1] = d[1]; -+ } -+ -+ for (i = 0; i < 4; ++i) { -+ for (j = 0; j < 256; j += 2) { -+ -+ bf_enc(d, key); -+ -+ key->s[i][j] = d[0]; -+ key->s[i][j + 1] = d[1]; -+ } -+ } -+} -+ -+static void rtmpe9_sig(uint8_t *in, uint8_t *out, int keyid) -+{ -+ uint32_t d[2]; -+ bf_key key; -+ -+ bf_setkey(rtmpe9_keys[keyid], KEYBYTES, &key); -+ -+ /* input is little-endian */ -+ d[0] = in[0] | (in[1] << 8) | (in[2] << 16) | (in[3] << 24); -+ d[1] = in[4] | (in[5] << 8) | (in[6] << 16) | (in[7] << 24); -+ bf_enc(d, &key); -+ out[0] = d[0] & 0xff; -+ out[1] = (d[0] >> 8) & 0xff; -+ out[2] = (d[0] >> 16) & 0xff; -+ out[3] = (d[0] >> 24) & 0xff; -+ out[4] = d[1] & 0xff; -+ out[5] = (d[1] >> 8) & 0xff; -+ out[6] = (d[1] >> 16) & 0xff; -+ out[7] = (d[1] >> 24) & 0xff; -+} -+ - static int - HandShake(RTMP * r, int FP9HandShake) - { -@@ -605,8 +936,7 @@ HandShake(RTMP * r, int FP9HandShake) - for (i=0; i<SHA256_DIGEST_LENGTH; i+=8) - rtmpe8_sig(sig+i, sig+i, dptr[i] % 15); - } --#if 0 -- else if (type == 9)) -+ else if (type == 9) - { - uint8_t *dptr = digestResp; - uint8_t *sig = signatureResp; -@@ -615,7 +945,6 @@ HandShake(RTMP * r, int FP9HandShake) - rtmpe9_sig(sig+i, sig+i, dptr[i] % 15); - } - #endif --#endif - RTMP_Log(RTMP_LOGDEBUG, "%s: Client signature calculated:", __FUNCTION__); - RTMP_LogHex(RTMP_LOGDEBUG, signatureResp, SHA256_DIGEST_LENGTH); - } -@@ -680,7 +1009,6 @@ HandShake(RTMP * r, int FP9HandShake) - for (i=0; i<SHA256_DIGEST_LENGTH; i+=8) - rtmpe8_sig(sig+i, sig+i, dptr[i] % 15); - } --#if 0 - else if (type == 9) - { - uint8_t *dptr = digest; -@@ -690,7 +1018,6 @@ HandShake(RTMP * r, int FP9HandShake) - rtmpe9_sig(sig+i, sig+i, dptr[i] % 15); - } - #endif --#endif - RTMP_Log(RTMP_LOGDEBUG, "%s: Signature calculated:", __FUNCTION__); - RTMP_LogHex(RTMP_LOGDEBUG, signature, SHA256_DIGEST_LENGTH); - if (memcmp -@@ -964,8 +1291,7 @@ SHandShake(RTMP * r) - for (i=0; i<SHA256_DIGEST_LENGTH; i+=8) - rtmpe8_sig(sig+i, sig+i, dptr[i] % 15); - } --#if 0 -- else if (type == 9)) -+ else if (type == 9) - { - uint8_t *dptr = digestResp; - uint8_t *sig = signatureResp; -@@ -974,7 +1300,6 @@ SHandShake(RTMP * r) - rtmpe9_sig(sig+i, sig+i, dptr[i] % 15); - } - #endif --#endif - - /* some info output */ - RTMP_Log(RTMP_LOGDEBUG, -@@ -1030,17 +1355,15 @@ SHandShake(RTMP * r) - for (i=0; i<SHA256_DIGEST_LENGTH; i+=8) - rtmpe8_sig(sig+i, sig+i, dptr[i] % 15); - } --#if 0 -- else if (type == 9)) -+ else if (type == 9) - { -- uint8_t *dptr = digestResp; -- uint8_t *sig = signatureResp; -+ uint8_t *dptr = digest; -+ uint8_t *sig = signature; - /* encrypt signatureResp */ - for (i=0; i<SHA256_DIGEST_LENGTH; i+=8) - rtmpe9_sig(sig+i, sig+i, dptr[i] % 15); - } - #endif --#endif - - /* show some information */ - RTMP_Log(RTMP_LOGDEBUG, "%s: Digest key: ", __FUNCTION__); --- -1.7.10.4 - - -From be0590a86af80df528e3556b86f110ad4b5cbb27 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@symas.com> -Date: Mon, 11 Jul 2011 16:41:28 -0700 -Subject: [PATCH 31/34] Add LIB_RTMP macro - -Allows changing to static linking on the cmd line - -diff --git a/Makefile b/Makefile -index c322e9a..1597be8 100644 ---- a/Makefile -+++ b/Makefile -@@ -35,7 +35,8 @@ MANDIR=$(DESTDIR)$(mandir) - LIBS_posix= - LIBS_darwin= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 --LIBS=-Llibrtmp -lrtmp $(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) -+LIB_RTMP=-Llibrtmp -lrtmp -+LIBS=$(LIB_RTMP) $(CRYPTO_LIB) $(LIBS_$(SYS)) $(XLIBS) - - THREADLIB_posix=-lpthread - THREADLIB_darwin=-lpthread --- -1.7.10.4 - - -From 4028a5aa7f72cac44a62b4aac596ff3c82e6e019 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@symas.com> -Date: Mon, 11 Jul 2011 17:19:25 -0700 -Subject: [PATCH 32/34] Additional credit for RTMPE 9 keys - - -diff --git a/README b/README -index 5689853..865c6c4 100644 ---- a/README -+++ b/README -@@ -1,7 +1,8 @@ --RTMP Dump v2.3 -+RTMP Dump v2.4 - (C) 2009 Andrej Stepanchuk --(C) 2009-2010 Howard Chu -+(C) 2009-2011 Howard Chu - (C) 2010 2a665470ced7adb7156fcef47f8199a6371c117b8a79e399a2771e0b36384090 -+(C) 2011 33ae1ce77301f4b4494faaa5f609f3c48b9dcf82 - License: GPLv2 - librtmp license: LGPLv2.1 - http://rtmpdump.mplayerhq.hu/ --- -1.7.10.4 - - -From 3121324046e4ca1934e7e28293fc8326475d5053 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@symas.com> -Date: Mon, 11 Jul 2011 17:22:43 -0700 -Subject: [PATCH 33/34] Version bump - - -diff --git a/Makefile b/Makefile -index 1597be8..6ef5742 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,4 +1,4 @@ --VERSION=v2.3 -+VERSION=v2.4 - - prefix=/usr/local - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 785e869..d61e7a4 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -1,4 +1,4 @@ --VERSION=v2.3 -+VERSION=v2.4 - - prefix=/usr/local - --- -1.7.10.4 - - -From c28f1bab7822de97353849e7787b59e50bbb1428 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@symas.com> -Date: Mon, 11 Jul 2011 17:24:33 -0700 -Subject: [PATCH 34/34] v2.4 changes - - -diff --git a/ChangeLog b/ChangeLog -index f57c580..fb2319f 100644 ---- a/ChangeLog -+++ b/ChangeLog -@@ -1,9 +1,12 @@ - RTMPDump - Copyright 2008-2009 Andrej Stepanchuk; Distributed under the GPL v2 --Copyright 2009-2010 Howard Chu -+Copyright 2009-2011 Howard Chu - Copyright 2009 The Flvstreamer Team - http://rtmpdump.mplayerhq.hu/ - -+11 July 2011, v2.4 -+- add RTMPE type 9 handshake support -+ - 30 June 2010, v2.3 - - fix RC4 cleanup for GnuTLS/gcrypt - - declare RTMP_Write buf as const --- -1.7.10.4 - diff --git a/src/librtmp-2-master.patch b/src/librtmp-2-master.patch deleted file mode 100644 index 19ec2e5..0000000 --- a/src/librtmp-2-master.patch +++ /dev/null @@ -1,5371 +0,0 @@ -This file is part of MXE. -See index.html for further information. - -From dc762e41a090b5c238bd7daedab13def69eb140b Mon Sep 17 00:00:00 2001 -From: toine512 <toine512@gmail.com> -Date: Thu, 21 Jul 2011 17:10:13 -0700 -Subject: [PATCH 01/64] Squashed commit of the following: - -commit 84b160fdc8e6aaff9b5b214d90e8f002cc4185dd -Author: toine512 <toine512@gmail.com> -Date: Wed Jul 20 23:09:26 2011 +0200 - - Updates man .. again - -commit 717c562b844595f5b24da268a5f5203d921ebc89 -Author: toine512 <toine512@gmail.com> -Date: Wed Jul 20 21:00:44 2011 +0200 - - More updates in man files, regenerating HTML files needed - -commit 8196cf03b2ff7b9483166302bf79a0760fed2772 -Author: toine512 <toine512@gmail.com> -Date: Wed Jul 20 20:42:41 2011 +0200 - - Updates ChangeLog - -commit 7a6931cffd0ffd2d0997ffed2bd7609e9a043387 -Author: toine512 <toine512@gmail.com> -Date: Wed Jul 20 20:37:40 2011 +0200 - - Updates man files, regenerating HTML files is needed - -commit 1cb67af20bb4085b87123299956c6b4d2d2b1484 -Author: toine512 <toine512@gmail.com> -Date: Wed Jul 20 20:03:16 2011 +0200 - - Implements Justin.tv support (NetStream.Authenticate.UsherToken) - -diff --git a/ChangeLog b/ChangeLog -index fb2319f..c3b1a14 100644 ---- a/ChangeLog -+++ b/ChangeLog -@@ -4,6 +4,9 @@ Copyright 2009-2011 Howard Chu - Copyright 2009 The Flvstreamer Team - http://rtmpdump.mplayerhq.hu/ - -+20 July 2011 -+- add NetStream.Authenticate.UsherToken for Justin.tv -+ - 11 July 2011, v2.4 - - add RTMPE type 9 handshake support - -diff --git a/librtmp/librtmp.3 b/librtmp/librtmp.3 -index 66197d5..7c424aa 100644 ---- a/librtmp/librtmp.3 -+++ b/librtmp/librtmp.3 -@@ -1,5 +1,5 @@ --.TH LIBRTMP 3 "2010-07-03" "RTMPDump v2.3" --.\" Copyright 2010 Howard Chu. -+.TH LIBRTMP 3 "2011-07-20" "RTMPDump v2.4" -+.\" Copyright 2011 Howard Chu. - .\" Copying permitted according to the GNU General Public License V2. - .SH NAME - librtmp \- RTMPDump Real-Time Messaging Protocol API -@@ -161,6 +161,9 @@ These options handle additional authentication requests from the server. - Key for SecureToken response, used if the server requires SecureToken - authentication. - .TP -+.BI jtv= JSON -+JSON token used by legacy Justin.tv servers. Invokes NetStream.Authenticate.UsherToken -+.TP - .BI swfVfy= 0|1 - If the value is 1 or TRUE, the SWF player is retrieved from the - specified -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 5ef3ae9..adcff1f 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -96,6 +96,7 @@ static int SendDeleteStream(RTMP *r, double dStreamId); - static int SendFCSubscribe(RTMP *r, AVal *subscribepath); - static int SendPlay(RTMP *r); - static int SendBytesReceived(RTMP *r); -+static int SendUsherToken(RTMP *r, AVal *usherToken); - - #if 0 /* unused */ - static int SendBGHasStream(RTMP *r, double dId, AVal *playpath); -@@ -335,6 +336,7 @@ RTMP_SetupStream(RTMP *r, - uint32_t swfSize, - AVal *flashVer, - AVal *subscribepath, -+ AVal *usherToken, - int dStart, - int dStop, int bLiveStream, long int timeout) - { -@@ -355,6 +357,8 @@ RTMP_SetupStream(RTMP *r, - RTMP_Log(RTMP_LOGDEBUG, "auth : %s", auth->av_val); - if (subscribepath && subscribepath->av_val) - RTMP_Log(RTMP_LOGDEBUG, "subscribepath : %s", subscribepath->av_val); -+ if (usherToken && usherToken->av_val) -+ RTMP_Log(RTMP_LOGDEBUG, "NetStream.Authenticate.UsherToken : %s", usherToken->av_val); - if (flashVer && flashVer->av_val) - RTMP_Log(RTMP_LOGDEBUG, "flashVer : %s", flashVer->av_val); - if (dStart > 0) -@@ -420,6 +424,8 @@ RTMP_SetupStream(RTMP *r, - r->Link.flashVer = RTMP_DefaultFlashVer; - if (subscribepath && subscribepath->av_len) - r->Link.subscribepath = *subscribepath; -+ if (usherToken && usherToken->av_len) -+ r->Link.usherToken = *usherToken; - r->Link.seekTime = dStart; - r->Link.stopTime = dStop; - if (bLiveStream) -@@ -477,6 +483,8 @@ static struct urlopt { - "Stream is live, no seeking possible" }, - { AVC("subscribe"), OFF(Link.subscribepath), OPT_STR, 0, - "Stream to subscribe to" }, -+ { AVC("jtv"), OFF(Link.usherToken), OPT_STR, 0, -+ "Justin.tv authentication token" }, - { AVC("token"), OFF(Link.token), OPT_STR, 0, - "Key for SecureToken response" }, - { AVC("swfVfy"), OFF(Link.lFlags), OPT_BOOL, RTMP_LF_SWFV, -@@ -1641,6 +1649,39 @@ SendFCSubscribe(RTMP *r, AVal *subscribepath) - return RTMP_SendPacket(r, &packet, TRUE); - } - -+//Justin.tv specific authentication -+static const AVal av_NetStream_Authenticate_UsherToken = AVC("NetStream.Authenticate.UsherToken"); //SAVC() isn't suitable for that -+ -+static int -+SendUsherToken(RTMP *r, AVal *usherToken) -+{ -+ RTMPPacket packet; -+ char pbuf[1024], *pend = pbuf + sizeof(pbuf); -+ char *enc; -+ packet.m_nChannel = 0x03; /* control channel (invoke) */ -+ packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -+ packet.m_packetType = RTMP_PACKET_TYPE_INVOKE; -+ packet.m_nTimeStamp = 0; -+ packet.m_nInfoField2 = 0; -+ packet.m_hasAbsTimestamp = 0; -+ packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE; -+ -+ RTMP_Log(RTMP_LOGDEBUG, "UsherToken: %s", usherToken->av_val); -+ enc = packet.m_body; -+ enc = AMF_EncodeString(enc, pend, &av_NetStream_Authenticate_UsherToken); -+ enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); -+ *enc++ = AMF_NULL; -+ enc = AMF_EncodeString(enc, pend, usherToken); -+ -+ if (!enc) -+ return FALSE; -+ -+ packet.m_nBodySize = enc - packet.m_body; -+ -+ return RTMP_SendPacket(r, &packet, FALSE); -+} -+/******************************************/ -+ - SAVC(releaseStream); - - static int -@@ -2364,6 +2405,9 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - - if (!(r->Link.protocol & RTMP_FEATURE_WRITE)) - { -+ /* Authenticate on Justin.tv legacy servers before sending FCSubscribe */ -+ if (r->Link.usherToken.av_len) -+ SendUsherToken(r, &r->Link.usherToken); - /* Send the FCSubscribe if live stream or if subscribepath is set */ - if (r->Link.subscribepath.av_len) - SendFCSubscribe(r, &r->Link.subscribepath); -diff --git a/librtmp/rtmp.h b/librtmp/rtmp.h -index 1ece207..6b2ae5b 100644 ---- a/librtmp/rtmp.h -+++ b/librtmp/rtmp.h -@@ -155,6 +155,7 @@ extern "C" - AVal auth; - AVal flashVer; - AVal subscribepath; -+ AVal usherToken; - AVal token; - AMFObject extras; - int edepth; -@@ -297,6 +298,7 @@ extern "C" - uint32_t swfSize, - AVal *flashVer, - AVal *subscribepath, -+ AVal *usherToken, - int dStart, - int dStop, int bLiveStream, long int timeout); - -diff --git a/rtmpdump.1 b/rtmpdump.1 -index 2395de9..0d9de8d 100644 ---- a/rtmpdump.1 -+++ b/rtmpdump.1 -@@ -1,5 +1,5 @@ --.TH RTMPDUMP 1 "2010-05-02" "RTMPDump v2.2e" --.\" Copyright 2010 Howard Chu. -+.TH RTMPDUMP 1 "2011-07-20" "RTMPDump v2.4" -+.\" Copyright 2011 Howard Chu. - .\" Copying permitted according to the GNU General Public License V2. - .SH NAME - rtmpdump \- RTMP streaming media client -@@ -51,6 +51,8 @@ rtmpdump \- RTMP streaming media client - [\c - .BI \-T \ key\fR] - [\c -+.BI \-j \ JSON\fR] -+[\c - .BI \-w \ swfHash\fR] - [\c - .BI \-x \ swfSize\fR] -@@ -210,6 +212,9 @@ These options handle additional authentication requests from the server. - Key for SecureToken response, used if the server requires SecureToken - authentication. - .TP -+\fB\-\-jtv \-j\fP\ \fIJSON\fP -+JSON token used by legacy Justin.tv servers. Invokes NetStream.Authenticate.UsherToken -+.TP - \fB\-\-swfhash \-w\fP\ \fIhexstring\fP - SHA256 hash of the decompressed SWF file. This option may be needed if - the server uses SWF Verification, but see the -diff --git a/rtmpdump.c b/rtmpdump.c -index c1cd95b..ec1de85 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -692,6 +692,8 @@ void usage(char *prog) - RTMP_LogPrintf - ("--token|-T key Key for SecureToken response\n"); - RTMP_LogPrintf -+ ("--jtv|-j JSON Authentication token for Justin.tv legacy servers\n"); -+ RTMP_LogPrintf - ("--hashes|-# Display progress with hashes, not with the byte counter\n"); - RTMP_LogPrintf - ("--buffer|-b Buffer time in milliseconds (default: %lu)\n", -@@ -738,6 +740,7 @@ main(int argc, char **argv) - AVal hostname = { 0, 0 }; - AVal playpath = { 0, 0 }; - AVal subscribepath = { 0, 0 }; -+ AVal usherToken = { 0, 0 }; //Justin.tv auth token - int port = -1; - int protocol = RTMP_PROTOCOL_UNDEFINED; - int retries = 0; -@@ -839,12 +842,13 @@ main(int argc, char **argv) - {"debug", 0, NULL, 'z'}, - {"quiet", 0, NULL, 'q'}, - {"verbose", 0, NULL, 'V'}, -+ {"jtv", 1, NULL, 'j'}, - {0, 0, 0, 0} - }; - - while ((opt = - getopt_long(argc, argv, -- "hVveqzr:s:t:p:a:b:f:o:u:C:n:c:l:y:Ym:k:d:A:B:T:w:x:W:X:S:#", -+ "hVveqzr:s:t:p:a:b:f:o:u:C:n:c:l:y:Ym:k:d:A:B:T:w:x:W:X:S:#j:", - longopts, NULL)) != -1) - { - switch (opt) -@@ -1051,6 +1055,9 @@ main(int argc, char **argv) - case 'S': - STR2AVAL(sockshost, optarg); - break; -+ case 'j': -+ STR2AVAL(usherToken, optarg); -+ break; - default: - RTMP_LogPrintf("unknown option: %c\n", opt); - usage(argv[0]); -@@ -1167,7 +1174,7 @@ main(int argc, char **argv) - - RTMP_SetupStream(&rtmp, protocol, &hostname, port, &sockshost, &playpath, - &tcUrl, &swfUrl, &pageUrl, &app, &auth, &swfHash, swfSize, -- &flashVer, &subscribepath, dSeek, dStopOffset, bLiveStream, timeout); -+ &flashVer, &subscribepath, &usherToken, dSeek, dStopOffset, bLiveStream, timeout); - - /* Try to keep the stream moving if it pauses on us */ - if (!bLiveStream && !(protocol & RTMP_FEATURE_HTTP)) -diff --git a/rtmpgw.8 b/rtmpgw.8 -index 197a2d6..0a231b4 100644 ---- a/rtmpgw.8 -+++ b/rtmpgw.8 -@@ -1,5 +1,5 @@ --.TH RTMPGW 8 "2010-05-02" "RTMPDump v2.2e" --.\" Copyright 2010 Howard Chu. -+.TH RTMPGW 8 "2011-07-20" "RTMPDump v2.4" -+.\" Copyright 2011 Howard Chu. - .\" Copying permitted according to the GNU General Public License V2. - .SH NAME - rtmpgw \- RTMP streaming media gateway -@@ -50,6 +50,8 @@ rtmpgw \- RTMP streaming media gateway - [\c - .BI \-T \ key\fR] - [\c -+.BI \-j \ JSON\fR] -+[\c - .BI \-w \ swfHash\fR] - [\c - .BI \-x \ swfSize\fR] -@@ -193,6 +195,9 @@ These options handle additional authentication requests from the server. - Key for SecureToken response, used if the server requires SecureToken - authentication. - .TP -+\fB\-\-jtv \-j\fP\ \fIJSON\fP -+JSON token used by legacy Justin.tv servers. Invokes NetStream.Authenticate.UsherToken -+.TP - \fB\-\-swfhash \-w\fP\ \fIhexstring\fP - SHA256 hash of the decompressed SWF file. This option may be needed if - the server uses SWF Verification, but see the -diff --git a/rtmpgw.c b/rtmpgw.c -index 10a99e8..ce7319a 100644 ---- a/rtmpgw.c -+++ b/rtmpgw.c -@@ -95,6 +95,7 @@ typedef struct - AVal flashVer; - AVal token; - AVal subscribepath; -+ AVal usherToken; //Justin.tv auth token - AVal sockshost; - AMFObject extras; - int edepth; -@@ -552,7 +553,7 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou - RTMP_Init(&rtmp); - RTMP_SetBufferMS(&rtmp, req.bufferTime); - RTMP_SetupStream(&rtmp, req.protocol, &req.hostname, req.rtmpport, &req.sockshost, -- &req.playpath, &req.tcUrl, &req.swfUrl, &req.pageUrl, &req.app, &req.auth, &req.swfHash, req.swfSize, &req.flashVer, &req.subscribepath, dSeek, req.dStopOffset, -+ &req.playpath, &req.tcUrl, &req.swfUrl, &req.pageUrl, &req.app, &req.auth, &req.swfHash, req.swfSize, &req.flashVer, &req.subscribepath, &req.usherToken, dSeek, req.dStopOffset, - req.bLiveStream, req.timeout); - /* backward compatibility, we always sent this as true before */ - if (req.auth.av_len) -@@ -953,6 +954,9 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) - case 'z': - RTMP_debuglevel = RTMP_LOGALL; - break; -+ case 'j': -+ STR2AVAL(req->usherToken, arg); -+ break; - default: - RTMP_LogPrintf("unknown option: %c, arg: %s\n", opt, arg); - return FALSE; -@@ -1023,6 +1027,7 @@ main(int argc, char **argv) - {"debug", 0, NULL, 'z'}, - {"quiet", 0, NULL, 'q'}, - {"verbose", 0, NULL, 'V'}, -+ {"jtv", 1, NULL, 'j'}, - {0, 0, 0, 0} - }; - -@@ -1035,7 +1040,7 @@ main(int argc, char **argv) - - while ((opt = - getopt_long(argc, argv, -- "hvqVzr:s:t:p:a:f:u:n:c:l:y:m:d:D:A:B:T:g:w:x:W:X:S:", longopts, -+ "hvqVzr:s:t:p:a:f:u:n:c:l:y:m:d:D:A:B:T:g:w:x:W:X:S:j:", longopts, - NULL)) != -1) - { - switch (opt) -@@ -1095,6 +1100,8 @@ main(int argc, char **argv) - ("--stop|-B num Stop at num seconds into stream\n"); - RTMP_LogPrintf - ("--token|-T key Key for SecureToken response\n"); -+ RTMP_LogPrintf -+ ("--jtv|-j JSON Authentication token for Justin.tv legacy servers\n"); - RTMP_LogPrintf - ("--buffer|-b Buffer time in milliseconds (default: %lu)\n\n", - defaultRTMPRequest.bufferTime); -diff --git a/rtmpsrv.c b/rtmpsrv.c -index f1b6c66..cf52bfa 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -116,6 +116,7 @@ typedef struct - AVal swfHash; - AVal flashVer; - AVal subscribepath; -+ AVal usherToken; - uint32_t swfSize; - - uint32_t dStartOffset; --- -1.7.10.4 - - -From a2fb387404cb0da99cf439d58478fff701398700 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Thu, 21 Jul 2011 17:31:14 -0700 -Subject: [PATCH 02/64] Regenerate HTML docs, minor tweaks - - -diff --git a/librtmp/librtmp.3.html b/librtmp/librtmp.3.html -index e5e6f4b..6f59851 100644 ---- a/librtmp/librtmp.3.html -+++ b/librtmp/librtmp.3.html -@@ -6,10 +6,10 @@ - <tr><td>LIBRTMP(3)<td align="center"><td align="right">LIBRTMP(3) - </thead> - <tfoot> --<tr><td>RTMPDump v2.3<td align="center">2010-07-03<td align="right">LIBRTMP(3) -+<tr><td>RTMPDump v2.4<td align="center">2011-07-20<td align="right">LIBRTMP(3) - </tfoot> - <tbody><tr><td colspan="3"><br><br><ul> --<!-- Copyright 2010 Howard Chu. -+<!-- Copyright 2011 Howard Chu. - Copying permitted according to the GNU General Public License V2.--> - </ul> - -@@ -238,6 +238,12 @@ authentication. - </dl> - <p> - <dl compact><dt> -+<b>jtv=</b><i>JSON</i> -+<dd> -+JSON token used by legacy Justin.tv servers. Invokes NetStream.Authenticate.UsherToken -+</dl> -+<p> -+<dl compact><dt> - <b>swfVfy=</b><i>0|1</i> - <dd> - If the value is 1 or TRUE, the SWF player is retrieved from the -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index adcff1f..8d76164 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -484,7 +484,7 @@ static struct urlopt { - { AVC("subscribe"), OFF(Link.subscribepath), OPT_STR, 0, - "Stream to subscribe to" }, - { AVC("jtv"), OFF(Link.usherToken), OPT_STR, 0, -- "Justin.tv authentication token" }, -+ "Justin.tv authentication token" }, - { AVC("token"), OFF(Link.token), OPT_STR, 0, - "Key for SecureToken response" }, - { AVC("swfVfy"), OFF(Link.lFlags), OPT_BOOL, RTMP_LF_SWFV, -@@ -1649,8 +1649,8 @@ SendFCSubscribe(RTMP *r, AVal *subscribepath) - return RTMP_SendPacket(r, &packet, TRUE); - } - --//Justin.tv specific authentication --static const AVal av_NetStream_Authenticate_UsherToken = AVC("NetStream.Authenticate.UsherToken"); //SAVC() isn't suitable for that -+/* Justin.tv specific authentication */ -+static const AVal av_NetStream_Authenticate_UsherToken = AVC("NetStream.Authenticate.UsherToken"); - - static int - SendUsherToken(RTMP *r, AVal *usherToken) -diff --git a/rtmpdump.1.html b/rtmpdump.1.html -index 7f17636..826f722 100644 ---- a/rtmpdump.1.html -+++ b/rtmpdump.1.html -@@ -6,10 +6,10 @@ - <tr><td>RTMPDUMP(1)<td align="center"><td align="right">RTMPDUMP(1) - </thead> - <tfoot> --<tr><td>RTMPDump v2.2e<td align="center">2010-05-02<td align="right">RTMPDUMP(1) -+<tr><td>RTMPDump v2.4<td align="center">2011-07-20<td align="right">RTMPDUMP(1) - </tfoot> - <tbody><tr><td colspan="3"><br><br><ul> --<!-- Copyright 2010 Howard Chu. -+<!-- Copyright 2011 Howard Chu. - Copying permitted according to the GNU General Public License V2.--> - </ul> - -@@ -42,6 +42,7 @@ rtmpdump − RTMP streaming media client - [<b>−b</b><i> buffer</i>] - [<b>−m</b><i> timeout</i>] - [<b>−T</b><i> key</i>] -+[<b>−j</b><i> JSON</i>] - [<b>−w</b><i> swfHash</i>] - [<b>−x</b><i> swfSize</i>] - [<b>−W</b><i> swfUrl</i>] -@@ -275,6 +276,12 @@ authentication. - </dl> - <p> - <dl compact><dt> -+<b>−−jtv −j</b> <i>JSON</i> -+<dd> -+JSON token used by legacy Justin.tv servers. Invokes NetStream.Authenticate.UsherToken -+</dl> -+<p> -+<dl compact><dt> - <b>−−swfhash −w</b> <i>hexstring</i> - <dd> - SHA256 hash of the decompressed SWF file. This option may be needed if -diff --git a/rtmpdump.c b/rtmpdump.c -index ec1de85..89c053a 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -1055,9 +1055,9 @@ main(int argc, char **argv) - case 'S': - STR2AVAL(sockshost, optarg); - break; -- case 'j': -- STR2AVAL(usherToken, optarg); -- break; -+ case 'j': -+ STR2AVAL(usherToken, optarg); -+ break; - default: - RTMP_LogPrintf("unknown option: %c\n", opt); - usage(argv[0]); -diff --git a/rtmpgw.8.html b/rtmpgw.8.html -index 58b8f35..68d6734 100644 ---- a/rtmpgw.8.html -+++ b/rtmpgw.8.html -@@ -6,10 +6,10 @@ - <tr><td>RTMPGW(8)<td align="center"><td align="right">RTMPGW(8) - </thead> - <tfoot> --<tr><td>RTMPDump v2.2e<td align="center">2010-05-02<td align="right">RTMPGW(8) -+<tr><td>RTMPDump v2.4<td align="center">2011-07-20<td align="right">RTMPGW(8) - </tfoot> - <tbody><tr><td colspan="3"><br><br><ul> --<!-- Copyright 2010 Howard Chu. -+<!-- Copyright 2011 Howard Chu. - Copying permitted according to the GNU General Public License V2.--> - </ul> - -@@ -41,6 +41,7 @@ rtmpgw − RTMP streaming media gateway - [<b>−b</b><i> buffer</i>] - [<b>−m</b><i> timeout</i>] - [<b>−T</b><i> key</i>] -+[<b>−j</b><i> JSON</i>] - [<b>−w</b><i> swfHash</i>] - [<b>−x</b><i> swfSize</i>] - [<b>−W</b><i> swfUrl</i>] -@@ -249,6 +250,12 @@ authentication. - </dl> - <p> - <dl compact><dt> -+<b>−−jtv −j</b> <i>JSON</i> -+<dd> -+JSON token used by legacy Justin.tv servers. Invokes NetStream.Authenticate.UsherToken -+</dl> -+<p> -+<dl compact><dt> - <b>−−swfhash −w</b> <i>hexstring</i> - <dd> - SHA256 hash of the decompressed SWF file. This option may be needed if -diff --git a/rtmpgw.c b/rtmpgw.c -index ce7319a..733e105 100644 ---- a/rtmpgw.c -+++ b/rtmpgw.c -@@ -1100,7 +1100,7 @@ main(int argc, char **argv) - ("--stop|-B num Stop at num seconds into stream\n"); - RTMP_LogPrintf - ("--token|-T key Key for SecureToken response\n"); -- RTMP_LogPrintf -+ RTMP_LogPrintf - ("--jtv|-j JSON Authentication token for Justin.tv legacy servers\n"); - RTMP_LogPrintf - ("--buffer|-b Buffer time in milliseconds (default: %lu)\n\n", -diff --git a/rtmpsrv.c b/rtmpsrv.c -index cf52bfa..f1b6c66 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -116,7 +116,6 @@ typedef struct - AVal swfHash; - AVal flashVer; - AVal subscribepath; -- AVal usherToken; - uint32_t swfSize; - - uint32_t dStartOffset; --- -1.7.10.4 - - -From ed99ad05b34031fac74230760c77d4d1a6a9e706 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Sat, 30 Apr 2011 14:29:58 +0300 -Subject: [PATCH 03/64] Remove the generated pkg-config file on make clean - - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index d61e7a4..c95c8a6 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -76,7 +76,7 @@ OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o - all: librtmp.a $(SO_LIB) - - clean: -- rm -f *.o *.a *.$(SOX) *.$(SO_EXT) -+ rm -f *.o *.a *.$(SOX) *.$(SO_EXT) librtmp.pc - - librtmp.a: $(OBJS) - $(AR) rs $@ $? --- -1.7.10.4 - - -From 749018b7c7c4e0090ea17c104dc094ab74326c08 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Sat, 30 Apr 2011 14:30:00 +0300 -Subject: [PATCH 04/64] Create the SODIR, too - -When SYS=mingw, this differs from LIBDIR. - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index c95c8a6..aa4a339 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -100,7 +100,7 @@ librtmp.pc: librtmp.pc.in Makefile - install: install_base $(SO_INST) - - install_base: librtmp.a librtmp.pc -- -mkdir -p $(INCDIR) $(LIBDIR)/pkgconfig $(MANDIR)/man3 -+ -mkdir -p $(INCDIR) $(LIBDIR)/pkgconfig $(MANDIR)/man3 $(SODIR) - cp amf.h http.h log.h rtmp.h $(INCDIR) - cp librtmp.a $(LIBDIR) - cp librtmp.pc $(LIBDIR)/pkgconfig --- -1.7.10.4 - - -From 9931c44867d157621ae10cf489ba336091dfab6b Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Sat, 30 Apr 2011 14:30:01 +0300 -Subject: [PATCH 05/64] Generate and install an import lib for the built DLL - - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index aa4a339..b88baf4 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -54,9 +54,14 @@ SODIR=$(SODIR_$(SYS)) - SO_LDFLAGS_posix=-shared -Wl,-soname,$@ - SO_LDFLAGS_darwin=-dynamiclib -flat_namespace -undefined suppress -fno-common \ - -headerpad_max_install_names --SO_LDFLAGS_mingw=-shared -+SO_LDFLAGS_mingw=-shared -Wl,--out-implib,librtmp.dll.a - SO_LDFLAGS=$(SO_LDFLAGS_$(SYS)) - -+INSTALL_IMPLIB_posix= -+INSTALL_IMPLIB_darwin= -+INSTALL_IMPLIB_mingw=cp librtmp.dll.a $(LIBDIR) -+INSTALL_IMPLIB=$(INSTALL_IMPLIB_$(SYS)) -+ - SHARED=yes - SODEF_yes=-fPIC - SOLIB_yes=librtmp.$(SO_EXT) -@@ -108,5 +113,6 @@ install_base: librtmp.a librtmp.pc - - install_so: librtmp.$(SO_EXT) - cp librtmp.$(SO_EXT) $(SODIR) -+ $(INSTALL_IMPLIB) - cd $(SODIR); ln -sf librtmp.$(SO_EXT) librtmp.$(SOX) - --- -1.7.10.4 - - -From 060206d121657d7e45c01ac022dd071c877b4caa Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Fri, 15 Jul 2011 13:46:02 +0300 -Subject: [PATCH 06/64] Check the return value from RTMP_SendBytesReceived() - -This avoids double frees in RTMP_Close(), if the -RTMP_SendBytesReceived() call failed, which earlier led -to RTMP_ReadPacket() writing back an already freed buffer -(freed by RTMP_Close() within WriteN()) into m_vecChannelsIn. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 8d76164..f85cd83 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1338,7 +1338,8 @@ ReadN(RTMP *r, char *buffer, int n) - r->m_nBytesIn += nRead; - if (r->m_bSendCounter - && r->m_nBytesIn > r->m_nBytesInSent + r->m_nClientBW / 2) -- SendBytesReceived(r); -+ if (!SendBytesReceived(r)) -+ return FALSE; - } - /*RTMP_Log(RTMP_LOGDEBUG, "%s: %d bytes\n", __FUNCTION__, nBytes); */ - #ifdef _DEBUG --- -1.7.10.4 - - -From 159a06ebe6d82ef20f2c77c497d55af00d2e0b78 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Fri, 15 Jul 2011 13:46:03 +0300 -Subject: [PATCH 07/64] Don't try to close an already closed socket - -This could happen if WriteN() (called within SendBytesReceived()) -failed. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index f85cd83..df2cb27 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3626,7 +3626,9 @@ RTMPSockBuf_Close(RTMPSockBuf *sb) - sb->sb_ssl = NULL; - } - #endif -- return closesocket(sb->sb_socket); -+ if (sb->sb_socket != -1) -+ return closesocket(sb->sb_socket); -+ return 0; - } - - #define HEX2BIN(a) (((a)&0x40)?((a)&0xf)+9:((a)&0xf)) --- -1.7.10.4 - - -From 530d02fccf24f98e2e318418b2fa3e3420056fda Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Fri, 22 Jul 2011 18:04:05 -0700 -Subject: [PATCH 08/64] Fix MDH_free() for PolarSSL - -Reported by Reijo Tomperi <aggro80@users.sourceforge.net> - -diff --git a/librtmp/dh.h b/librtmp/dh.h -index 8e285a6..efef0fd 100644 ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -53,7 +53,7 @@ typedef struct MDH { - } MDH; - - #define MDH_new() calloc(1,sizeof(MDH)) --#define MDH_free(vp) {MDH *dh = vp; dhm_free(&dh->ctx); MP_free(dh->p); MP_free(dh->g); MP_free(dh->pub_key); MP_free(dh->priv_key); free(dh);} -+#define MDH_free(vp) {MDH *_dh = vp; dhm_free(&_dh->ctx); MP_free(_dh->p); MP_free(_dh->g); MP_free(_dh->pub_key); MP_free(_dh->priv_key); free(_dh);} - - static int MDH_generate_key(MDH *dh) - { --- -1.7.10.4 - - -From b627335dc37fd5265ac6d23a441ee2d89ab503c8 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Fri, 22 Jul 2011 18:06:27 -0700 -Subject: [PATCH 09/64] Plug potential memleak - -Reported by Reijo Tomperi <aggro80@users.sourceforge.net> - -diff --git a/rtmpdump.c b/rtmpdump.c -index 89c053a..e506fa9 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -444,7 +444,7 @@ Download(RTMP * rtmp, // connected RTMP object - { - int32_t now, lastUpdate; - int bufferSize = 64 * 1024; -- char *buffer = (char *) malloc(bufferSize); -+ char *buffer; - int nRead = 0; - off_t size = ftello(file); - unsigned long lastPercent = 0; -@@ -505,6 +505,8 @@ Download(RTMP * rtmp, // connected RTMP object - rtmp->m_read.nMetaHeaderSize = nMetaHeaderSize; - rtmp->m_read.nInitialFrameSize = nInitialFrameSize; - -+ buffer = (char *) malloc(bufferSize); -+ - now = RTMP_GetTime(); - lastUpdate = now - 1000; - do --- -1.7.10.4 - - -From ec422962d58b8e0d9bfcf0af6e450e0e349947da Mon Sep 17 00:00:00 2001 -From: "Scott D. Davilla" <davilla@xbmc.org> -Date: Fri, 29 Jul 2011 11:26:35 -0700 -Subject: [PATCH 10/64] Darwin dylib updates - -Bring in line with current practice for Darwin dynamic libs - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index b88baf4..a0125f1 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -52,8 +52,8 @@ SODIR_mingw=$(BINDIR) - SODIR=$(SODIR_$(SYS)) - - SO_LDFLAGS_posix=-shared -Wl,-soname,$@ --SO_LDFLAGS_darwin=-dynamiclib -flat_namespace -undefined suppress -fno-common \ -- -headerpad_max_install_names -+SO_LDFLAGS_darwin=-dynamiclib -twolevel_namespace -undefined dynamic_lookup \ -+ -fno-common -headerpad_max_install_names -install_name $(libdir)/$@ - SO_LDFLAGS_mingw=-shared -Wl,--out-implib,librtmp.dll.a - SO_LDFLAGS=$(SO_LDFLAGS_$(SYS)) - --- -1.7.10.4 - - -From 024d201c36e1b40f4f4d473e87d405e1b411230f Mon Sep 17 00:00:00 2001 -From: KSV <faltuvisitor@yahoo.co.in> -Date: Sun, 31 Jul 2011 12:33:46 -0700 -Subject: [PATCH 11/64] Justin.TV usherToken detection - - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index f1b6c66..805ce0d 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -95,6 +95,7 @@ STREAMING_SERVER *rtmpServer = 0; // server structure pointer - - STREAMING_SERVER *startStreaming(const char *address, int port); - void stopStreaming(STREAMING_SERVER * server); -+char *strreplace(char *srcstr, int srclen, char *orig, char *repl); - - typedef struct - { -@@ -261,6 +262,7 @@ static const AVal av_NetStream_Play_Stop = AVC("NetStream.Play.Stop"); - static const AVal av_Stopped_playing = AVC("Stopped playing"); - SAVC(details); - SAVC(clientid); -+static const AVal av_NetStream_Authenticate_UsherToken = AVC("NetStream.Authenticate.UsherToken"); - - static int - SendPlayStart(RTMP *r) -@@ -575,6 +577,13 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int - { - SendResultNumber(r, txn, 10.0); - } -+ else if (AVMATCH(&method, &av_NetStream_Authenticate_UsherToken)) -+ { -+ AMFObjectProperty *prop = AMF_GetProp(&obj, NULL, 3); -+ AMFProp_GetString(prop, &r->Link.usherToken); -+ prop->p_vu.p_aval.av_len = 0; -+ prop->p_vu.p_aval.av_val = NULL; -+ } - else if (AVMATCH(&method, &av_play)) - { - char *file, *p, *q, *cmd, *ptr; -@@ -591,10 +600,11 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int - if (r->Link.tcUrl.av_len) - { - len = server->arglen + r->Link.playpath.av_len + 4 + -- sizeof("rtmpdump") + r->Link.playpath.av_len + 12; -+ sizeof("rtmpdump") + r->Link.playpath.av_len + 12 + -+ r->Link.usherToken.av_len + 64; - server->argc += 5; - -- cmd = malloc(len + server->argc * sizeof(AVal)); -+ cmd = malloc(len + (server->argc + 2) * sizeof(AVal)); - ptr = cmd; - argv = (AVal *)(cmd + len); - argv[0].av_val = cmd; -@@ -640,6 +650,17 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int - ptr += sprintf(ptr, " -p \"%s\"", r->Link.pageUrl.av_val); - argv[argc++].av_len = r->Link.pageUrl.av_len; - } -+ if (r->Link.usherToken.av_val) -+ { -+ char *usherToken = strreplace(r->Link.usherToken.av_val, r->Link.usherToken.av_len, "\"", "\\\""); -+ argv[argc].av_val = ptr + 1; -+ argv[argc++].av_len = 5; -+ argv[argc].av_val = ptr + 8; -+ ptr += sprintf(ptr, " --jtv \"%s\"", usherToken); -+ argv[argc++].av_len = strlen(usherToken); -+ server->argc += 2; -+ free(usherToken); -+ } - if (r->Link.extras.o_num) { - ptr = dumpAMF(&r->Link.extras, ptr, argv, &argc); - AMF_Reset(&r->Link.extras); -@@ -1111,3 +1132,39 @@ main(int argc, char **argv) - #endif - return nStatus; - } -+ -+char * -+strreplace(char *srcstr, int srclen, char *orig, char *repl) -+{ -+ char *ptr = NULL, *srcstrstart = srcstr; -+ int origlen = strlen(orig); -+ int repllen = strlen(repl); -+ if (!srclen) -+ srclen = strlen(srcstr); -+ char *srcend = srcstr + srclen; -+ int deststrbuffer = srclen / origlen * repllen; -+ if (deststrbuffer < srclen) -+ deststrbuffer = srclen; -+ char *deststr = calloc(deststrbuffer + 1, sizeof(char)); -+ char *deststrstart = deststr; -+ -+ if ( (ptr = strstr(srcstr, orig)) ) -+ { -+ do -+ { -+ int len = ptr - srcstrstart; -+ memcpy(deststrstart, srcstrstart, len); -+ srcstrstart += len + origlen; -+ deststrstart += len; -+ memcpy(deststrstart, repl, repllen); -+ deststrstart += repllen; -+ ptr = strstr(srcstrstart, orig); -+ } -+ while (ptr && (ptr < srcend)); -+ strncpy(deststrstart, srcstrstart, srcend-srcstrstart); -+ return deststr; -+ } -+ -+ strncpy(deststr, srcstr, srclen); -+ return deststr; -+} --- -1.7.10.4 - - -From f1abda046ca5a3f1efa63033c542e686b43dbcf3 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Sun, 31 Jul 2011 13:21:12 -0700 -Subject: [PATCH 12/64] Cleanup previous commit - - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index 805ce0d..b45aae3 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -1,6 +1,6 @@ - /* Simple RTMP Server - * Copyright (C) 2009 Andrej Stepanchuk -- * Copyright (C) 2009 Howard Chu -+ * Copyright (C) 2009-2011 Howard Chu - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -95,7 +95,10 @@ STREAMING_SERVER *rtmpServer = 0; // server structure pointer - - STREAMING_SERVER *startStreaming(const char *address, int port); - void stopStreaming(STREAMING_SERVER * server); --char *strreplace(char *srcstr, int srclen, char *orig, char *repl); -+void AVreplace(AVal *src, const AVal *orig, const AVal *repl); -+ -+static const AVal av_dquote = AVC("\""); -+static const AVal av_escdquote = AVC("\\\""); - - typedef struct - { -@@ -579,10 +582,12 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int - } - else if (AVMATCH(&method, &av_NetStream_Authenticate_UsherToken)) - { -- AMFObjectProperty *prop = AMF_GetProp(&obj, NULL, 3); -- AMFProp_GetString(prop, &r->Link.usherToken); -- prop->p_vu.p_aval.av_len = 0; -- prop->p_vu.p_aval.av_val = NULL; -+ AVal usherToken; -+ AMFProp_GetString(AMF_GetProp(&obj, NULL, 3), &usherToken); -+ AVreplace(&usherToken, &av_dquote, &av_escdquote); -+ server->arglen += 6 + usherToken.av_len; -+ server->argc += 2; -+ r->Link.usherToken = usherToken; - } - else if (AVMATCH(&method, &av_play)) - { -@@ -600,11 +605,10 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int - if (r->Link.tcUrl.av_len) - { - len = server->arglen + r->Link.playpath.av_len + 4 + -- sizeof("rtmpdump") + r->Link.playpath.av_len + 12 + -- r->Link.usherToken.av_len + 64; -+ sizeof("rtmpdump") + r->Link.playpath.av_len + 12; - server->argc += 5; - -- cmd = malloc(len + (server->argc + 2) * sizeof(AVal)); -+ cmd = malloc(len + server->argc * sizeof(AVal)); - ptr = cmd; - argv = (AVal *)(cmd + len); - argv[0].av_val = cmd; -@@ -650,17 +654,17 @@ ServeInvoke(STREAMING_SERVER *server, RTMP * r, RTMPPacket *packet, unsigned int - ptr += sprintf(ptr, " -p \"%s\"", r->Link.pageUrl.av_val); - argv[argc++].av_len = r->Link.pageUrl.av_len; - } -- if (r->Link.usherToken.av_val) -- { -- char *usherToken = strreplace(r->Link.usherToken.av_val, r->Link.usherToken.av_len, "\"", "\\\""); -+ if (r->Link.usherToken.av_val) -+ { - argv[argc].av_val = ptr + 1; -- argv[argc++].av_len = 5; -- argv[argc].av_val = ptr + 8; -- ptr += sprintf(ptr, " --jtv \"%s\"", usherToken); -- argv[argc++].av_len = strlen(usherToken); -- server->argc += 2; -- free(usherToken); -- } -+ argv[argc++].av_len = 2; -+ argv[argc].av_val = ptr + 5; -+ ptr += sprintf(ptr, " -j \"%s\"", r->Link.usherToken.av_val); -+ argv[argc++].av_len = r->Link.usherToken.av_len; -+ free(r->Link.usherToken.av_val); -+ r->Link.usherToken.av_val = NULL; -+ r->Link.usherToken.av_len = 0; -+ } - if (r->Link.extras.o_num) { - ptr = dumpAMF(&r->Link.extras, ptr, argv, &argc); - AMF_Reset(&r->Link.extras); -@@ -932,6 +936,11 @@ cleanup: - rtmp.Link.pageUrl.av_val = NULL; - rtmp.Link.app.av_val = NULL; - rtmp.Link.flashVer.av_val = NULL; -+ if (rtmp.Link.usherToken.av_val) -+ { -+ free(rtmp.Link.usherToken.av_val); -+ rtmp.Link.usherToken.av_val = NULL; -+ } - RTMP_LogPrintf("done!\n\n"); - - quit: -@@ -1133,38 +1142,42 @@ main(int argc, char **argv) - return nStatus; - } - --char * --strreplace(char *srcstr, int srclen, char *orig, char *repl) -+void -+AVreplace(AVal *src, const AVal *orig, const AVal *repl) - { -- char *ptr = NULL, *srcstrstart = srcstr; -- int origlen = strlen(orig); -- int repllen = strlen(repl); -- if (!srclen) -- srclen = strlen(srcstr); -- char *srcend = srcstr + srclen; -- int deststrbuffer = srclen / origlen * repllen; -- if (deststrbuffer < srclen) -- deststrbuffer = srclen; -- char *deststr = calloc(deststrbuffer + 1, sizeof(char)); -- char *deststrstart = deststr; -- -- if ( (ptr = strstr(srcstr, orig)) ) -- { -- do -+ char *srcbeg = src->av_val; -+ char *srcend = src->av_val + src->av_len; -+ char *dest, *sptr, *dptr; -+ int n = 0; -+ -+ /* count occurrences of orig in src */ -+ sptr = src->av_val; -+ while (sptr < srcend && (sptr = strstr(sptr, orig->av_val))) - { -- int len = ptr - srcstrstart; -- memcpy(deststrstart, srcstrstart, len); -- srcstrstart += len + origlen; -- deststrstart += len; -- memcpy(deststrstart, repl, repllen); -- deststrstart += repllen; -- ptr = strstr(srcstrstart, orig); -+ n++; -+ sptr += orig->av_len; - } -- while (ptr && (ptr < srcend)); -- strncpy(deststrstart, srcstrstart, srcend-srcstrstart); -- return deststr; -- } -+ if (!n) -+ return; - -- strncpy(deststr, srcstr, srclen); -- return deststr; -+ dest = malloc(src->av_len + 1 + (repl->av_len - orig->av_len) * n); -+ -+ sptr = src->av_val; -+ dptr = dest; -+ while (sptr < srcend && (sptr = strstr(sptr, orig->av_val))) -+ { -+ n = sptr - srcbeg; -+ memcpy(dptr, srcbeg, n); -+ srcbeg += n; -+ dptr += n; -+ memcpy(dptr, repl->av_val, repl->av_len); -+ dptr += repl->av_len; -+ sptr += orig->av_len; -+ } -+ n = srcend - srcbeg; -+ memcpy(dptr, srcbeg, n); -+ dptr += n; -+ *dptr = '\0'; -+ src->av_val = dest; -+ src->av_len = dptr - dest; - } --- -1.7.10.4 - - -From 8880d1456b282ee79979adbe7b6a6eb8ad371081 Mon Sep 17 00:00:00 2001 -From: Chris Larsen <clarsen@euphoriaaudio.com> -Date: Tue, 2 Aug 2011 12:33:44 -0400 -Subject: [PATCH 13/64] Unexpected BW Response Fix - -Bug: SendCheckBWResult sends an invalid bw response due to casting issues -from a double to an int. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index df2cb27..5311a8a 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2339,7 +2339,7 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - { - AMFObject obj; - AVal method; -- int txn; -+ double txn; - int ret = 0, nRes; - if (body[0] != 0x02) /* make sure it is a string method name we start with */ - { -@@ -2357,7 +2357,7 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - - AMF_Dump(&obj); - AMFProp_GetString(AMF_GetProp(&obj, NULL, 0), &method); -- txn = (int)AMFProp_GetNumber(AMF_GetProp(&obj, NULL, 1)); -+ txn = AMFProp_GetNumber(AMF_GetProp(&obj, NULL, 1)); - RTMP_Log(RTMP_LOGDEBUG, "%s, server invoking <%s>", __FUNCTION__, method.av_val); - - if (AVMATCH(&method, &av__result)) -@@ -2366,7 +2366,7 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - int i; - - for (i=0; i<r->m_numCalls; i++) { -- if (r->m_methodCalls[i].num == txn) { -+ if (r->m_methodCalls[i].num == (int)txn) { - methodInvoked = r->m_methodCalls[i].name; - AV_erase(r->m_methodCalls, &r->m_numCalls, i, FALSE); - break; --- -1.7.10.4 - - -From c528451068de033d7cc76eb1c5a606c10215fcfb Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Wed, 3 Aug 2011 11:46:07 -0700 -Subject: [PATCH 14/64] Fix <arpa/inet.h> include order - - -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 6a3f215..638374f 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -46,10 +46,10 @@ - #include <sys/socket.h> - #include <sys/times.h> - #include <netdb.h> --#include <arpa/inet.h> - #include <unistd.h> - #include <netinet/in.h> - #include <netinet/tcp.h> -+#include <arpa/inet.h> - #define GetSockError() errno - #define SetSockError(e) errno = e - #undef closesocket --- -1.7.10.4 - - -From a1114e09bf0d74ef1d575eb88f3aa36bc7c6d790 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 9 Aug 2011 14:44:14 -0700 -Subject: [PATCH 15/64] Fix AVreplace for usherToken - - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index b45aae3..91fc4da 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -1168,11 +1168,11 @@ AVreplace(AVal *src, const AVal *orig, const AVal *repl) - { - n = sptr - srcbeg; - memcpy(dptr, srcbeg, n); -- srcbeg += n; - dptr += n; - memcpy(dptr, repl->av_val, repl->av_len); - dptr += repl->av_len; - sptr += orig->av_len; -+ srcbeg = sptr; - } - n = srcend - srcbeg; - memcpy(dptr, srcbeg, n); --- -1.7.10.4 - - -From c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Thu, 11 Aug 2011 18:02:10 -0700 -Subject: [PATCH 16/64] Add RD_NO_CONNECT return code for Connect failures - - -diff --git a/rtmpdump.c b/rtmpdump.c -index e506fa9..01decf9 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -46,6 +46,7 @@ - #define RD_SUCCESS 0 - #define RD_FAILED 1 - #define RD_INCOMPLETE 2 -+#define RD_NO_CONNECT 3 - - #define DEF_TIMEOUT 30 /* seconds */ - #define DEF_BUFTIME (10 * 60 * 60 * 1000) /* 10 hours default */ -@@ -1253,7 +1254,7 @@ main(int argc, char **argv) - - if (!RTMP_Connect(&rtmp, NULL)) - { -- nStatus = RD_FAILED; -+ nStatus = RD_NO_CONNECT; - break; - } - --- -1.7.10.4 - - -From 6230845ab0fba07289d4b2d9b97269e4b2d90766 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Sun, 25 Sep 2011 03:07:14 -0700 -Subject: [PATCH 17/64] PolarSSL support now requires version 1.0.0. - - -diff --git a/README b/README -index 865c6c4..dcf5f52 100644 ---- a/README -+++ b/README -@@ -50,6 +50,7 @@ library. You can also turn it off if desired - The rtmpdump programs still link to the static library, regardless. - - Note that if using OpenSSL, you must have version 0.9.8 or newer. -+For Polar SSL you must have version 1.0.0 or newer. - - Credit goes to team boxee for the XBMC RTMP code originally used in RTMPDumper. - The current code is based on the XBMC code but rewritten in C by Howard Chu. -diff --git a/librtmp/dh.h b/librtmp/dh.h -index efef0fd..a9f3763 100644 ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -30,14 +30,14 @@ - #ifdef USE_POLARSSL - #include <polarssl/dhm.h> - typedef mpi * MP_t; --#define MP_new(m) m = malloc(sizeof(mpi)); mpi_init(m, NULL) -+#define MP_new(m) m = malloc(sizeof(mpi)); mpi_init(m) - #define MP_set_w(mpi, w) mpi_lset(mpi, w) - #define MP_cmp(u, v) mpi_cmp_mpi(u, v) - #define MP_set(u, v) mpi_copy(u, v) - #define MP_sub_w(mpi, w) mpi_sub_int(mpi, mpi, w) - #define MP_cmp_1(mpi) mpi_cmp_int(mpi, 1) - #define MP_modexp(r, y, q, p) mpi_exp_mod(r, y, q, p, NULL) --#define MP_free(mpi) mpi_free(mpi, NULL); free(mpi) -+#define MP_free(mpi) mpi_free(mpi); free(mpi) - #define MP_gethex(u, hex, res) MP_new(u); res = mpi_read_string(u, 16, hex) == 0 - #define MP_bytes(u) mpi_size(u) - #define MP_setbin(u,buf,len) mpi_write_binary(u,buf,len) -@@ -71,9 +71,8 @@ static int MDH_generate_key(MDH *dh) - - static int MDH_compute_key(uint8_t *secret, size_t len, MP_t pub, MDH *dh) - { -- int n = len; - MP_set(&dh->ctx.GY, pub); -- dhm_calc_secret(&dh->ctx, secret, &n); -+ dhm_calc_secret(&dh->ctx, secret, &len); - return 0; - } - -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 638374f..c3fd4a6 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -71,7 +71,8 @@ typedef struct tls_ctx { - #define TLS_CTX tls_ctx * - #define TLS_client(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\ -- ssl_set_rng(s, havege_rand, &ctx->hs); ssl_set_ciphers(s, ssl_default_ciphers);\ -+ ssl_set_rng(s, havege_rand, &ctx->hs);\ -+ ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ - ssl_set_session(s, 1, 600, &ctx->ssn) - #define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd) - #define TLS_connect(s) ssl_handshake(s) --- -1.7.10.4 - - -From 60218d0af0f4bd683ecdebe49986f188820cf8ce Mon Sep 17 00:00:00 2001 -From: Kirill Zorin <cyril.zorin@gmail.com> -Date: Fri, 30 Sep 2011 13:38:23 -0400 -Subject: [PATCH 18/64] fixed undefined behaviour due to union assignment - - -diff --git a/librtmp/amf.c b/librtmp/amf.c -index 7fa289e..ae920e4 100644 ---- a/librtmp/amf.c -+++ b/librtmp/amf.c -@@ -1111,7 +1111,7 @@ AMF_AddProp(AMFObject *obj, const AMFObjectProperty *prop) - if (!(obj->o_num & 0x0f)) - obj->o_props = - realloc(obj->o_props, (obj->o_num + 16) * sizeof(AMFObjectProperty)); -- obj->o_props[obj->o_num++] = *prop; -+ memcpy(&obj->o_props[obj->o_num++], prop, sizeof(AMFObjectProperty)); - } - - int -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 5311a8a..4b17a49 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2584,7 +2584,7 @@ RTMP_FindFirstMatchingProperty(AMFObject *obj, const AVal *name, - - if (AVMATCH(&prop->p_name, name)) - { -- *p = *prop; -+ memcpy(p, prop, sizeof(*prop)); - return TRUE; - } - -@@ -2610,7 +2610,7 @@ RTMP_FindPrefixProperty(AMFObject *obj, const AVal *name, - if (prop->p_name.av_len > name->av_len && - !memcmp(prop->p_name.av_val, name->av_val, name->av_len)) - { -- *p = *prop; -+ memcpy(p, prop, sizeof(*prop)); - return TRUE; - } - --- -1.7.10.4 - - -From c90c05892cbaebfb1b2095759597d9fb38238c64 Mon Sep 17 00:00:00 2001 -From: KSV <faltuvistor@yahoo.co.in> -Date: Mon, 7 Nov 2011 11:38:27 -0800 -Subject: [PATCH 19/64] Fix bytes-received report - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 4b17a49..a9c1bc1 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1337,7 +1337,7 @@ ReadN(RTMP *r, char *buffer, int n) - nBytes = nRead; - r->m_nBytesIn += nRead; - if (r->m_bSendCounter -- && r->m_nBytesIn > r->m_nBytesInSent + r->m_nClientBW / 2) -+ && r->m_nBytesIn > ( r->m_nBytesInSent + r->m_nClientBW / 10)) - if (!SendBytesReceived(r)) - return FALSE; - } --- -1.7.10.4 - - -From b3467069ad7c26d748ca13ce0ee88a41f85b22dd Mon Sep 17 00:00:00 2001 -From: Jeff Johnson <jeff@rogueamoeba.com> -Date: Mon, 7 Nov 2011 11:43:26 -0800 -Subject: [PATCH 20/64] Fix getting swf hash with https URLs - - -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 3c56b69..5576730 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -163,7 +163,7 @@ HTTP_get(struct HTTP_ctx *http, const char *url, HTTP_read_callback *cb) - #else - TLS_client(RTMP_TLS_ctx, sb.sb_ssl); - TLS_setfd(sb.sb_ssl, sb.sb_socket); -- if ((i = TLS_connect(sb.sb_ssl)) < 0) -+ if (TLS_connect(sb.sb_ssl) < 0) - { - RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__); - ret = HTTPRES_LOST_CONNECTION; --- -1.7.10.4 - - -From 90799efbb67f415ff930d68905e8267d5aa5dc4e Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 8 Nov 2011 02:04:01 -0800 -Subject: [PATCH 21/64] Increase tcUrl buffer size - - -diff --git a/rtmpdump.c b/rtmpdump.c -index 01decf9..a8fa128 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -1152,9 +1152,9 @@ main(int argc, char **argv) - - if (tcUrl.av_len == 0) - { -- char str[512] = { 0 }; -+ char str[1024]; - -- tcUrl.av_len = snprintf(str, 511, "%s://%.*s:%d/%.*s", -+ tcUrl.av_len = snprintf(str, sizeof(str), "%s://%.*s:%d/%.*s", - RTMPProtocolStringsLower[protocol], hostname.av_len, - hostname.av_val, port, app.av_len, app.av_val); - tcUrl.av_val = (char *) malloc(tcUrl.av_len + 1); --- -1.7.10.4 - - -From 9df7959a71ec33cc9c83c9d3ef25c17b1c527f0e Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 8 Nov 2011 02:05:01 -0800 -Subject: [PATCH 22/64] Spell Referer according to RFC1945 - - -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 5576730..0320480 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -141,7 +141,7 @@ HTTP_get(struct HTTP_ctx *http, const char *url, HTTP_read_callback *cb) - return HTTPRES_LOST_CONNECTION; - i = - sprintf(sb.sb_buf, -- "GET %s HTTP/1.0\r\nUser-Agent: %s\r\nHost: %s\r\nReferrer: %.*s\r\n", -+ "GET %s HTTP/1.0\r\nUser-Agent: %s\r\nHost: %s\r\nReferer: %.*s\r\n", - path, AGENT, host, (int)(path - url + 1), url); - if (http->date[0]) - i += sprintf(sb.sb_buf + i, "If-Modified-Since: %s\r\n", http->date); --- -1.7.10.4 - - -From 1c77ff43439068981d2ad9872952922a1ee37f89 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 8 Nov 2011 02:13:14 -0800 -Subject: [PATCH 23/64] Calculate tcUrl length - - -diff --git a/rtmpdump.c b/rtmpdump.c -index a8fa128..892a8bc 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -1152,13 +1152,12 @@ main(int argc, char **argv) - - if (tcUrl.av_len == 0) - { -- char str[1024]; -- -- tcUrl.av_len = snprintf(str, sizeof(str), "%s://%.*s:%d/%.*s", -+ tcUrl.av_len = strlen(RTMPProtocolStringsLower[protocol]) + -+ hostname.av_len + app.av_len + sizeof("://:65535/"); -+ tcUrl.av_val = (char *) malloc(tcUrl.av_len); -+ tcUrl.av_len = snprintf(tcUrl.av_val, tcUrl.av_len, "%s://%.*s:%d/%.*s", - RTMPProtocolStringsLower[protocol], hostname.av_len, - hostname.av_val, port, app.av_len, app.av_val); -- tcUrl.av_val = (char *) malloc(tcUrl.av_len + 1); -- strcpy(tcUrl.av_val, str); - } - - int first = 1; --- -1.7.10.4 - - -From 30fcf46fc82f96ca41b710fc38bbc15f2489795e Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 8 Nov 2011 02:14:21 -0800 -Subject: [PATCH 24/64] Check for malloc failure in prev commit - - -diff --git a/rtmpdump.c b/rtmpdump.c -index 892a8bc..c37def2 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -1155,6 +1155,8 @@ main(int argc, char **argv) - tcUrl.av_len = strlen(RTMPProtocolStringsLower[protocol]) + - hostname.av_len + app.av_len + sizeof("://:65535/"); - tcUrl.av_val = (char *) malloc(tcUrl.av_len); -+ if (!tcUrl.av_val) -+ return RD_FAILED; - tcUrl.av_len = snprintf(tcUrl.av_val, tcUrl.av_len, "%s://%.*s:%d/%.*s", - RTMPProtocolStringsLower[protocol], hostname.av_len, - hostname.av_val, port, app.av_len, app.av_val); --- -1.7.10.4 - - -From 83e701eef0d7947713280fe3e7561bed1e7195f5 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 14 Nov 2011 16:09:26 -0800 -Subject: [PATCH 25/64] Fix missing log message parameter - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index a9c1bc1..4da318b 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -974,7 +974,7 @@ SocksNegotiate(RTMP *r) - } - else - { -- RTMP_Log(RTMP_LOGERROR, "%s, SOCKS returned error code %d", packet[1]); -+ RTMP_Log(RTMP_LOGERROR, "%s, SOCKS returned error code %d", __FUNCTION__, packet[1]); - return FALSE; - } - } --- -1.7.10.4 - - -From 949da84ab1f659597d6e7fa1ef0ab8fc1ca8e246 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 14 Nov 2011 16:11:13 -0800 -Subject: [PATCH 26/64] Tell gcc about log format strings - - -diff --git a/librtmp/log.h b/librtmp/log.h -index 97c9aac..2adb111 100644 ---- a/librtmp/log.h -+++ b/librtmp/log.h -@@ -48,9 +48,15 @@ extern RTMP_LogLevel RTMP_debuglevel; - typedef void (RTMP_LogCallback)(int level, const char *fmt, va_list); - void RTMP_LogSetCallback(RTMP_LogCallback *cb); - void RTMP_LogSetOutput(FILE *file); -+#ifdef __GNUC__ -+void RTMP_LogPrintf(const char *format, ...) __attribute__ ((__format__ (__printf__, 1, 2))); -+void RTMP_LogStatus(const char *format, ...) __attribute__ ((__format__ (__printf__, 1, 2))); -+void RTMP_Log(int level, const char *format, ...) __attribute__ ((__format__ (__printf__, 2, 3))); -+#else - void RTMP_LogPrintf(const char *format, ...); - void RTMP_LogStatus(const char *format, ...); - void RTMP_Log(int level, const char *format, ...); -+#endif - void RTMP_LogHex(int level, const uint8_t *data, unsigned long len); - void RTMP_LogHexString(int level, const uint8_t *data, unsigned long len); - void RTMP_LogSetLevel(RTMP_LogLevel lvl); --- -1.7.10.4 - - -From 45556fb3b372402d7bd5235832176f58dede90ae Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 14 Nov 2011 16:12:26 -0800 -Subject: [PATCH 27/64] Fix mismatched format string conversions - - -diff --git a/librtmp/amf.c b/librtmp/amf.c -index ae920e4..f9ecf21 100644 ---- a/librtmp/amf.c -+++ b/librtmp/amf.c -@@ -586,7 +586,7 @@ AMF3Prop_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - case AMF3_ARRAY: - case AMF3_BYTE_ARRAY: - default: -- RTMP_Log(RTMP_LOGDEBUG, "%s - AMF3 unknown/unsupported datatype 0x%02x, @0x%08X", -+ RTMP_Log(RTMP_LOGDEBUG, "%s - AMF3 unknown/unsupported datatype 0x%02x, @%p", - __FUNCTION__, (unsigned char)(*pBuffer), pBuffer); - return -1; - } -@@ -772,7 +772,7 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - break; - } - default: -- RTMP_Log(RTMP_LOGDEBUG, "%s - unknown datatype 0x%02x, @0x%08X", __FUNCTION__, -+ RTMP_Log(RTMP_LOGDEBUG, "%s - unknown datatype 0x%02x, @%p", __FUNCTION__, - prop->p_type, pBuffer - 1); - return -1; - } -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 4da318b..52d0254 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -185,7 +185,7 @@ void - RTMPPacket_Dump(RTMPPacket *p) - { - RTMP_Log(RTMP_LOGDEBUG, -- "RTMP PACKET: packet type: 0x%02x. channel: 0x%02x. info 1: %d info 2: %d. Body size: %lu. body: 0x%02x", -+ "RTMP PACKET: packet type: 0x%02x. channel: 0x%02x. info 1: %d info 2: %d. Body size: %u. body: 0x%02x", - p->m_packetType, p->m_nChannel, p->m_nTimeStamp, p->m_nInfoField2, - p->m_nBodySize, p->m_body ? (unsigned char)p->m_body[0] : 0); - } -@@ -367,7 +367,7 @@ RTMP_SetupStream(RTMP *r, - RTMP_Log(RTMP_LOGDEBUG, "StopTime : %d msec", dStop); - - RTMP_Log(RTMP_LOGDEBUG, "live : %s", bLiveStream ? "yes" : "no"); -- RTMP_Log(RTMP_LOGDEBUG, "timeout : %d sec", timeout); -+ RTMP_Log(RTMP_LOGDEBUG, "timeout : %ld sec", timeout); - - #ifdef CRYPTO - if (swfSHA256Hash != NULL && swfSize > 0) -@@ -376,7 +376,7 @@ RTMP_SetupStream(RTMP *r, - r->Link.SWFSize = swfSize; - RTMP_Log(RTMP_LOGDEBUG, "SWFSHA256:"); - RTMP_LogHex(RTMP_LOGDEBUG, r->Link.SWFHash, sizeof(r->Link.SWFHash)); -- RTMP_Log(RTMP_LOGDEBUG, "SWFSize : %lu", r->Link.SWFSize); -+ RTMP_Log(RTMP_LOGDEBUG, "SWFSize : %u", r->Link.SWFSize); - } - else - { -@@ -1161,14 +1161,14 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - case RTMP_PACKET_TYPE_FLEX_STREAM_SEND: - /* flex stream send */ - RTMP_Log(RTMP_LOGDEBUG, -- "%s, flex stream send, size %lu bytes, not supported, ignoring", -+ "%s, flex stream send, size %u bytes, not supported, ignoring", - __FUNCTION__, packet->m_nBodySize); - break; - - case RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT: - /* flex shared object */ - RTMP_Log(RTMP_LOGDEBUG, -- "%s, flex shared object, size %lu bytes, not supported, ignoring", -+ "%s, flex shared object, size %u bytes, not supported, ignoring", - __FUNCTION__, packet->m_nBodySize); - break; - -@@ -1176,7 +1176,7 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - /* flex message */ - { - RTMP_Log(RTMP_LOGDEBUG, -- "%s, flex message, size %lu bytes, not fully supported", -+ "%s, flex message, size %u bytes, not fully supported", - __FUNCTION__, packet->m_nBodySize); - /*RTMP_LogHex(packet.m_body, packet.m_nBodySize); */ - -@@ -1198,7 +1198,7 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - } - case RTMP_PACKET_TYPE_INFO: - /* metadata (notify) */ -- RTMP_Log(RTMP_LOGDEBUG, "%s, received: notify %lu bytes", __FUNCTION__, -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received: notify %u bytes", __FUNCTION__, - packet->m_nBodySize); - if (HandleMetadata(r, packet->m_body, packet->m_nBodySize)) - bHasMediaPacket = 1; -@@ -1211,7 +1211,7 @@ RTMP_ClientPacket(RTMP *r, RTMPPacket *packet) - - case RTMP_PACKET_TYPE_INVOKE: - /* invoke */ -- RTMP_Log(RTMP_LOGDEBUG, "%s, received: invoke %lu bytes", __FUNCTION__, -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received: invoke %u bytes", __FUNCTION__, - packet->m_nBodySize); - /*RTMP_LogHex(packet.m_body, packet.m_nBodySize); */ - -@@ -2373,7 +2373,7 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - } - } - if (!methodInvoked.av_val) { -- RTMP_Log(RTMP_LOGDEBUG, "%s, received result id %d without matching request", -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received result id %f without matching request", - __FUNCTION__, txn); - goto leave; - } -@@ -3055,7 +3055,7 @@ RTMP_ReadPacket(RTMP *r, RTMPPacket *packet) - - if (ReadN(r, packet->m_body + packet->m_nBytesRead, nChunk) != nChunk) - { -- RTMP_Log(RTMP_LOGERROR, "%s, failed to read RTMP packet body. len: %lu", -+ RTMP_Log(RTMP_LOGERROR, "%s, failed to read RTMP packet body. len: %u", - __FUNCTION__, packet->m_nBodySize); - return FALSE; - } -@@ -4176,7 +4176,7 @@ Read_1_Packet(RTMP *r, char *buf, unsigned int buflen) - if (pos + 11 + dataSize > nPacketLen) - { - RTMP_Log(RTMP_LOGERROR, -- "Wrong data size (%lu), stream corrupted, aborting!", -+ "Wrong data size (%u), stream corrupted, aborting!", - dataSize); - ret = RTMP_READ_ERROR; - break; --- -1.7.10.4 - - -From 5d03a4f0d6216da92830306436eae7eb318d5115 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Mon, 14 Nov 2011 16:17:27 -0800 -Subject: [PATCH 28/64] Fix log messages - - -diff --git a/rtmpdump.c b/rtmpdump.c -index c37def2..34bfdba 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -686,7 +686,7 @@ void usage(char *prog) - RTMP_LogPrintf - ("--resume|-e Resume a partial RTMP download\n"); - RTMP_LogPrintf -- ("--timeout|-m num Timeout connection num seconds (default: %lu)\n", -+ ("--timeout|-m num Timeout connection num seconds (default: %u)\n", - DEF_TIMEOUT); - RTMP_LogPrintf - ("--start|-A num Start at num seconds into stream (not valid when using --live)\n"); -@@ -699,7 +699,7 @@ void usage(char *prog) - RTMP_LogPrintf - ("--hashes|-# Display progress with hashes, not with the byte counter\n"); - RTMP_LogPrintf -- ("--buffer|-b Buffer time in milliseconds (default: %lu)\n", -+ ("--buffer|-b Buffer time in milliseconds (default: %u)\n", - DEF_BUFTIME); - RTMP_LogPrintf - ("--skip|-k num Skip num keyframes when looking for last keyframe to resume from. Useful if resume fails (default: %d)\n\n", -diff --git a/rtmpgw.c b/rtmpgw.c -index 733e105..0cf56bb 100644 ---- a/rtmpgw.c -+++ b/rtmpgw.c -@@ -563,7 +563,7 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou - rtmp.Link.token = req.token; - rtmp.m_read.timestamp = dSeek; - -- RTMP_LogPrintf("Connecting ... port: %d, app: %s\n", req.rtmpport, req.app); -+ RTMP_LogPrintf("Connecting ... port: %d, app: %s\n", req.rtmpport, req.app.av_val); - if (!RTMP_Connect(&rtmp, NULL)) - { - RTMP_LogPrintf("%s, failed to connect!\n", __FUNCTION__); -@@ -738,7 +738,7 @@ stopStreaming(STREAMING_SERVER * server) - - if (closesocket(server->socket)) - RTMP_Log(RTMP_LOGERROR, "%s: Failed to close listening socket, error %d", -- GetSockError()); -+ __FUNCTION__, GetSockError()); - - server->state = STREAMING_STOPPED; - } -@@ -1103,7 +1103,7 @@ main(int argc, char **argv) - RTMP_LogPrintf - ("--jtv|-j JSON Authentication token for Justin.tv legacy servers\n"); - RTMP_LogPrintf -- ("--buffer|-b Buffer time in milliseconds (default: %lu)\n\n", -+ ("--buffer|-b Buffer time in milliseconds (default: %u)\n\n", - defaultRTMPRequest.bufferTime); - - RTMP_LogPrintf -diff --git a/rtmpsrv.c b/rtmpsrv.c -index 91fc4da..b662d54 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -765,7 +765,7 @@ ServePacket(STREAMING_SERVER *server, RTMP *r, RTMPPacket *packet) - { - int ret = 0; - -- RTMP_Log(RTMP_LOGDEBUG, "%s, received packet type %02X, size %lu bytes", __FUNCTION__, -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received packet type %02X, size %u bytes", __FUNCTION__, - packet->m_packetType, packet->m_nBodySize); - - switch (packet->m_packetType) -@@ -812,7 +812,7 @@ ServePacket(STREAMING_SERVER *server, RTMP *r, RTMPPacket *packet) - - case 0x11: // flex message - { -- RTMP_Log(RTMP_LOGDEBUG, "%s, flex message, size %lu bytes, not fully supported", -+ RTMP_Log(RTMP_LOGDEBUG, "%s, flex message, size %u bytes, not fully supported", - __FUNCTION__, packet->m_nBodySize); - //RTMP_LogHex(packet.m_body, packet.m_nBodySize); - -@@ -840,7 +840,7 @@ ServePacket(STREAMING_SERVER *server, RTMP *r, RTMPPacket *packet) - - case 0x14: - // invoke -- RTMP_Log(RTMP_LOGDEBUG, "%s, received: invoke %lu bytes", __FUNCTION__, -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received: invoke %u bytes", __FUNCTION__, - packet->m_nBodySize); - //RTMP_LogHex(packet.m_body, packet.m_nBodySize); - -@@ -1053,7 +1053,7 @@ stopStreaming(STREAMING_SERVER * server) - - if (closesocket(server->socket)) - RTMP_Log(RTMP_LOGERROR, "%s: Failed to close listening socket, error %d", -- GetSockError()); -+ __FUNCTION__, GetSockError()); - - server->state = STREAMING_STOPPED; - } -diff --git a/rtmpsuck.c b/rtmpsuck.c -index 661e64b..e886179 100644 ---- a/rtmpsuck.c -+++ b/rtmpsuck.c -@@ -456,7 +456,7 @@ ServePacket(STREAMING_SERVER *server, int which, RTMPPacket *packet) - { - int ret = 0; - -- RTMP_Log(RTMP_LOGDEBUG, "%s, %s sent packet type %02X, size %lu bytes", __FUNCTION__, -+ RTMP_Log(RTMP_LOGDEBUG, "%s, %s sent packet type %02X, size %u bytes", __FUNCTION__, - cst[which], packet->m_packetType, packet->m_nBodySize); - - switch (packet->m_packetType) -@@ -649,7 +649,7 @@ WriteStream(char **buf, // target pointer, maybe preallocated - if (pos + 11 + dataSize > nPacketLen) - { - RTMP_Log(RTMP_LOGERROR, -- "Wrong data size (%lu), stream corrupted, aborting!", -+ "Wrong data size (%u), stream corrupted, aborting!", - dataSize); - ret = -2; - break; -@@ -1117,7 +1117,7 @@ stopStreaming(STREAMING_SERVER * server) - - if (fd && closesocket(fd)) - RTMP_Log(RTMP_LOGERROR, "%s: Failed to close listening socket, error %d", -- GetSockError()); -+ __FUNCTION__, GetSockError()); - - server->state = STREAMING_STOPPED; - } --- -1.7.10.4 - - -From 4e06e218e230a86608637b613499984703a342cf Mon Sep 17 00:00:00 2001 -From: Antti Ajanki <antti.ajanki@iki.fi> -Date: Thu, 22 Dec 2011 17:54:10 -0800 -Subject: [PATCH 29/64] Support decoding AMF_XML_DOC - -MF_XML_DOC data is an XML document which is encoded similarly to a -long string. - -diff --git a/librtmp/amf.c b/librtmp/amf.c -index f9ecf21..659421e 100644 ---- a/librtmp/amf.c -+++ b/librtmp/amf.c -@@ -735,13 +735,15 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - break; - } - case AMF_LONG_STRING: -+ case AMF_XML_DOC: - { - unsigned int nStringSize = AMF_DecodeInt32(pBuffer); - if (nSize < (long)nStringSize + 4) - return -1; - AMF_DecodeLongString(pBuffer, &prop->p_vu.p_aval); - nSize -= (4 + nStringSize); -- prop->p_type = AMF_STRING; -+ if (prop->p_type == AMF_LONG_STRING) -+ prop->p_type = AMF_STRING; - break; - } - case AMF_RECORDSET: -@@ -750,12 +752,6 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - return -1; - break; - } -- case AMF_XML_DOC: -- { -- RTMP_Log(RTMP_LOGERROR, "AMF_XML_DOC not supported!"); -- return -1; -- break; -- } - case AMF_TYPED_OBJECT: - { - RTMP_Log(RTMP_LOGERROR, "AMF_TYPED_OBJECT not supported!"); --- -1.7.10.4 - - -From adb77ff4d72cea92b7c307ccb64e9aa930d866da Mon Sep 17 00:00:00 2001 -From: Joshua Allmann <joshua.allmann@gmail.com> -Date: Fri, 24 Feb 2012 13:44:29 -0800 -Subject: [PATCH 30/64] Remove extra object end tag in Connect reply - - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index b662d54..9aa62f3 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -223,9 +223,6 @@ SendConnectResult(RTMP *r, double txn) - *enc++ = 0; - *enc++ = 0; - *enc++ = AMF_OBJECT_END; -- *enc++ = 0; -- *enc++ = 0; -- *enc++ = AMF_OBJECT_END; - - packet.m_nBodySize = enc - packet.m_body; - --- -1.7.10.4 - - -From 2ad1d5d133a46ceeaaa05c9375e293f332871f3b Mon Sep 17 00:00:00 2001 -From: Josh Allmann <joshua.allmann@gmail.com> -Date: Fri, 24 Feb 2012 13:46:59 -0800 -Subject: [PATCH 31/64] Fix upper bound check in AMF_GetProp - - -diff --git a/librtmp/amf.c b/librtmp/amf.c -index 659421e..ce84f81 100644 ---- a/librtmp/amf.c -+++ b/librtmp/amf.c -@@ -1121,7 +1121,7 @@ AMF_GetProp(AMFObject *obj, const AVal *name, int nIndex) - { - if (nIndex >= 0) - { -- if (nIndex <= obj->o_num) -+ if (nIndex < obj->o_num) - return &obj->o_props[nIndex]; - } - else --- -1.7.10.4 - - -From eea470fa5f9a5481a36dedd257549595ef7480d6 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Thu, 8 Mar 2012 23:10:11 -0800 -Subject: [PATCH 32/64] Add support for building with gnutls with nettle as - backend - - -diff --git a/Makefile b/Makefile -index 6ef5742..0cf41be 100644 ---- a/Makefile -+++ b/Makefile -@@ -13,6 +13,7 @@ CRYPTO=OPENSSL - #CRYPTO=GNUTLS - LIBZ=-lz - LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) -+LIB_GNUTLS_NETTLE=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ) - LIB_OPENSSL=-lssl -lcrypto $(LIBZ) - LIB_POLARSSL=-lpolarssl $(LIBZ) - CRYPTO_LIB=$(LIB_$(CRYPTO)) -diff --git a/librtmp/Makefile b/librtmp/Makefile -index a0125f1..353c6c8 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -21,14 +21,17 @@ CRYPTO=OPENSSL - DEF_POLARSSL=-DUSE_POLARSSL - DEF_OPENSSL=-DUSE_OPENSSL - DEF_GNUTLS=-DUSE_GNUTLS -+DEF_GNUTLS_NETTLE=-DUSE_GNUTLS_NETTLE - DEF_=-DNO_CRYPTO - REQ_GNUTLS=gnutls -+REQ_GNUTLS_NETTLE=gnutls - REQ_OPENSSL=libssl,libcrypto - LIBZ=-lz - LIBS_posix= - LIBS_darwin= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 - LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) -+LIB_GNUTLS_NETTLE=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ) - LIB_OPENSSL=-lssl -lcrypto $(LIBZ) - LIB_POLARSSL=-lpolarssl $(LIBZ) - PRIVATE_LIBS=$(LIBS_$(SYS)) -diff --git a/librtmp/dh.h b/librtmp/dh.h -index a9f3763..830000e 100644 ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -76,7 +76,8 @@ static int MDH_compute_key(uint8_t *secret, size_t len, MP_t pub, MDH *dh) - return 0; - } - --#elif defined(USE_GNUTLS) -+#elif defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE) -+#ifdef USE_GNUTLS - #include <gcrypt.h> - typedef gcry_mpi_t MP_t; - #define MP_new(m) m = gcry_mpi_new(1) -@@ -91,6 +92,23 @@ typedef gcry_mpi_t MP_t; - #define MP_bytes(u) (gcry_mpi_get_nbits(u) + 7) / 8 - #define MP_setbin(u,buf,len) gcry_mpi_print(GCRYMPI_FMT_USG,buf,len,NULL,u) - #define MP_getbin(u,buf,len) gcry_mpi_scan(&u,GCRYMPI_FMT_USG,buf,len,NULL) -+#else -+#include <gmp.h> -+#include <nettle/bignum.h> -+typedef mpz_ptr MP_t; -+#define MP_new(m) m = malloc(sizeof(*m)); mpz_init2(m, 1) -+#define MP_set_w(mpi, w) mpz_set_ui(mpi, w) -+#define MP_cmp(u, v) mpz_cmp(u, v) -+#define MP_set(u, v) mpz_set(u, v) -+#define MP_sub_w(mpi, w) mpz_sub_ui(mpi, mpi, w) -+#define MP_cmp_1(mpi) mpz_cmp_ui(mpi, 1) -+#define MP_modexp(r, y, q, p) mpz_powm(r, y, q, p) -+#define MP_free(mpi) mpz_clear(mpi); free(mpi) -+#define MP_gethex(u, hex, res) u = malloc(sizeof(*u)); mpz_init2(u, 1); res = (mpz_set_str(u, hex, 16) == 0) -+#define MP_bytes(u) (mpz_sizeinbase(u, 2) + 7) / 8 -+#define MP_setbin(u,buf,len) nettle_mpz_get_str_256(len,buf,u) -+#define MP_getbin(u,buf,len) u = malloc(sizeof(*u)); mpz_init2(u, 1); nettle_mpz_set_str_256_u(u,len,buf) -+#endif - - typedef struct MDH { - MP_t p; -diff --git a/librtmp/handshake.h b/librtmp/handshake.h -index 98bf3c8..4c2ea7f 100644 ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -59,6 +59,26 @@ typedef gcry_cipher_hd_t RC4_handle; - #define RC4_encrypt2(h,l,s,d) gcry_cipher_encrypt(h,(void *)d,l,(void *)s,l) - #define RC4_free(h) gcry_cipher_close(h) - -+#elif defined(USE_GNUTLS_NETTLE) -+#include <nettle/hmac.h> -+#include <nettle/arcfour.h> -+#ifndef SHA256_DIGEST_LENGTH -+#define SHA256_DIGEST_LENGTH 32 -+#endif -+#undef HMAC_CTX -+#define HMAC_CTX struct hmac_sha256_ctx -+#define HMAC_setup(ctx, key, len) hmac_sha256_set_key(&ctx, len, key) -+#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(&ctx, len, buf) -+#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(&ctx, SHA256_DIGEST_LENGTH, dig) -+#define HMAC_close(ctx) -+ -+typedef struct arcfour_ctx* RC4_handle; -+#define RC4_alloc(h) *h = malloc(sizeof(struct arcfour_ctx)) -+#define RC4_setkey(h,l,k) arcfour_set_key(h, l, k) -+#define RC4_encrypt(h,l,d) arcfour_crypt(h,l,(uint8_t *)d,(uint8_t *)d) -+#define RC4_encrypt2(h,l,s,d) arcfour_crypt(h,l,(uint8_t *)d,(uint8_t *)s) -+#define RC4_free(h) free(h) -+ - #else /* USE_OPENSSL */ - #include <openssl/sha.h> - #include <openssl/hmac.h> -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 0320480..8cefd3b 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -52,6 +52,17 @@ - #define HMAC_crunch(ctx, buf, len) gcry_md_write(ctx, buf, len) - #define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; memcpy(dig, gcry_md_read(ctx, 0), dlen) - #define HMAC_close(ctx) gcry_md_close(ctx) -+#elif defined(USE_GNUTLS_NETTLE) -+#include <nettle/hmac.h> -+#ifndef SHA256_DIGEST_LENGTH -+#define SHA256_DIGEST_LENGTH 32 -+#endif -+#undef HMAC_CTX -+#define HMAC_CTX struct hmac_sha256_ctx -+#define HMAC_setup(ctx, key, len) hmac_sha256_set_key(&ctx, len, key) -+#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(&ctx, len, buf) -+#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(&ctx, SHA256_DIGEST_LENGTH, dig) -+#define HMAC_close(ctx) - #else /* USE_OPENSSL */ - #include <openssl/ssl.h> - #include <openssl/sha.h> -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 52d0254..5cd7b8d 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -34,7 +34,7 @@ - #ifdef CRYPTO - #ifdef USE_POLARSSL - #include <polarssl/havege.h> --#elif defined(USE_GNUTLS) -+#elif defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE) - #include <gnutls/gnutls.h> - #else /* USE_OPENSSL */ - #include <openssl/ssl.h> -@@ -204,7 +204,7 @@ RTMP_TLS_Init() - /* Do this regardless of NO_SSL, we use havege for rtmpe too */ - RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx)); - havege_init(&RTMP_TLS_ctx->hs); --#elif defined(USE_GNUTLS) && !defined(NO_SSL) -+#elif (defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE)) && !defined(NO_SSL) - /* Technically we need to initialize libgcrypt ourselves if - * we're not going to call gnutls_global_init(). Ignoring this - * for now. -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index c3fd4a6..478c59f 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -81,7 +81,7 @@ typedef struct tls_ctx { - #define TLS_shutdown(s) ssl_close_notify(s) - #define TLS_close(s) ssl_free(s); free(s) - --#elif defined(USE_GNUTLS) -+#elif defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE) - #include <gnutls/gnutls.h> - typedef struct tls_ctx { - gnutls_certificate_credentials_t cred; --- -1.7.10.4 - - -From 7340f6dbc6b3c8e552baab2e5a891c2de75cddcc Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Thu, 8 Mar 2012 23:19:45 -0800 -Subject: [PATCH 33/64] Cleanup prev commit, drop gcrypt support - - -diff --git a/Makefile b/Makefile -index 0cf41be..a1595a8 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,8 +12,7 @@ CRYPTO=OPENSSL - #CRYPTO=POLARSSL - #CRYPTO=GNUTLS - LIBZ=-lz --LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) --LIB_GNUTLS_NETTLE=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ) -+LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ) - LIB_OPENSSL=-lssl -lcrypto $(LIBZ) - LIB_POLARSSL=-lpolarssl $(LIBZ) - CRYPTO_LIB=$(LIB_$(CRYPTO)) -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 353c6c8..74ee3b5 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -21,17 +21,14 @@ CRYPTO=OPENSSL - DEF_POLARSSL=-DUSE_POLARSSL - DEF_OPENSSL=-DUSE_OPENSSL - DEF_GNUTLS=-DUSE_GNUTLS --DEF_GNUTLS_NETTLE=-DUSE_GNUTLS_NETTLE - DEF_=-DNO_CRYPTO - REQ_GNUTLS=gnutls --REQ_GNUTLS_NETTLE=gnutls - REQ_OPENSSL=libssl,libcrypto - LIBZ=-lz - LIBS_posix= - LIBS_darwin= - LIBS_mingw=-lws2_32 -lwinmm -lgdi32 --LIB_GNUTLS=-lgnutls -lgcrypt $(LIBZ) --LIB_GNUTLS_NETTLE=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ) -+LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ) - LIB_OPENSSL=-lssl -lcrypto $(LIBZ) - LIB_POLARSSL=-lpolarssl $(LIBZ) - PRIVATE_LIBS=$(LIBS_$(SYS)) -diff --git a/librtmp/dh.h b/librtmp/dh.h -index 830000e..9959532 100644 ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -76,23 +76,7 @@ static int MDH_compute_key(uint8_t *secret, size_t len, MP_t pub, MDH *dh) - return 0; - } - --#elif defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE) --#ifdef USE_GNUTLS --#include <gcrypt.h> --typedef gcry_mpi_t MP_t; --#define MP_new(m) m = gcry_mpi_new(1) --#define MP_set_w(mpi, w) gcry_mpi_set_ui(mpi, w) --#define MP_cmp(u, v) gcry_mpi_cmp(u, v) --#define MP_set(u, v) gcry_mpi_set(u, v) --#define MP_sub_w(mpi, w) gcry_mpi_sub_ui(mpi, mpi, w) --#define MP_cmp_1(mpi) gcry_mpi_cmp_ui(mpi, 1) --#define MP_modexp(r, y, q, p) gcry_mpi_powm(r, y, q, p) --#define MP_free(mpi) gcry_mpi_release(mpi) --#define MP_gethex(u, hex, res) res = (gcry_mpi_scan(&u, GCRYMPI_FMT_HEX, hex, 0, 0) == 0) --#define MP_bytes(u) (gcry_mpi_get_nbits(u) + 7) / 8 --#define MP_setbin(u,buf,len) gcry_mpi_print(GCRYMPI_FMT_USG,buf,len,NULL,u) --#define MP_getbin(u,buf,len) gcry_mpi_scan(&u,GCRYMPI_FMT_USG,buf,len,NULL) --#else -+#elif defined(USE_GNUTLS) - #include <gmp.h> - #include <nettle/bignum.h> - typedef mpz_ptr MP_t; -@@ -108,7 +92,6 @@ typedef mpz_ptr MP_t; - #define MP_bytes(u) (mpz_sizeinbase(u, 2) + 7) / 8 - #define MP_setbin(u,buf,len) nettle_mpz_get_str_256(len,buf,u) - #define MP_getbin(u,buf,len) u = malloc(sizeof(*u)); mpz_init2(u, 1); nettle_mpz_set_str_256_u(u,len,buf) --#endif - - typedef struct MDH { - MP_t p; -diff --git a/librtmp/handshake.h b/librtmp/handshake.h -index 4c2ea7f..0438486 100644 ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -43,27 +43,10 @@ typedef arc4_context * RC4_handle; - #define RC4_free(h) free(h) - - #elif defined(USE_GNUTLS) --#include <gcrypt.h> --#ifndef SHA256_DIGEST_LENGTH --#define SHA256_DIGEST_LENGTH 32 --#endif --#define HMAC_CTX gcry_md_hd_t --#define HMAC_setup(ctx, key, len) gcry_md_open(&ctx, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC); gcry_md_setkey(ctx, key, len) --#define HMAC_crunch(ctx, buf, len) gcry_md_write(ctx, buf, len) --#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; memcpy(dig, gcry_md_read(ctx, 0), dlen); gcry_md_close(ctx) -- --typedef gcry_cipher_hd_t RC4_handle; --#define RC4_alloc(h) gcry_cipher_open(h, GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM, 0) --#define RC4_setkey(h,l,k) gcry_cipher_setkey(h,k,l) --#define RC4_encrypt(h,l,d) gcry_cipher_encrypt(h,(void *)d,l,NULL,0) --#define RC4_encrypt2(h,l,s,d) gcry_cipher_encrypt(h,(void *)d,l,(void *)s,l) --#define RC4_free(h) gcry_cipher_close(h) -- --#elif defined(USE_GNUTLS_NETTLE) - #include <nettle/hmac.h> - #include <nettle/arcfour.h> - #ifndef SHA256_DIGEST_LENGTH --#define SHA256_DIGEST_LENGTH 32 -+#define SHA256_DIGEST_LENGTH 32 - #endif - #undef HMAC_CTX - #define HMAC_CTX struct hmac_sha256_ctx -diff --git a/librtmp/hashswf.c b/librtmp/hashswf.c -index 8cefd3b..9f4e2c0 100644 ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c -@@ -42,17 +42,6 @@ - #define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; sha2_hmac_finish(&ctx, dig) - #define HMAC_close(ctx) - #elif defined(USE_GNUTLS) --#include <gnutls/gnutls.h> --#include <gcrypt.h> --#ifndef SHA256_DIGEST_LENGTH --#define SHA256_DIGEST_LENGTH 32 --#endif --#define HMAC_CTX gcry_md_hd_t --#define HMAC_setup(ctx, key, len) gcry_md_open(&ctx, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC); gcry_md_setkey(ctx, key, len) --#define HMAC_crunch(ctx, buf, len) gcry_md_write(ctx, buf, len) --#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; memcpy(dig, gcry_md_read(ctx, 0), dlen) --#define HMAC_close(ctx) gcry_md_close(ctx) --#elif defined(USE_GNUTLS_NETTLE) - #include <nettle/hmac.h> - #ifndef SHA256_DIGEST_LENGTH - #define SHA256_DIGEST_LENGTH 32 -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 5cd7b8d..52d0254 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -34,7 +34,7 @@ - #ifdef CRYPTO - #ifdef USE_POLARSSL - #include <polarssl/havege.h> --#elif defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE) -+#elif defined(USE_GNUTLS) - #include <gnutls/gnutls.h> - #else /* USE_OPENSSL */ - #include <openssl/ssl.h> -@@ -204,7 +204,7 @@ RTMP_TLS_Init() - /* Do this regardless of NO_SSL, we use havege for rtmpe too */ - RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx)); - havege_init(&RTMP_TLS_ctx->hs); --#elif (defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE)) && !defined(NO_SSL) -+#elif defined(USE_GNUTLS) && !defined(NO_SSL) - /* Technically we need to initialize libgcrypt ourselves if - * we're not going to call gnutls_global_init(). Ignoring this - * for now. -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 478c59f..c3fd4a6 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -81,7 +81,7 @@ typedef struct tls_ctx { - #define TLS_shutdown(s) ssl_close_notify(s) - #define TLS_close(s) ssl_free(s); free(s) - --#elif defined(USE_GNUTLS) || defined(USE_GNUTLS_NETTLE) -+#elif defined(USE_GNUTLS) - #include <gnutls/gnutls.h> - typedef struct tls_ctx { - gnutls_certificate_credentials_t cred; --- -1.7.10.4 - - -From 603ff20e9e717a70b5b0c011f3413cf376d0c2f6 Mon Sep 17 00:00:00 2001 -From: Ulrik Dickow <u.dickow@gmail.com> -Date: Thu, 26 Jul 2012 04:57:23 -0700 -Subject: [PATCH 34/64] Add .gitignore to ignore generated files - - -diff --git a/.gitignore b/.gitignore -new file mode 100644 -index 0000000..c7ec44f ---- /dev/null -+++ b/.gitignore -@@ -0,0 +1,9 @@ -+*.[oa] -+*.exe -+*.so -+*.so.[0-9] -+*.dylib -+rtmpdump -+rtmpgw -+rtmpsrv -+rtmpsuck --- -1.7.10.4 - - -From e0056c51cc1710c9a44d2a2c4e2f344fa9cabcf4 Mon Sep 17 00:00:00 2001 -From: Ulrik Dickow <u.dickow@gmail.com> -Date: Tue, 24 Jul 2012 17:17:26 +0200 -Subject: [PATCH 35/64] Add option --realtime (-R) to rtmpdump to disable the - BUFX hack - - -diff --git a/rtmpdump.1 b/rtmpdump.1 -index 0d9de8d..7bb5328 100644 ---- a/rtmpdump.1 -+++ b/rtmpdump.1 -@@ -1,4 +1,4 @@ --.TH RTMPDUMP 1 "2011-07-20" "RTMPDump v2.4" -+.TH RTMPDUMP 1 "2012-07-24" "RTMPDump v2.4" - .\" Copyright 2011 Howard Chu. - .\" Copying permitted according to the GNU General Public License V2. - .SH NAME -@@ -177,6 +177,12 @@ live streams is possible. - Name of live stream to subscribe to. Defaults to - .IR playpath . - .TP -+.B \-\-realtime \-R -+Download approximately in realtime, without attempting to speed up via -+Pause/Unpause commands ("the BUFX hack"). -+Useful for servers that jump backwards in time at the Unpause command. -+Resuming and seeking in realtime streams is still possible. -+.TP - .B \-\-resume \-e - Resume an incomplete RTMP download. - .TP -diff --git a/rtmpdump.1.html b/rtmpdump.1.html -index 826f722..4c39b35 100644 ---- a/rtmpdump.1.html -+++ b/rtmpdump.1.html -@@ -6,7 +6,7 @@ - <tr><td>RTMPDUMP(1)<td align="center"><td align="right">RTMPDUMP(1) - </thead> - <tfoot> --<tr><td>RTMPDump v2.4<td align="center">2011-07-20<td align="right">RTMPDUMP(1) -+<tr><td>RTMPDump v2.4<td align="center">2012-07-24<td align="right">RTMPDUMP(1) - </tfoot> - <tbody><tr><td colspan="3"><br><br><ul> - <!-- Copyright 2011 Howard Chu. -@@ -34,6 +34,7 @@ rtmpdump − RTMP streaming media client - [<b>−y</b><i> playpath</i>] - [<b>−Y</b>] - [<b>−v</b>] -+[<b>−R</b>] - [<b>−d</b><i> subscription</i>] - [<b>−e</b>] - [<b>−k</b><i> skip</i>] -@@ -218,6 +219,15 @@ Name of live stream to subscribe to. Defaults to - </dl> - <p> - <dl compact><dt> -+<b>−−realtime −R</b> -+<dd> -+Download approximately in realtime, without attempting to speed up via -+Pause/Unpause commands ("the BUFX hack"). -+Useful for servers that jump backwards in time at the Unpause command. -+Resuming and seeking in realtime streams is still possible. -+</dl> -+<p> -+<dl compact><dt> - <b>−−resume −e</b> - <dd> - Resume an incomplete RTMP download. -diff --git a/rtmpdump.c b/rtmpdump.c -index 34bfdba..e52f7d4 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -441,7 +441,7 @@ GetLastKeyframe(FILE * file, // output file [in] - - int - Download(RTMP * rtmp, // connected RTMP object -- FILE * file, uint32_t dSeek, uint32_t dStopOffset, double duration, int bResume, char *metaHeader, uint32_t nMetaHeaderSize, char *initialFrame, int initialFrameType, uint32_t nInitialFrameSize, int nSkipKeyFrames, int bStdoutMode, int bLiveStream, int bHashes, int bOverrideBufferTime, uint32_t bufferTime, double *percent) // percentage downloaded [out] -+ FILE * file, uint32_t dSeek, uint32_t dStopOffset, double duration, int bResume, char *metaHeader, uint32_t nMetaHeaderSize, char *initialFrame, int initialFrameType, uint32_t nInitialFrameSize, int nSkipKeyFrames, int bStdoutMode, int bLiveStream, int bRealtimeStream, int bHashes, int bOverrideBufferTime, uint32_t bufferTime, double *percent) // percentage downloaded [out] - { - int32_t now, lastUpdate; - int bufferSize = 64 * 1024; -@@ -492,6 +492,8 @@ Download(RTMP * rtmp, // connected RTMP object - bResume ? "Resuming" : "Starting", - (double) size / 1024.0); - } -+ if (bRealtimeStream) -+ RTMP_LogPrintf(" in approximately realtime (disabled BUFX speedup hack)\n"); - } - - if (dStopOffset > 0) -@@ -682,6 +684,8 @@ void usage(char *prog) - RTMP_LogPrintf - ("--subscribe|-d string Stream name to subscribe to (otherwise defaults to playpath if live is specifed)\n"); - RTMP_LogPrintf -+ ("--realtime|-R Don't attempt to speed up download via the Pause/Unpause BUFX hack\n"); -+ RTMP_LogPrintf - ("--flv|-o string FLV output file name, if the file name is - print stream to stdout\n"); - RTMP_LogPrintf - ("--resume|-e Resume a partial RTMP download\n"); -@@ -748,6 +752,7 @@ main(int argc, char **argv) - int protocol = RTMP_PROTOCOL_UNDEFINED; - int retries = 0; - int bLiveStream = FALSE; // is it a live stream? then we can't seek/resume -+ int bRealtimeStream = FALSE; // If true, disable the BUFX hack (be patient) - int bHashes = FALSE; // display byte counters not hashes by default - - long int timeout = DEF_TIMEOUT; // timeout connection after 120 seconds -@@ -832,6 +837,7 @@ main(int argc, char **argv) - #endif - {"flashVer", 1, NULL, 'f'}, - {"live", 0, NULL, 'v'}, -+ {"realtime", 0, NULL, 'R'}, - {"flv", 1, NULL, 'o'}, - {"resume", 0, NULL, 'e'}, - {"timeout", 1, NULL, 'm'}, -@@ -851,7 +857,7 @@ main(int argc, char **argv) - - while ((opt = - getopt_long(argc, argv, -- "hVveqzr:s:t:p:a:b:f:o:u:C:n:c:l:y:Ym:k:d:A:B:T:w:x:W:X:S:#j:", -+ "hVveqzRr:s:t:p:a:b:f:o:u:C:n:c:l:y:Ym:k:d:A:B:T:w:x:W:X:S:#j:", - longopts, NULL)) != -1) - { - switch (opt) -@@ -936,6 +942,9 @@ main(int argc, char **argv) - case 'v': - bLiveStream = TRUE; // no seeking or resuming possible! - break; -+ case 'R': -+ bRealtimeStream = TRUE; // seeking and resuming is still possible -+ break; - case 'd': - STR2AVAL(subscribepath, optarg); - break; -@@ -1181,7 +1190,7 @@ main(int argc, char **argv) - &flashVer, &subscribepath, &usherToken, dSeek, dStopOffset, bLiveStream, timeout); - - /* Try to keep the stream moving if it pauses on us */ -- if (!bLiveStream && !(protocol & RTMP_FEATURE_HTTP)) -+ if (!bLiveStream && !bRealtimeStream && !(protocol & RTMP_FEATURE_HTTP)) - rtmp.Link.lFlags |= RTMP_LF_BUFX; - - off_t size = 0; -@@ -1348,8 +1357,8 @@ main(int argc, char **argv) - - nStatus = Download(&rtmp, file, dSeek, dStopOffset, duration, bResume, - metaHeader, nMetaHeaderSize, initialFrame, -- initialFrameType, nInitialFrameSize, -- nSkipKeyFrames, bStdoutMode, bLiveStream, bHashes, -+ initialFrameType, nInitialFrameSize, nSkipKeyFrames, -+ bStdoutMode, bLiveStream, bRealtimeStream, bHashes, - bOverrideBufferTime, bufferTime, &percent); - free(initialFrame); - initialFrame = NULL; --- -1.7.10.4 - - -From 87d47b876f818fe5c949e08c699238bc22a3c7b1 Mon Sep 17 00:00:00 2001 -From: Bastien Nocera <hadess@hadess.net> -Date: Tue, 30 Oct 2012 08:16:36 -0700 -Subject: [PATCH 36/64] Make rtmpdump handle full RTMP URLs with "-i" - - -diff --git a/rtmpdump.c b/rtmpdump.c -index e52f7d4..2b30eb2 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -640,6 +640,8 @@ void usage(char *prog) - ("\n%s: This program dumps the media content streamed over RTMP.\n\n", prog); - RTMP_LogPrintf("--help|-h Prints this help screen.\n"); - RTMP_LogPrintf -+ ("--url|-i url URL with options included (e.g. rtmp://host[:port]/path swfUrl=url tcUrl=url)\n"); -+ RTMP_LogPrintf - ("--rtmp|-r url URL (e.g. rtmp://host[:port]/path)\n"); - RTMP_LogPrintf - ("--host|-n hostname Overrides the hostname in the rtmp url\n"); -@@ -760,6 +762,7 @@ main(int argc, char **argv) - uint32_t dStopOffset = 0; - RTMP rtmp = { 0 }; - -+ AVal fullUrl = { 0, 0 }; - AVal swfUrl = { 0, 0 }; - AVal tcUrl = { 0, 0 }; - AVal pageUrl = { 0, 0 }; -@@ -822,6 +825,7 @@ main(int argc, char **argv) - {"protocol", 1, NULL, 'l'}, - {"playpath", 1, NULL, 'y'}, - {"playlist", 0, NULL, 'Y'}, -+ {"url", 1, NULL, 'i'}, - {"rtmp", 1, NULL, 'r'}, - {"swfUrl", 1, NULL, 's'}, - {"tcUrl", 1, NULL, 't'}, -@@ -857,7 +861,7 @@ main(int argc, char **argv) - - while ((opt = - getopt_long(argc, argv, -- "hVveqzRr:s:t:p:a:b:f:o:u:C:n:c:l:y:Ym:k:d:A:B:T:w:x:W:X:S:#j:", -+ "hVveqzRr:s:t:i:p:a:b:f:o:u:C:n:c:l:y:Ym:k:d:A:B:T:w:x:W:X:S:#j:", - longopts, NULL)) != -1) - { - switch (opt) -@@ -1000,6 +1004,9 @@ main(int argc, char **argv) - } - break; - } -+ case 'i': -+ STR2AVAL(fullUrl, optarg); -+ break; - case 's': - STR2AVAL(swfUrl, optarg); - break; -@@ -1078,32 +1085,32 @@ main(int argc, char **argv) - } - } - -- if (!hostname.av_len) -+ if (!hostname.av_len && !fullUrl.av_len) - { - RTMP_Log(RTMP_LOGERROR, - "You must specify a hostname (--host) or url (-r \"rtmp://host[:port]/playpath\") containing a hostname"); - return RD_FAILED; - } -- if (playpath.av_len == 0) -+ if (playpath.av_len == 0 && !fullUrl.av_len) - { - RTMP_Log(RTMP_LOGERROR, - "You must specify a playpath (--playpath) or url (-r \"rtmp://host[:port]/playpath\") containing a playpath"); - return RD_FAILED; - } - -- if (protocol == RTMP_PROTOCOL_UNDEFINED) -+ if (protocol == RTMP_PROTOCOL_UNDEFINED && !fullUrl.av_len) - { - RTMP_Log(RTMP_LOGWARNING, - "You haven't specified a protocol (--protocol) or rtmp url (-r), using default protocol RTMP"); - protocol = RTMP_PROTOCOL_RTMP; - } -- if (port == -1) -+ if (port == -1 && !fullUrl.av_len) - { - RTMP_Log(RTMP_LOGWARNING, - "You haven't specified a port (--port) or rtmp url (-r), using default port 1935"); - port = 0; - } -- if (port == 0) -+ if (port == 0 && !fullUrl.av_len) - { - if (protocol & RTMP_FEATURE_SSL) - port = 443; -@@ -1185,9 +1192,20 @@ main(int argc, char **argv) - } - } - -- RTMP_SetupStream(&rtmp, protocol, &hostname, port, &sockshost, &playpath, -- &tcUrl, &swfUrl, &pageUrl, &app, &auth, &swfHash, swfSize, -- &flashVer, &subscribepath, &usherToken, dSeek, dStopOffset, bLiveStream, timeout); -+ if (!fullUrl.av_len) -+ { -+ RTMP_SetupStream(&rtmp, protocol, &hostname, port, &sockshost, &playpath, -+ &tcUrl, &swfUrl, &pageUrl, &app, &auth, &swfHash, swfSize, -+ &flashVer, &subscribepath, &usherToken, dSeek, dStopOffset, bLiveStream, timeout); -+ } -+ else -+ { -+ if (RTMP_SetupURL(&rtmp, fullUrl.av_val) == FALSE) -+ { -+ RTMP_Log(RTMP_LOGERROR, "Couldn't parse URL: %s", fullUrl.av_val); -+ return RD_FAILED; -+ } -+ } - - /* Try to keep the stream moving if it pauses on us */ - if (!bLiveStream && !bRealtimeStream && !(protocol & RTMP_FEATURE_HTTP)) --- -1.7.10.4 - - -From 3fcbcb9a0bae6de03401f32939d3d243cdd7b865 Mon Sep 17 00:00:00 2001 -From: Bastien Nocera <hadess@hadess.net> -Date: Thu, 19 Jul 2012 17:22:03 +0100 -Subject: [PATCH 37/64] Make rtmpgw handle full RTMP URLs with "-i" - -or --url. Just as rtmpdump and librtmp already can. - -diff --git a/rtmpgw.c b/rtmpgw.c -index 0cf56bb..ab255d4 100644 ---- a/rtmpgw.c -+++ b/rtmpgw.c -@@ -85,6 +85,7 @@ typedef struct - uint32_t bufferTime; - - char *rtmpurl; -+ AVal fullUrl; - AVal playpath; - AVal swfUrl; - AVal tcUrl; -@@ -469,14 +470,14 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou - } - - // do necessary checks right here to make sure the combined request of default values and GET parameters is correct -- if (!req.hostname.av_len) -+ if (!req.hostname.av_len && !req.fullUrl.av_len) - { - RTMP_Log(RTMP_LOGERROR, - "You must specify a hostname (--host) or url (-r \"rtmp://host[:port]/playpath\") containing a hostname"); - status = "400 Missing Hostname"; - goto filenotfound; - } -- if (req.playpath.av_len == 0) -+ if (req.playpath.av_len == 0 && !req.fullUrl.av_len) - { - RTMP_Log(RTMP_LOGERROR, - "You must specify a playpath (--playpath) or url (-r \"rtmp://host[:port]/playpath\") containing a playpath"); -@@ -484,19 +485,19 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou - goto filenotfound;; - } - -- if (req.protocol == RTMP_PROTOCOL_UNDEFINED) -+ if (req.protocol == RTMP_PROTOCOL_UNDEFINED && !req.fullUrl.av_len) - { - RTMP_Log(RTMP_LOGWARNING, - "You haven't specified a protocol (--protocol) or rtmp url (-r), using default protocol RTMP"); - req.protocol = RTMP_PROTOCOL_RTMP; - } -- if (req.rtmpport == -1) -+ if (req.rtmpport == -1 && !req.fullUrl.av_len) - { - RTMP_Log(RTMP_LOGWARNING, - "You haven't specified a port (--port) or rtmp url (-r), using default port"); - req.rtmpport = 0; - } -- if (req.rtmpport == 0) -+ if (req.rtmpport == 0 && !req.fullUrl.av_len) - { - if (req.protocol & RTMP_FEATURE_SSL) - req.rtmpport = 443; -@@ -552,9 +553,20 @@ void processTCPrequest(STREAMING_SERVER * server, // server socket and state (ou - RTMP_Log(RTMP_LOGDEBUG, "Setting buffer time to: %dms", req.bufferTime); - RTMP_Init(&rtmp); - RTMP_SetBufferMS(&rtmp, req.bufferTime); -- RTMP_SetupStream(&rtmp, req.protocol, &req.hostname, req.rtmpport, &req.sockshost, -- &req.playpath, &req.tcUrl, &req.swfUrl, &req.pageUrl, &req.app, &req.auth, &req.swfHash, req.swfSize, &req.flashVer, &req.subscribepath, &req.usherToken, dSeek, req.dStopOffset, -- req.bLiveStream, req.timeout); -+ if (!req.fullUrl.av_len) -+ { -+ RTMP_SetupStream(&rtmp, req.protocol, &req.hostname, req.rtmpport, &req.sockshost, -+ &req.playpath, &req.tcUrl, &req.swfUrl, &req.pageUrl, &req.app, &req.auth, &req.swfHash, req.swfSize, &req.flashVer, &req.subscribepath, &req.usherToken, dSeek, req.dStopOffset, -+ req.bLiveStream, req.timeout); -+ } -+ else -+ { -+ if (RTMP_SetupURL(&rtmp, req.fullUrl.av_val) == FALSE) -+ { -+ RTMP_Log(RTMP_LOGERROR, "Couldn't parse URL: %s", req.fullUrl.av_val); -+ return; -+ } -+ } - /* backward compatibility, we always sent this as true before */ - if (req.auth.av_len) - rtmp.Link.lFlags |= RTMP_LF_AUTH; -@@ -908,6 +920,9 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) - } - break; - } -+ case 'i': -+ STR2AVAL(req->fullUrl, optarg); -+ break; - case 's': - STR2AVAL(req->swfUrl, arg); - break; -@@ -993,6 +1008,7 @@ main(int argc, char **argv) - int opt; - struct option longopts[] = { - {"help", 0, NULL, 'h'}, -+ {"url", 1, NULL, 'i'}, - {"host", 1, NULL, 'n'}, - {"port", 1, NULL, 'c'}, - {"socks", 1, NULL, 'S'}, -@@ -1040,7 +1056,7 @@ main(int argc, char **argv) - - while ((opt = - getopt_long(argc, argv, -- "hvqVzr:s:t:p:a:f:u:n:c:l:y:m:d:D:A:B:T:g:w:x:W:X:S:j:", longopts, -+ "hvqVzr:s:t:i:p:a:f:u:n:c:l:y:m:d:D:A:B:T:g:w:x:W:X:S:j:", longopts, - NULL)) != -1) - { - switch (opt) -@@ -1050,6 +1066,8 @@ main(int argc, char **argv) - ("\nThis program serves media content streamed from RTMP onto HTTP.\n\n"); - RTMP_LogPrintf("--help|-h Prints this help screen.\n"); - RTMP_LogPrintf -+ ("--url|-i url URL with options included (e.g. rtmp://host[:port]/path swfUrl=url tcUrl=url)\n"); -+ RTMP_LogPrintf - ("--rtmp|-r url URL (e.g. rtmp://host[:port]/path)\n"); - RTMP_LogPrintf - ("--host|-n hostname Overrides the hostname in the rtmp url\n"); --- -1.7.10.4 - - -From 75a6167863bc415845b9130d6f8f437cbdc185f7 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 08:20:14 -0700 -Subject: [PATCH 38/64] Fix bogus optarg refs in prev commit - - -diff --git a/rtmpgw.c b/rtmpgw.c -index ab255d4..3e47602 100644 ---- a/rtmpgw.c -+++ b/rtmpgw.c -@@ -921,7 +921,7 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) - break; - } - case 'i': -- STR2AVAL(req->fullUrl, optarg); -+ STR2AVAL(req->fullUrl, arg); - break; - case 's': - STR2AVAL(req->swfUrl, arg); -@@ -942,7 +942,7 @@ ParseOption(char opt, char *arg, RTMP_REQUEST * req) - STR2AVAL(req->auth, arg); - break; - case 'C': -- parseAMF(&req->extras, optarg, &req->edepth); -+ parseAMF(&req->extras, arg, &req->edepth); - break; - case 'm': - req->timeout = atoi(arg); --- -1.7.10.4 - - -From dc1ddd3b3f567c036f6909af7f1bfdc135331439 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 08:28:15 -0700 -Subject: [PATCH 39/64] Fix rare infinite loop on EOF - -reported by Matt Robison <rtmpdump@nerdoftheherd.com> - -diff --git a/rtmpdump.c b/rtmpdump.c -index 2b30eb2..13741a7 100644 ---- a/rtmpdump.c -+++ b/rtmpdump.c -@@ -580,12 +580,14 @@ Download(RTMP * rtmp, // connected RTMP object - } - } - } --#ifdef _DEBUG - else - { -+#ifdef _DEBUG - RTMP_Log(RTMP_LOGDEBUG, "zero read!"); -- } - #endif -+ if (rtmp->m_read.status == RTMP_READ_EOF) -+ break; -+ } - - } - while (!RTMP_ctrlC && nRead > -1 && RTMP_IsConnected(rtmp) && !RTMP_IsTimedout(rtmp)); --- -1.7.10.4 - - -From a312ac7770207bd7d07725c1aef43725206e803a Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 08:41:49 -0700 -Subject: [PATCH 40/64] Fix compat with PolarSSL >= 1.1.0 - - -diff --git a/librtmp/dh.h b/librtmp/dh.h -index 9959532..fa264f8 100644 ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -29,6 +29,9 @@ - - #ifdef USE_POLARSSL - #include <polarssl/dhm.h> -+#if POLARSSL_VERSION_NUMBER < 0x01010100 -+#define havege_random havege_rand -+#endif - typedef mpi * MP_t; - #define MP_new(m) m = malloc(sizeof(mpi)); mpi_init(m) - #define MP_set_w(mpi, w) mpi_lset(mpi, w) -@@ -61,7 +64,7 @@ static int MDH_generate_key(MDH *dh) - MP_set(&dh->ctx.P, dh->p); - MP_set(&dh->ctx.G, dh->g); - dh->ctx.len = 128; -- dhm_make_public(&dh->ctx, 1024, out, 1, havege_rand, &RTMP_TLS_ctx->hs); -+ dhm_make_public(&dh->ctx, 1024, out, 1, havege_random, &RTMP_TLS_ctx->hs); - MP_new(dh->pub_key); - MP_new(dh->priv_key); - MP_set(dh->pub_key, &dh->ctx.GX); -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 52d0254..76a6b4f 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -33,6 +33,7 @@ - - #ifdef CRYPTO - #ifdef USE_POLARSSL -+#include <polarssl/version.h> - #include <polarssl/havege.h> - #elif defined(USE_GNUTLS) - #include <gnutls/gnutls.h> -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index c3fd4a6..1bf0735 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -61,9 +61,13 @@ - #include "rtmp.h" - - #ifdef USE_POLARSSL -+#include <polarssl/version.h> - #include <polarssl/net.h> - #include <polarssl/ssl.h> - #include <polarssl/havege.h> -+#if POLARSSL_VERSION_NUMBER < 0x01010100 -+#define havege_random havege_rand -+#endif - typedef struct tls_ctx { - havege_state hs; - ssl_session ssn; -@@ -71,7 +75,7 @@ typedef struct tls_ctx { - #define TLS_CTX tls_ctx * - #define TLS_client(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\ -- ssl_set_rng(s, havege_rand, &ctx->hs);\ -+ ssl_set_rng(s, havege_random, &ctx->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ - ssl_set_session(s, 1, 600, &ctx->ssn) - #define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd) --- -1.7.10.4 - - -From 1d07cfa60402ace8472f4661112595f1fe661913 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett <mjg59@srcf.ucam.org> -Date: Sun, 8 Jul 2012 16:26:14 -0400 -Subject: [PATCH 41/64] Fix socks support for SetupURL - -SetupURL assigns sockshost but never parses the data. This patch factors -the code out from SetupStream into a common function and adds it to -SetupURL. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 76a6b4f..682e3b8 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -321,6 +321,31 @@ static const char DEFAULT_FLASH_VER[] = DEF_VERSTR; - const AVal RTMP_DefaultFlashVer = - { (char *)DEFAULT_FLASH_VER, sizeof(DEFAULT_FLASH_VER) - 1 }; - -+static void -+SocksSetup(RTMP *r, AVal *sockshost) -+{ -+ if (sockshost->av_len) -+ { -+ const char *socksport = strchr(sockshost->av_val, ':'); -+ char *hostname = strdup(sockshost->av_val); -+ -+ if (socksport) -+ hostname[socksport - sockshost->av_val] = '\0'; -+ r->Link.sockshost.av_val = hostname; -+ r->Link.sockshost.av_len = strlen(hostname); -+ -+ r->Link.socksport = socksport ? atoi(socksport + 1) : 1080; -+ RTMP_Log(RTMP_LOGDEBUG, "Connecting via SOCKS proxy: %s:%d", r->Link.sockshost.av_val, -+ r->Link.socksport); -+ } -+ else -+ { -+ r->Link.sockshost.av_val = NULL; -+ r->Link.sockshost.av_len = 0; -+ r->Link.socksport = 0; -+ } -+} -+ - void - RTMP_SetupStream(RTMP *r, - int protocol, -@@ -385,26 +410,7 @@ RTMP_SetupStream(RTMP *r, - } - #endif - -- if (sockshost->av_len) -- { -- const char *socksport = strchr(sockshost->av_val, ':'); -- char *hostname = strdup(sockshost->av_val); -- -- if (socksport) -- hostname[socksport - sockshost->av_val] = '\0'; -- r->Link.sockshost.av_val = hostname; -- r->Link.sockshost.av_len = strlen(hostname); -- -- r->Link.socksport = socksport ? atoi(socksport + 1) : 1080; -- RTMP_Log(RTMP_LOGDEBUG, "Connecting via SOCKS proxy: %s:%d", r->Link.sockshost.av_val, -- r->Link.socksport); -- } -- else -- { -- r->Link.sockshost.av_val = NULL; -- r->Link.sockshost.av_len = 0; -- r->Link.socksport = 0; -- } -+ SocksSetup(r, sockshost); - - if (tcUrl && tcUrl->av_len) - r->Link.tcUrl = *tcUrl; -@@ -757,6 +763,8 @@ int RTMP_SetupURL(RTMP *r, char *url) - (unsigned char *)r->Link.SWFHash, r->Link.swfAge); - #endif - -+ SocksSetup(r, &r->Link.sockshost); -+ - if (r->Link.port == 0) - { - if (r->Link.protocol & RTMP_FEATURE_SSL) --- -1.7.10.4 - - -From b77a7dc719f8b04274db91f6344f4358a78d9c5f Mon Sep 17 00:00:00 2001 -From: goggle1 <goggle1@163.com> -Date: Tue, 30 Oct 2012 08:47:19 -0700 -Subject: [PATCH 42/64] Handle AMF_ECMA_ARRAY and AMF_STRICT_ARRAY objects - - -diff --git a/librtmp/amf.c b/librtmp/amf.c -index ce84f81..1406be4 100644 ---- a/librtmp/amf.c -+++ b/librtmp/amf.c -@@ -396,6 +396,14 @@ AMFProp_Encode(AMFObjectProperty *prop, char *pBuffer, char *pBufEnd) - pBuffer = AMF_Encode(&prop->p_vu.p_object, pBuffer, pBufEnd); - break; - -+ case AMF_ECMA_ARRAY: -+ pBuffer = AMF_EncodeEcmaArray(&prop->p_vu.p_object, pBuffer, pBufEnd); -+ break; -+ -+ case AMF_STRICT_ARRAY: -+ pBuffer = AMF_EncodeArray(&prop->p_vu.p_object, pBuffer, pBufEnd); -+ break; -+ - default: - RTMP_Log(RTMP_LOGERROR, "%s, invalid type. %d", __FUNCTION__, prop->p_type); - pBuffer = NULL; -@@ -700,7 +708,7 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - if (nRes == -1) - return -1; - nSize -= nRes; -- prop->p_type = AMF_OBJECT; -+ //prop->p_type = AMF_OBJECT; - break; - } - case AMF_OBJECT_END: -@@ -718,7 +726,7 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - if (nRes == -1) - return -1; - nSize -= nRes; -- prop->p_type = AMF_OBJECT; -+ //prop->p_type = AMF_OBJECT; - break; - } - case AMF_DATE: -@@ -815,6 +823,18 @@ AMFProp_Dump(AMFObjectProperty *prop) - AMF_Dump(&prop->p_vu.p_object); - return; - } -+ else if (prop->p_type == AMF_ECMA_ARRAY) -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "Property: <%sECMA_ARRAY>", strRes); -+ AMF_Dump(&prop->p_vu.p_object); -+ return; -+ } -+ else if (prop->p_type == AMF_STRICT_ARRAY) -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "Property: <%sSTRICT_ARRAY>", strRes); -+ AMF_Dump(&prop->p_vu.p_object); -+ return; -+ } - - switch (prop->p_type) - { -@@ -888,6 +908,76 @@ AMF_Encode(AMFObject *obj, char *pBuffer, char *pBufEnd) - return pBuffer; - } - -+char * -+AMF_EncodeEcmaArray(AMFObject *obj, char *pBuffer, char *pBufEnd) -+{ -+ int i; -+ -+ if (pBuffer+4 >= pBufEnd) -+ return NULL; -+ -+ *pBuffer++ = AMF_ECMA_ARRAY; -+ -+ pBuffer = AMF_EncodeInt32(pBuffer, pBufEnd, obj->o_num); -+ -+ for (i = 0; i < obj->o_num; i++) -+ { -+ char *res = AMFProp_Encode(&obj->o_props[i], pBuffer, pBufEnd); -+ if (res == NULL) -+ { -+ RTMP_Log(RTMP_LOGERROR, "AMF_Encode - failed to encode property in index %d", -+ i); -+ break; -+ } -+ else -+ { -+ pBuffer = res; -+ } -+ } -+ -+ if (pBuffer + 3 >= pBufEnd) -+ return NULL; /* no room for the end marker */ -+ -+ pBuffer = AMF_EncodeInt24(pBuffer, pBufEnd, AMF_OBJECT_END); -+ -+ return pBuffer; -+} -+ -+char * -+AMF_EncodeArray(AMFObject *obj, char *pBuffer, char *pBufEnd) -+{ -+ int i; -+ -+ if (pBuffer+4 >= pBufEnd) -+ return NULL; -+ -+ *pBuffer++ = AMF_STRICT_ARRAY; -+ -+ pBuffer = AMF_EncodeInt32(pBuffer, pBufEnd, obj->o_num); -+ -+ for (i = 0; i < obj->o_num; i++) -+ { -+ char *res = AMFProp_Encode(&obj->o_props[i], pBuffer, pBufEnd); -+ if (res == NULL) -+ { -+ RTMP_Log(RTMP_LOGERROR, "AMF_Encode - failed to encode property in index %d", -+ i); -+ break; -+ } -+ else -+ { -+ pBuffer = res; -+ } -+ } -+ -+ //if (pBuffer + 3 >= pBufEnd) -+ // return NULL; /* no room for the end marker */ -+ -+ //pBuffer = AMF_EncodeInt24(pBuffer, pBufEnd, AMF_OBJECT_END); -+ -+ return pBuffer; -+} -+ - int - AMF_DecodeArray(AMFObject *obj, const char *pBuffer, int nSize, - int nArrayLen, int bDecodeName) -diff --git a/librtmp/amf.h b/librtmp/amf.h -index b945beb..5a47d77 100644 ---- a/librtmp/amf.h -+++ b/librtmp/amf.h -@@ -104,6 +104,9 @@ extern "C" - double AMF_DecodeNumber(const char *data); - - char *AMF_Encode(AMFObject * obj, char *pBuffer, char *pBufEnd); -+ char *AMF_EncodeEcmaArray(AMFObject *obj, char *pBuffer, char *pBufEnd); -+ char *AMF_EncodeArray(AMFObject *obj, char *pBuffer, char *pBufEnd); -+ - int AMF_Decode(AMFObject * obj, const char *pBuffer, int nSize, - int bDecodeName); - int AMF_DecodeArray(AMFObject * obj, const char *pBuffer, int nSize, --- -1.7.10.4 - - -From 294135e6eafeb1ac338ac4bb11ebd5ef62c748b9 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 08:50:34 -0700 -Subject: [PATCH 43/64] Cleanup prev commit - - -diff --git a/librtmp/amf.c b/librtmp/amf.c -index 1406be4..563486c 100644 ---- a/librtmp/amf.c -+++ b/librtmp/amf.c -@@ -396,14 +396,14 @@ AMFProp_Encode(AMFObjectProperty *prop, char *pBuffer, char *pBufEnd) - pBuffer = AMF_Encode(&prop->p_vu.p_object, pBuffer, pBufEnd); - break; - -- case AMF_ECMA_ARRAY: -+ case AMF_ECMA_ARRAY: - pBuffer = AMF_EncodeEcmaArray(&prop->p_vu.p_object, pBuffer, pBufEnd); - break; -- -- case AMF_STRICT_ARRAY: -+ -+ case AMF_STRICT_ARRAY: - pBuffer = AMF_EncodeArray(&prop->p_vu.p_object, pBuffer, pBufEnd); - break; -- -+ - default: - RTMP_Log(RTMP_LOGERROR, "%s, invalid type. %d", __FUNCTION__, prop->p_type); - pBuffer = NULL; -@@ -708,7 +708,6 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - if (nRes == -1) - return -1; - nSize -= nRes; -- //prop->p_type = AMF_OBJECT; - break; - } - case AMF_OBJECT_END: -@@ -726,7 +725,6 @@ AMFProp_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize, - if (nRes == -1) - return -1; - nSize -= nRes; -- //prop->p_type = AMF_OBJECT; - break; - } - case AMF_DATE: -diff --git a/librtmp/amf.h b/librtmp/amf.h -index 5a47d77..5de414b 100644 ---- a/librtmp/amf.h -+++ b/librtmp/amf.h -@@ -106,7 +106,7 @@ extern "C" - char *AMF_Encode(AMFObject * obj, char *pBuffer, char *pBufEnd); - char *AMF_EncodeEcmaArray(AMFObject *obj, char *pBuffer, char *pBufEnd); - char *AMF_EncodeArray(AMFObject *obj, char *pBuffer, char *pBufEnd); -- -+ - int AMF_Decode(AMFObject * obj, const char *pBuffer, int nSize, - int bDecodeName); - int AMF_DecodeArray(AMFObject * obj, const char *pBuffer, int nSize, --- -1.7.10.4 - - -From d70c3f677d3d80763adf54c4e1329c57ed8af3ba Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Sun, 20 May 2012 23:36:57 +0300 -Subject: [PATCH 44/64] Allocate the RTMP struct dynamically - -This struct is over 1 MB in size, and doesn't fit on the stack -on OS X. - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index 9aa62f3..956abab 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -886,7 +886,7 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin - { - server->state = STREAMING_IN_PROGRESS; - -- RTMP rtmp = { 0 }; /* our session with the real client */ -+ RTMP *rtmp = RTMP_Alloc(); /* our session with the real client */ - RTMPPacket packet = { 0 }; - - // timeout for http requests -@@ -906,38 +906,39 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin - } - else - { -- RTMP_Init(&rtmp); -- rtmp.m_sb.sb_socket = sockfd; -- if (!RTMP_Serve(&rtmp)) -+ RTMP_Init(rtmp); -+ rtmp->m_sb.sb_socket = sockfd; -+ if (!RTMP_Serve(rtmp)) - { - RTMP_Log(RTMP_LOGERROR, "Handshake failed"); - goto cleanup; - } - } - server->arglen = 0; -- while (RTMP_IsConnected(&rtmp) && RTMP_ReadPacket(&rtmp, &packet)) -+ while (RTMP_IsConnected(rtmp) && RTMP_ReadPacket(rtmp, &packet)) - { - if (!RTMPPacket_IsReady(&packet)) - continue; -- ServePacket(server, &rtmp, &packet); -+ ServePacket(server, rtmp, &packet); - RTMPPacket_Free(&packet); - } - - cleanup: - RTMP_LogPrintf("Closing connection... "); -- RTMP_Close(&rtmp); -+ RTMP_Close(rtmp); - /* Should probably be done by RTMP_Close() ... */ -- rtmp.Link.playpath.av_val = NULL; -- rtmp.Link.tcUrl.av_val = NULL; -- rtmp.Link.swfUrl.av_val = NULL; -- rtmp.Link.pageUrl.av_val = NULL; -- rtmp.Link.app.av_val = NULL; -- rtmp.Link.flashVer.av_val = NULL; -- if (rtmp.Link.usherToken.av_val) -+ rtmp->Link.playpath.av_val = NULL; -+ rtmp->Link.tcUrl.av_val = NULL; -+ rtmp->Link.swfUrl.av_val = NULL; -+ rtmp->Link.pageUrl.av_val = NULL; -+ rtmp->Link.app.av_val = NULL; -+ rtmp->Link.flashVer.av_val = NULL; -+ if (rtmp->Link.usherToken.av_val) - { -- free(rtmp.Link.usherToken.av_val); -- rtmp.Link.usherToken.av_val = NULL; -+ free(rtmp->Link.usherToken.av_val); -+ rtmp->Link.usherToken.av_val = NULL; - } -+ RTMP_Free(rtmp); - RTMP_LogPrintf("done!\n\n"); - - quit: --- -1.7.10.4 - - -From f14b6ac18d779cfb1431c59344bd59a0b0445e08 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Sun, 20 May 2012 23:36:58 +0300 -Subject: [PATCH 45/64] Replace hardcoded constants and comments with proper - named constants - - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index 956abab..fc727bc 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -767,47 +767,40 @@ ServePacket(STREAMING_SERVER *server, RTMP *r, RTMPPacket *packet) - - switch (packet->m_packetType) - { -- case 0x01: -- // chunk size -+ case RTMP_PACKET_TYPE_CHUNK_SIZE: - // HandleChangeChunkSize(r, packet); - break; - -- case 0x03: -- // bytes read report -+ case RTMP_PACKET_TYPE_BYTES_READ_REPORT: - break; - -- case 0x04: -- // ctrl -+ case RTMP_PACKET_TYPE_CONTROL: - // HandleCtrl(r, packet); - break; - -- case 0x05: -- // server bw -+ case RTMP_PACKET_TYPE_SERVER_BW: - // HandleServerBW(r, packet); - break; - -- case 0x06: -- // client bw -+ case RTMP_PACKET_TYPE_CLIENT_BW: - // HandleClientBW(r, packet); - break; - -- case 0x08: -- // audio data -+ case RTMP_PACKET_TYPE_AUDIO: - //RTMP_Log(RTMP_LOGDEBUG, "%s, received: audio %lu bytes", __FUNCTION__, packet.m_nBodySize); - break; - -- case 0x09: -- // video data -+ case RTMP_PACKET_TYPE_VIDEO: - //RTMP_Log(RTMP_LOGDEBUG, "%s, received: video %lu bytes", __FUNCTION__, packet.m_nBodySize); - break; - -- case 0x0F: // flex stream send -+ case RTMP_PACKET_TYPE_FLEX_STREAM_SEND: - break; - -- case 0x10: // flex shared object -+ case RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT: - break; - -- case 0x11: // flex message -+ case RTMP_PACKET_TYPE_FLEX_MESSAGE: - { - RTMP_Log(RTMP_LOGDEBUG, "%s, flex message, size %u bytes, not fully supported", - __FUNCTION__, packet->m_nBodySize); -@@ -827,16 +820,13 @@ ServePacket(STREAMING_SERVER *server, RTMP *r, RTMPPacket *packet) - RTMP_Close(r); - break; - } -- case 0x12: -- // metadata (notify) -+ case RTMP_PACKET_TYPE_INFO: - break; - -- case 0x13: -- /* shared object */ -+ case RTMP_PACKET_TYPE_SHARED_OBJECT: - break; - -- case 0x14: -- // invoke -+ case RTMP_PACKET_TYPE_INVOKE: - RTMP_Log(RTMP_LOGDEBUG, "%s, received: invoke %u bytes", __FUNCTION__, - packet->m_nBodySize); - //RTMP_LogHex(packet.m_body, packet.m_nBodySize); -@@ -845,8 +835,7 @@ ServePacket(STREAMING_SERVER *server, RTMP *r, RTMPPacket *packet) - RTMP_Close(r); - break; - -- case 0x16: -- /* flv */ -+ case RTMP_PACKET_TYPE_FLASH_VIDEO: - break; - default: - RTMP_Log(RTMP_LOGDEBUG, "%s, unknown packet type received: 0x%02x", __FUNCTION__, --- -1.7.10.4 - - -From 6df3b1f2015f928d74a675bda542c354b893c2c2 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Tue, 30 Oct 2012 08:57:43 -0700 -Subject: [PATCH 46/64] Add functions for doing server side TLS initialization - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 682e3b8..cba8b6c 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -35,6 +35,19 @@ - #ifdef USE_POLARSSL - #include <polarssl/version.h> - #include <polarssl/havege.h> -+ -+static const char *my_dhm_P = -+ "E4004C1F94182000103D883A448B3F80" \ -+ "2CE4B44A83301270002C20D0321CFD00" \ -+ "11CCEF784C26A400F43DFB901BCA7538" \ -+ "F2C6B176001CF5A0FD16D2C48B1D0C1C" \ -+ "F6AC8E1DA6BCC3B4E1F96B0564965300" \ -+ "FFA1D0B601EB2800F489AA512C4B248C" \ -+ "01F76949A60BB7F00A40B1EAB64BDD48" \ -+ "E8A700D60B7F1200FA8E77B0A979DABF"; -+ -+static const char *my_dhm_G = "4"; -+ - #elif defined(USE_GNUTLS) - #include <gnutls/gnutls.h> - #else /* USE_OPENSSL */ -@@ -228,6 +241,82 @@ RTMP_TLS_Init() - #endif - } - -+void * -+RTMP_TLS_AllocServerContext(const char* cert, const char* key) -+{ -+ void *ctx = NULL; -+#ifdef CRYPTO -+ if (!RTMP_TLS_ctx) -+ RTMP_TLS_Init(); -+#ifdef USE_POLARSSL -+ tls_server_ctx *tc = ctx = calloc(1, sizeof(struct tls_server_ctx)); -+ tc->dhm_P = my_dhm_P; -+ tc->dhm_G = my_dhm_G; -+ tc->hs = &RTMP_TLS_ctx->hs; -+ if (x509parse_crtfile(&tc->cert, cert)) { -+ free(tc); -+ return NULL; -+ } -+ if (x509parse_keyfile(&tc->key, key, NULL)) { -+ x509_free(&tc->cert); -+ free(tc); -+ return NULL; -+ } -+#elif defined(USE_GNUTLS) && !defined(NO_SSL) -+ gnutls_certificate_allocate_credentials((gnutls_certificate_credentials*) &ctx); -+ if (gnutls_certificate_set_x509_key_file(ctx, cert, key, GNUTLS_X509_FMT_PEM) != 0) { -+ gnutls_certificate_free_credentials(ctx); -+ return NULL; -+ } -+#elif !defined(NO_SSL) /* USE_OPENSSL */ -+ ctx = SSL_CTX_new(SSLv23_server_method()); -+ FILE *f = fopen(key, "r"); -+ if (!f) { -+ SSL_CTX_free(ctx); -+ return NULL; -+ } -+ EVP_PKEY *k = PEM_read_PrivateKey(f, NULL, NULL, NULL); -+ fclose(f); -+ if (!k) { -+ SSL_CTX_free(ctx); -+ return NULL; -+ } -+ SSL_CTX_use_PrivateKey(ctx, k); -+ EVP_PKEY_free(k); -+ f = fopen(cert, "r"); -+ if (!f) { -+ SSL_CTX_free(ctx); -+ return NULL; -+ } -+ X509 *c = PEM_read_X509(f, NULL, NULL, NULL); -+ fclose(f); -+ if (!c) { -+ SSL_CTX_free(ctx); -+ return NULL; -+ } -+ SSL_CTX_use_certificate(ctx, c); -+ X509_free(c); -+#endif -+#endif -+ return ctx; -+} -+ -+void -+RTMP_TLS_FreeServerContext(void *ctx) -+{ -+#ifdef CRYPTO -+#ifdef USE_POLARSSL -+ x509_free(&((tls_server_ctx*)ctx)->cert); -+ rsa_free(&((tls_server_ctx*)ctx)->key); -+ free(ctx); -+#elif defined(USE_GNUTLS) && !defined(NO_SSL) -+ gnutls_certificate_free_credentials(ctx); -+#elif !defined(NO_SSL) /* USE_OPENSSL */ -+ SSL_CTX_free(ctx); -+#endif -+#endif -+} -+ - RTMP * - RTMP_Alloc() - { -@@ -868,6 +957,23 @@ RTMP_Connect0(RTMP *r, struct sockaddr * service) - } - - int -+RTMP_TLS_Accept(RTMP *r, void *ctx) -+{ -+#if defined(CRYPTO) && !defined(NO_SSL) -+ TLS_server(ctx, r->m_sb.sb_ssl); -+ TLS_setfd(r->m_sb.sb_ssl, r->m_sb.sb_socket); -+ if (TLS_accept(r->m_sb.sb_ssl) < 0) -+ { -+ RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__); -+ return FALSE; -+ } -+ return TRUE; -+#else -+ return FALSE; -+#endif -+} -+ -+int - RTMP_Connect1(RTMP *r, RTMPPacket *cp) - { - if (r->Link.protocol & RTMP_FEATURE_SSL) -diff --git a/librtmp/rtmp.h b/librtmp/rtmp.h -index 6b2ae5b..76e01fd 100644 ---- a/librtmp/rtmp.h -+++ b/librtmp/rtmp.h -@@ -307,6 +307,7 @@ extern "C" - int RTMP_Connect0(RTMP *r, struct sockaddr *svc); - int RTMP_Connect1(RTMP *r, RTMPPacket *cp); - int RTMP_Serve(RTMP *r); -+ int RTMP_TLS_Accept(RTMP *r, void *ctx); - - int RTMP_ReadPacket(RTMP *r, RTMPPacket *packet); - int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue); -@@ -329,6 +330,9 @@ extern "C" - void RTMP_Free(RTMP *r); - void RTMP_EnableWrite(RTMP *r); - -+ void *RTMP_TLS_AllocServerContext(const char* cert, const char* key); -+ void RTMP_TLS_FreeServerContext(void *ctx); -+ - int RTMP_LibVersion(void); - void RTMP_UserInterrupt(void); /* user typed Ctrl-C */ - -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 1bf0735..2cdb705 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -72,14 +72,30 @@ typedef struct tls_ctx { - havege_state hs; - ssl_session ssn; - } tls_ctx; -+typedef struct tls_server_ctx { -+ havege_state *hs; -+ x509_cert cert; -+ rsa_context key; -+ ssl_session ssn; -+ const char *dhm_P, *dhm_G; -+} tls_server_ctx; -+ - #define TLS_CTX tls_ctx * - #define TLS_client(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\ - ssl_set_rng(s, havege_random, &ctx->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ - ssl_set_session(s, 1, 600, &ctx->ssn) -+#define TLS_server(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ -+ ssl_set_endpoint(s, SSL_IS_SERVER); ssl_set_authmode(s, SSL_VERIFY_NONE);\ -+ ssl_set_rng(s, havege_rand, ((tls_server_ctx*)ctx)->hs);\ -+ ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ -+ ssl_set_session(s, 1, 600, &((tls_server_ctx*)ctx)->ssn);\ -+ ssl_set_own_cert(s, &((tls_server_ctx*)ctx)->cert, &((tls_server_ctx*)ctx)->key);\ -+ ssl_set_dh_param(s, ((tls_server_ctx*)ctx)->dhm_P, ((tls_server_ctx*)ctx)->dhm_G) - #define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd) - #define TLS_connect(s) ssl_handshake(s) -+#define TLS_accept(s) ssl_handshake(s) - #define TLS_read(s,b,l) ssl_read(s,(unsigned char *)b,l) - #define TLS_write(s,b,l) ssl_write(s,(unsigned char *)b,l) - #define TLS_shutdown(s) ssl_close_notify(s) -@@ -93,8 +109,10 @@ typedef struct tls_ctx { - } tls_ctx; - #define TLS_CTX tls_ctx * - #define TLS_client(ctx,s) gnutls_init((gnutls_session_t *)(&s), GNUTLS_CLIENT); gnutls_priority_set(s, ctx->prios); gnutls_credentials_set(s, GNUTLS_CRD_CERTIFICATE, ctx->cred) -+#define TLS_server(ctx,s) gnutls_init((gnutls_session_t *)(&s), GNUTLS_SERVER); gnutls_priority_set_direct(s, "NORMAL", NULL); gnutls_credentials_set(s, GNUTLS_CRD_CERTIFICATE, ctx) - #define TLS_setfd(s,fd) gnutls_transport_set_ptr(s, (gnutls_transport_ptr_t)(long)fd) - #define TLS_connect(s) gnutls_handshake(s) -+#define TLS_accept(s) gnutls_handshake(s) - #define TLS_read(s,b,l) gnutls_record_recv(s,b,l) - #define TLS_write(s,b,l) gnutls_record_send(s,b,l) - #define TLS_shutdown(s) gnutls_bye(s, GNUTLS_SHUT_RDWR) -@@ -103,8 +121,10 @@ typedef struct tls_ctx { - #else /* USE_OPENSSL */ - #define TLS_CTX SSL_CTX * - #define TLS_client(ctx,s) s = SSL_new(ctx) -+#define TLS_server(ctx,s) s = SSL_new(ctx) - #define TLS_setfd(s,fd) SSL_set_fd(s,fd) - #define TLS_connect(s) SSL_connect(s) -+#define TLS_accept(s) SSL_accept(s) - #define TLS_read(s,b,l) SSL_read(s,b,l) - #define TLS_write(s,b,l) SSL_write(s,b,l) - #define TLS_shutdown(s) SSL_shutdown(s) --- -1.7.10.4 - - -From 002ef6f6be2bbdf852ff64ab6981d709435a9045 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Sun, 20 May 2012 23:37:35 +0300 -Subject: [PATCH 47/64] Support rtmps in rtmpsrv - - -diff --git a/rtmpsrv.c b/rtmpsrv.c -index fc727bc..a9e9045 100644 ---- a/rtmpsrv.c -+++ b/rtmpsrv.c -@@ -92,6 +92,7 @@ typedef struct - } STREAMING_SERVER; - - STREAMING_SERVER *rtmpServer = 0; // server structure pointer -+void *sslCtx = NULL; - - STREAMING_SERVER *startStreaming(const char *address, int port); - void stopStreaming(STREAMING_SERVER * server); -@@ -897,6 +898,11 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin - { - RTMP_Init(rtmp); - rtmp->m_sb.sb_socket = sockfd; -+ if (sslCtx && !RTMP_TLS_Accept(rtmp, sslCtx)) -+ { -+ RTMP_Log(RTMP_LOGERROR, "TLS handshake failed"); -+ goto cleanup; -+ } - if (!RTMP_Serve(rtmp)) - { - RTMP_Log(RTMP_LOGERROR, "Handshake failed"); -@@ -1061,20 +1067,32 @@ int - main(int argc, char **argv) - { - int nStatus = RD_SUCCESS; -+ int i; - - // http streaming server - char DEFAULT_HTTP_STREAMING_DEVICE[] = "0.0.0.0"; // 0.0.0.0 is any device - - char *rtmpStreamingDevice = DEFAULT_HTTP_STREAMING_DEVICE; // streaming device, default 0.0.0.0 - int nRtmpStreamingPort = 1935; // port -+ char *cert = NULL, *key = NULL; - - RTMP_LogPrintf("RTMP Server %s\n", RTMPDUMP_VERSION); - RTMP_LogPrintf("(c) 2010 Andrej Stepanchuk, Howard Chu; license: GPL\n\n"); - - RTMP_debuglevel = RTMP_LOGINFO; - -- if (argc > 1 && !strcmp(argv[1], "-z")) -- RTMP_debuglevel = RTMP_LOGALL; -+ for (i = 1; i < argc; i++) -+ { -+ if (!strcmp(argv[i], "-z")) -+ RTMP_debuglevel = RTMP_LOGALL; -+ else if (!strcmp(argv[i], "-c") && i + 1 < argc) -+ cert = argv[++i]; -+ else if (!strcmp(argv[i], "-k") && i + 1 < argc) -+ key = argv[++i]; -+ } -+ -+ if (cert && key) -+ sslCtx = RTMP_TLS_AllocServerContext(cert, key); - - // init request - memset(&defaultRTMPRequest, 0, sizeof(RTMP_REQUEST)); -@@ -1118,6 +1136,9 @@ main(int argc, char **argv) - } - RTMP_Log(RTMP_LOGDEBUG, "Done, exiting..."); - -+ if (sslCtx) -+ RTMP_TLS_FreeServerContext(sslCtx); -+ - CleanupSockets(); - - #ifdef _DEBUG --- -1.7.10.4 - - -From 8e527f61afbcb72eb7d8ae1f507765cdc2df2785 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 21 May 2012 18:17:29 +0300 -Subject: [PATCH 48/64] Add null termination to buffers before using strstr - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index cba8b6c..83f3247 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3673,7 +3673,7 @@ RTMPSockBuf_Fill(RTMPSockBuf *sb) - - while (1) - { -- nBytes = sizeof(sb->sb_buf) - sb->sb_size - (sb->sb_start - sb->sb_buf); -+ nBytes = sizeof(sb->sb_buf) - 1 - sb->sb_size - (sb->sb_start - sb->sb_buf); - #if defined(CRYPTO) && !defined(NO_SSL) - if (sb->sb_ssl) - { -@@ -3852,6 +3852,7 @@ HTTP_read(RTMP *r, int fill) - return -2; - if (strncmp(r->m_sb.sb_start, "HTTP/1.1 200 ", 13)) - return -1; -+ r->m_sb.sb_start[r->m_sb.sb_size] = '\0'; - ptr = r->m_sb.sb_start + sizeof("HTTP/1.1 200"); - while ((ptr = strstr(ptr, "Content-"))) { - if (!strncasecmp(ptr+8, "length:", 7)) break; --- -1.7.10.4 - - -From 895392a7161ceb37ac32b3fb4a910b350361b13f Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 21 May 2012 18:17:30 +0300 -Subject: [PATCH 49/64] Buffer more data before returning successfully from - HTTP_read, if needed - -This fixes issues if the http header and the payload data -are sent in separate packets (as they normally are), and the -buffer contains the full header but none of the payload. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 83f3247..0d28666 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3846,6 +3846,7 @@ HTTP_read(RTMP *r, int fill) - char *ptr; - int hlen; - -+restart: - if (fill) - RTMPSockBuf_Fill(&r->m_sb); - if (r->m_sb.sb_size < 144) -@@ -3865,6 +3866,12 @@ HTTP_read(RTMP *r, int fill) - if (!ptr) - return -1; - ptr += 4; -+ if (ptr + (r->m_clientID.av_val ? 1 : hlen) > r->m_sb.sb_start + r->m_sb.sb_size) -+ { -+ if (fill) -+ goto restart; -+ return -2; -+ } - r->m_sb.sb_size -= ptr - r->m_sb.sb_start; - r->m_sb.sb_start = ptr; - r->m_unackd--; --- -1.7.10.4 - - -From 4ded9e053744e54286ab9af4e9657f5926a79a2c Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 21 May 2012 18:17:31 +0300 -Subject: [PATCH 50/64] Don't require 144 bytes to be buffered before - proceeding with HTTP_read - -This makes the code more flexible, if servers were to use -smaller headers. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 0d28666..21e2c18 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3849,11 +3849,20 @@ HTTP_read(RTMP *r, int fill) - restart: - if (fill) - RTMPSockBuf_Fill(&r->m_sb); -- if (r->m_sb.sb_size < 144) -+ if (r->m_sb.sb_size < 13) { -+ if (fill) -+ goto restart; - return -2; -+ } - if (strncmp(r->m_sb.sb_start, "HTTP/1.1 200 ", 13)) - return -1; - r->m_sb.sb_start[r->m_sb.sb_size] = '\0'; -+ if (!strstr(r->m_sb.sb_start, "\r\n\r\n")) { -+ if (fill) -+ goto restart; -+ return -2; -+ } -+ - ptr = r->m_sb.sb_start + sizeof("HTTP/1.1 200"); - while ((ptr = strstr(ptr, "Content-"))) { - if (!strncasecmp(ptr+8, "length:", 7)) break; --- -1.7.10.4 - - -From 91921dda7002ea8ffed9dfb74ad2913dfdd0b1ed Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 21 May 2012 18:17:32 +0300 -Subject: [PATCH 51/64] Refill if HTTP_read indicated it needs more data - -HTTP_read wants to skip past the first payload byte, so -it actually needs to have at least 144 + 1 bytes buffered. - -This also avoids relying on the magic 144 byte constant altogether, -which could easily break if servers include less reply headers. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 21e2c18..6183d20 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1403,9 +1403,11 @@ ReadN(RTMP *r, char *buffer, int n) - int nBytes = 0, nRead; - if (r->Link.protocol & RTMP_FEATURE_HTTP) - { -+ int refill = 0; - while (!r->m_resplen) - { -- if (r->m_sb.sb_size < 144) -+ int ret; -+ if (r->m_sb.sb_size < 13 || refill) - { - if (!r->m_unackd) - HTTP_Post(r, RTMPT_IDLE, "", 1); -@@ -1416,12 +1418,20 @@ ReadN(RTMP *r, char *buffer, int n) - return 0; - } - } -- if (HTTP_read(r, 0) == -1) -+ if ((ret = HTTP_read(r, 0)) == -1) - { - RTMP_Log(RTMP_LOGDEBUG, "%s, No valid HTTP response found", __FUNCTION__); - RTMP_Close(r); - return 0; - } -+ else if (ret == -2) -+ { -+ refill = 1; -+ } -+ else -+ { -+ refill = 0; -+ } - } - if (r->m_resplen && !r->m_sb.sb_size) - RTMPSockBuf_Fill(&r->m_sb); --- -1.7.10.4 - - -From 4a08069f086b68e99f33e931583148f4090960a3 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Mon, 21 May 2012 23:52:11 +0300 -Subject: [PATCH 52/64] Use CRLF newlines consistently for all HTTP POST - headers - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 6183d20..ab52c49 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -3835,8 +3835,8 @@ HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len) - int hlen = snprintf(hbuf, sizeof(hbuf), "POST /%s%s/%d HTTP/1.1\r\n" - "Host: %.*s:%d\r\n" - "Accept: */*\r\n" -- "User-Agent: Shockwave Flash\n" -- "Connection: Keep-Alive\n" -+ "User-Agent: Shockwave Flash\r\n" -+ "Connection: Keep-Alive\r\n" - "Cache-Control: no-cache\r\n" - "Content-type: application/x-fcs\r\n" - "Content-length: %d\r\n\r\n", RTMPT_cmds[cmd], --- -1.7.10.4 - - -From 0fb1d9936fb25f0755bb8b4afc95db048efe4526 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Wed, 30 May 2012 22:06:57 +0300 -Subject: [PATCH 53/64] Free skipped packets in RTMP_GetNextMediaPacket - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index ab52c49..d35b58a 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1206,6 +1206,7 @@ RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet) - packet->m_nTimeStamp, packet->m_hasAbsTimestamp, - r->m_mediaStamp); - #endif -+ RTMPPacket_Free(packet); - continue; - } - r->m_pausing = 0; --- -1.7.10.4 - - -From a9282329c3be3bb95f31137867fad9920b682d6d Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Wed, 30 May 2012 22:07:23 +0300 -Subject: [PATCH 54/64] Allocate the channel arrays dynamically - -This avoids having to allocate space for all theoretical channels -if most of them aren't used. This drops the size of the full -RTMP struct from over 1200 KB to 16 KB (on 64 bit), and as long as -only channels with a low number are used, the amount of total -allocated memory stays far below what it was before. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index d35b58a..6f6e97b 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -1216,7 +1216,8 @@ RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet) - if (bHasMediaPacket) - r->m_bPlaying = TRUE; - else if (r->m_sb.sb_timedout && !r->m_pausing) -- r->m_pauseStamp = r->m_channelTimestamp[r->m_mediaChannel]; -+ r->m_pauseStamp = r->m_mediaChannel < r->m_channelsAllocatedIn ? -+ r->m_channelTimestamp[r->m_mediaChannel] : 0; - - return bHasMediaPacket; - } -@@ -1998,7 +1999,8 @@ RTMP_SendPause(RTMP *r, int DoPause, int iTime) - int RTMP_Pause(RTMP *r, int DoPause) - { - if (DoPause) -- r->m_pauseStamp = r->m_channelTimestamp[r->m_mediaChannel]; -+ r->m_pauseStamp = r->m_mediaChannel < r->m_channelsAllocatedIn ? -+ r->m_channelTimestamp[r->m_mediaChannel] : 0; - return RTMP_SendPause(r, DoPause, r->m_pauseStamp); - } - -@@ -2953,7 +2955,8 @@ HandleCtrl(RTMP *r, const RTMPPacket *packet) - break; - if (!r->m_pausing) - { -- r->m_pauseStamp = r->m_channelTimestamp[r->m_mediaChannel]; -+ r->m_pauseStamp = r->m_mediaChannel < r->m_channelsAllocatedIn ? -+ r->m_channelTimestamp[r->m_mediaChannel] : 0; - RTMP_SendPause(r, TRUE, r->m_pauseStamp); - r->m_pausing = 1; - } -@@ -3098,6 +3101,26 @@ RTMP_ReadPacket(RTMP *r, RTMPPacket *packet) - - nSize = packetSize[packet->m_headerType]; - -+ if (packet->m_nChannel >= r->m_channelsAllocatedIn) -+ { -+ int n = packet->m_nChannel + 10; -+ int *timestamp = realloc(r->m_channelTimestamp, sizeof(int) * n); -+ RTMPPacket **packets = realloc(r->m_vecChannelsIn, sizeof(RTMPPacket*) * n); -+ if (!timestamp) -+ free(r->m_channelTimestamp); -+ if (!packets) -+ free(r->m_vecChannelsIn); -+ r->m_channelTimestamp = timestamp; -+ r->m_vecChannelsIn = packets; -+ if (!timestamp || !packets) { -+ r->m_channelsAllocatedIn = 0; -+ return FALSE; -+ } -+ memset(r->m_channelTimestamp + r->m_channelsAllocatedIn, 0, sizeof(int) * (n - r->m_channelsAllocatedIn)); -+ memset(r->m_vecChannelsIn + r->m_channelsAllocatedIn, 0, sizeof(RTMPPacket*) * (n - r->m_channelsAllocatedIn)); -+ r->m_channelsAllocatedIn = n; -+ } -+ - if (nSize == RTMP_LARGE_HEADER_SIZE) /* if we get a full header the timestamp is absolute */ - packet->m_hasAbsTimestamp = TRUE; - -@@ -3373,7 +3396,7 @@ RTMP_SendChunk(RTMP *r, RTMPChunk *chunk) - int - RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue) - { -- const RTMPPacket *prevPacket = r->m_vecChannelsOut[packet->m_nChannel]; -+ const RTMPPacket *prevPacket; - uint32_t last = 0; - int nSize; - int hSize, cSize; -@@ -3383,6 +3406,22 @@ RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue) - int nChunkSize; - int tlen; - -+ if (packet->m_nChannel >= r->m_channelsAllocatedOut) -+ { -+ int n = packet->m_nChannel + 10; -+ RTMPPacket **packets = realloc(r->m_vecChannelsOut, sizeof(RTMPPacket*) * n); -+ if (!packets) { -+ free(r->m_vecChannelsOut); -+ r->m_vecChannelsOut = NULL; -+ r->m_channelsAllocatedOut = 0; -+ return FALSE; -+ } -+ r->m_vecChannelsOut = packets; -+ memset(r->m_vecChannelsOut + r->m_channelsAllocatedOut, 0, sizeof(RTMPPacket*) * (n - r->m_channelsAllocatedOut)); -+ r->m_channelsAllocatedOut = n; -+ } -+ -+ prevPacket = r->m_vecChannelsOut[packet->m_nChannel]; - if (prevPacket && packet->m_headerType != RTMP_PACKET_SIZE_LARGE) - { - /* compress a bit by using the prev packet's attributes */ -@@ -3619,7 +3658,7 @@ RTMP_Close(RTMP *r) - r->m_write.m_nBytesRead = 0; - RTMPPacket_Free(&r->m_write); - -- for (i = 0; i < RTMP_CHANNELS; i++) -+ for (i = 0; i < r->m_channelsAllocatedIn; i++) - { - if (r->m_vecChannelsIn[i]) - { -@@ -3627,12 +3666,23 @@ RTMP_Close(RTMP *r) - free(r->m_vecChannelsIn[i]); - r->m_vecChannelsIn[i] = NULL; - } -+ } -+ free(r->m_vecChannelsIn); -+ r->m_vecChannelsIn = NULL; -+ free(r->m_channelTimestamp); -+ r->m_channelTimestamp = NULL; -+ r->m_channelsAllocatedIn = 0; -+ for (i = 0; i < r->m_channelsAllocatedOut; i++) -+ { - if (r->m_vecChannelsOut[i]) - { - free(r->m_vecChannelsOut[i]); - r->m_vecChannelsOut[i] = NULL; - } - } -+ free(r->m_vecChannelsOut); -+ r->m_vecChannelsOut = NULL; -+ r->m_channelsAllocatedOut = 0; - AV_clear(r->m_methodCalls, r->m_numCalls); - r->m_methodCalls = NULL; - r->m_numCalls = 0; -diff --git a/librtmp/rtmp.h b/librtmp/rtmp.h -index 76e01fd..8cb6e45 100644 ---- a/librtmp/rtmp.h -+++ b/librtmp/rtmp.h -@@ -253,9 +253,11 @@ extern "C" - int m_numCalls; - RTMP_METHOD *m_methodCalls; /* remote method calls queue */ - -- RTMPPacket *m_vecChannelsIn[RTMP_CHANNELS]; -- RTMPPacket *m_vecChannelsOut[RTMP_CHANNELS]; -- int m_channelTimestamp[RTMP_CHANNELS]; /* abs timestamp of last packet */ -+ int m_channelsAllocatedIn; -+ int m_channelsAllocatedOut; -+ RTMPPacket **m_vecChannelsIn; -+ RTMPPacket **m_vecChannelsOut; -+ int *m_channelTimestamp; /* abs timestamp of last packet */ - - double m_fAudioCodecs; /* audioCodecs for the connect packet */ - double m_fVideoCodecs; /* videoCodecs for the connect packet */ --- -1.7.10.4 - - -From 630c8db7d1ee2889d0c26a77d95050c01caf5d5a Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Tue, 30 Oct 2012 09:09:25 -0700 -Subject: [PATCH 55/64] Add adobe authentication support - -From: Sergiy <piratfm@gmail.com> - -To use this, add flashver=FMLE/3.0\20(compatible;\20FMSc/1.0) -and pubUser=<username> pubUser=<password> to the RTMP url. - -This should both work for generic adobe authentication, and for -publishing to akamai. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 6f6e97b..391a3b4 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -27,6 +27,7 @@ - #include <stdlib.h> - #include <string.h> - #include <assert.h> -+#include <time.h> - - #include "rtmp_sys.h" - #include "log.h" -@@ -35,6 +36,9 @@ - #ifdef USE_POLARSSL - #include <polarssl/version.h> - #include <polarssl/havege.h> -+#include <polarssl/md5.h> -+#include <polarssl/base64.h> -+#define MD5_DIGEST_LENGTH 16 - - static const char *my_dhm_P = - "E4004C1F94182000103D883A448B3F80" \ -@@ -50,9 +54,15 @@ static const char *my_dhm_G = "4"; - - #elif defined(USE_GNUTLS) - #include <gnutls/gnutls.h> -+#define MD5_DIGEST_LENGTH 16 -+#include <nettle/base64.h> -+#include <nettle/md5.h> - #else /* USE_OPENSSL */ - #include <openssl/ssl.h> - #include <openssl/rc4.h> -+#include <openssl/md5.h> -+#include <openssl/bio.h> -+#include <openssl/buffer.h> - #endif - TLS_CTX RTMP_TLS_ctx; - #endif -@@ -595,6 +605,10 @@ static struct urlopt { - "Buffer time in milliseconds" }, - { AVC("timeout"), OFF(Link.timeout), OPT_INT, 0, - "Session timeout in seconds" }, -+ { AVC("pubUser"), OFF(Link.pubUser), OPT_STR, 0, -+ "Publisher username" }, -+ { AVC("pubPasswd"), OFF(Link.pubPasswd), OPT_STR, 0, -+ "Publisher password" }, - { {NULL,0}, 0, 0} - }; - -@@ -2433,6 +2447,239 @@ AV_clear(RTMP_METHOD *vals, int num) - free(vals); - } - -+ -+#ifdef CRYPTO -+static int -+b64enc(const unsigned char *input, int length, char *output, int maxsize) -+{ -+#ifdef USE_POLARSSL -+ int buf_size = maxsize; -+ if(base64_encode((unsigned char *) output, &buf_size, input, length) == 0) -+ { -+ output[buf_size] = '\0'; -+ return 1; -+ } -+ else -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "%s, error", __FUNCTION__); -+ return 0; -+ } -+#elif defined(USE_GNUTLS) -+ if (BASE64_ENCODE_RAW_LENGTH(length) <= maxsize) -+ base64_encode_raw((uint8_t*) output, length, input); -+ else -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "%s, error", __FUNCTION__); -+ return 0; -+ } -+#else /* USE_OPENSSL */ -+ BIO *bmem, *b64; -+ BUF_MEM *bptr; -+ -+ b64 = BIO_new(BIO_f_base64()); -+ bmem = BIO_new(BIO_s_mem()); -+ b64 = BIO_push(b64, bmem); -+ BIO_write(b64, input, length); -+ if (BIO_flush(b64) == 1) -+ { -+ BIO_get_mem_ptr(b64, &bptr); -+ memcpy(output, bptr->data, bptr->length-1); -+ output[bptr->length-1] = '\0'; -+ } -+ else -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "%s, error", __FUNCTION__); -+ return 0; -+ } -+ BIO_free_all(b64); -+#endif -+ return 1; -+} -+ -+#ifdef USE_POLARSSL -+#define md5sum(x,y,z) md5(x,y,z); -+#elif defined(USE_GNUTLS) -+static void md5sum(const unsigned char *data, int len, unsigned char *out) -+{ -+ struct md5_ctx ctx; -+ md5_init(&ctx); -+ md5_update(&ctx, len, data); -+ md5_digest(&ctx, MD5_DIGEST_LENGTH, out); -+} -+#else -+#define md5sum(x,y,z) MD5(x,y,z); -+#endif -+ -+static const AVal av_authmod_adobe = AVC("authmod=adobe"); -+ -+static int -+PublisherAuth(RTMP *r, AVal *description) -+{ -+ char *token_in = NULL; -+ char *ptr; -+ unsigned char md5sum_val[MD5_DIGEST_LENGTH+1]; -+ int challenge2_data; -+#define RESPONSE_LEN 32 -+#define CHALLENGE2_LEN 16 -+#define SALTED2_LEN (32+8+8+8) -+ char response[RESPONSE_LEN]; -+ char challenge2[CHALLENGE2_LEN]; -+ char salted2[SALTED2_LEN]; -+ AVal pubToken; -+ -+ if (strstr(description->av_val, av_authmod_adobe.av_val) != NULL) -+ { -+ if(strstr(description->av_val, "code=403 need auth") != NULL) -+ { -+ 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); -+ pubToken.av_len = sprintf(pubToken.av_val, "?%s&user=%s", -+ 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; -+ } -+ } -+ else if((token_in = strstr(description->av_val, "?reason=needauth")) != NULL) -+ { -+ char *par, *val = NULL, *orig_ptr; -+ char *user = NULL; -+ char *salt = NULL; -+ char *opaque = NULL; -+ char *challenge = NULL; -+ char *salted1; -+ -+ ptr = orig_ptr = strdup(token_in); -+ while (ptr) -+ { -+ par = ptr; -+ ptr = strchr(par, '&'); -+ if(ptr) -+ *ptr++ = '\0'; -+ -+ val = strchr(par, '='); -+ if(val) -+ *val++ = '\0'; -+ -+ if (strcmp(par, "user") == 0){ -+ user = val; -+ } else if (strcmp(par, "salt") == 0){ -+ salt = val; -+ } else if (strcmp(par, "opaque") == 0){ -+ opaque = val; -+ } else if (strcmp(par, "challenge") == 0){ -+ challenge = val; -+ } -+ -+ RTMP_Log(RTMP_LOGDEBUG, "%s, par:\"%s\" = val:\"%s\"", __FUNCTION__, par, val); -+ } -+ -+ /* hash1 = base64enc(md5(user + _aodbeAuthSalt + password)) */ -+ salted1 = malloc(strlen(user)+strlen(salt)+r->Link.pubPasswd.av_len+1); -+ strcpy(salted1, user); -+ strcat(salted1, salt); -+ strcat(salted1, r->Link.pubPasswd.av_val); -+ md5sum((unsigned char*) salted1, strlen(salted1), md5sum_val); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, salted1); -+ free(salted1); -+ -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -+ -+ b64enc(md5sum_val, MD5_DIGEST_LENGTH, salted2, SALTED2_LEN); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, b64(md5_1) = %s", __FUNCTION__, salted2); -+ -+ srand( time(NULL) ); -+ challenge2_data = rand(); -+ -+ b64enc((unsigned char *) &challenge2_data, sizeof(int), challenge2, CHALLENGE2_LEN); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, b64(%d) = %s", __FUNCTION__, challenge2_data, challenge2); -+ -+ /* response = base64enc(md5(hash1 + opaque + challenge2)) */ -+ if (opaque) -+ strcat(salted2, opaque); -+ if (challenge) -+ strcat(salted2, challenge); -+ strcat(salted2, challenge2); -+ -+ md5sum((unsigned char*) salted2, strlen(salted2), md5sum_val); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, salted2); -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -+ -+ b64enc(md5sum_val, MD5_DIGEST_LENGTH, response, RESPONSE_LEN); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, b64(md5_2) = %s", __FUNCTION__, response); -+ -+ /* have all hashes, create auth token for the end of app */ -+ pubToken.av_val = malloc(32 + strlen(challenge2) + strlen(response) + (opaque ? strlen(opaque) : 0)); -+ pubToken.av_len = sprintf(pubToken.av_val, -+ "&challenge=%s&response=%s&opaque=%s", -+ challenge2, -+ response, -+ opaque ? opaque : ""); -+ 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; -+ } -+ -+ ptr = malloc(r->Link.app.av_len + pubToken.av_len); -+ 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) -+ free(r->Link.app.av_val); -+ r->Link.app.av_val = ptr; -+ -+ ptr = malloc(r->Link.tcUrl.av_len + pubToken.av_len); -+ 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) -+ free(r->Link.tcUrl.av_val); -+ r->Link.tcUrl.av_val = ptr; -+ -+ free(pubToken.av_val); -+ r->Link.pFlags |= RTMP_PUB_ALLOC; -+ -+ RTMP_Log(RTMP_LOGDEBUG, "%s, new app: %.*s tcUrl: %.*s playpath: %s", __FUNCTION__, -+ r->Link.app.av_len, r->Link.app.av_val, -+ r->Link.tcUrl.av_len, r->Link.tcUrl.av_val, -+ r->Link.playpath.av_val); -+ } -+ else -+ { -+ return 0; -+ } -+ return 1; -+} -+#endif -+ -+ - SAVC(onBWDone); - SAVC(onFCSubscribe); - SAVC(onFCUnsubscribe); -@@ -2442,6 +2689,7 @@ SAVC(_error); - SAVC(close); - SAVC(code); - SAVC(level); -+SAVC(description); - SAVC(onStatus); - SAVC(playlist_ready); - static const AVal av_NetStream_Failed = AVC("NetStream.Failed"); -@@ -2460,6 +2708,8 @@ AVC("NetStream.Play.PublishNotify"); - static const AVal av_NetStream_Play_UnpublishNotify = - AVC("NetStream.Play.UnpublishNotify"); - static const AVal av_NetStream_Publish_Start = AVC("NetStream.Publish.Start"); -+static const AVal av_NetConnection_Connect_Rejected = -+AVC("NetConnection.Connect.Rejected"); - - /* Returns 0 for OK/Failed/error, 1 for 'Stop or Complete' */ - static int -@@ -2601,12 +2851,73 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) - } - else if (AVMATCH(&method, &av__error)) - { -+#ifdef CRYPTO -+ AVal methodInvoked = {0}; -+ int i; -+ -+ if (r->Link.protocol & RTMP_FEATURE_WRITE) -+ { -+ for (i=0; i<r->m_numCalls; i++) -+ { -+ if (r->m_methodCalls[i].num == txn) -+ { -+ methodInvoked = r->m_methodCalls[i].name; -+ AV_erase(r->m_methodCalls, &r->m_numCalls, i, FALSE); -+ break; -+ } -+ } -+ if (!methodInvoked.av_val) -+ { -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received result id %f without matching request", -+ __FUNCTION__, txn); -+ goto leave; -+ } -+ -+ RTMP_Log(RTMP_LOGDEBUG, "%s, received error for method call <%s>", __FUNCTION__, -+ methodInvoked.av_val); -+ -+ if (AVMATCH(&methodInvoked, &av_connect)) -+ { -+ AMFObject obj2; -+ AVal code, level, description; -+ AMFProp_GetObject(AMF_GetProp(&obj, NULL, 3), &obj2); -+ AMFProp_GetString(AMF_GetProp(&obj2, &av_code, -1), &code); -+ AMFProp_GetString(AMF_GetProp(&obj2, &av_level, -1), &level); -+ 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); -+ } -+ } -+ else -+ { -+ RTMP_Log(RTMP_LOGERROR, "rtmp server sent error"); -+ } -+ free(methodInvoked.av_val); -+#else - RTMP_Log(RTMP_LOGERROR, "rtmp server sent error"); -+#endif - } - else if (AVMATCH(&method, &av_close)) - { - 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)) - { -@@ -3695,9 +4006,6 @@ RTMP_Close(RTMP *r) - r->m_resplen = 0; - r->m_unackd = 0; - -- free(r->Link.playpath0.av_val); -- r->Link.playpath0.av_val = NULL; -- - if (r->Link.lFlags & RTMP_LF_FTCU) - { - free(r->Link.tcUrl.av_val); -@@ -3706,6 +4014,20 @@ RTMP_Close(RTMP *r) - } - - #ifdef CRYPTO -+ if (!(r->Link.protocol & RTMP_FEATURE_WRITE) || (r->Link.pFlags & RTMP_PUB_CLEAN)) -+ { -+ 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; -+ } - if (r->Link.dh) - { - MDH_free(r->Link.dh); -@@ -3721,6 +4043,9 @@ RTMP_Close(RTMP *r) - RC4_free(r->Link.rc4keyOut); - r->Link.rc4keyOut = NULL; - } -+#else -+ free(r->Link.playpath0.av_val); -+ r->Link.playpath0.av_val = NULL; - #endif - } - -diff --git a/librtmp/rtmp.h b/librtmp/rtmp.h -index 8cb6e45..d723070 100644 ---- a/librtmp/rtmp.h -+++ b/librtmp/rtmp.h -@@ -157,6 +157,8 @@ extern "C" - AVal subscribepath; - AVal usherToken; - AVal token; -+ AVal pubUser; -+ AVal pubPasswd; - AMFObject extras; - int edepth; - -@@ -176,6 +178,13 @@ extern "C" - 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; -+ - unsigned short socksport; - unsigned short port; - --- -1.7.10.4 - - -From 9ecf540e4d5bdc85c17668fa7ead93cc375111ca Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Bj=C3=B6rn=20Axelsson?= <bjorn.axelsson@intinor.se> -Date: Tue, 20 Mar 2012 19:12:23 +0200 -Subject: [PATCH 56/64] Add support for limelight authentication - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 391a3b4..5ea1c76 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2511,6 +2511,18 @@ static void md5sum(const unsigned char *data, int len, unsigned char *out) - #endif - - static const AVal av_authmod_adobe = AVC("authmod=adobe"); -+static const AVal av_authmod_llnw = AVC("authmod=llnw"); -+ -+static char *hexenc(unsigned char *inbuf, int len) -+{ -+ char *dst = malloc(len * 2 + 1), *ptr = dst; -+ while(len--) { -+ sprintf(ptr, "%02x", *inbuf++); -+ ptr += 2; -+ } -+ *ptr = '\0'; -+ return dst; -+} - - static int - PublisherAuth(RTMP *r, AVal *description) -@@ -2671,6 +2683,178 @@ PublisherAuth(RTMP *r, AVal *description) - r->Link.tcUrl.av_len, r->Link.tcUrl.av_val, - r->Link.playpath.av_val); - } -+ else if (strstr(description->av_val, av_authmod_llnw.av_val) != NULL) -+ { -+ if(strstr(description->av_val, "code=403 need auth") != NULL) -+ { -+ /* This part seems to be the same for llnw and adobe */ -+ -+ 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); -+ pubToken.av_len = sprintf(pubToken.av_val, "?%s&user=%s", -+ 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; -+ } -+ } -+ else if((token_in = strstr(description->av_val, "?reason=needauth")) != NULL) -+ { -+ char *orig_ptr; -+ char *par, *val = NULL; -+ char *user = NULL; -+ char *nonce = NULL; -+ -+ ptr = orig_ptr = strdup(token_in); -+ /* Extract parameters (we need user and nonce) */ -+ while (ptr) -+ { -+ par = ptr; -+ ptr = strchr(par, '&'); -+ if(ptr) -+ *ptr++ = '\0'; -+ -+ val = strchr(par, '='); -+ if(val) -+ *val++ = '\0'; -+ -+ if (strcmp(par, "user") == 0){ -+ user = val; -+ } else if (strcmp(par, "nonce") == 0){ -+ nonce = val; -+ } -+ -+ RTMP_Log(RTMP_LOGDEBUG, "%s, par:\"%s\" = val:\"%s\"", __FUNCTION__, par, val); -+ } -+ -+ // FIXME: handle case where user==NULL or nonce==NULL -+ -+ /* llnw auth method -+ * Seems to be closely based on HTTP Digest Auth: -+ * http://tools.ietf.org/html/rfc2617 -+ * http://en.wikipedia.org/wiki/Digest_access_authentication -+ */ -+ -+ const char *authmod = "llnw"; -+ const char *realm = "live"; -+ const char *method = "publish"; -+ const char *qop = "auth"; -+ char *tmpbuf; -+ -+ /* nc = 1..connection count (or rather, number of times cnonce has been reused) */ -+ int nc = 1; -+ /* nchex = hexenc(nc) (8 hex digits according to RFC 2617) */ -+ char nchex[9]; -+ sprintf(nchex, "%08x", nc); -+ /* cnonce = hexenc(4 random bytes) (initialized on first connection) */ -+ char cnonce[9]; -+ srand( time(NULL) ); // FIXME: a lib shouldn't call srand() -+ sprintf(cnonce, "%08x", rand()); -+ -+ /* hash1 = hexenc(md5(user + ":" + realm + ":" + password)) */ -+ tmpbuf = malloc(strlen(user) + 1 + strlen(realm) + 1 + r->Link.pubPasswd.av_len + 1); -+ sprintf(tmpbuf, "%s:%s:%s", user, realm, r->Link.pubPasswd.av_val); -+ md5sum((unsigned char*)tmpbuf, strlen(tmpbuf), md5sum_val); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, tmpbuf); -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -+ free(tmpbuf); -+ char *hash1 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ -+ /* hash2 = hexenc(md5(method + ":/" + app + "/" + appInstance)) */ -+ /* Extract appname + appinstance without query parameters */ -+ char *apptmp = malloc(r->Link.app.av_len + 1), *qpos; -+ memcpy(apptmp, r->Link.app.av_val, r->Link.app.av_len); -+ apptmp[r->Link.app.av_len] = '\0'; -+ if((qpos = strchr(apptmp, '?'))) -+ *qpos = '\0'; -+ -+ tmpbuf = malloc(strlen(method) + 2 + strlen(apptmp) + 1); -+ sprintf(tmpbuf, "%s:/%s", method, apptmp); -+ md5sum((unsigned char*)tmpbuf, strlen(tmpbuf), md5sum_val); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, tmpbuf); -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -+ free(tmpbuf); -+ char *hash2 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ -+ free(apptmp); -+ -+ /* hash3 = hexenc(md5(hash1 + ":" + nonce + ":" + nchex + ":" + cnonce + ":" + qop + ":" + hash2)) */ -+ tmpbuf = malloc(strlen(hash1) + 1 + strlen(nonce) + 1 + strlen(nchex) + 1 + strlen(cnonce) + 1 + strlen(qop) + 1 + strlen(hash2) + 1); -+ sprintf(tmpbuf, "%s:%s:%s:%s:%s:%s", hash1, nonce, nchex, cnonce, qop, hash2); -+ md5sum((unsigned char*)tmpbuf, strlen(tmpbuf), md5sum_val); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, tmpbuf); -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -+ free(tmpbuf); -+ char *hash3 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ -+ /* pubToken = &authmod=<authmod>&user=<username>&nonce=<nonce>&cnonce=<cnonce>&nc=<nchex>&response=<hash3> */ -+ /* Append nonces and response to query string which already contains -+ * user + authmod */ -+ pubToken.av_val = malloc(64 + strlen(authmod) + strlen(user) + strlen(nonce) + strlen(cnonce) + strlen(nchex) + strlen(hash3)); -+ sprintf(pubToken.av_val, -+ "&nonce=%s&cnonce=%s&nc=%s&response=%s", -+ nonce, 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(hash1); -+ free(hash2); -+ free(hash3); -+ 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; -+ } -+ -+ ptr = malloc(r->Link.app.av_len + pubToken.av_len); -+ 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) -+ free(r->Link.app.av_val); -+ r->Link.app.av_val = ptr; -+ -+ ptr = malloc(r->Link.tcUrl.av_len + pubToken.av_len); -+ 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) -+ free(r->Link.tcUrl.av_val); -+ r->Link.tcUrl.av_val = ptr; -+ -+ free(pubToken.av_val); -+ r->Link.pFlags |= RTMP_PUB_ALLOC; -+ -+ RTMP_Log(RTMP_LOGDEBUG, "%s, new app: %.*s tcUrl: %.*s playpath: %s", __FUNCTION__, -+ r->Link.app.av_len, r->Link.app.av_val, -+ r->Link.tcUrl.av_len, r->Link.tcUrl.av_val, -+ r->Link.playpath.av_val); -+ } - else - { - return 0; --- -1.7.10.4 - - -From 883c33489403ed360a01d1a47ec76d476525b49e Mon Sep 17 00:00:00 2001 -From: LRN <lrn1986@gmail.com> -Date: Sat, 5 May 2012 21:15:36 +0400 -Subject: [PATCH 57/64] Fix dll name to have SO_VERSION - ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -subj is attached - -Changes librtmp.dll into librtmp-$(SO_VERSION).dll, the same form that -libtool uses. -librtmp.dll is still created from librtmp-$(SO_VERSION).dll via `ln -- -sf'; obviously, it makes a hardlink when called in MSYS, but that's -no worse than what we have right now. - -Please, CC me, since i'm not subscibed to this list ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.11 (MingW32) -Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ - -iQEcBAEBAgAGBQJPpWA2AAoJEOs4Jb6SI2Cw+xIH/jqI7SbM1nMHBhFDSDtDFxim -zzlX5zsU9Ss45ZX9VMdzXLSDvxsuB6a97svMlipU2HOs4Ba1rcO8fdNII/8lD7nt -yIWiGDcyZNXP7xBXJOVahYwzDzpyGhOychl2XlgW8/9lY7V1DYFjlPUSWdfw8IH0 -iUX6PKMjrN3n4TTIh1kTwG0YHBRq2JdsRAaTB1uQDwBwNFkNPegWTO8oVvtlb1sc -gxhmN08o/S7nWAJRs5+Ah9eYSvWJral5yzIcxeOISGkZJxLs16F0b5iVtd2J1xN4 -3mNQH4W3n7q/EcsF18/UwI8VjcAZnyCXMGI1VXp9frFEvm8//Bv9jSrWKfrZPwI= -=/n61 ------END PGP SIGNATURE----- - -From 4d885c0ef9eab89ec7ed1383fd5cba5587a6a311 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?= - =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com> -Date: Sat, 5 May 2012 21:05:30 +0400 -Subject: [PATCH] Fix dll name to have SO_VERSION - -diff --git a/librtmp/Makefile b/librtmp/Makefile -index 74ee3b5..96c076b 100644 ---- a/librtmp/Makefile -+++ b/librtmp/Makefile -@@ -39,11 +39,11 @@ CRYPTO_DEF=$(DEF_$(CRYPTO)) - SO_VERSION=0 - SOX_posix=so - SOX_darwin=dylib --SOX_mingw=so # useless -+SOX_mingw=dll - SOX=$(SOX_$(SYS)) --SO_posix=$(SOX).$(SO_VERSION) --SO_darwin=$(SO_VERSION).$(SOX) --SO_mingw=dll -+SO_posix=.$(SOX).$(SO_VERSION) -+SO_darwin=.$(SO_VERSION).$(SOX) -+SO_mingw=-$(SO_VERSION).$(SOX) - SO_EXT=$(SO_$(SYS)) - - SODIR_posix=$(LIBDIR) -@@ -64,7 +64,7 @@ INSTALL_IMPLIB=$(INSTALL_IMPLIB_$(SYS)) - - SHARED=yes - SODEF_yes=-fPIC --SOLIB_yes=librtmp.$(SO_EXT) -+SOLIB_yes=librtmp$(SO_EXT) - SOINST_yes=install_so - SO_DEF=$(SODEF_$(SHARED)) - SO_LIB=$(SOLIB_$(SHARED)) -@@ -81,12 +81,12 @@ OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o - all: librtmp.a $(SO_LIB) - - clean: -- rm -f *.o *.a *.$(SOX) *.$(SO_EXT) librtmp.pc -+ rm -f *.o *.a *.$(SOX) *$(SO_EXT) librtmp.pc - - librtmp.a: $(OBJS) - $(AR) rs $@ $? - --librtmp.$(SO_EXT): $(OBJS) -+librtmp$(SO_EXT): $(OBJS) - $(CC) $(SO_LDFLAGS) $(LDFLAGS) -o $@ $^ $> $(CRYPTO_LIB) - ln -sf $@ librtmp.$(SOX) - -@@ -111,8 +111,8 @@ install_base: librtmp.a librtmp.pc - cp librtmp.pc $(LIBDIR)/pkgconfig - cp librtmp.3 $(MANDIR)/man3 - --install_so: librtmp.$(SO_EXT) -- cp librtmp.$(SO_EXT) $(SODIR) -+install_so: librtmp$(SO_EXT) -+ cp librtmp$(SO_EXT) $(SODIR) - $(INSTALL_IMPLIB) -- cd $(SODIR); ln -sf librtmp.$(SO_EXT) librtmp.$(SOX) -+ cd $(SODIR); ln -sf librtmp$(SO_EXT) librtmp.$(SOX) - --- -1.7.10.4 - - -From e42b5d0926b1a668d7fbd794a70f31040c5f198d Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 11:17:41 -0700 -Subject: [PATCH 58/64] Cleanup authentication code - -from commit 9ecf540e4d5bdc85c17668fa7ead93cc375111ca - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 5ea1c76..6d04708 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2497,17 +2497,16 @@ b64enc(const unsigned char *input, int length, char *output, int maxsize) - } - - #ifdef USE_POLARSSL --#define md5sum(x,y,z) md5(x,y,z); -+#define MD5_CTX md5_context -+#define MD5_Init(ctx) md5_starts(ctx) -+#define MD5_Update(ctx,data,len) md5_update(ctx,data,len) -+#define MD5_Final(dig,ctx) md5_finish(ctx,dig) - #elif defined(USE_GNUTLS) --static void md5sum(const unsigned char *data, int len, unsigned char *out) --{ -- struct md5_ctx ctx; -- md5_init(&ctx); -- md5_update(&ctx, len, data); -- md5_digest(&ctx, MD5_DIGEST_LENGTH, out); --} -+typedef struct md5_ctx MD5_CTX -+#define MD5_Init(ctx) md5_init(ctx) -+#define MD5_Update(ctx,data,len) md5_update(ctx,len,data) -+#define MD5_Final(dig,ctx) md5_digest(ctx,MD5_DIGEST_LENGTH,dig) - #else --#define md5sum(x,y,z) MD5(x,y,z); - #endif - - static const AVal av_authmod_adobe = AVC("authmod=adobe"); -@@ -2530,10 +2529,14 @@ PublisherAuth(RTMP *r, AVal *description) - char *token_in = NULL; - char *ptr; - unsigned char md5sum_val[MD5_DIGEST_LENGTH+1]; -+ MD5_CTX md5ctx; - int challenge2_data; - #define RESPONSE_LEN 32 - #define CHALLENGE2_LEN 16 - #define SALTED2_LEN (32+8+8+8) -+#define B64DIGEST_LEN 22 /* 16 byte digest => 22 b64 chars */ -+#define B64INT_LEN 6 /* 4 byte int => 6 b64 chars */ -+#define HEXHASH_LEN (2*MD5_DIGEST_LENGTH) - char response[RESPONSE_LEN]; - char challenge2[CHALLENGE2_LEN]; - char salted2[SALTED2_LEN]; -@@ -2563,11 +2566,9 @@ PublisherAuth(RTMP *r, AVal *description) - else if((token_in = strstr(description->av_val, "?reason=needauth")) != NULL) - { - char *par, *val = NULL, *orig_ptr; -- char *user = NULL; -- char *salt = NULL; -- char *opaque = NULL; -- char *challenge = NULL; -- char *salted1; -+ AVal user, salt, opaque, challenge, *aptr = NULL; -+ opaque.av_len = 0; -+ challenge.av_len = 0; - - ptr = orig_ptr = strdup(token_in); - while (ptr) -@@ -2581,60 +2582,72 @@ PublisherAuth(RTMP *r, AVal *description) - if(val) - *val++ = '\0'; - -+ if (aptr) { -+ aptr->av_len = par - aptr->av_val - 1; -+ aptr = NULL; -+ } - if (strcmp(par, "user") == 0){ -- user = val; -+ user.av_val = val; -+ aptr = &user; - } else if (strcmp(par, "salt") == 0){ -- salt = val; -+ salt.av_val = val; -+ aptr = &salt; - } else if (strcmp(par, "opaque") == 0){ -- opaque = val; -+ opaque.av_val = val; -+ aptr = &opaque; - } else if (strcmp(par, "challenge") == 0){ -- challenge = val; -+ challenge.av_val = val; -+ aptr = &challenge; - } - - RTMP_Log(RTMP_LOGDEBUG, "%s, par:\"%s\" = val:\"%s\"", __FUNCTION__, par, val); - } -+ if (aptr) -+ aptr->av_len = strlen(aptr->av_val); -+ -+ /* hash1 = base64enc(md5(user + _aodbeAuthSalt + password)) */ -+ MD5_Init(&md5ctx); -+ MD5_Update(&md5ctx, user.av_val, user.av_len); -+ MD5_Update(&md5ctx, salt.av_val, salt.av_len); -+ MD5_Update(&md5ctx, r->Link.pubPasswd.av_val, r->Link.pubPasswd.av_len); -+ MD5_Final(md5sum_val, &md5ctx); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s%s%s) =>", __FUNCTION__, -+ user.av_val, salt.av_val, r->Link.pubPasswd.av_val); -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); - -- /* hash1 = base64enc(md5(user + _aodbeAuthSalt + password)) */ -- salted1 = malloc(strlen(user)+strlen(salt)+r->Link.pubPasswd.av_len+1); -- strcpy(salted1, user); -- strcat(salted1, salt); -- strcat(salted1, r->Link.pubPasswd.av_val); -- md5sum((unsigned char*) salted1, strlen(salted1), md5sum_val); -- RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, salted1); -- free(salted1); -- -- RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- -- b64enc(md5sum_val, MD5_DIGEST_LENGTH, salted2, SALTED2_LEN); -- RTMP_Log(RTMP_LOGDEBUG, "%s, b64(md5_1) = %s", __FUNCTION__, salted2); -+ b64enc(md5sum_val, MD5_DIGEST_LENGTH, salted2, SALTED2_LEN); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, b64(md5_1) = %s", __FUNCTION__, salted2); - -- srand( time(NULL) ); -+ /* FIXME: what byte order does this depend on? */ - challenge2_data = rand(); - - b64enc((unsigned char *) &challenge2_data, sizeof(int), challenge2, CHALLENGE2_LEN); - RTMP_Log(RTMP_LOGDEBUG, "%s, b64(%d) = %s", __FUNCTION__, challenge2_data, challenge2); - -+ MD5_Init(&md5ctx); -+ MD5_Update(&md5ctx, salted2, B64DIGEST_LEN); - /* response = base64enc(md5(hash1 + opaque + challenge2)) */ -- if (opaque) -- strcat(salted2, opaque); -- if (challenge) -- strcat(salted2, challenge); -- strcat(salted2, challenge2); -- -- md5sum((unsigned char*) salted2, strlen(salted2), md5sum_val); -- RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, salted2); -- RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -+ if (opaque.av_len) -+ MD5_Update(&md5ctx, opaque.av_val, opaque.av_len); -+ if (challenge.av_len) -+ MD5_Update(&md5ctx, challenge.av_val, challenge.av_len); -+ MD5_Update(&md5ctx, challenge2, B64INT_LEN); -+ MD5_Final(md5sum_val, &md5ctx); -+ -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s%s%s) =>", __FUNCTION__, -+ salted2, opaque.av_len ? opaque.av_val : "", challenge2); -+ RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); - -- b64enc(md5sum_val, MD5_DIGEST_LENGTH, response, RESPONSE_LEN); -- RTMP_Log(RTMP_LOGDEBUG, "%s, b64(md5_2) = %s", __FUNCTION__, response); -+ b64enc(md5sum_val, MD5_DIGEST_LENGTH, response, RESPONSE_LEN); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, b64(md5_2) = %s", __FUNCTION__, response); - - /* have all hashes, create auth token for the end of app */ -- pubToken.av_val = malloc(32 + strlen(challenge2) + strlen(response) + (opaque ? strlen(opaque) : 0)); -+ pubToken.av_val = malloc(32 + B64INT_LEN + B64DIGEST_LEN + opaque.av_len); - pubToken.av_len = sprintf(pubToken.av_val, - "&challenge=%s&response=%s&opaque=%s", - challenge2, - response, -- opaque ? opaque : ""); -+ 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; -@@ -2710,8 +2723,26 @@ PublisherAuth(RTMP *r, AVal *description) - { - char *orig_ptr; - char *par, *val = NULL; -- char *user = NULL; -- char *nonce = NULL; -+ char *hash1, *hash2, *hash3; -+ AVal user, nonce, *aptr = NULL; -+ AVal apptmp; -+ -+ /* llnw auth method -+ * Seems to be closely based on HTTP Digest Auth: -+ * http://tools.ietf.org/html/rfc2617 -+ * http://en.wikipedia.org/wiki/Digest_access_authentication -+ */ -+ -+ const char authmod[] = "llnw"; -+ const char realm[] = "live"; -+ const char method[] = "publish"; -+ const char qop[] = "auth"; -+ /* nc = 1..connection count (or rather, number of times cnonce has been reused) */ -+ int nc = 1; -+ /* nchex = hexenc(nc) (8 hex digits according to RFC 2617) */ -+ char nchex[9]; -+ /* cnonce = hexenc(4 random bytes) (initialized on first connection) */ -+ char cnonce[9]; - - ptr = orig_ptr = strdup(token_in); - /* Extract parameters (we need user and nonce) */ -@@ -2726,82 +2757,84 @@ PublisherAuth(RTMP *r, AVal *description) - if(val) - *val++ = '\0'; - -+ if (aptr) { -+ aptr->av_len = par - aptr->av_val - 1; -+ aptr = NULL; -+ } - if (strcmp(par, "user") == 0){ -- user = val; -+ user.av_val = val; -+ aptr = &user; - } else if (strcmp(par, "nonce") == 0){ -- nonce = val; -+ nonce.av_val = val; -+ aptr = &nonce; - } - - RTMP_Log(RTMP_LOGDEBUG, "%s, par:\"%s\" = val:\"%s\"", __FUNCTION__, par, val); - } -+ if (aptr) -+ aptr->av_len = strlen(aptr->av_val); - -- // FIXME: handle case where user==NULL or nonce==NULL -- -- /* llnw auth method -- * Seems to be closely based on HTTP Digest Auth: -- * http://tools.ietf.org/html/rfc2617 -- * http://en.wikipedia.org/wiki/Digest_access_authentication -- */ -- -- const char *authmod = "llnw"; -- const char *realm = "live"; -- const char *method = "publish"; -- const char *qop = "auth"; -- char *tmpbuf; -+ /* FIXME: handle case where user==NULL or nonce==NULL */ - -- /* nc = 1..connection count (or rather, number of times cnonce has been reused) */ -- int nc = 1; -- /* nchex = hexenc(nc) (8 hex digits according to RFC 2617) */ -- char nchex[9]; - sprintf(nchex, "%08x", nc); -- /* cnonce = hexenc(4 random bytes) (initialized on first connection) */ -- char cnonce[9]; -- srand( time(NULL) ); // FIXME: a lib shouldn't call srand() - sprintf(cnonce, "%08x", rand()); - - /* hash1 = hexenc(md5(user + ":" + realm + ":" + password)) */ -- tmpbuf = malloc(strlen(user) + 1 + strlen(realm) + 1 + r->Link.pubPasswd.av_len + 1); -- sprintf(tmpbuf, "%s:%s:%s", user, realm, r->Link.pubPasswd.av_val); -- md5sum((unsigned char*)tmpbuf, strlen(tmpbuf), md5sum_val); -- RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, tmpbuf); -+ MD5_Init(&md5ctx); -+ MD5_Update(&md5ctx, user.av_val, user.av_len); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, realm, sizeof(realm)-1); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, r->Link.pubPasswd.av_val, r->Link.pubPasswd.av_len); -+ MD5_Final(md5sum_val, &md5ctx); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:%s:%s) =>", __FUNCTION__, -+ user.av_val, realm, r->Link.pubPasswd.av_val); - RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- free(tmpbuf); -- char *hash1 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ hash1 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); - - /* hash2 = hexenc(md5(method + ":/" + app + "/" + appInstance)) */ - /* Extract appname + appinstance without query parameters */ -- char *apptmp = malloc(r->Link.app.av_len + 1), *qpos; -- memcpy(apptmp, r->Link.app.av_val, r->Link.app.av_len); -- apptmp[r->Link.app.av_len] = '\0'; -- if((qpos = strchr(apptmp, '?'))) -- *qpos = '\0'; -- -- tmpbuf = malloc(strlen(method) + 2 + strlen(apptmp) + 1); -- sprintf(tmpbuf, "%s:/%s", method, apptmp); -- md5sum((unsigned char*)tmpbuf, strlen(tmpbuf), md5sum_val); -- RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, tmpbuf); -+ apptmp = r->Link.app; -+ ptr = strchr(apptmp.av_val, '?'); -+ if (ptr) -+ apptmp.av_len = ptr - apptmp.av_val; -+ -+ MD5_Init(&md5ctx); -+ MD5_Update(&md5ctx, method, sizeof(method)-1); -+ MD5_Update(&md5ctx, ":/", 2); -+ MD5_Update(&md5ctx, apptmp.av_val, apptmp.av_len); -+ MD5_Final(md5sum_val, &md5ctx); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:/%.*s) =>", __FUNCTION__, -+ method, apptmp.av_len, apptmp.av_val); - RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- free(tmpbuf); -- char *hash2 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -- -- free(apptmp); -+ hash2 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); - - /* hash3 = hexenc(md5(hash1 + ":" + nonce + ":" + nchex + ":" + cnonce + ":" + qop + ":" + hash2)) */ -- tmpbuf = malloc(strlen(hash1) + 1 + strlen(nonce) + 1 + strlen(nchex) + 1 + strlen(cnonce) + 1 + strlen(qop) + 1 + strlen(hash2) + 1); -- sprintf(tmpbuf, "%s:%s:%s:%s:%s:%s", hash1, nonce, nchex, cnonce, qop, hash2); -- md5sum((unsigned char*)tmpbuf, strlen(tmpbuf), md5sum_val); -- RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s) =>", __FUNCTION__, tmpbuf); -+ MD5_Init(&md5ctx); -+ MD5_Update(&md5ctx, hash1, HEXHASH_LEN); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, nonce.av_val, nonce.av_len); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, nchex, sizeof(nchex)-1); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, cnonce, sizeof(cnonce)-1); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, qop, sizeof(qop)-1); -+ MD5_Update(&md5ctx, ":", 1); -+ MD5_Update(&md5ctx, hash2, HEXHASH_LEN); -+ MD5_Final(md5sum_val, &md5ctx); -+ RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:%s:%s:%s:%s:%s) =>", __FUNCTION__, -+ hash1, nonce.av_val, nchex, cnonce, qop, hash2); - RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- free(tmpbuf); -- char *hash3 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ hash3 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); - - /* pubToken = &authmod=<authmod>&user=<username>&nonce=<nonce>&cnonce=<cnonce>&nc=<nchex>&response=<hash3> */ - /* Append nonces and response to query string which already contains - * user + authmod */ -- pubToken.av_val = malloc(64 + strlen(authmod) + strlen(user) + strlen(nonce) + strlen(cnonce) + strlen(nchex) + strlen(hash3)); -+ pubToken.av_val = malloc(64 + sizeof(authmod)-1 + user.av_len + nonce.av_len + sizeof(cnonce)-1 + sizeof(nchex)-1 + HEXHASH_LEN); - sprintf(pubToken.av_val, - "&nonce=%s&cnonce=%s&nc=%s&response=%s", -- nonce, cnonce, nchex, hash3); -+ 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; --- -1.7.10.4 - - -From 1f6c6434d6794b3ba14540a141bab358eba48b13 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 11:30:07 -0700 -Subject: [PATCH 59/64] More authentication cleanup - - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 6d04708..4858e24 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2512,15 +2512,14 @@ typedef struct md5_ctx MD5_CTX - static const AVal av_authmod_adobe = AVC("authmod=adobe"); - static const AVal av_authmod_llnw = AVC("authmod=llnw"); - --static char *hexenc(unsigned char *inbuf, int len) -+static void hexenc(unsigned char *inbuf, int len, char *dst) - { -- char *dst = malloc(len * 2 + 1), *ptr = dst; -+ char *ptr = dst; - while(len--) { - sprintf(ptr, "%02x", *inbuf++); - ptr += 2; - } - *ptr = '\0'; -- return dst; - } - - static int -@@ -2723,7 +2722,7 @@ PublisherAuth(RTMP *r, AVal *description) - { - char *orig_ptr; - char *par, *val = NULL; -- char *hash1, *hash2, *hash3; -+ char hash1[HEXHASH_LEN+1], hash2[HEXHASH_LEN+1], hash3[HEXHASH_LEN+1]; - AVal user, nonce, *aptr = NULL; - AVal apptmp; - -@@ -2790,7 +2789,7 @@ PublisherAuth(RTMP *r, AVal *description) - RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:%s:%s) =>", __FUNCTION__, - user.av_val, realm, r->Link.pubPasswd.av_val); - RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- hash1 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ hexenc(md5sum_val, MD5_DIGEST_LENGTH, hash1); - - /* hash2 = hexenc(md5(method + ":/" + app + "/" + appInstance)) */ - /* Extract appname + appinstance without query parameters */ -@@ -2807,7 +2806,7 @@ PublisherAuth(RTMP *r, AVal *description) - RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:/%.*s) =>", __FUNCTION__, - method, apptmp.av_len, apptmp.av_val); - RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- hash2 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ hexenc(md5sum_val, MD5_DIGEST_LENGTH, hash2); - - /* hash3 = hexenc(md5(hash1 + ":" + nonce + ":" + nchex + ":" + cnonce + ":" + qop + ":" + hash2)) */ - MD5_Init(&md5ctx); -@@ -2826,7 +2825,7 @@ PublisherAuth(RTMP *r, AVal *description) - RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:%s:%s:%s:%s:%s) =>", __FUNCTION__, - hash1, nonce.av_val, nchex, cnonce, qop, hash2); - RTMP_LogHexString(RTMP_LOGDEBUG, md5sum_val, MD5_DIGEST_LENGTH); -- hash3 = hexenc(md5sum_val, MD5_DIGEST_LENGTH); -+ hexenc(md5sum_val, MD5_DIGEST_LENGTH, hash3); - - /* pubToken = &authmod=<authmod>&user=<username>&nonce=<nonce>&cnonce=<cnonce>&nc=<nchex>&response=<hash3> */ - /* Append nonces and response to query string which already contains -@@ -2839,9 +2838,6 @@ PublisherAuth(RTMP *r, AVal *description) - RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken2: %s", __FUNCTION__, pubToken.av_val); - r->Link.pFlags |= RTMP_PUB_RESP|RTMP_PUB_CLATE; - -- free(hash1); -- free(hash2); -- free(hash3); - free(orig_ptr); - } - else if(strstr(description->av_val, "?reason=authfail") != NULL) --- -1.7.10.4 - - -From 9d6dc72d7c43554dbe8cdb02f450807230df8c25 Mon Sep 17 00:00:00 2001 -From: Martin Storsjo <martin@martin.st> -Date: Tue, 30 Oct 2012 19:22:16 +0200 -Subject: [PATCH 60/64] Simplify initializing the TLS server context - -This does the same thing, but I wasn't aware of these functions -when I initially wrote this. - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 4858e24..d72f105 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -280,32 +280,14 @@ RTMP_TLS_AllocServerContext(const char* cert, const char* key) - } - #elif !defined(NO_SSL) /* USE_OPENSSL */ - ctx = SSL_CTX_new(SSLv23_server_method()); -- FILE *f = fopen(key, "r"); -- if (!f) { -+ if (!SSL_CTX_use_certificate_chain_file(ctx, cert)) { - SSL_CTX_free(ctx); - return NULL; - } -- EVP_PKEY *k = PEM_read_PrivateKey(f, NULL, NULL, NULL); -- fclose(f); -- if (!k) { -+ if (!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) { - SSL_CTX_free(ctx); - return NULL; - } -- SSL_CTX_use_PrivateKey(ctx, k); -- EVP_PKEY_free(k); -- f = fopen(cert, "r"); -- if (!f) { -- SSL_CTX_free(ctx); -- return NULL; -- } -- X509 *c = PEM_read_X509(f, NULL, NULL, NULL); -- fclose(f); -- if (!c) { -- SSL_CTX_free(ctx); -- return NULL; -- } -- SSL_CTX_use_certificate(ctx, c); -- X509_free(c); - #endif - #endif - return ctx; --- -1.7.10.4 - - -From f3e3e6b507ac0df89a11764abd15cc9535593735 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Bj=C3=B6rn=20Axelsson?= <bjorn.axelsson@intinor.se> -Date: Tue, 30 Oct 2012 19:31:01 +0200 -Subject: [PATCH 61/64] Look for a fourth slash when splitting the url into - app+playpath - - -diff --git a/librtmp/parseurl.c b/librtmp/parseurl.c -index 0183958..646c70c 100644 ---- a/librtmp/parseurl.c -+++ b/librtmp/parseurl.c -@@ -137,12 +137,14 @@ parsehost: - * application = app[/appinstance] - */ - -- char *slash2, *slash3 = NULL; -+ char *slash2, *slash3 = NULL, *slash4 = NULL; - int applen, appnamelen; - - slash2 = strchr(p, '/'); - if(slash2) - slash3 = strchr(slash2+1, '/'); -+ if(slash3) -+ slash4 = strchr(slash3+1, '/'); - - applen = end-p; /* ondemand, pass all parameters as app */ - appnamelen = applen; /* ondemand length */ -@@ -156,7 +158,9 @@ parsehost: - appnamelen = 8; - } - else { /* app!=ondemand, so app is app[/appinstance] */ -- if(slash3) -+ if(slash4) -+ appnamelen = slash4-p; -+ else if(slash3) - appnamelen = slash3-p; - else if(slash2) - appnamelen = slash2-p; --- -1.7.10.4 - - -From e79a07c8625b56ebb182c12343518faff4902de7 Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Tue, 30 Oct 2012 14:40:14 -0700 -Subject: [PATCH 62/64] PolarSSL version fixes - -Fix commit a312ac7770207bd7d07725c1aef43725206e803a - -diff --git a/librtmp/dh.h b/librtmp/dh.h -index fa264f8..e29587b 100644 ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -29,9 +29,6 @@ - - #ifdef USE_POLARSSL - #include <polarssl/dhm.h> --#if POLARSSL_VERSION_NUMBER < 0x01010100 --#define havege_random havege_rand --#endif - typedef mpi * MP_t; - #define MP_new(m) m = malloc(sizeof(mpi)); mpi_init(m) - #define MP_set_w(mpi, w) mpi_lset(mpi, w) -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index d72f105..720669e 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -34,7 +34,6 @@ - - #ifdef CRYPTO - #ifdef USE_POLARSSL --#include <polarssl/version.h> - #include <polarssl/havege.h> - #include <polarssl/md5.h> - #include <polarssl/base64.h> -@@ -2435,7 +2434,7 @@ static int - b64enc(const unsigned char *input, int length, char *output, int maxsize) - { - #ifdef USE_POLARSSL -- int buf_size = maxsize; -+ size_t buf_size = maxsize; - if(base64_encode((unsigned char *) output, &buf_size, input, length) == 0) - { - output[buf_size] = '\0'; -@@ -2481,7 +2480,7 @@ b64enc(const unsigned char *input, int length, char *output, int maxsize) - #ifdef USE_POLARSSL - #define MD5_CTX md5_context - #define MD5_Init(ctx) md5_starts(ctx) --#define MD5_Update(ctx,data,len) md5_update(ctx,data,len) -+#define MD5_Update(ctx,data,len) md5_update(ctx,(unsigned char *)data,len) - #define MD5_Final(dig,ctx) md5_finish(ctx,dig) - #elif defined(USE_GNUTLS) - typedef struct md5_ctx MD5_CTX -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 2cdb705..6e2356a 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -65,7 +65,7 @@ - #include <polarssl/net.h> - #include <polarssl/ssl.h> - #include <polarssl/havege.h> --#if POLARSSL_VERSION_NUMBER < 0x01010100 -+#if POLARSSL_VERSION_NUMBER < 0x01010000 - #define havege_random havege_rand - #endif - typedef struct tls_ctx { -@@ -88,7 +88,7 @@ typedef struct tls_server_ctx { - ssl_set_session(s, 1, 600, &ctx->ssn) - #define TLS_server(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_SERVER); ssl_set_authmode(s, SSL_VERIFY_NONE);\ -- ssl_set_rng(s, havege_rand, ((tls_server_ctx*)ctx)->hs);\ -+ ssl_set_rng(s, havege_random, ((tls_server_ctx*)ctx)->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ - ssl_set_session(s, 1, 600, &((tls_server_ctx*)ctx)->ssn);\ - ssl_set_own_cert(s, &((tls_server_ctx*)ctx)->cert, &((tls_server_ctx*)ctx)->key);\ --- -1.7.10.4 - - -From feb81c8b3e0102b2eed18a34cbfb1e8a513e99ae Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Thu, 1 Nov 2012 17:00:31 -0700 -Subject: [PATCH 63/64] Fix gnutls build - -Missing semicolon in e42b5d0926b1a668d7fbd794a70f31040c5f198d - -diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c -index 720669e..0e00059 100644 ---- a/librtmp/rtmp.c -+++ b/librtmp/rtmp.c -@@ -2483,7 +2483,7 @@ b64enc(const unsigned char *input, int length, char *output, int maxsize) - #define MD5_Update(ctx,data,len) md5_update(ctx,(unsigned char *)data,len) - #define MD5_Final(dig,ctx) md5_finish(ctx,dig) - #elif defined(USE_GNUTLS) --typedef struct md5_ctx MD5_CTX -+typedef struct md5_ctx MD5_CTX; - #define MD5_Init(ctx) md5_init(ctx) - #define MD5_Update(ctx,data,len) md5_update(ctx,len,data) - #define MD5_Final(dig,ctx) md5_digest(ctx,MD5_DIGEST_LENGTH,dig) --- -1.7.10.4 - - -From 19d36368f6c1ec6fa55df319173ca93048309f9a Mon Sep 17 00:00:00 2001 -From: Howard Chu <hyc@highlandsun.com> -Date: Fri, 9 Nov 2012 07:58:08 -0800 -Subject: [PATCH 64/64] PolarSSL 1.2.x compat - - -diff --git a/librtmp/rtmp_sys.h b/librtmp/rtmp_sys.h -index 6e2356a..85d7e53 100644 ---- a/librtmp/rtmp_sys.h -+++ b/librtmp/rtmp_sys.h -@@ -68,6 +68,11 @@ - #if POLARSSL_VERSION_NUMBER < 0x01010000 - #define havege_random havege_rand - #endif -+#if POLARSSL_VERSION_NUMBER >= 0x01020000 -+#define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,ctx) -+#else -+#define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,resume,timeout,ctx) -+#endif - typedef struct tls_ctx { - havege_state hs; - ssl_session ssn; -@@ -85,12 +90,12 @@ typedef struct tls_server_ctx { - ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\ - ssl_set_rng(s, havege_random, &ctx->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ -- ssl_set_session(s, 1, 600, &ctx->ssn) -+ SSL_SET_SESSION(s, 1, 600, &ctx->ssn) - #define TLS_server(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_SERVER); ssl_set_authmode(s, SSL_VERIFY_NONE);\ - ssl_set_rng(s, havege_random, ((tls_server_ctx*)ctx)->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ -- ssl_set_session(s, 1, 600, &((tls_server_ctx*)ctx)->ssn);\ -+ SSL_SET_SESSION(s, 1, 600, &((tls_server_ctx*)ctx)->ssn);\ - ssl_set_own_cert(s, &((tls_server_ctx*)ctx)->cert, &((tls_server_ctx*)ctx)->key);\ - ssl_set_dh_param(s, ((tls_server_ctx*)ctx)->dhm_P, ((tls_server_ctx*)ctx)->dhm_G) - #define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd) --- -1.7.10.4 - diff --git a/src/librtmp.mk b/src/librtmp.mk index 560a0a0..94388b7 100644 --- a/src/librtmp.mk +++ b/src/librtmp.mk @@ -3,17 +3,14 @@ PKG := librtmp $(PKG)_IGNORE := -$(PKG)_VERSION := 2.4 -$(PKG)_CHECKSUM := b65ce7708ae79adb51d1f43dd0b6d987076d7c42 -$(PKG)_SUBDIR := rtmpdump-2.3 -$(PKG)_FILE := rtmpdump-2.3.tgz -$(PKG)_URL := http://rtmpdump.mplayerhq.hu/download/$($(PKG)_FILE) +$(PKG)_VERSION := a1900c3 +$(PKG)_CHECKSUM := ca1738708ce799226626326f46c416dbda346514 +$(PKG)_SUBDIR := mirror-rtmpdump-$($(PKG)_VERSION) +$(PKG)_FILE := rtmpdump-$($(PKG)_VERSION).tar.gz +$(PKG)_URL := https://github.com/mirror/rtmpdump/tarball/$($(PKG)_VERSION)/$($(PKG)_FILE) $(PKG)_DEPS := gcc gnutls -define $(PKG)_UPDATE - echo 'Warning: Updates are temporarily disabled for package librtmp.' >&2; - echo $(librtmp_VERSION) -endef +$(PKG)_UPDATE = $(call MXE_GET_GITHUB_SHA, mirror/rtmpdump, master) define $(PKG)_BUILD $(MAKE) -C '$(1)' \ @@ -21,9 +18,7 @@ define $(PKG)_BUILD prefix='$(PREFIX)/$(TARGET)' \ SYS=mingw \ CRYPTO=GNUTLS \ - SHARED=no \ - LIB_GNUTLS="`$(TARGET)-pkg-config --libs-only-l gnutls`" \ + $(if $(BUILD_STATIC),SHARED=no,) \ + LIB_GNUTLS="`$(TARGET)-pkg-config --libs-only-l gnutls --static`" \ -j '$(JOBS)' install endef - -$(PKG)_BUILD_SHARED = |