Compare commits

...

4 Commits

Author SHA1 Message Date
xia-chu
57fede9508 修复编译警告
Some checks are pending
Android / build (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
Docker / build (push) Waiting to run
Linux / build (push) Waiting to run
macOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2025-08-09 15:42:28 +08:00
yingxiaodong
d2e099bd23
BUG修正:loadMP4File播放文件时,无人观看触发关闭,导致程序崩溃 (#4387)
关闭文件播放的处理与文件播放动作不在一个线程,导致崩溃。
2025-08-09 14:37:54 +08:00
dsjing
87d84c47fe
修正ENABLE_RTPPROXY未启用时编译失败问题 (#4384) 2025-08-09 14:24:23 +08:00
Lidaofu
90fcad41f2
feat: C Api 增加部分函数 (#4382)
feat: C Api
增加mk_recorder_start_task(录制任务)、mk_rtp_server_create3(rtp多路复用)、mk_rtp_server_update_ssrc(更新ssrc)、mk_rtp_get_info(获取rtp信息)、mk_rtp_pause_check(暂停RTP超时检查)、mk_rtp_resume_check(恢复RTP超时检查)、mk_media_source_set_speed(回放流速度配置)等函数

---------

Co-authored-by: lidaofu <lidf@ahtelit.com>
2025-08-09 10:45:16 +08:00
22 changed files with 183 additions and 41 deletions

View File

@ -193,6 +193,8 @@ API_EXPORT uint64_t API_CALL mk_media_source_get_alive_second(const mk_media_sou
API_EXPORT int API_CALL mk_media_source_close(const mk_media_source ctx,int force);
//MediaSource::seekTo()
API_EXPORT int API_CALL mk_media_source_seek_to(const mk_media_source ctx,uint32_t stamp);
// MediaSource::setSpeed()
API_EXPORT void API_CALL mk_media_source_set_speed(const mk_media_source ctx, float speed);
/**
* rtp推流成功与否的回调()

View File

@ -125,6 +125,21 @@ API_EXPORT int API_CALL mk_recorder_start(int type, const char *vhost, const cha
*/
API_EXPORT int API_CALL mk_recorder_stop(int type, const char *vhost, const char *app, const char *stream);
/**
*
* @param vhost
* @param app
* @param stream id
* @param path
* @param back_ms
* @param forward_ms
* @return 1:0
* */
API_EXPORT int API_CALL mk_recorder_start_task(const char *vhost, const char *app, const char *stream, const char *path, uint32_t back_ms, uint32_t forward_ms);
/**
* mp4列表
* @param vhost

View File

@ -21,6 +21,7 @@ typedef struct mk_rtp_server_t *mk_rtp_server;
* @param port 0
* @param tcp_mode tcp模式(0: 1: 2: )
* @param stream_id id
* @param multiple RTP服务器 1: 0:
* @return
* Create GB28181 RTP server
* @param port Listening port, 0 for random
@ -32,6 +33,7 @@ typedef struct mk_rtp_server_t *mk_rtp_server;
*/
API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create(uint16_t port, int tcp_mode, const char *stream_id);
API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create2(uint16_t port, int tcp_mode, const char *vhost, const char *app, const char *stream_id);
API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create3(uint16_t port, int tcp_mode, const char *vhost, const char *app, const char *stream_id, int multiplex);
/**
* TCP
@ -110,6 +112,53 @@ typedef void(API_CALL *on_mk_rtp_server_detach)(void *user_data);
API_EXPORT void API_CALL mk_rtp_server_set_on_detach(mk_rtp_server ctx, on_mk_rtp_server_detach cb, void *user_data);
API_EXPORT void API_CALL mk_rtp_server_set_on_detach2(mk_rtp_server ctx, on_mk_rtp_server_detach cb, void *user_data, on_user_data_free user_data_free);
/**
* RTP服务器过滤SSRC
* @param ctx
* @param ssrc ssrc
*
*/
API_EXPORT void API_CALL mk_rtp_server_update_ssrc(mk_rtp_server ctx, uint32_t ssrc);
/**
* rtp信息获取回调
* @param exist rtp信息 0: 1:
* @param peer_ip ip
* @param peer_port
* @param local_ip ip
* @param local_port
* @param identifier
*
*/
typedef void(API_CALL *on_mk_rtp_get_info)(int exist, const char *peer_ip, uint16_t peer_port, const char *local_ip, uint16_t local_port, const char *identifier);
/**
* rtp推流信息
* @param app
* @param stream id
* @param cb rtp信息获取回调
*
*/
API_EXPORT void API_CALL mk_rtp_get_info(const char *app, const char *stream, on_mk_rtp_get_info cb);
/**
* RTP超时检查
* @param app
* @param stream id
*
*/
API_EXPORT void API_CALL mk_rtp_pause_check(const char *app, const char *stream);
/**
* RTP超时检查
* @param app
* @param stream id
*
*/
API_EXPORT void API_CALL mk_rtp_resume_check(const char *app, const char *stream);
#ifdef __cplusplus
}
#endif

View File

@ -296,6 +296,13 @@ API_EXPORT int API_CALL mk_media_source_seek_to(const mk_media_source ctx,uint32
MediaSource *src = (MediaSource *)ctx;
return src->seekTo(stamp);
}
API_EXPORT void API_CALL mk_media_source_set_speed(const mk_media_source ctx, float speed) {
assert(ctx);
MediaSource *src = (MediaSource *)ctx;
src->getOwnerPoller()->async([=]() mutable { src->speed(speed); });
}
API_EXPORT void API_CALL mk_media_source_start_send_rtp(const mk_media_source ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int con_type, on_mk_media_source_send_rtp_result cb, void *user_data) {
mk_media_source_start_send_rtp2(ctx, dst_url, dst_port, ssrc, con_type, cb, user_data, nullptr);
}
@ -347,6 +354,7 @@ API_EXPORT void API_CALL mk_media_source_start_send_rtp4(const mk_media_source c
args.close_delay_ms = (*ini_ptr)["close_delay_ms"].empty() ? 0 : (*ini_ptr)["close_delay_ms"].as<int>();
args.rtcp_timeout_ms = (*ini_ptr)["rtcp_timeout_ms"].empty() ? 30000 : (*ini_ptr)["rtcp_timeout_ms"].as<int>();
args.rtcp_send_interval_ms = (*ini_ptr)["rtcp_send_interval_ms"].empty() ? 5000 : (*ini_ptr)["rtcp_send_interval_ms"].as<int>();
args.enable_origin_recv_limit = (*ini_ptr)["enable_origin_recv_limit"].empty() ? false : (*ini_ptr)["enable_origin_recv_limit"].as<bool>();
std::shared_ptr<void> ptr(
user_data, user_data_free ? user_data_free : [](void *) {});
src->getOwnerPoller()->async([=]() mutable {

View File

@ -342,6 +342,7 @@ API_EXPORT void API_CALL mk_media_start_send_rtp4(mk_media ctx, const char *dst_
args.close_delay_ms = (*ini_ptr)["close_delay_ms"].empty() ? 30000 : (*ini_ptr)["close_delay_ms"].as<int>();
args.rtcp_timeout_ms = (*ini_ptr)["rtcp_timeout_ms"].empty() ? 30000 : (*ini_ptr)["rtcp_timeout_ms"].as<int>();
args.rtcp_send_interval_ms = (*ini_ptr)["rtcp_send_interval_ms"].empty() ? 5000 : (*ini_ptr)["rtcp_send_interval_ms"].as<int>();
args.enable_origin_recv_limit = (*ini_ptr)["enable_origin_recv_limit"].empty() ? false : (*ini_ptr)["enable_origin_recv_limit"].as<bool>();
// sender参数无用 [AUTO-TRANSLATED:21590ae5]
// The sender parameter is useless
auto ref = *obj;

View File

@ -85,6 +85,27 @@ API_EXPORT int API_CALL mk_recorder_stop(int type, const char *vhost, const char
return stopRecord((Recorder::type)type,vhost,app,stream);
}
API_EXPORT int API_CALL mk_recorder_start_task(const char *vhost, const char *app, const char *stream, const char *path, uint32_t back_ms, uint32_t forward_ms) {
assert(vhost && app && stream);
auto src = MediaSource::find(vhost, app, stream);
if (!src) {
WarnL << "未找到相关的MediaSource,startRecordTask失败:" << vhost << "/" << app << "/" << stream;
return false;
}
bool ret;
src->getOwnerPoller()->async([=]() mutable {
std::string err;
try {
src->getMuxer()->startRecord(path, back_ms, forward_ms);
} catch (std::exception &ex) {
err = ex.what();
WarnL << "MediaSource开启startRecordTask失败:" << vhost << "/" << app << "/" << stream << " what: " << err;
}
ret = err.empty();
});
return ret;
}
API_EXPORT void API_CALL mk_load_mp4_file(const char *vhost, const char *app, const char *stream, const char *file_path, int file_repeat) {
mINI ini;
mk_load_mp4_file2(vhost, app, stream, file_path, file_repeat, (mk_ini)&ini);

View File

@ -30,6 +30,13 @@ API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create2(uint16_t port, int tcp_m
return (mk_rtp_server)server;
}
API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create3(uint16_t port, int tcp_mode, const char *vhost, const char *app, const char *stream_id, int multiplex) {
RtpServer::Ptr *server = new RtpServer::Ptr(new RtpServer);
GET_CONFIG(std::string, local_ip, General::kListenIP)
(*server)->start(port, local_ip.c_str(), MediaTuple { vhost, app, stream_id, "" }, (RtpServer::TcpMode)tcp_mode,multiplex);
return (mk_rtp_server)server;
}
API_EXPORT void API_CALL mk_rtp_server_connect(mk_rtp_server ctx, const char *dst_url, uint16_t dst_port, on_mk_rtp_server_connected cb, void *user_data) {
mk_rtp_server_connect2(ctx, dst_url, dst_port, cb, user_data, nullptr);
}
@ -72,6 +79,41 @@ API_EXPORT void API_CALL mk_rtp_server_set_on_detach2(mk_rtp_server ctx, on_mk_r
}
}
API_EXPORT void API_CALL mk_rtp_server_update_ssrc(mk_rtp_server ctx, uint32_t ssrc) {
assert(ctx);
RtpServer::Ptr *server = (RtpServer::Ptr *)ctx;
(*server)->updateSSRC(ssrc);
}
API_EXPORT void API_CALL mk_rtp_get_info(const char *app, const char *stream, on_mk_rtp_get_info cb) {
assert(cb);
auto src = MediaSource::find(DEFAULT_VHOST, app, stream);
auto process = src ? src->getRtpProcess() : nullptr;
if (!process) {
cb(0, nullptr, 0, nullptr, 0, nullptr);
return;
}
SockInfo *info = process.get();
cb(1, info->get_local_ip().c_str(), info->get_peer_port(), info->get_local_ip().c_str(), info->get_local_port(), info->getIdentifier().c_str());
}
API_EXPORT void API_CALL mk_rtp_pause_check(const char *app, const char *stream) {
auto src = MediaSource::find(DEFAULT_VHOST, app, stream);
auto process = src ? src->getRtpProcess() : nullptr;
if (process) {
process->setStopCheckRtp(true);
}
}
API_EXPORT void API_CALL mk_rtp_resume_check(const char *app, const char *stream) {
auto src = MediaSource::find(DEFAULT_VHOST, app, stream);
auto process = src ? src->getRtpProcess() : nullptr;
if (process) {
process->setStopCheckRtp(false);
}
}
#else
API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create(uint16_t port, int enable_tcp, const char *stream_id) {

View File

@ -700,7 +700,7 @@ void MediaSourceEvent::onReaderChanged(MediaSource &sender, int size){
strong_sender->close(false);
}
return false;
}, nullptr);
}, this->getOwnerPoller(sender));
}
string MediaSourceEvent::getOriginUrl(MediaSource &sender) const {

View File

@ -177,7 +177,7 @@ static string getTrackInfoStr(const TrackSource *track_src){
break;
}
}
return std::move(codec_info);
return codec_info;
}
const ProtocolOption &MultiMediaSourceMuxer::getOption() const {
@ -195,7 +195,7 @@ std::string MultiMediaSourceMuxer::shortUrl() const {
}
return _tuple.shortUrl();
}
#if defined(ENABLE_RTPPROXY)
void MultiMediaSourceMuxer::forEachRtpSender(const std::function<void(const std::string &ssrc, const RtpSender &sender)> &cb) const {
for (auto &pr : _rtp_sender) {
auto sender = std::get<1>(pr.second).lock();
@ -204,7 +204,7 @@ void MultiMediaSourceMuxer::forEachRtpSender(const std::function<void(const std:
}
}
}
#endif // ENABLE_RTPPROXY
MultiMediaSourceMuxer::MultiMediaSourceMuxer(const MediaTuple& tuple, float dur_sec, const ProtocolOption &option): _tuple(tuple) {
if (!option.stream_replace.empty()) {
// 支持在on_publish hook中替换stream_id [AUTO-TRANSLATED:375eb2ff]
@ -605,7 +605,9 @@ bool MultiMediaSourceMuxer::close(MediaSource &sender) {
_mp4 = nullptr;
_hls = nullptr;
_hls_fmp4 = nullptr;
#if defined(ENABLE_RTPPROXY)
_rtp_sender.clear();
#endif // ENABLE_RTPPROXY
return true;
}

View File

@ -208,9 +208,9 @@ public:
const ProtocolOption &getOption() const;
const MediaTuple &getMediaTuple() const;
std::string shortUrl() const;
#if defined(ENABLE_RTPPROXY)
void forEachRtpSender(const std::function<void(const std::string &ssrc, const RtpSender &sender)> &cb) const;
#endif // ENABLE_RTPPROXY
protected:
/////////////////////////////////MediaSink override/////////////////////////////////
@ -260,7 +260,9 @@ private:
toolkit::Ticker _last_check;
std::unordered_map<int, Stamp> _stamps;
std::weak_ptr<Listener> _track_listener;
#if defined(ENABLE_RTPPROXY)
std::unordered_multimap<std::string, std::tuple<RingType::RingReader::Ptr, std::weak_ptr<RtpSender>>> _rtp_sender;
#endif // ENABLE_RTPPROXY
FMP4MediaSourceMuxer::Ptr _fmp4;
RtmpMediaSourceMuxer::Ptr _rtmp;
RtspMediaSourceMuxer::Ptr _rtsp;

View File

@ -296,7 +296,7 @@ Buffer::Ptr HttpFileBody::readData(size_t size) {
// Data is read
ret->setSize(iRead);
_file_offset += iRead;
return std::move(ret);
return ret;
}
// 读取文件异常,文件真实长度小于声明长度 [AUTO-TRANSLATED:89d09f9b]
// File reading exception, the actual length of the file is less than the declared length
@ -385,7 +385,7 @@ string HttpMultiFormBody::multiFormBodyPrefix(const HttpArgs &args, const string
<< "file"
<< "\"; filename=\"" << fileName << "\"\r\n";
body << "Content-Type: application/octet-stream\r\n\r\n";
return std::move(body);
return body;
}
HttpBufferBody::HttpBufferBody(Buffer::Ptr buffer) {

View File

@ -68,7 +68,7 @@ bool MpegMuxer::inputFrame(const Frame::Ptr &frame) {
}
case CodecAAC: {
CHECK(frame->prefixSize(), "Mpeg muxer required aac frame with adts heade");
CHECK(frame->prefixSize(), "Mpeg muxer required aac frame with adts header");
}
default: {

View File

@ -114,7 +114,7 @@ string RtcpHeader::dumpHeader() const {
printer << "pt:" << rtcpTypeToStr((RtcpType)pt) << "\r\n";
printer << "size:" << getSize() << "\r\n";
printer << "--------\r\n";
return std::move(printer);
return printer;
}
string RtcpHeader::dumpString() const {
@ -322,7 +322,7 @@ string RtcpSR::dumpString() const {
printer << "---- item:" << i++ << " ----\r\n";
printer << item->dumpString();
}
return std::move(printer);
return printer;
}
#define CHECK_MIN_SIZE(size, kMinSize) \
@ -385,7 +385,7 @@ string ReportItem::dumpString() const {
printer << "jitter:" << jitter << "\r\n";
printer << "last_sr_stamp:" << last_sr_stamp << "\r\n";
printer << "delay_since_last_sr:" << delay_since_last_sr << "\r\n";
return std::move(printer);
return printer;
}
void ReportItem::net2Host() {
@ -419,7 +419,7 @@ string RtcpRR::dumpString() const {
printer << "---- item:" << i++ << " ----\r\n";
printer << item->dumpString();
}
return std::move(printer);
return printer;
}
void RtcpRR::net2Host(size_t size) {
@ -467,7 +467,7 @@ string SdesChunk::dumpString() const {
printer << "type:" << sdesTypeToStr((SdesType)type) << "\r\n";
printer << "txt_len:" << (int)txt_len << "\r\n";
printer << "text:" << (txt_len ? string(text, txt_len) : "") << "\r\n";
return std::move(printer);
return printer;
}
/////////////////////////////////////////////////////////////////////////////
@ -506,7 +506,7 @@ string RtcpSdes::dumpString() const {
printer << "---- item:" << i++ << " ----\r\n";
printer << item->dumpString();
}
return std::move(printer);
return printer;
}
void RtcpSdes::net2Host(size_t size) {
@ -627,7 +627,7 @@ string RtcpFB::dumpString() const {
}
default: /*不可达*/ assert(0); break;
}
return std::move(printer);
return printer;
}
void RtcpFB::net2Host(size_t size) {
@ -684,7 +684,7 @@ string RtcpBye::dumpString() const {
printer << "ssrc:" << *ssrc << "\r\n";
}
printer << "reason:" << getReason();
return std::move(printer);
return printer;
}
void RtcpBye::net2Host(size_t size) {
@ -719,7 +719,7 @@ string RtcpXRRRTR::dumpString() const {
printer << "block_length : " << block_length << "\r\n";
printer << "ntp msw : " << ntpmsw << "\r\n";
printer << "ntp lsw : " << ntplsw << "\r\n";
return std::move(printer);
return printer;
}
void RtcpXRRRTR::net2Host(size_t size) {
@ -743,7 +743,7 @@ string RtcpXRDLRRReportItem::dumpString() const {
printer << "last RR (lrr) :" << lrr << "\r\n";
printer << "delay since last RR (dlrr): " << dlrr << "\r\n";
return std::move(printer);
return printer;
}
void RtcpXRDLRRReportItem::net2Host() {
@ -774,7 +774,7 @@ string RtcpXRDLRR::dumpString() const {
printer << "---- item:" << i++ << " ----\r\n";
printer << item->dumpString();
}
return std::move(printer);
return printer;
}
void RtcpXRDLRR::net2Host(size_t size) {
@ -809,7 +809,7 @@ string RtcpXRTargetBitrateItem::dumpString() const {
printer << "Temporal Layer :" << temporal_layer << "\r\n";
printer << "Target Bitrate: " << target_bitrate << "\r\n";
return std::move(printer);
return printer;
}
void RtcpXRTargetBitrateItem::net2Host() {
@ -839,7 +839,7 @@ string RtcpXRTargetBitrate::dumpString() const {
printer << "---- item:" << i++ << " ----\r\n";
printer << item->dumpString();
}
return std::move(printer);
return printer;
}
void RtcpXRTargetBitrate::net2Host(size_t size) {

View File

@ -153,7 +153,7 @@ string FCI_REMB::dumpString() const {
for (auto &ssrc : ((FCI_REMB *)this)->getSSRC()) {
printer << ssrc << " ";
}
return std::move(printer);
return printer;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -208,7 +208,7 @@ string FCI_NACK::dumpString() const {
}
++pid;
}
return std::move(printer);
return printer;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -267,7 +267,7 @@ uint16_t RunLengthChunk::getRunLength() const {
string RunLengthChunk::dumpString() const {
_StrPrinter printer;
printer << "run length chunk, symbol:" << (int)symbol << ", run length:" << getRunLength();
return std::move(printer);
return printer;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -361,7 +361,7 @@ string StatusVecChunk::dumpString() const {
for (auto &item : vec) {
printer << (int)item << " ";
}
return std::move(printer);
return printer;
}
///////////////////////////////////////////////////////
@ -496,7 +496,7 @@ string FCI_TWCC::dumpString(size_t total_size) const {
printer << "rtp seq:" << pr.first << ", packet status:" << (int)(pr.second.first)
<< ", delta:" << pr.second.second << "\n";
}
return std::move(printer);
return printer;
}
static void appendDeltaString(string &delta_str, FCI_TWCC::TwccPacketStatus &status, int count) {

View File

@ -161,7 +161,7 @@ string SdpTrack::toString(uint16_t port) const {
}
default: break;
}
return std::move(_printer);
return _printer;
}
static TrackType toTrackType(const string &str) {
@ -644,7 +644,7 @@ string RtpHeader::dumpString(size_t rtp_size) const {
printer << "rtp size:" << rtp_size << "\r\n";
printer << "payload offset:" << getPayloadOffset() << "\r\n";
printer << "payload size:" << getPayloadSize(rtp_size) << "\r\n";
return std::move(printer);
return printer;
}
///////////////////////////////////////////////////////////////////////

View File

@ -80,6 +80,6 @@ std::string ACKPacket::dump() {
<< " rtt_variance=" << rtt_variance << " pkt_recv_rate=" << pkt_recv_rate
<< " available_buf_size=" << available_buf_size << " estimated_link_capacity=" << estimated_link_capacity
<< " recv_rate=" << recv_rate;
return std::move(printer);
return printer;
}
} // namespace SRT

View File

@ -34,7 +34,7 @@ std::string HSExtMessage::dump() {
_StrPrinter printer;
printer << "srt version : " << std::hex << srt_version << " srt flag : " << std::hex << srt_flag
<< " recv_tsbpd_delay=" << recv_tsbpd_delay << " send_tsbpd_delay = " << send_tsbpd_delay;
return std::move(printer);
return printer;
}
bool HSExtMessage::storeToData() {
@ -130,7 +130,7 @@ bool HSExtStreamID::storeToData() {
std::string HSExtStreamID::dump() {
_StrPrinter printer;
printer << " streamid : " << streamid;
return std::move(printer);
return printer;
}
size_t KeyMaterial::getContentSize() {
@ -263,7 +263,7 @@ std::string KeyMaterial::dump() {
<< " sLen : " << _slen
<< " salt : " << std::hex << _salt.data()
<< " kLen : " << _klen;
return std::move(printer);
return printer;
}
bool HSExtKeyMaterial::loadFromData(uint8_t *buf, size_t len) {

View File

@ -279,7 +279,7 @@ std::string HandshakePacket::dump(){
for(size_t i=0;i<ext_list.size();++i){
printer<<ext_list[i]->dump()<<"\r\n";
}
return std::move(printer);
return printer;
}
bool HandshakePacket::loadFromData(uint8_t *buf, size_t len) {
if (HEADER_SIZE + HS_CONTENT_MIN_SIZE > len) {
@ -627,7 +627,7 @@ std::string NAKPacket::dump() {
for (auto it : lost_list) {
printer << "[ " << it.first << " , " << it.second - 1 << " ]";
}
return std::move(printer);
return printer;
}
bool MsgDropReqPacket::loadFromData(uint8_t *buf, size_t len) {

View File

@ -233,7 +233,7 @@ std::string PacketQueue::dump() {
printer << " last:" << _pkt_map.rbegin()->second->packet_seq_number;
printer << " latency:" << timeLatency() / 1e3;
}
return std::move(printer);
return printer;
}
//////////////////// PacketRecvQueue //////////////////////////////////
@ -395,7 +395,7 @@ std::string PacketRecvQueue::dump() {
printer << " start:" << _start;
printer << " end:" << _end;
}
return std::move(printer);
return printer;
}
bool PacketRecvQueue::drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out) {
uint32_t diff = 0;

View File

@ -91,7 +91,7 @@ std::string PacketRecvRateContext::dump(){
}
printer <<"\r\n";
return std::move(printer);
return printer;
}
EstimatedLinkCapacityContext::EstimatedLinkCapacityContext(TimePoint start) : _start(start) {
for (size_t i = 0; i < SIZE; i++) {

View File

@ -298,7 +298,7 @@ string RtpExt::dumpString() const {
break;
}
}
return std::move(printer);
return printer;
}
//https://tools.ietf.org/html/rfc6464

View File

@ -174,7 +174,7 @@ string RtcSdpBase::toString() const {
for (auto &item : items) {
printer << item->getKey() << "=" << item->toString() << "\r\n";
}
return std::move(printer);
return printer;
}
RtpDirection RtcSdpBase::getDirection() const {
@ -307,7 +307,7 @@ string RtcSessionSdp::toString() const {
printer << media.toString();
}
return std::move(printer);
return printer;
}
//////////////////////////////////////////////////////////////////////////////////////////