Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
700a16c7
Commit
700a16c7
authored
4 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
大幅提升接收推流性能以及降低内存占用
parent
5c7a08eb
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
38 个修改的文件
包含
93 行增加
和
117 行删除
+93
-117
3rdpart/ZLToolKit
+1
-1
src/Extension/Frame.h
+1
-1
src/Http/HttpChunkedSplitter.cpp
+1
-1
src/Http/HttpChunkedSplitter.h
+1
-1
src/Http/HttpClient.cpp
+0
-13
src/Http/HttpRequestSplitter.cpp
+7
-8
src/Http/HttpRequestSplitter.h
+4
-2
src/Http/HttpSession.cpp
+2
-12
src/Http/HttpSession.h
+1
-1
src/Http/WebSocketClient.h
+4
-4
src/Http/WebSocketSession.h
+4
-4
src/Http/WebSocketSplitter.h
+1
-1
src/Record/MP4Muxer.cpp
+2
-1
src/Record/TsMuxer.cpp
+3
-2
src/Rtmp/Rtmp.h
+1
-1
src/Rtmp/RtmpPlayer.h
+2
-2
src/Rtmp/RtmpProtocol.cpp
+0
-0
src/Rtmp/RtmpProtocol.h
+17
-12
src/Rtmp/RtmpPusher.cpp
+0
-3
src/Rtmp/RtmpPusher.h
+2
-2
src/Rtmp/RtmpSession.cpp
+0
-5
src/Rtmp/RtmpSession.h
+2
-2
src/Rtmp/amf.cpp
+3
-3
src/Rtmp/amf.h
+4
-2
src/Rtp/Decoder.cpp
+3
-2
src/Rtp/GB28181Process.cpp
+1
-1
src/Rtp/GB28181Process.h
+1
-1
src/Rtp/PSEncoder.cpp
+3
-2
src/Rtp/RtpSplitter.cpp
+3
-4
src/Rtp/RtpSplitter.h
+2
-2
src/Rtp/TSDecoder.cpp
+1
-1
src/Rtp/TSDecoder.h
+1
-1
src/Rtsp/RtspPlayer.cpp
+2
-1
src/Rtsp/RtspPusher.cpp
+3
-5
src/Rtsp/RtspSession.cpp
+5
-8
src/Rtsp/RtspSession.h
+1
-1
src/Rtsp/RtspSplitter.cpp
+2
-2
src/Rtsp/RtspSplitter.h
+2
-2
没有找到文件。
ZLToolKit
@
17c445fd
Subproject commit
d4d4ac1e9866ef4d025b8189264efe5ec8fa201c
Subproject commit
17c445fd1f42cddeeccdc6a06aa56cf2ffcfc99f
This diff is collapsed.
Click to expand it.
src/Extension/Frame.h
查看文件 @
700a16c7
...
...
@@ -161,7 +161,7 @@ public:
public
:
CodecId
_codec_id
=
CodecInvalid
;
s
tring
_buffer
;
BufferLikeS
tring
_buffer
;
uint32_t
_dts
=
0
;
uint32_t
_pts
=
0
;
uint32_t
_prefix_size
=
0
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpChunkedSplitter.cpp
查看文件 @
700a16c7
...
...
@@ -13,7 +13,7 @@
namespace
mediakit
{
const
char
*
HttpChunkedSplitter
::
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
{
const
char
*
HttpChunkedSplitter
::
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
{
auto
pos
=
strstr
(
data
,
"
\r\n
"
);
if
(
!
pos
){
return
nullptr
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpChunkedSplitter.h
查看文件 @
700a16c7
...
...
@@ -30,7 +30,7 @@ public:
protected
:
int64_t
onRecvHeader
(
const
char
*
data
,
uint64_t
len
)
override
;
void
onRecvContent
(
const
char
*
data
,
uint64_t
len
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
override
;
protected
:
virtual
void
onRecvChunk
(
const
char
*
data
,
uint64_t
len
){
if
(
_onChunkData
){
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpClient.cpp
查看文件 @
700a16c7
...
...
@@ -99,9 +99,6 @@ void HttpClient::onConnect(const SockException &ex) {
return
;
}
//先假设http客户端只会接收一点点数据(只接受http头,节省内存)
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
1
*
1024
));
_totalBodySize
=
0
;
_recvedBodySize
=
0
;
HttpRequestSplitter
::
reset
();
...
...
@@ -156,9 +153,6 @@ int64_t HttpClient::onRecvHeader(const char *data, uint64_t len) {
}
if
(
_parser
[
"Transfer-Encoding"
]
==
"chunked"
){
//我们认为这种情况下后面应该有大量的数据过来,加大接收缓存提高性能
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
256
*
1024
));
//如果Transfer-Encoding字段等于chunked,则认为后续的content是不限制长度的
_totalBodySize
=
-
1
;
_chunkedSplitter
=
std
::
make_shared
<
HttpChunkedSplitter
>
([
this
](
const
char
*
data
,
uint64_t
len
){
...
...
@@ -183,13 +177,6 @@ int64_t HttpClient::onRecvHeader(const char *data, uint64_t len) {
//但是由于我们没必要等content接收完毕才回调onRecvContent(因为这样浪费内存并且要多次拷贝数据)
//所以返回-1代表我们接下来分段接收content
_recvedBodySize
=
0
;
if
(
_totalBodySize
>
0
){
//根据_totalBodySize设置接收缓存大小
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
MIN
(
_totalBodySize
+
1
,
256
*
1024
)));
}
else
{
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
256
*
1024
));
}
return
-
1
;
}
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpRequestSplitter.cpp
查看文件 @
700a16c7
...
...
@@ -39,6 +39,9 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) {
const
char
*
index
=
nullptr
;
_remain_data_size
=
len
;
while
(
_content_len
==
0
&&
_remain_data_size
>
0
&&
(
index
=
onSearchPacketTail
(
ptr
,
_remain_data_size
))
!=
nullptr
)
{
if
(
index
==
ptr
){
break
;
}
//_content_len == 0,这是请求头
const
char
*
header_ptr
=
ptr
;
int64_t
header_size
=
index
-
ptr
;
...
...
@@ -61,8 +64,7 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) {
if
(
_content_len
==
0
){
//尚未找到http头,缓存定位到剩余数据部分
string
str
(
ptr
,
_remain_data_size
);
_remain_data
=
str
;
_remain_data
.
assign
(
ptr
,
_remain_data_size
);
return
;
}
...
...
@@ -71,8 +73,7 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) {
//数据按照固定长度content处理
if
(
_remain_data_size
<
_content_len
){
//数据不够,缓存定位到剩余数据部分
string
str
(
ptr
,
_remain_data_size
);
_remain_data
=
str
;
_remain_data
.
assign
(
ptr
,
_remain_data_size
);
return
;
}
//收到content数据,并且接受content完毕
...
...
@@ -85,9 +86,7 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) {
if
(
_remain_data_size
>
0
){
//还有数据没有处理完毕
string
str
(
ptr
,
_remain_data_size
);
_remain_data
=
str
;
_remain_data
.
assign
(
ptr
,
_remain_data_size
);
data
=
ptr
=
(
char
*
)
_remain_data
.
data
();
len
=
_remain_data
.
size
();
goto
splitPacket
;
...
...
@@ -112,7 +111,7 @@ void HttpRequestSplitter::reset() {
_remain_data
.
clear
();
}
const
char
*
HttpRequestSplitter
::
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
{
const
char
*
HttpRequestSplitter
::
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
{
auto
pos
=
strstr
(
data
,
"
\r\n\r\n
"
);
if
(
pos
==
nullptr
){
return
nullptr
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpRequestSplitter.h
查看文件 @
700a16c7
...
...
@@ -12,7 +12,9 @@
#define ZLMEDIAKIT_HTTPREQUESTSPLITTER_H
#include <string>
#include "Network/Buffer.h"
using
namespace
std
;
using
namespace
toolkit
;
namespace
mediakit
{
...
...
@@ -54,7 +56,7 @@ protected:
* @param len 数据长度
* @return nullptr代表未找到包位,否则返回包尾指针
*/
virtual
const
char
*
onSearchPacketTail
(
const
char
*
data
,
in
t
len
);
virtual
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
);
/**
* 设置content len
...
...
@@ -71,7 +73,7 @@ protected:
*/
int64_t
remainDataSize
();
private
:
s
tring
_remain_data
;
BufferLikeS
tring
_remain_data
;
int64_t
_content_len
=
0
;
int64_t
_remain_data_size
=
0
;
};
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpSession.cpp
查看文件 @
700a16c7
...
...
@@ -24,8 +24,6 @@ HttpSession::HttpSession(const Socket::Ptr &pSock) : TcpSession(pSock) {
TraceP
(
this
);
GET_CONFIG
(
uint32_t
,
keep_alive_sec
,
Http
::
kKeepAliveSecond
);
pSock
->
setSendTimeOutSecond
(
keep_alive_sec
);
//起始接收buffer缓存设置为4K,节省内存
pSock
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
4
*
1024
));
}
HttpSession
::~
HttpSession
()
{
...
...
@@ -638,14 +636,6 @@ void HttpSession::Handle_Req_POST(int64_t &content_len) {
return
;
}
//根据Content-Length设置接收缓存大小
if
(
totalContentLen
>
0
){
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
MIN
(
totalContentLen
+
1
,
256
*
1024
)));
}
else
{
//不定长度的Content-Length
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
256
*
1024
));
}
if
(
totalContentLen
>
0
&&
totalContentLen
<
maxReqSize
){
//返回固定长度的content
content_len
=
totalContentLen
;
...
...
@@ -738,9 +728,9 @@ void HttpSession::onWrite(const Buffer::Ptr &buffer, bool flush) {
}
}
void
HttpSession
::
onWebSocketEncodeData
(
const
Buffer
::
Ptr
&
buffer
){
void
HttpSession
::
onWebSocketEncodeData
(
Buffer
::
Ptr
buffer
){
_total_bytes_usage
+=
buffer
->
size
();
send
(
buffer
);
send
(
std
::
move
(
buffer
)
);
}
void
HttpSession
::
onWebSocketDecodeComplete
(
const
WebSocketHeader
&
header_in
){
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpSession.h
查看文件 @
700a16c7
...
...
@@ -92,7 +92,7 @@ protected:
* 发送数据进行websocket协议打包后回调
* @param buffer websocket协议数据
*/
void
onWebSocketEncodeData
(
const
Buffer
::
Ptr
&
buffer
)
override
;
void
onWebSocketEncodeData
(
Buffer
::
Ptr
buffer
)
override
;
/**
* 接收到完整的一个webSocket数据包后回调
...
...
This diff is collapsed.
Click to expand it.
src/Http/WebSocketClient.h
查看文件 @
700a16c7
...
...
@@ -43,11 +43,11 @@ protected:
/**
* 发送前拦截并打包为websocket协议
*/
int
send
(
const
Buffer
::
Ptr
&
buf
)
override
{
int
send
(
Buffer
::
Ptr
buf
)
override
{
if
(
_beforeSendCB
){
return
_beforeSendCB
(
buf
);
}
return
ClientType
::
send
(
buf
);
return
ClientType
::
send
(
std
::
move
(
buf
)
);
}
/**
...
...
@@ -287,8 +287,8 @@ protected:
* @param ptr 数据指针
* @param len 数据指针长度
*/
void
onWebSocketEncodeData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
HttpClientImp
::
send
(
buffer
);
void
onWebSocketEncodeData
(
Buffer
::
Ptr
buffer
)
override
{
HttpClientImp
::
send
(
std
::
move
(
buffer
)
);
}
private
:
...
...
This diff is collapsed.
Click to expand it.
src/Http/WebSocketSession.h
查看文件 @
700a16c7
...
...
@@ -53,11 +53,11 @@ protected:
* @param buf 需要截取的数据
* @return 数据字节数
*/
int
send
(
const
Buffer
::
Ptr
&
buf
)
override
{
int
send
(
Buffer
::
Ptr
buf
)
override
{
if
(
_beforeSendCB
)
{
return
_beforeSendCB
(
buf
);
}
return
TcpSessionType
::
send
(
buf
);
return
TcpSessionType
::
send
(
std
::
move
(
buf
)
);
}
string
getIdentifier
()
const
override
{
...
...
@@ -219,8 +219,8 @@ protected:
/**
* 发送数据进行websocket协议打包后回调
*/
void
onWebSocketEncodeData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
HttpSessionType
::
send
(
buffer
);
void
onWebSocketEncodeData
(
Buffer
::
Ptr
buffer
)
override
{
HttpSessionType
::
send
(
std
::
move
(
buffer
)
);
}
private
:
...
...
This diff is collapsed.
Click to expand it.
src/Http/WebSocketSplitter.h
查看文件 @
700a16c7
...
...
@@ -132,7 +132,7 @@ protected:
* @param ptr 数据指针
* @param len 数据指针长度
*/
virtual
void
onWebSocketEncodeData
(
const
Buffer
::
Ptr
&
buffer
){};
virtual
void
onWebSocketEncodeData
(
Buffer
::
Ptr
buffer
){};
private
:
void
onPayloadData
(
uint8_t
*
data
,
uint64_t
len
);
...
...
This diff is collapsed.
Click to expand it.
src/Record/MP4Muxer.cpp
查看文件 @
700a16c7
...
...
@@ -101,7 +101,8 @@ void MP4MuxerInterface::inputFrame(const Frame::Ptr &frame) {
if
(
_frameCached
.
size
()
!=
1
)
{
//缓存中有多帧,需要按照mp4格式合并一起
string
merged
;
BufferLikeString
merged
;
merged
.
reserve
(
back
->
size
()
+
1024
);
_frameCached
.
for_each
([
&
](
const
Frame
::
Ptr
&
frame
)
{
uint32_t
nalu_size
=
frame
->
size
()
-
frame
->
prefixSize
();
nalu_size
=
htonl
(
nalu_size
);
...
...
This diff is collapsed.
Click to expand it.
src/Record/TsMuxer.cpp
查看文件 @
700a16c7
...
...
@@ -107,7 +107,8 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
Frame
::
Ptr
back
=
_frameCached
.
back
();
Buffer
::
Ptr
merged_frame
=
back
;
if
(
_frameCached
.
size
()
!=
1
)
{
string
merged
;
BufferLikeString
merged
;
merged
.
reserve
(
back
->
size
()
+
1024
);
_frameCached
.
for_each
([
&
](
const
Frame
::
Ptr
&
frame
)
{
if
(
frame
->
prefixSize
())
{
merged
.
append
(
frame
->
data
(),
frame
->
size
());
...
...
@@ -119,7 +120,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
_is_idr_fast_packet
=
true
;
}
});
merged_frame
=
std
::
make_shared
<
Buffer
String
>
(
std
::
move
(
merged
));
merged_frame
=
std
::
make_shared
<
Buffer
Offset
<
BufferLikeString
>
>
(
std
::
move
(
merged
));
}
track_info
.
stamp
.
revise
(
back
->
dts
(),
back
->
pts
(),
dts_out
,
pts_out
);
//取视频时间戳为TS的时间戳
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/Rtmp.h
查看文件 @
700a16c7
...
...
@@ -136,7 +136,7 @@ public:
uint32_t
ts_field
=
0
;
uint32_t
stream_index
;
uint32_t
chunk_id
;
std
::
s
tring
buffer
;
BufferLikeS
tring
buffer
;
public
:
char
*
data
()
const
override
{
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpPlayer.h
查看文件 @
700a16c7
...
...
@@ -58,8 +58,8 @@ protected:
//from RtmpProtocol
void
onRtmpChunk
(
RtmpPacket
&
chunk_data
)
override
;
void
onStreamDry
(
uint32_t
stream_index
)
override
;
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
send
(
buffer
);
void
onSendRawData
(
Buffer
::
Ptr
buffer
)
override
{
send
(
std
::
move
(
buffer
)
);
}
template
<
typename
FUNC
>
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpProtocol.cpp
查看文件 @
700a16c7
差异被折叠。
点击展开。
src/Rtmp/RtmpProtocol.h
查看文件 @
700a16c7
...
...
@@ -21,23 +21,24 @@
#include "Util/TimeTicker.h"
#include "Network/Socket.h"
#include "Util/ResourcePool.h"
#include "Http/HttpRequestSplitter.h"
using
namespace
std
;
using
namespace
toolkit
;
namespace
mediakit
{
class
RtmpProtocol
{
class
RtmpProtocol
:
public
HttpRequestSplitter
{
public
:
RtmpProtocol
();
virtual
~
RtmpProtocol
();
void
onParseRtmp
(
const
char
*
data
,
in
t
size
);
void
onParseRtmp
(
const
char
*
data
,
uint64_
t
size
);
//作为客户端发送c0c1,等待s0s1s2并且回调
void
startClientSession
(
const
function
<
void
()
>
&
cb
);
protected
:
virtual
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
=
0
;
virtual
void
onSendRawData
(
Buffer
::
Ptr
buffer
)
=
0
;
virtual
void
onRtmpChunk
(
RtmpPacket
&
chunk_data
)
=
0
;
virtual
void
onStreamBegin
(
uint32_t
stream_index
){
_stream_index
=
stream_index
;
...
...
@@ -46,6 +47,11 @@ protected:
virtual
void
onStreamDry
(
uint32_t
stream_index
){};
protected
:
//// HttpRequestSplitter override ////
int64_t
onRecvHeader
(
const
char
*
data
,
uint64_t
len
)
override
{
return
0
;
}
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_t
len
)
override
;
protected
:
void
reset
();
BufferRaw
::
Ptr
obtainBuffer
();
BufferRaw
::
Ptr
obtainBuffer
(
const
void
*
data
,
int
len
);
...
...
@@ -66,20 +72,20 @@ protected:
void
sendRtmp
(
uint8_t
type
,
uint32_t
stream_index
,
const
Buffer
::
Ptr
&
buffer
,
uint32_t
stamp
,
int
chunk_id
);
private
:
void
handle_S0S1S2
(
const
function
<
void
()
>
&
func
);
void
handle_C0C1
();
void
handle_C1_simple
();
void
handle_C1_simple
(
const
char
*
data
);
#ifdef ENABLE_OPENSSL
void
handle_C1_complex
();
void
handle_C1_complex
(
const
char
*
data
);
string
get_C1_digest
(
const
uint8_t
*
ptr
,
char
**
digestPos
);
string
get_C1_key
(
const
uint8_t
*
ptr
);
void
check_C1_Digest
(
const
string
&
digest
,
const
string
&
data
);
void
send_complex_S0S1S2
(
int
schemeType
,
const
string
&
digest
);
#endif //ENABLE_OPENSSL
void
handle_C2
();
void
handle_rtmp
();
void
handle_rtmpChunk
(
RtmpPacket
&
chunk_data
);
const
char
*
handle_S0S1S2
(
const
char
*
data
,
uint64_t
len
,
const
function
<
void
()
>
&
func
);
const
char
*
handle_C0C1
(
const
char
*
data
,
uint64_t
len
);
const
char
*
handle_C2
(
const
char
*
data
,
uint64_t
len
);
const
char
*
handle_rtmp
(
const
char
*
data
,
uint64_t
len
);
void
handle_chunk
(
RtmpPacket
&
chunk_data
);
protected
:
int
_send_req_id
=
0
;
...
...
@@ -100,8 +106,7 @@ private:
uint32_t
_bandwidth
=
2500000
;
uint8_t
_band_limit_type
=
2
;
//////////Rtmp parser//////////
string
_recv_data_buf
;
function
<
void
()
>
_next_step_func
;
function
<
const
char
*
(
const
char
*
data
,
uint64_t
len
)
>
_next_step_func
;
////////////Chunk////////////
unordered_map
<
int
,
RtmpPacket
>
_map_chunk_data
;
};
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpPusher.cpp
查看文件 @
700a16c7
...
...
@@ -119,9 +119,6 @@ void RtmpPusher::onConnect(const SockException &err){
onPublishResult
(
err
,
false
);
return
;
}
//推流器不需要多大的接收缓存,节省内存占用
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
1
*
1024
));
weak_ptr
<
RtmpPusher
>
weak_self
=
dynamic_pointer_cast
<
RtmpPusher
>
(
shared_from_this
());
startClientSession
([
weak_self
]()
{
auto
strong_self
=
weak_self
.
lock
();
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpPusher.h
查看文件 @
700a16c7
...
...
@@ -43,8 +43,8 @@ protected:
//for RtmpProtocol override
void
onRtmpChunk
(
RtmpPacket
&
chunk_data
)
override
;
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
send
(
buffer
);
void
onSendRawData
(
Buffer
::
Ptr
buffer
)
override
{
send
(
std
::
move
(
buffer
)
);
}
private
:
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpSession.cpp
查看文件 @
700a16c7
...
...
@@ -17,8 +17,6 @@ RtmpSession::RtmpSession(const Socket::Ptr &sock) : TcpSession(sock) {
DebugP
(
this
);
GET_CONFIG
(
uint32_t
,
keep_alive_sec
,
Rtmp
::
kKeepAliveSecond
);
sock
->
setSendTimeOutSecond
(
keep_alive_sec
);
//起始接收buffer缓存设置为4K,节省内存
sock
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
4
*
1024
));
}
RtmpSession
::~
RtmpSession
()
{
...
...
@@ -151,9 +149,6 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
_publisher_src
->
setListener
(
dynamic_pointer_cast
<
MediaSourceEvent
>
(
shared_from_this
()));
//设置转协议
_publisher_src
->
setProtocolTranslation
(
enableHls
,
enableMP4
);
//如果是rtmp推流客户端,那么加大TCP接收缓存,这样能提升接收性能
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
256
*
1024
));
setSocketFlags
();
};
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/RtmpSession.h
查看文件 @
700a16c7
...
...
@@ -56,9 +56,9 @@ private:
void
setMetaData
(
AMFDecoder
&
dec
);
void
onSendMedia
(
const
RtmpPacket
::
Ptr
&
pkt
);
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
void
onSendRawData
(
Buffer
::
Ptr
buffer
)
override
{
_total_bytes
+=
buffer
->
size
();
send
(
buffer
);
send
(
std
::
move
(
buffer
)
);
}
void
onRtmpChunk
(
RtmpPacket
&
chunk_data
)
override
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtmp/amf.cpp
查看文件 @
700a16c7
...
...
@@ -539,7 +539,7 @@ std::string AMFDecoder::load<std::string>() {
if
(
pos
+
str_len
>
buf
.
size
())
{
throw
std
::
runtime_error
(
"Not enough data"
);
}
std
::
string
s
(
buf
,
pos
,
str_len
);
std
::
string
s
=
buf
.
substr
(
pos
,
str_len
);
pos
+=
str_len
;
return
s
;
}
...
...
@@ -612,7 +612,7 @@ std::string AMFDecoder::load_key() {
if
(
pos
+
str_len
>
buf
.
size
())
{
throw
std
::
runtime_error
(
"Not enough data"
);
}
std
::
string
s
(
buf
,
pos
,
str_len
);
std
::
string
s
=
buf
.
substr
(
pos
,
str_len
);
pos
+=
str_len
;
return
s
;
...
...
@@ -680,7 +680,7 @@ AMFValue AMFDecoder::load_arr() {
return
object
;
}
AMFDecoder
::
AMFDecoder
(
const
std
::
s
tring
&
buf_in
,
size_t
pos_in
,
int
version_in
)
:
AMFDecoder
::
AMFDecoder
(
const
BufferLikeS
tring
&
buf_in
,
size_t
pos_in
,
int
version_in
)
:
buf
(
buf_in
),
pos
(
pos_in
),
version
(
version_in
)
{
}
This diff is collapsed.
Click to expand it.
src/Rtmp/amf.h
查看文件 @
700a16c7
...
...
@@ -18,7 +18,9 @@
#include <map>
#include <stdexcept>
#include <functional>
#include "Network/Buffer.h"
using
namespace
std
;
using
namespace
toolkit
;
enum
AMFType
{
AMF_NUMBER
,
...
...
@@ -81,7 +83,7 @@ private:
class
AMFDecoder
{
public
:
AMFDecoder
(
const
std
::
s
tring
&
buf
,
size_t
pos
,
int
version
=
0
);
AMFDecoder
(
const
BufferLikeS
tring
&
buf
,
size_t
pos
,
int
version
=
0
);
template
<
typename
TP
>
TP
load
();
private
:
...
...
@@ -92,7 +94,7 @@ private:
uint8_t
front
();
uint8_t
pop_front
();
private
:
const
std
::
s
tring
&
buf
;
const
BufferLikeS
tring
&
buf
;
size_t
pos
;
int
version
;
};
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/Decoder.cpp
查看文件 @
700a16c7
...
...
@@ -102,11 +102,12 @@ void FrameMerger::inputFrame(const Frame::Ptr &frame,const function<void(uint32_
Frame
::
Ptr
back
=
_frameCached
.
back
();
Buffer
::
Ptr
merged_frame
=
back
;
if
(
_frameCached
.
size
()
!=
1
){
string
merged
;
BufferLikeString
merged
;
merged
.
reserve
(
back
->
size
()
+
1024
);
_frameCached
.
for_each
([
&
](
const
Frame
::
Ptr
&
frame
){
merged
.
append
(
frame
->
data
(),
frame
->
size
());
});
merged_frame
=
std
::
make_shared
<
Buffer
String
>
(
std
::
move
(
merged
));
merged_frame
=
std
::
make_shared
<
Buffer
Offset
<
BufferLikeString
>
>
(
std
::
move
(
merged
));
}
cb
(
back
->
dts
(),
back
->
pts
(),
merged_frame
);
_frameCached
.
clear
();
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/GB28181Process.cpp
查看文件 @
700a16c7
...
...
@@ -69,7 +69,7 @@ void GB28181Process::onRtpSorted(const RtpPacket::Ptr &rtp, int) {
_rtp_decoder
->
inputRtp
(
rtp
,
false
);
}
const
char
*
GB28181Process
::
onSearchPacketTail
(
const
char
*
packet
,
in
t
bytes
){
const
char
*
GB28181Process
::
onSearchPacketTail
(
const
char
*
packet
,
uint64_
t
bytes
){
try
{
auto
ret
=
_decoder
->
input
((
uint8_t
*
)
packet
,
bytes
);
if
(
ret
>
0
)
{
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/GB28181Process.h
查看文件 @
700a16c7
...
...
@@ -37,7 +37,7 @@ public:
protected
:
void
onRtpSorted
(
const
RtpPacket
::
Ptr
&
rtp
,
int
track_index
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
override
;
int64_t
onRecvHeader
(
const
char
*
data
,
uint64_t
len
)
override
{
return
0
;
};
private
:
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/PSEncoder.cpp
查看文件 @
700a16c7
...
...
@@ -129,7 +129,8 @@ void PSEncoder::inputFrame(const Frame::Ptr &frame) {
Frame
::
Ptr
back
=
_frameCached
.
back
();
Buffer
::
Ptr
merged_frame
=
back
;
if
(
_frameCached
.
size
()
!=
1
)
{
string
merged
;
BufferLikeString
merged
;
merged
.
reserve
(
back
->
size
()
+
1024
);
_frameCached
.
for_each
([
&
](
const
Frame
::
Ptr
&
frame
)
{
if
(
frame
->
prefixSize
())
{
merged
.
append
(
frame
->
data
(),
frame
->
size
());
...
...
@@ -138,7 +139,7 @@ void PSEncoder::inputFrame(const Frame::Ptr &frame) {
merged
.
append
(
frame
->
data
(),
frame
->
size
());
}
});
merged_frame
=
std
::
make_shared
<
Buffer
String
>
(
std
::
move
(
merged
));
merged_frame
=
std
::
make_shared
<
Buffer
Offset
<
BufferLikeString
>
>
(
std
::
move
(
merged
));
}
track_info
.
stamp
.
revise
(
back
->
dts
(),
back
->
pts
(),
dts_out
,
pts_out
);
_timestamp
=
dts_out
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/RtpSplitter.cpp
查看文件 @
700a16c7
...
...
@@ -9,7 +9,6 @@
*/
#if defined(ENABLE_RTPPROXY)
#include <netinet/in.h>
#include <string.h>
#include "RtpSplitter.h"
namespace
mediakit
{
...
...
@@ -35,14 +34,14 @@ int64_t RtpSplitter::onRecvHeader(const char *data,uint64_t len){
return
0
;
}
static
bool
isEhome
(
const
char
*
data
,
in
t
len
){
static
bool
isEhome
(
const
char
*
data
,
uint64_
t
len
){
if
(
len
<
4
)
{
return
false
;
}
return
memcmp
(
data
,
kEHOME_MAGIC
,
sizeof
(
kEHOME_MAGIC
)
-
1
)
==
0
;
}
const
char
*
RtpSplitter
::
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
{
const
char
*
RtpSplitter
::
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
{
if
(
len
<
4
)
{
//数据不够
return
nullptr
;
...
...
@@ -70,7 +69,7 @@ const char *RtpSplitter::onSearchPacketTail(const char *data, int len) {
return
onSearchPacketTail_l
(
data
,
len
);
}
const
char
*
RtpSplitter
::
onSearchPacketTail_l
(
const
char
*
data
,
in
t
len
)
{
const
char
*
RtpSplitter
::
onSearchPacketTail_l
(
const
char
*
data
,
uint64_
t
len
)
{
//这是rtp包
uint16_t
length
=
(((
uint8_t
*
)
data
)[
0
]
<<
8
)
|
((
uint8_t
*
)
data
)[
1
];
if
(
len
<
length
+
2
)
{
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/RtpSplitter.h
查看文件 @
700a16c7
...
...
@@ -31,8 +31,8 @@ protected:
protected
:
int64_t
onRecvHeader
(
const
char
*
data
,
uint64_t
len
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
override
;
const
char
*
onSearchPacketTail_l
(
const
char
*
data
,
in
t
len
);
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
override
;
const
char
*
onSearchPacketTail_l
(
const
char
*
data
,
uint64_
t
len
);
private
:
int
_offset
=
0
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/TSDecoder.cpp
查看文件 @
700a16c7
...
...
@@ -28,7 +28,7 @@ int64_t TSSegment::onRecvHeader(const char *data, uint64_t len) {
return
0
;
}
const
char
*
TSSegment
::
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
{
const
char
*
TSSegment
::
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
{
if
(
len
<
_size
+
1
)
{
if
(
len
==
_size
&&
((
uint8_t
*
)
data
)[
0
]
==
TS_SYNC_BYTE
)
{
return
data
+
_size
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/TSDecoder.h
查看文件 @
700a16c7
...
...
@@ -31,7 +31,7 @@ public:
static
bool
isTSPacket
(
const
char
*
data
,
int
len
);
protected
:
int64_t
onRecvHeader
(
const
char
*
data
,
uint64_t
len
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
override
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
override
;
private
:
int
_size
;
onSegment
_onSegment
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspPlayer.cpp
查看文件 @
700a16c7
...
...
@@ -704,7 +704,8 @@ void RtspPlayer::sendRtspRequest(const string &cmd, const string &url,const StrC
for
(
auto
&
pr
:
header
){
printer
<<
pr
.
first
<<
": "
<<
pr
.
second
<<
"
\r\n
"
;
}
SockSender
::
send
(
printer
<<
"
\r\n
"
);
printer
<<
"
\r\n
"
;
SockSender
::
send
(
std
::
move
(
printer
));
}
void
RtspPlayer
::
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
rtp
,
const
SdpTrack
::
Ptr
&
track
)
{
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspPusher.cpp
查看文件 @
700a16c7
...
...
@@ -121,8 +121,6 @@ void RtspPusher::onConnect(const SockException &err) {
onPublishResult
(
err
,
false
);
return
;
}
//推流器不需要多大的接收缓存,节省内存占用
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
1
*
1024
));
sendAnnounce
();
}
...
...
@@ -318,7 +316,7 @@ inline void RtspPusher::sendRtpPacket(const RtspMediaSource::RingDataType &pkt)
setSendFlushFlag
(
true
);
}
BufferRtp
::
Ptr
buffer
(
new
BufferRtp
(
rtp
));
send
(
buffer
);
send
(
std
::
move
(
buffer
)
);
});
break
;
}
...
...
@@ -335,7 +333,7 @@ inline void RtspPusher::sendRtpPacket(const RtspMediaSource::RingDataType &pkt)
}
BufferRtp
::
Ptr
buffer
(
new
BufferRtp
(
rtp
,
4
));
pSock
->
send
(
buffer
,
nullptr
,
0
,
++
i
==
size
);
pSock
->
send
(
std
::
move
(
buffer
)
,
nullptr
,
0
,
++
i
==
size
);
});
break
;
}
...
...
@@ -475,7 +473,7 @@ void RtspPusher::sendRtspRequest(const string &cmd, const string &url,const StrC
if
(
!
sdp
.
empty
())
{
printer
<<
sdp
;
}
SockSender
::
send
(
printer
);
SockSender
::
send
(
std
::
move
(
printer
)
);
}
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspSession.cpp
查看文件 @
700a16c7
...
...
@@ -60,8 +60,6 @@ RtspSession::RtspSession(const Socket::Ptr &sock) : TcpSession(sock) {
DebugP
(
this
);
GET_CONFIG
(
uint32_t
,
keep_alive_sec
,
Rtsp
::
kKeepAliveSecond
);
sock
->
setSendTimeOutSecond
(
keep_alive_sec
);
//起始接收buffer缓存设置为4K,节省内存
sock
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
4
*
1024
));
}
RtspSession
::~
RtspSession
()
{
...
...
@@ -270,8 +268,7 @@ void RtspSession::handleReq_RECORD(const Parser &parser){
rtp_info
.
pop_back
();
sendRtspResponse
(
"200 OK"
,
{
"RTP-Info"
,
rtp_info
});
if
(
_rtp_type
==
Rtsp
::
RTP_TCP
){
//如果是rtsp推流服务器,并且是TCP推流,那么加大TCP接收缓存,这样能提升接收性能
getSock
()
->
setReadBuffer
(
std
::
make_shared
<
BufferRaw
>
(
256
*
1024
));
//如果是rtsp推流服务器,并且是TCP推流,设置socket flags,,这样能提升接收性能
setSocketFlags
();
}
};
...
...
@@ -1030,15 +1027,15 @@ bool RtspSession::sendRtspResponse(const string &res_code, const StrCaseMap &hea
printer
<<
sdp
;
}
// DebugP(this) << printer;
return
send
(
std
::
make_shared
<
BufferString
>
(
printer
))
>
0
;
return
send
(
std
::
make_shared
<
BufferString
>
(
std
::
move
(
printer
)
))
>
0
;
}
int
RtspSession
::
send
(
const
Buffer
::
Ptr
&
pkt
){
int
RtspSession
::
send
(
Buffer
::
Ptr
pkt
){
// if(!_enableSendRtp){
// DebugP(this) << pkt->data();
// }
_bytes_usage
+=
pkt
->
size
();
return
TcpSession
::
send
(
pkt
);
return
TcpSession
::
send
(
std
::
move
(
pkt
)
);
}
bool
RtspSession
::
sendRtspResponse
(
const
string
&
res_code
,
const
std
::
initializer_list
<
string
>
&
header
,
const
string
&
sdp
,
const
char
*
protocol
)
{
...
...
@@ -1162,7 +1159,7 @@ void RtspSession::sendRtpPacket(const RtspMediaSource::RingDataType &pkt) {
}
BufferRtp
::
Ptr
buffer
(
new
BufferRtp
(
rtp
,
4
));
_bytes_usage
+=
buffer
->
size
();
pSock
->
send
(
buffer
,
nullptr
,
0
,
++
i
==
size
);
pSock
->
send
(
std
::
move
(
buffer
)
,
nullptr
,
0
,
++
i
==
size
);
});
}
break
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspSession.h
查看文件 @
700a16c7
...
...
@@ -93,7 +93,7 @@ protected:
std
::
shared_ptr
<
SockInfo
>
getOriginSock
(
MediaSource
&
sender
)
const
override
;
/////TcpSession override////
int
send
(
const
Buffer
::
Ptr
&
pkt
)
override
;
int
send
(
Buffer
::
Ptr
pkt
)
override
;
//收到RTCP包回调
virtual
void
onRtcpPacket
(
int
track_idx
,
SdpTrack
::
Ptr
&
track
,
unsigned
char
*
data
,
unsigned
int
len
);
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspSplitter.cpp
查看文件 @
700a16c7
...
...
@@ -15,7 +15,7 @@
namespace
mediakit
{
const
char
*
RtspSplitter
::
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
{
const
char
*
RtspSplitter
::
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
{
auto
ret
=
onSearchPacketTail_l
(
data
,
len
);
if
(
ret
){
return
ret
;
...
...
@@ -32,7 +32,7 @@ const char *RtspSplitter::onSearchPacketTail(const char *data, int len) {
return
ret
;
}
const
char
*
RtspSplitter
::
onSearchPacketTail_l
(
const
char
*
data
,
in
t
len
)
{
const
char
*
RtspSplitter
::
onSearchPacketTail_l
(
const
char
*
data
,
uint64_
t
len
)
{
if
(
!
_enableRecvRtp
||
data
[
0
]
!=
'$'
){
//这是rtsp包
_isRtpPacket
=
false
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/RtspSplitter.h
查看文件 @
700a16c7
...
...
@@ -47,8 +47,8 @@ protected:
*/
virtual
int64_t
getContentLength
(
Parser
&
parser
);
protected
:
const
char
*
onSearchPacketTail
(
const
char
*
data
,
in
t
len
)
override
;
const
char
*
onSearchPacketTail_l
(
const
char
*
data
,
in
t
len
)
;
const
char
*
onSearchPacketTail
(
const
char
*
data
,
uint64_
t
len
)
override
;
const
char
*
onSearchPacketTail_l
(
const
char
*
data
,
uint64_
t
len
)
;
int64_t
onRecvHeader
(
const
char
*
data
,
uint64_t
len
)
override
;
void
onRecvContent
(
const
char
*
data
,
uint64_t
len
)
override
;
private
:
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论