mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-10-31 00:37:39 +08:00
使用临时变量和std::move减少智能指针的拷贝构造
This commit is contained in:
parent
83a24a5863
commit
dfaa8b540c
@ -1 +1 @@
|
||||
Subproject commit 735f194e18d5fb576c0da03024226a6f38537e5a
|
||||
Subproject commit ac02dc10fb0cc065d72a0e950e5c1aafff1da0d6
|
@ -328,13 +328,13 @@ public:
|
||||
|
||||
virtual ~PacketCache() = default;
|
||||
|
||||
void inputPacket(bool is_video, const std::shared_ptr<packet> &pkt, bool key_pos) {
|
||||
void inputPacket(bool is_video, std::shared_ptr<packet> pkt, bool key_pos) {
|
||||
if (_policy.isFlushAble(is_video, key_pos, _policy.getStamp(pkt), _cache->size())) {
|
||||
flushAll();
|
||||
}
|
||||
|
||||
//追加数据到最后
|
||||
_cache->emplace_back(pkt);
|
||||
_cache->emplace_back(std::move(pkt));
|
||||
if (key_pos) {
|
||||
_key_pos = key_pos;
|
||||
}
|
||||
@ -344,14 +344,14 @@ public:
|
||||
_cache->clear();
|
||||
}
|
||||
|
||||
virtual void onFlush(std::shared_ptr<packet_list> &, bool key_pos) = 0;
|
||||
virtual void onFlush(std::shared_ptr<packet_list>, bool key_pos) = 0;
|
||||
|
||||
private:
|
||||
void flushAll() {
|
||||
if (_cache->empty()) {
|
||||
return;
|
||||
}
|
||||
onFlush(_cache, _key_pos);
|
||||
onFlush(std::move(_cache), _key_pos);
|
||||
_cache = std::make_shared<packet_list>();
|
||||
_key_pos = false;
|
||||
}
|
||||
|
@ -92,7 +92,7 @@ public:
|
||||
* @param packet FMP4包
|
||||
* @param key 是否为关键帧第一个包
|
||||
*/
|
||||
void onWrite(const FMP4Packet::Ptr &packet, bool key) override {
|
||||
void onWrite(FMP4Packet::Ptr packet, bool key) override {
|
||||
if (!_ring) {
|
||||
createRing();
|
||||
}
|
||||
@ -100,7 +100,7 @@ public:
|
||||
_have_video = true;
|
||||
}
|
||||
_speed += packet->size();
|
||||
PacketCache<FMP4Packet, FMP4FlushPolicy>::inputPacket(true, packet, key);
|
||||
PacketCache<FMP4Packet, FMP4FlushPolicy>::inputPacket(true, std::move(packet), key);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -132,9 +132,9 @@ private:
|
||||
* @param packet_list 合并写缓存列队
|
||||
* @param key_pos 是否包含关键帧
|
||||
*/
|
||||
void onFlush(std::shared_ptr<List<FMP4Packet::Ptr> > &packet_list, bool key_pos) override {
|
||||
void onFlush(std::shared_ptr<List<FMP4Packet::Ptr> > packet_list, bool key_pos) override {
|
||||
//如果不存在视频,那么就没有存在GOP缓存的意义,所以确保一直清空GOP缓存
|
||||
_ring->write(packet_list, _have_video ? key_pos : true);
|
||||
_ring->write(std::move(packet_list), _have_video ? key_pos : true);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -74,7 +74,7 @@ protected:
|
||||
}
|
||||
FMP4Packet::Ptr packet = std::make_shared<FMP4Packet>(std::move(string));
|
||||
packet->time_stamp = stamp;
|
||||
_media_src->onWrite(packet, key_frame);
|
||||
_media_src->onWrite(std::move(packet), key_frame);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -118,7 +118,7 @@ public:
|
||||
* 输入rtmp包
|
||||
* @param pkt rtmp包
|
||||
*/
|
||||
void onWrite(const RtmpPacket::Ptr &pkt, bool = true) override {
|
||||
void onWrite(RtmpPacket::Ptr pkt, bool = true) override {
|
||||
_speed += pkt->size();
|
||||
//保存当前时间戳
|
||||
switch (pkt->type_id) {
|
||||
@ -152,7 +152,8 @@ public:
|
||||
regist();
|
||||
}
|
||||
}
|
||||
PacketCache<RtmpPacket>::inputPacket(pkt->type_id == MSG_VIDEO, pkt, pkt->isVideoKeyFrame());
|
||||
bool key = pkt->isVideoKeyFrame();
|
||||
PacketCache<RtmpPacket>::inputPacket(pkt->type_id == MSG_VIDEO, std::move(pkt), key);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -186,9 +187,9 @@ private:
|
||||
* @param rtmp_list rtmp包列表
|
||||
* @param key_pos 是否包含关键帧
|
||||
*/
|
||||
void onFlush(std::shared_ptr<List<RtmpPacket::Ptr> > &rtmp_list, bool key_pos) override {
|
||||
void onFlush(std::shared_ptr<List<RtmpPacket::Ptr> > rtmp_list, bool key_pos) override {
|
||||
//如果不存在视频,那么就没有存在GOP缓存的意义,所以is_key一直为true确保一直清空GOP缓存
|
||||
_ring->write(rtmp_list, _have_video ? key_pos : true);
|
||||
_ring->write(std::move(rtmp_list), _have_video ? key_pos : true);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -60,12 +60,12 @@ public:
|
||||
/**
|
||||
* 输入rtmp并解析
|
||||
*/
|
||||
void onWrite(const RtmpPacket::Ptr &pkt, bool = true) override {
|
||||
void onWrite(RtmpPacket::Ptr pkt, bool = true) override {
|
||||
if (!_all_track_ready || _muxer->isEnabled()) {
|
||||
//未获取到所有Track后,或者开启转协议,那么需要解复用rtmp
|
||||
_demuxer->inputRtmp(pkt);
|
||||
}
|
||||
RtmpMediaSource::onWrite(pkt);
|
||||
RtmpMediaSource::onWrite(std::move(pkt));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -113,7 +113,7 @@ void PSRtpSender::onRtp(const RtpPacket::Ptr &rtp, bool) {
|
||||
}
|
||||
|
||||
//此函数在其他线程执行
|
||||
void PSRtpSender::onFlush(shared_ptr<List<RtpPacket::Ptr>> &rtp_list, bool) {
|
||||
void PSRtpSender::onFlush(shared_ptr<List<RtpPacket::Ptr> > rtp_list, bool) {
|
||||
if(!_is_connect){
|
||||
//连接成功后才能发送数据
|
||||
return;
|
||||
|
@ -24,7 +24,7 @@ public:
|
||||
RingDelegateHelper(onRtp on_rtp){
|
||||
_on_rtp = std::move(on_rtp);
|
||||
}
|
||||
void onWrite(const RtpPacket::Ptr &in, bool is_key) override{
|
||||
void onWrite(RtpPacket::Ptr in, bool is_key) override{
|
||||
_on_rtp(in, is_key);
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ protected:
|
||||
* @param rtp_list rtp包列表
|
||||
* @param key_pos 是否包含关键帧
|
||||
*/
|
||||
void onFlush(std::shared_ptr<List<RtpPacket::Ptr> > &rtp_list, bool key_pos) override;
|
||||
void onFlush(std::shared_ptr<List<RtpPacket::Ptr> > rtp_list, bool key_pos) override;
|
||||
|
||||
private:
|
||||
//rtp打包后回调
|
||||
|
@ -156,7 +156,7 @@ public:
|
||||
* @param rtp rtp包
|
||||
* @param keyPos 该包是否为关键帧的第一个包
|
||||
*/
|
||||
void onWrite(const RtpPacket::Ptr &rtp, bool keyPos) override {
|
||||
void onWrite(RtpPacket::Ptr rtp, bool keyPos) override {
|
||||
_speed += rtp->size();
|
||||
assert(rtp->type >= 0 && rtp->type < TrackMax);
|
||||
auto track = _tracks[rtp->type];
|
||||
@ -182,7 +182,7 @@ public:
|
||||
regist();
|
||||
}
|
||||
}
|
||||
PacketCache<RtpPacket>::inputPacket(rtp->type == TrackVideo, rtp, keyPos);
|
||||
PacketCache<RtpPacket>::inputPacket(rtp->type == TrackVideo, std::move(rtp), keyPos);
|
||||
}
|
||||
|
||||
void clearCache() override{
|
||||
@ -196,9 +196,9 @@ private:
|
||||
* @param rtp_list rtp包列表
|
||||
* @param key_pos 是否包含关键帧
|
||||
*/
|
||||
void onFlush(std::shared_ptr<List<RtpPacket::Ptr> > &rtp_list, bool key_pos) override {
|
||||
void onFlush(std::shared_ptr<List<RtpPacket::Ptr> > rtp_list, bool key_pos) override {
|
||||
//如果不存在视频,那么就没有存在GOP缓存的意义,所以is_key一直为true确保一直清空GOP缓存
|
||||
_ring->write(rtp_list, _have_video ? key_pos : true);
|
||||
_ring->write(std::move(rtp_list), _have_video ? key_pos : true);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
/**
|
||||
* 输入rtp并解析
|
||||
*/
|
||||
void onWrite(const RtpPacket::Ptr &rtp, bool key_pos) override {
|
||||
void onWrite(RtpPacket::Ptr rtp, bool key_pos) override {
|
||||
if (_all_track_ready && !_muxer->isEnabled()) {
|
||||
//获取到所有Track后,并且未开启转协议,那么不需要解复用rtp
|
||||
//在关闭rtp解复用后,无法知道是否为关键帧,这样会导致无法秒开,或者开播花屏
|
||||
@ -56,7 +56,7 @@ public:
|
||||
//需要解复用rtp
|
||||
key_pos = _demuxer->inputRtp(rtp);
|
||||
}
|
||||
RtspMediaSource::onWrite(rtp, key_pos);
|
||||
RtspMediaSource::onWrite(std::move(rtp), key_pos);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -75,7 +75,7 @@ public:
|
||||
* @param packet TS包
|
||||
* @param key 是否为关键帧第一个包
|
||||
*/
|
||||
void onWrite(const TSPacket::Ptr &packet, bool key) override {
|
||||
void onWrite(TSPacket::Ptr packet, bool key) override {
|
||||
_speed += packet->size();
|
||||
if (!_ring) {
|
||||
createRing();
|
||||
@ -83,7 +83,7 @@ public:
|
||||
if (key) {
|
||||
_have_video = true;
|
||||
}
|
||||
PacketCache<TSPacket, TSFlushPolicy>::inputPacket(true, packet, key);
|
||||
PacketCache<TSPacket, TSFlushPolicy>::inputPacket(true, std::move(packet), key);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -114,9 +114,9 @@ private:
|
||||
* @param packet_list 合并写缓存列队
|
||||
* @param key_pos 是否包含关键帧
|
||||
*/
|
||||
void onFlush(std::shared_ptr<List<TSPacket::Ptr> > &packet_list, bool key_pos) override {
|
||||
void onFlush(std::shared_ptr<List<TSPacket::Ptr> > packet_list, bool key_pos) override {
|
||||
//如果不存在视频,那么就没有存在GOP缓存的意义,所以确保一直清空GOP缓存
|
||||
_ring->write(packet_list, _have_video ? key_pos : true);
|
||||
_ring->write(std::move(packet_list), _have_video ? key_pos : true);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -70,7 +70,7 @@ protected:
|
||||
TSPacket::Ptr packet = _pool.obtain();
|
||||
packet->assign((char *) data, len);
|
||||
packet->time_stamp = timestamp;
|
||||
_media_src->onWrite(packet, is_idr_fast_packet);
|
||||
_media_src->onWrite(std::move(packet), is_idr_fast_packet);
|
||||
}
|
||||
|
||||
private:
|
||||
|
Loading…
Reference in New Issue
Block a user