Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2014-11-19 16:16:04 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
d6072b16c07346f6ad8c8a91e16c7b6c8fbf6934
d6072b16
1 parent
5f48d4f5
support compile srs-librtmp on windows. 2.0.26
显示空白字符变更
内嵌
并排对比
正在显示
14 个修改的文件
包含
468 行增加
和
33 行删除
README.md
trunk/auto/generate-srs-librtmp-single.sh
trunk/src/core/srs_core.hpp
trunk/src/kernel/srs_kernel_file.cpp
trunk/src/kernel/srs_kernel_flv.cpp
trunk/src/kernel/srs_kernel_utility.cpp
trunk/src/libs/srs_lib_bandwidth.cpp
trunk/src/libs/srs_lib_simple_socket.cpp
trunk/src/libs/srs_librtmp.cpp
trunk/src/libs/srs_librtmp.hpp
trunk/src/rtmp/srs_protocol_io.hpp
trunk/src/rtmp/srs_protocol_rtmp.cpp
trunk/src/rtmp/srs_protocol_stack.cpp
trunk/src/rtmp/srs_protocol_stack.hpp
README.md
查看文件 @
d6072b1
...
...
@@ -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.
<br/>
## 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.
...
...
trunk/auto/generate-srs-librtmp-single.sh
查看文件 @
d6072b1
...
...
@@ -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);
...
...
trunk/src/core/srs_core.hpp
查看文件 @
d6072b1
...
...
@@ -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 2
5
#define VERSION_REVISION 2
6
// 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 <inttypes.h>
#endif
#include <assert.h>
#define srs_assert(expression) assert(expression)
...
...
trunk/src/kernel/srs_kernel_file.cpp
查看文件 @
d6072b1
...
...
@@ -23,8 +23,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_file.hpp>
#include <fcntl.h>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <unistd.h>
#endif
#include <fcntl.h>
#include <sstream>
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
;
}
...
...
trunk/src/kernel/srs_kernel_flv.cpp
查看文件 @
d6072b1
...
...
@@ -23,8 +23,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_flv.hpp>
#include <fcntl.h>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <unistd.h>
#endif
#include <fcntl.h>
#include <sstream>
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
);
...
...
trunk/src/kernel/srs_kernel_utility.cpp
查看文件 @
d6072b1
...
...
@@ -23,11 +23,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_utility.hpp>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/time.h>
#endif
#include <string.h>
using
namespace
std
;
...
...
trunk/src/libs/srs_lib_bandwidth.cpp
查看文件 @
d6072b1
...
...
@@ -23,7 +23,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_lib_bandwidth.hpp>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <unistd.h>
#endif
#include <sstream>
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.
}
}
...
...
trunk/src/libs/srs_lib_simple_socket.cpp
查看文件 @
d6072b1
...
...
@@ -25,13 +25,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_error.hpp>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/uio.h>
#endif
#include <sys/types.h>
#include <errno.h>
#include <srs_kernel_utility.hpp>
...
...
@@ -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
;
...
...
trunk/src/libs/srs_librtmp.cpp
查看文件 @
d6072b1
...
...
@@ -24,7 +24,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_librtmp.hpp>
#include <stdlib.h>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <sys/time.h>
#endif
#include <string>
#include <sstream>
...
...
@@ -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 <Todd.Miller@courtesan.com>
*
* 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 <sys/cdefs.h> // ****
//#include <cstddef> // ****
// __FBSDID("$FreeBSD: stable/9/sys/libkern/strlcpy.c 243811 2012-12-03 18:08:44Z delphij $"); // ****
// #include <sys/types.h> // ****
// #include <sys/libkern.h> // ****
/*
* 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 <sys/cdefs.h> // ****
// __FBSDID("$FreeBSD: stable/9/sys/libkern/inet_ntop.c 213103 2010-09-24 15:01:45Z attilio $"); // ****
//#define _WIN32_WINNT _WIN32_WINNT_WIN8 // ****
//#include <Ws2tcpip.h> // ****
#pragma comment(lib, "Ws2_32.lib") // ****
//#include <cstdio> // ****
// #include <sys/param.h> // ****
// #include <sys/socket.h> // ****
// #include <sys/systm.h> // ****
// #include <netinet/in.h> // ****
/*%
* 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
;
}
...
...
@@ -606,6 +960,9 @@ const char* srs_format_time()
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
;
}
...
...
trunk/src/libs/srs_librtmp.hpp
查看文件 @
d6072b1
...
...
@@ -30,6 +30,48 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <sys/types.h>
// 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 <time.h>
#include <windows.h>
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.
...
...
trunk/src/rtmp/srs_protocol_io.hpp
查看文件 @
d6072b1
...
...
@@ -30,7 +30,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_core.hpp>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <sys/uio.h>
#endif
#include <srs_kernel_buffer.hpp>
...
...
trunk/src/rtmp/srs_protocol_rtmp.cpp
查看文件 @
d6072b1
...
...
@@ -31,7 +31,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_stream.hpp>
#include <srs_kernel_utility.hpp>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <unistd.h>
#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
);
...
...
trunk/src/rtmp/srs_protocol_stack.cpp
查看文件 @
d6072b1
...
...
@@ -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
;
...
...
trunk/src/rtmp/srs_protocol_stack.hpp
查看文件 @
d6072b1
...
...
@@ -32,7 +32,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <map>
#include <string>
// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213
#ifndef _WIN32
#include <sys/uio.h>
#endif
#include <srs_kernel_log.hpp>
#include <srs_kernel_error.hpp>
...
...
请
注册
或
登录
后发表评论