大幅提升接收推流性能以及降低内存占用

This commit is contained in:
xiongziliang
2020-11-01 03:41:35 +08:00
parent 5c7a08eb7c
commit 700a16c759
38 changed files with 173 additions and 193 deletions

View File

@@ -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<BufferString>(std::move(merged));
merged_frame = std::make_shared<BufferOffset<BufferLikeString> >(std::move(merged));
}
cb(back->dts(),back->pts(),merged_frame);
_frameCached.clear();

View File

@@ -69,7 +69,7 @@ void GB28181Process::onRtpSorted(const RtpPacket::Ptr &rtp, int) {
_rtp_decoder->inputRtp(rtp, false);
}
const char *GB28181Process::onSearchPacketTail(const char *packet,int bytes){
const char *GB28181Process::onSearchPacketTail(const char *packet,uint64_t bytes){
try {
auto ret = _decoder->input((uint8_t *) packet, bytes);
if (ret > 0) {

View File

@@ -37,7 +37,7 @@ public:
protected:
void onRtpSorted(const RtpPacket::Ptr &rtp, int track_index) override ;
const char *onSearchPacketTail(const char *data,int 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:

View File

@@ -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<BufferString>(std::move(merged));
merged_frame = std::make_shared<BufferOffset<BufferLikeString> >(std::move(merged));
}
track_info.stamp.revise(back->dts(), back->pts(), dts_out, pts_out);
_timestamp = dts_out;

View File

@@ -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, int 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, int 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, int 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) {

View File

@@ -31,8 +31,8 @@ protected:
protected:
int64_t onRecvHeader(const char *data, uint64_t len) override;
const char *onSearchPacketTail(const char *data, int len) override;
const char *onSearchPacketTail_l(const char *data, int 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;

View File

@@ -28,7 +28,7 @@ int64_t TSSegment::onRecvHeader(const char *data, uint64_t len) {
return 0;
}
const char *TSSegment::onSearchPacketTail(const char *data, int 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;

View File

@@ -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, int len) override ;
const char *onSearchPacketTail(const char *data, uint64_t len) override ;
private:
int _size;
onSegment _onSegment;