From d6072b16c07346f6ad8c8a91e16c7b6c8fbf6934 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 19 Nov 2014 16:16:04 +0800 Subject: [PATCH] support compile srs-librtmp on windows. 2.0.26 --- README.md | 7 +- trunk/auto/generate-srs-librtmp-single.sh | 4 +- trunk/src/core/srs_core.hpp | 6 +- trunk/src/kernel/srs_kernel_file.cpp | 12 +- trunk/src/kernel/srs_kernel_flv.cpp | 10 +- trunk/src/kernel/srs_kernel_utility.cpp | 6 +- trunk/src/libs/srs_lib_bandwidth.cpp | 16 +- trunk/src/libs/srs_lib_simple_socket.cpp | 14 +- trunk/src/libs/srs_librtmp.cpp | 359 +++++++++++++++++++++- trunk/src/libs/srs_librtmp.hpp | 42 +++ trunk/src/rtmp/srs_protocol_io.hpp | 3 + trunk/src/rtmp/srs_protocol_rtmp.cpp | 10 +- trunk/src/rtmp/srs_protocol_stack.cpp | 8 +- trunk/src/rtmp/srs_protocol_stack.hpp | 4 + 14 files changed, 468 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 8d1603026..c7d532688 100755 --- a/README.md +++ b/README.md @@ -446,8 +446,10 @@ Supported operating systems and hardware: [EN](https://github.com/winlinvip/simple-rtmp-server/wiki/v2_EN_SrsLibrtmp#publish-h264-raw-data) ) by srs-librtmp. 1. Support [6k+ clients](https://github.com/winlinvip/simple-rtmp-server/issues/194), 4Gbps per process. -1. [dev] Suppport [English wiki](https://github.com/winlinvip/simple-rtmp-server/wiki/v1_EN_Home). -1. [dev] Research and simplify st, [bug #182](https://github.com/winlinvip/simple-rtmp-server/issues/182). +1. Suppport [English wiki](https://github.com/winlinvip/simple-rtmp-server/wiki/v1_EN_Home). +1. Research and simplify st, [bug #182](https://github.com/winlinvip/simple-rtmp-server/issues/182). +1. Support compile [srs-librtmp on windows](https://github.com/winlinvip/srs.librtmp), +[bug #213](https://github.com/winlinvip/simple-rtmp-server/issues/213). 1. [no-plan] Support <500ms latency, FRSC(Fast RTMP-compatible Stream Channel tech). 1. [no-plan] Support RTMP 302 redirect [#92](https://github.com/winlinvip/simple-rtmp-server/issues/92). 1. [no-plan] Support multiple processes, for both origin and edge @@ -480,6 +482,7 @@ Supported operating systems and hardware: * 2013-10-17, Created.
## History +* v2.0, 2014-11-19, fix [#213](https://github.com/winlinvip/simple-rtmp-server/issues/213), support compile [srs-librtmp on windows](https://github.com/winlinvip/srs.librtmp), [bug #213](https://github.com/winlinvip/simple-rtmp-server/issues/213). 2.0.26 * v2.0, 2014-11-18, all wiki translated to English. 2.0.23. * v2.0, 2014-11-15, fix [#204](https://github.com/winlinvip/simple-rtmp-server/issues/204), srs-librtmp drop duplicated sps/pps(sequence header). 2.0.22. * v2.0, 2014-11-15, fix [#203](https://github.com/winlinvip/simple-rtmp-server/issues/203), srs-librtmp drop any video before sps/pps(sequence header). 2.0.21. diff --git a/trunk/auto/generate-srs-librtmp-single.sh b/trunk/auto/generate-srs-librtmp-single.sh index 38ec75afb..00035946f 100755 --- a/trunk/auto/generate-srs-librtmp-single.sh +++ b/trunk/auto/generate-srs-librtmp-single.sh @@ -105,11 +105,13 @@ cat << END >$FILE int main(int argc, char** argv) { + srs_rtmp_t rtmp; + printf("Example for srs-librtmp\n"); printf("SRS(simple-rtmp-server) client librtmp library.\n"); printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); - srs_rtmp_t rtmp = srs_rtmp_create("rtmp://ossrs.net/live/livestream"); + rtmp = srs_rtmp_create("rtmp://ossrs.net/live/livestream"); srs_lib_trace("create rtmp success"); srs_rtmp_destroy(rtmp); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 506c6f025..390e5427f 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 25 +#define VERSION_REVISION 26 // server info. #define RTMP_SIG_SRS_KEY "SRS" #define RTMP_SIG_SRS_ROLE "origin/edge server" @@ -70,7 +70,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif + +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif #include #define srs_assert(expression) assert(expression) diff --git a/trunk/src/kernel/srs_kernel_file.cpp b/trunk/src/kernel/srs_kernel_file.cpp index 17f92586f..02079d3c5 100644 --- a/trunk/src/kernel/srs_kernel_file.cpp +++ b/trunk/src/kernel/srs_kernel_file.cpp @@ -23,8 +23,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include -#include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif + +#include #include using namespace std; @@ -173,19 +177,19 @@ int64_t SrsFileReader::tellg() void SrsFileReader::skip(int64_t size) { - ::lseek(fd, size, SEEK_CUR); + ::lseek(fd, (off_t)size, SEEK_CUR); } int64_t SrsFileReader::lseek(int64_t offset) { - return (int64_t)::lseek(fd, offset, SEEK_SET); + return (int64_t)::lseek(fd, (off_t)offset, SEEK_SET); } int64_t SrsFileReader::filesize() { int64_t cur = tellg(); int64_t size = (int64_t)::lseek(fd, 0, SEEK_END); - ::lseek(fd, cur, SEEK_SET); + ::lseek(fd, (off_t)cur, SEEK_SET); return size; } diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index c2b93461e..4de67ed64 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -23,8 +23,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include -#include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif + +#include #include using namespace std; @@ -157,7 +161,7 @@ int SrsFlvEncoder::write_audio(int64_t timestamp, char* data, int size) return ret; } tag_stream->write_3bytes(size); - tag_stream->write_3bytes(timestamp); + tag_stream->write_3bytes((int32_t)timestamp); // default to little-endian tag_stream->write_1bytes((timestamp >> 24) & 0xFF); @@ -191,7 +195,7 @@ int SrsFlvEncoder::write_video(int64_t timestamp, char* data, int size) return ret; } tag_stream->write_3bytes(size); - tag_stream->write_3bytes(timestamp); + tag_stream->write_3bytes((int32_t)timestamp); // default to little-endian tag_stream->write_1bytes((timestamp >> 24) & 0xFF); diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 1bbfbf516..d51e59472 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -23,11 +23,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include -#include #include #include #include +#endif + +#include using namespace std; diff --git a/trunk/src/libs/srs_lib_bandwidth.cpp b/trunk/src/libs/srs_lib_bandwidth.cpp index 88c32c37d..c3816293d 100644 --- a/trunk/src/libs/srs_lib_bandwidth.cpp +++ b/trunk/src/libs/srs_lib_bandwidth.cpp @@ -23,7 +23,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif #include using namespace std; @@ -293,11 +296,6 @@ int SrsBandwidthClient::publish_checking(int duration_ms, int play_kbps) return ret; } - // send play data to client - int size = 1024; // TODO: FIXME: magic number - char random_data[size]; - memset(random_data, 'A', size); - int data_count = 1; srs_update_system_time_ms(); int64_t starttime = srs_get_system_time_ms(); @@ -321,13 +319,13 @@ int SrsBandwidthClient::publish_checking(int duration_ms, int play_kbps) // use the play kbps to control the publish srs_update_system_time_ms(); - int elaps = srs_get_system_time_ms() - starttime; + int elaps = (int)(srs_get_system_time_ms() - starttime); if (elaps > 0) { - int current_kbps = _rtmp->get_send_bytes() * 8 / elaps; + int current_kbps = (int)(_rtmp->get_send_bytes() * 8 / elaps); while (current_kbps > play_kbps) { srs_update_system_time_ms(); - elaps = srs_get_system_time_ms() - starttime; - current_kbps = _rtmp->get_send_bytes() * 8 / elaps; + elaps = (int)(srs_get_system_time_ms() - starttime); + current_kbps = (int)(_rtmp->get_send_bytes() * 8 / elaps); usleep(100 * 1000); // TODO: FIXME: magic number. } } diff --git a/trunk/src/libs/srs_lib_simple_socket.cpp b/trunk/src/libs/srs_lib_simple_socket.cpp index cc8476778..e7346b6a0 100644 --- a/trunk/src/libs/srs_lib_simple_socket.cpp +++ b/trunk/src/libs/srs_lib_simple_socket.cpp @@ -25,13 +25,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include -#include #include #include #include -#include #include +#endif + +#include +#include #include @@ -82,7 +86,7 @@ int SimpleSocketStream::read(void* buf, size_t size, ssize_t* nread) { int ret = ERROR_SUCCESS; - ssize_t nb_read = ::recv(fd, buf, size, 0); + ssize_t nb_read = ::recv(fd, (char*)buf, size, 0); if (nread) { *nread = nb_read; @@ -188,7 +192,7 @@ int SimpleSocketStream::read_fully(void* buf, size_t size, ssize_t* nread) } nb_read += this_nread; - left -= this_nread; + left -= (size_t)this_nread; } if (nread) { @@ -203,7 +207,7 @@ int SimpleSocketStream::write(void* buf, size_t size, ssize_t* nwrite) { int ret = ERROR_SUCCESS; - ssize_t nb_write = ::send(fd, (void*)buf, size, 0); + ssize_t nb_write = ::send(fd, (char*)buf, size, 0); if (nwrite) { *nwrite = nb_write; diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index e2d3f80da..f2be538f4 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -24,7 +24,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include + +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif #include #include @@ -98,6 +102,356 @@ struct Context } }; +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifdef _WIN32 + int gettimeofday(struct timeval* tv, struct timezone* tz) + { + time_t clock; + struct tm tm; + SYSTEMTIME win_time; + + GetLocalTime(&win_time); + + tm.tm_year = win_time.wYear - 1900; + tm.tm_mon = win_time.wMonth - 1; + tm.tm_mday = win_time.wDay; + tm.tm_hour = win_time.wHour; + tm.tm_min = win_time.wMinute; + tm.tm_sec = win_time.wSecond; + tm.tm_isdst = -1; + + clock = mktime(&tm); + + tv->tv_sec = (long)clock; + tv->tv_usec = win_time.wMilliseconds * 1000; + + return 0; + } + + int open(const char *pathname, int flags) + { + return open(pathname, flags, 0); + } + + int open(const char *pathname, int flags, mode_t mode) + { + FILE* file = NULL; + + if ((flags & O_RDONLY) == O_RDONLY) { + file = fopen(pathname, "r"); + } else { + file = fopen(pathname, "w+"); + } + + if (file == NULL) { + return -1; + } + + return (int)file; + } + + int close(int fd) + { + FILE* file = (FILE*)fd; + return fclose(file); + } + + off_t lseek(int fd, off_t offset, int whence) + { + return (off_t)fseek((FILE*)fd, offset, whence); + } + + ssize_t write(int fd, const void *buf, size_t count) + { + return (ssize_t)fwrite(buf, count, 1, (FILE*)fd); + } + + ssize_t read(int fd, void *buf, size_t count) + { + return (ssize_t)fread(buf, count, 1, (FILE*)fd); + } + + pid_t getpid(void) + { + return (pid_t)GetCurrentProcessId(); + } + + int usleep(useconds_t usec) + { + Sleep((DWORD)(usec / 1000)); + return 0; + } + + ssize_t writev(int fd, const struct iovec *iov, int iovcnt) + { + ssize_t nwrite = 0; + for (int i = 0; i < iovcnt; i++) { + const struct iovec* current = iov + i; + + int nsent = ::send(fd, (char*)current->iov_base, current->iov_len, 0); + if (nsent < 0) { + return nsent; + } + + nwrite += nsent; + if (nsent == 0) { + return nwrite; + } + } + return nwrite; + } + + //////////////////////// strlcpy.c (modified) ////////////////////////// + + /* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ + + /*- + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + //#include // **** + //#include // **** + // __FBSDID("$FreeBSD: stable/9/sys/libkern/strlcpy.c 243811 2012-12-03 18:08:44Z delphij $"); // **** + + // #include // **** + // #include // **** + + /* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ + + //#define __restrict // **** + + std::size_t strlcpy(char * __restrict dst, const char * __restrict src, size_t siz) + { + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ + } + + // http://www.cplusplus.com/forum/general/141779///////////////////////// inet_ntop.c (modified) ////////////////////////// + /* + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + // #if defined(LIBC_SCCS) && !defined(lint) // **** + //static const char rcsid[] = "$Id: inet_ntop.c,v 1.3.18.2 2005/11/03 23:02:22 marka Exp $"; + // #endif /* LIBC_SCCS and not lint */ // **** + // #include // **** + // __FBSDID("$FreeBSD: stable/9/sys/libkern/inet_ntop.c 213103 2010-09-24 15:01:45Z attilio $"); // **** + + //#define _WIN32_WINNT _WIN32_WINNT_WIN8 // **** + //#include // **** + #pragma comment(lib, "Ws2_32.lib") // **** + //#include // **** + + // #include // **** + // #include // **** + // #include // **** + + // #include // **** + + /*% + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + + static char *inet_ntop4(const u_char *src, char *dst, socklen_t size); + static char *inet_ntop6(const u_char *src, char *dst, socklen_t size); + + /* char * + * inet_ntop(af, src, dst, size) + * convert a network format address to presentation format. + * return: + * pointer to presentation format address (`dst'), or NULL (see errno). + * author: + * Paul Vixie, 1996. + */ + const char* inet_ntop(int af, const void *src, char *dst, socklen_t size) + { + switch (af) { + case AF_INET: + return (inet_ntop4( (unsigned char*)src, (char*)dst, size)); // **** + #ifdef AF_INET6 + #error "IPv6 not supported" + //case AF_INET6: + // return (char*)(inet_ntop6( (unsigned char*)src, (char*)dst, size)); // **** + #endif + default: + // return (NULL); // **** + return 0 ; // **** + } + /* NOTREACHED */ + } + + /* const char * + * inet_ntop4(src, dst, size) + * format an IPv4 address + * return: + * `dst' (as a const) + * notes: + * (1) uses no statics + * (2) takes a u_char* not an in_addr as input + * author: + * Paul Vixie, 1996. + */ + static char * inet_ntop4(const u_char *src, char *dst, socklen_t size) + { + static const char fmt[128] = "%u.%u.%u.%u"; + char tmp[sizeof "255.255.255.255"]; + int l; + + l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); // **** + if (l <= 0 || (socklen_t) l >= size) { + return (NULL); + } + strlcpy(dst, tmp, size); + return (dst); + } + + /* const char * + * inet_ntop6(src, dst, size) + * convert IPv6 binary address into presentation (printable) format + * author: + * Paul Vixie, 1996. + */ + static char * inet_ntop6(const u_char *src, char *dst, socklen_t size) + { + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; + struct { int base, len; } best, cur; + #define NS_IN6ADDRSZ 16 + #define NS_INT16SZ 2 + u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; + int i; + + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset(words, '\0', sizeof words); + for (i = 0; i < NS_IN6ADDRSZ; i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + best.base = -1; + best.len = 0; + cur.base = -1; + cur.len = 0; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + if (words[i] == 0) { + if (cur.base == -1) + cur.base = i, cur.len = 1; + else + cur.len++; + } else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; + } + } + } + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + if (best.base != -1 && best.len < 2) + best.base = -1; + + /* + * Format the result. + */ + tp = tmp; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) { + if (i == best.base) + *tp++ = ':'; + continue; + } + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) + *tp++ = ':'; + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && (best.len == 6 || + (best.len == 7 && words[7] != 0x0001) || + (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) + return (NULL); + tp += strlen(tp); + break; + } + tp += std::sprintf(tp, "%x", words[i]); // **** + } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == + (NS_IN6ADDRSZ / NS_INT16SZ)) + *tp++ = ':'; + *tp++ = '\0'; + + /* + * Check for overflow, copy, and we're done. + */ + if ((socklen_t)(tp - tmp) > size) { + return (NULL); + } + strcpy(dst, tmp); + return (dst); + } +#endif + int srs_librtmp_context_parse_uri(Context* context) { int ret = ERROR_SUCCESS; @@ -596,7 +950,7 @@ const char* srs_format_time() // to calendar time struct tm* tm; - if ((tm = localtime(&tv.tv_sec)) == NULL) { + if ((tm = localtime((const time_t*)&tv.tv_sec)) == NULL) { return buf; } @@ -605,6 +959,9 @@ const char* srs_format_time() 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000)); + + // for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 + buf[sizeof(buf) - 1] = 0; return buf; } diff --git a/trunk/src/libs/srs_librtmp.hpp b/trunk/src/libs/srs_librtmp.hpp index a72c270c1..8a9d148c9 100644 --- a/trunk/src/libs/srs_librtmp.hpp +++ b/trunk/src/libs/srs_librtmp.hpp @@ -30,6 +30,48 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifdef _WIN32 + #define _CRT_SECURE_NO_WARNINGS + typedef unsigned long long u_int64_t; + typedef long long int64_t; + typedef unsigned int u_int32_t; + typedef int int32_t; + typedef unsigned char u_int8_t; + typedef char int8_t; + typedef unsigned short u_int16_t; + typedef short int16_t; + typedef int64_t ssize_t; + struct iovec { + void *iov_base; /* Starting address */ + size_t iov_len; /* Number of bytes to transfer */ + }; + #include + #include + int gettimeofday(struct timeval* tv, struct timezone* tz); + #define PRId64 "lld" + typedef int socklen_t; + const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); + typedef int mode_t; + #define S_IRUSR 0 + #define S_IWUSR 0 + #define S_IRGRP 0 + #define S_IWGRP 0 + #define S_IROTH 0 + int open(const char *pathname, int flags); + int open(const char *pathname, int flags, mode_t mode); + int close(int fd); + off_t lseek(int fd, off_t offset, int whence); + ssize_t write(int fd, const void *buf, size_t count); + ssize_t read(int fd, void *buf, size_t count); + typedef int pid_t; + pid_t getpid(void); + #define snprintf _snprintf + ssize_t writev(int fd, const struct iovec *iov, int iovcnt); + typedef int64_t useconds_t; + int usleep(useconds_t usec); +#endif + /** * srs-librtmp is a librtmp like library, * used to play/publish rtmp stream from/to rtmp server. diff --git a/trunk/src/rtmp/srs_protocol_io.hpp b/trunk/src/rtmp/srs_protocol_io.hpp index 9112f7087..bc816309f 100644 --- a/trunk/src/rtmp/srs_protocol_io.hpp +++ b/trunk/src/rtmp/srs_protocol_io.hpp @@ -30,7 +30,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif #include diff --git a/trunk/src/rtmp/srs_protocol_rtmp.cpp b/trunk/src/rtmp/srs_protocol_rtmp.cpp index 9dec1f7a1..1049de187 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp.cpp @@ -31,7 +31,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif + using namespace std; /** @@ -260,7 +264,7 @@ int SrsHandshakeBytes::create_c0c1() return ret; } stream.write_1bytes(0x03); - stream.write_4bytes(::time(NULL)); + stream.write_4bytes((int32_t)::time(NULL)); stream.write_4bytes(0x00); return ret; @@ -283,7 +287,7 @@ int SrsHandshakeBytes::create_s0s1s2(const char* c1) return ret; } stream.write_1bytes(0x03); - stream.write_4bytes(::time(NULL)); + stream.write_4bytes((int32_t)::time(NULL)); // s2 time2 copy from c1 if (c0c1) { stream.write_bytes(c0c1 + 1, 4); @@ -314,7 +318,7 @@ int SrsHandshakeBytes::create_c2() if ((ret = stream.initialize(c2, 8)) != ERROR_SUCCESS) { return ret; } - stream.write_4bytes(::time(NULL)); + stream.write_4bytes((int32_t)::time(NULL)); // c2 time2 copy from s1 if (s0s1s2) { stream.write_bytes(s0s1s2 + 1, 4); diff --git a/trunk/src/rtmp/srs_protocol_stack.cpp b/trunk/src/rtmp/srs_protocol_stack.cpp index 2e41e2675..ef8487983 100644 --- a/trunk/src/rtmp/srs_protocol_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_stack.cpp @@ -397,7 +397,8 @@ SrsMessage::~SrsMessage() SrsProtocol::AckWindowSize::AckWindowSize() { - ack_window_size = acked_size = 0; + ack_window_size = 0; + acked_size = 0; } SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io) @@ -1427,7 +1428,7 @@ int SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt, int bh_siz * @remark, srs always send the extended-timestamp, to keep simple, * and compatible with adobe products. */ - u_int32_t chunk_timestamp = chunk->header.timestamp; + u_int32_t chunk_timestamp = (u_int32_t)chunk->header.timestamp; /** * if chunk_timestamp<=0, the chunk previous packet has no extended-timestamp, @@ -1695,7 +1696,8 @@ int SrsProtocol::response_acknowledgement_message() int ret = ERROR_SUCCESS; SrsAcknowledgementPacket* pkt = new SrsAcknowledgementPacket(); - in_ack_size.acked_size = pkt->sequence_number = skt->get_recv_bytes(); + in_ack_size.acked_size = skt->get_recv_bytes(); + pkt->sequence_number = (int32_t)in_ack_size.acked_size; if ((ret = send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) { srs_error("send acknowledgement failed. ret=%d", ret); return ret; diff --git a/trunk/src/rtmp/srs_protocol_stack.hpp b/trunk/src/rtmp/srs_protocol_stack.hpp index 27f671151..925391fdf 100644 --- a/trunk/src/rtmp/srs_protocol_stack.hpp +++ b/trunk/src/rtmp/srs_protocol_stack.hpp @@ -32,7 +32,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include + +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #include +#endif #include #include