mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #2142, Fix memory leak for bridger of RTC source stream. 4.0.61
This commit is contained in:
parent
50bb9eb391
commit
4e70bf5eaf
3 changed files with 60 additions and 24 deletions
|
@ -309,11 +309,7 @@ SrsRtcStream::SrsRtcStream()
|
||||||
stream_desc_ = NULL;
|
stream_desc_ = NULL;
|
||||||
|
|
||||||
req = NULL;
|
req = NULL;
|
||||||
#ifdef SRS_FFMPEG_FIT
|
bridger_ = new SrsRtcDummyBridger(this);
|
||||||
bridger_ = new SrsRtcFromRtmpBridger(this);
|
|
||||||
#else
|
|
||||||
bridger_ = new SrsRtcDummyBridger();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtcStream::~SrsRtcStream()
|
SrsRtcStream::~SrsRtcStream()
|
||||||
|
@ -333,13 +329,6 @@ srs_error_t SrsRtcStream::initialize(SrsRequest* r)
|
||||||
|
|
||||||
req = r->copy();
|
req = r->copy();
|
||||||
|
|
||||||
#ifdef SRS_FFMPEG_FIT
|
|
||||||
SrsRtcFromRtmpBridger* bridger = dynamic_cast<SrsRtcFromRtmpBridger*>(bridger_);
|
|
||||||
if ((err = bridger->initialize(req)) != srs_success) {
|
|
||||||
return srs_error_wrap(err, "bridge initialize");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,6 +443,16 @@ srs_error_t SrsRtcStream::on_publish()
|
||||||
return srs_error_wrap(err, "source id change");
|
return srs_error_wrap(err, "source id change");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new bridger, because it's been disposed when unpublish.
|
||||||
|
#ifdef SRS_FFMPEG_FIT
|
||||||
|
SrsRtcFromRtmpBridger* impl = new SrsRtcFromRtmpBridger(this);
|
||||||
|
if ((err = impl->initialize(req)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "bridge initialize");
|
||||||
|
}
|
||||||
|
|
||||||
|
bridger_->setup(impl);
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO: FIXME: Handle by statistic.
|
// TODO: FIXME: Handle by statistic.
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -484,6 +483,11 @@ void SrsRtcStream::on_unpublish()
|
||||||
// release unpublish stream description.
|
// release unpublish stream description.
|
||||||
set_stream_desc(NULL);
|
set_stream_desc(NULL);
|
||||||
|
|
||||||
|
// Dispose the impl of bridger, to free memory.
|
||||||
|
#ifdef SRS_FFMPEG_FIT
|
||||||
|
bridger_->setup(NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO: FIXME: Handle by statistic.
|
// TODO: FIXME: Handle by statistic.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -663,13 +667,14 @@ srs_error_t SrsRtcFromRtmpBridger::on_publish()
|
||||||
|
|
||||||
void SrsRtcFromRtmpBridger::on_unpublish()
|
void SrsRtcFromRtmpBridger::on_unpublish()
|
||||||
{
|
{
|
||||||
// TODO: FIXME: Should sync with bridger?
|
|
||||||
source_->on_unpublish();
|
|
||||||
|
|
||||||
// Reset the metadata cache, to make VLC happy when disable/enable stream.
|
// Reset the metadata cache, to make VLC happy when disable/enable stream.
|
||||||
// @see https://github.com/ossrs/srs/issues/1630#issuecomment-597979448
|
// @see https://github.com/ossrs/srs/issues/1630#issuecomment-597979448
|
||||||
meta->update_previous_vsh();
|
meta->update_previous_vsh();
|
||||||
meta->update_previous_ash();
|
meta->update_previous_ash();
|
||||||
|
|
||||||
|
// @remark This bridger might be disposed here, so never use it.
|
||||||
|
// TODO: FIXME: Should sync with bridger?
|
||||||
|
source_->on_unpublish();
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtcFromRtmpBridger::on_audio(SrsSharedPtrMessage* msg)
|
srs_error_t SrsRtcFromRtmpBridger::on_audio(SrsSharedPtrMessage* msg)
|
||||||
|
@ -1147,31 +1152,54 @@ srs_error_t SrsRtcFromRtmpBridger::consume_packets(vector<SrsRtpPacket2*>& pkts)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SrsRtcDummyBridger::SrsRtcDummyBridger()
|
SrsRtcDummyBridger::SrsRtcDummyBridger(SrsRtcStream* s)
|
||||||
{
|
{
|
||||||
|
rtc_ = s;
|
||||||
|
impl_ = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtcDummyBridger::~SrsRtcDummyBridger()
|
SrsRtcDummyBridger::~SrsRtcDummyBridger()
|
||||||
{
|
{
|
||||||
|
srs_freep(impl_);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtcDummyBridger::on_publish()
|
srs_error_t SrsRtcDummyBridger::on_publish()
|
||||||
{
|
{
|
||||||
return srs_error_new(ERROR_RTC_DUMMY_BRIDGER, "no FFmpeg fit");
|
if (impl_) {
|
||||||
|
return impl_->on_publish();
|
||||||
|
}
|
||||||
|
return rtc_->on_publish();
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtcDummyBridger::on_audio(SrsSharedPtrMessage* /*audio*/)
|
srs_error_t SrsRtcDummyBridger::on_audio(SrsSharedPtrMessage* audio)
|
||||||
{
|
{
|
||||||
return srs_error_new(ERROR_RTC_DUMMY_BRIDGER, "no FFmpeg fit");
|
if (impl_) {
|
||||||
|
return impl_->on_audio(audio);
|
||||||
|
}
|
||||||
|
return srs_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtcDummyBridger::on_video(SrsSharedPtrMessage* /*video*/)
|
srs_error_t SrsRtcDummyBridger::on_video(SrsSharedPtrMessage* video)
|
||||||
{
|
{
|
||||||
return srs_error_new(ERROR_RTC_DUMMY_BRIDGER, "no FFmpeg fit");
|
if (impl_) {
|
||||||
|
return impl_->on_video(video);
|
||||||
|
}
|
||||||
|
return srs_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtcDummyBridger::on_unpublish()
|
void SrsRtcDummyBridger::on_unpublish()
|
||||||
{
|
{
|
||||||
|
if (impl_) {
|
||||||
|
impl_->on_unpublish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rtc_->on_unpublish();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SrsRtcDummyBridger::setup(ISrsSourceBridger* impl)
|
||||||
|
{
|
||||||
|
srs_freep(impl_);
|
||||||
|
impl_ = impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsCodecPayload::SrsCodecPayload()
|
SrsCodecPayload::SrsCodecPayload()
|
||||||
|
|
|
@ -55,6 +55,7 @@ class SrsRtpNackForReceiver;
|
||||||
class SrsJsonObject;
|
class SrsJsonObject;
|
||||||
class SrsRtcPlayStreamStatistic;
|
class SrsRtcPlayStreamStatistic;
|
||||||
class SrsErrorPithyPrint;
|
class SrsErrorPithyPrint;
|
||||||
|
class SrsRtcDummyBridger;
|
||||||
|
|
||||||
class SrsNtp
|
class SrsNtp
|
||||||
{
|
{
|
||||||
|
@ -159,7 +160,7 @@ private:
|
||||||
SrsRequest* req;
|
SrsRequest* req;
|
||||||
ISrsRtcPublishStream* publish_stream_;
|
ISrsRtcPublishStream* publish_stream_;
|
||||||
// Transmux RTMP to RTC.
|
// Transmux RTMP to RTC.
|
||||||
ISrsSourceBridger* bridger_;
|
SrsRtcDummyBridger* bridger_;
|
||||||
// Steam description for this steam.
|
// Steam description for this steam.
|
||||||
SrsRtcStreamDescription* stream_desc_;
|
SrsRtcStreamDescription* stream_desc_;
|
||||||
private:
|
private:
|
||||||
|
@ -264,14 +265,21 @@ private:
|
||||||
|
|
||||||
class SrsRtcDummyBridger : public ISrsSourceBridger
|
class SrsRtcDummyBridger : public ISrsSourceBridger
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
SrsRtcStream* rtc_;
|
||||||
|
// The optional implementation bridger, ignore if NULL.
|
||||||
|
ISrsSourceBridger* impl_;
|
||||||
public:
|
public:
|
||||||
SrsRtcDummyBridger();
|
SrsRtcDummyBridger(SrsRtcStream* s);
|
||||||
virtual ~SrsRtcDummyBridger();
|
virtual ~SrsRtcDummyBridger();
|
||||||
public:
|
public:
|
||||||
virtual srs_error_t on_publish();
|
virtual srs_error_t on_publish();
|
||||||
virtual srs_error_t on_audio(SrsSharedPtrMessage* audio);
|
virtual srs_error_t on_audio(SrsSharedPtrMessage* audio);
|
||||||
virtual srs_error_t on_video(SrsSharedPtrMessage* video);
|
virtual srs_error_t on_video(SrsSharedPtrMessage* video);
|
||||||
virtual void on_unpublish();
|
virtual void on_unpublish();
|
||||||
|
public:
|
||||||
|
// Setup a new implementation bridger, which might be NULL to free previous one.
|
||||||
|
void setup(ISrsSourceBridger* impl);
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: FIXME: Rename it.
|
// TODO: FIXME: Rename it.
|
||||||
|
|
|
@ -24,6 +24,6 @@
|
||||||
#ifndef SRS_CORE_VERSION4_HPP
|
#ifndef SRS_CORE_VERSION4_HPP
|
||||||
#define SRS_CORE_VERSION4_HPP
|
#define SRS_CORE_VERSION4_HPP
|
||||||
|
|
||||||
#define SRS_VERSION4_REVISION 59
|
#define SRS_VERSION4_REVISION 61
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue