修复全局变量初始化顺序错乱导致崩溃的问题

This commit is contained in:
ziyue 2022-08-23 14:11:32 +08:00
parent c6a0e3ad66
commit 208b0865bd
4 changed files with 10 additions and 8 deletions

View File

@ -266,7 +266,7 @@ API_EXPORT void API_CALL mk_media_start_send_rtp(mk_media ctx, const char *dst_u
args.is_udp = is_udp;
//sender参数无用
(*obj)->getChannel()->startSendRtp(MediaSource::NullMediaSource, args, [cb, user_data](uint16_t local_port, const SockException &ex){
(*obj)->getChannel()->startSendRtp(MediaSource::NullMediaSource(), args, [cb, user_data](uint16_t local_port, const SockException &ex){
if (cb) {
cb(user_data, local_port, ex.getErrCode(), ex.what());
}
@ -277,5 +277,5 @@ API_EXPORT int API_CALL mk_media_stop_send_rtp(mk_media ctx, const char *ssrc){
assert(ctx);
MediaHelper::Ptr *obj = (MediaHelper::Ptr *) ctx;
//sender参数无用
return (*obj)->getChannel()->stopSendRtp(MediaSource::NullMediaSource, ssrc ? ssrc : "");
return (*obj)->getChannel()->stopSendRtp(MediaSource::NullMediaSource(), ssrc ? ssrc : "");
}

View File

@ -53,8 +53,10 @@ struct MediaSourceNull : public MediaSource {
int readerCount() override { return 0; }
};
static std::shared_ptr<MediaSource> s_null = std::make_shared<MediaSourceNull>();
MediaSource &MediaSource::NullMediaSource = *s_null;
MediaSource &MediaSource::NullMediaSource() {
static std::shared_ptr<MediaSource> s_null = std::make_shared<MediaSourceNull>();
return *s_null;
}
MediaSource::MediaSource(const string &schema, const string &vhost, const string &app, const string &stream_id){
GET_CONFIG(bool, enableVhost, General::kEnableVhost);

View File

@ -235,7 +235,7 @@ private:
*/
class MediaSource: public TrackSource, public std::enable_shared_from_this<MediaSource> {
public:
static MediaSource& NullMediaSource;
static MediaSource& NullMediaSource();
using Ptr = std::shared_ptr<MediaSource>;
using StreamMap = std::unordered_map<std::string/*stream_id*/, std::weak_ptr<MediaSource> >;
using AppStreamMap = std::unordered_map<std::string/*app*/, StreamMap>;

View File

@ -78,7 +78,7 @@ static string getTrackInfoStr(const TrackSource *track_src){
MultiMediaSourceMuxer::MultiMediaSourceMuxer(const string &vhost, const string &app, const string &stream, float dur_sec, const ProtocolOption &option) {
_option = option;
_get_origin_url = [this, vhost, app, stream]() {
auto ret = getOriginUrl(MediaSource::NullMediaSource);
auto ret = getOriginUrl(MediaSource::NullMediaSource());
if (!ret.empty()) {
return ret;
}
@ -240,11 +240,11 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &, const MediaSourceEvent::
WarnL << "stream:" << strong_self->_get_origin_url() << " stop send rtp:" << ssrc;
strong_self->_rtp_sender.erase(ssrc);
//触发观看人数统计
strong_self->onReaderChanged(MediaSource::NullMediaSource, strong_self->totalReaderCount());
strong_self->onReaderChanged(MediaSource::NullMediaSource(), strong_self->totalReaderCount());
}
});
strong_self->_rtp_sender[args.ssrc] = std::move(rtp_sender);
strong_self->onReaderChanged(MediaSource::NullMediaSource, strong_self->totalReaderCount());
strong_self->onReaderChanged(MediaSource::NullMediaSource(), strong_self->totalReaderCount());
});
#else
cb(0, SockException(Err_other, "该功能未启用编译时请打开ENABLE_RTPPROXY宏"));