diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index e31824d4a..ff50cc718 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -246,8 +246,6 @@ SrsRtcSource::SrsRtcSource() req = NULL; bridger_ = new SrsRtcFromRtmpBridger(this); - format = new SrsRtmpFormat(); - meta = new SrsMetaCache(); } SrsRtcSource::~SrsRtcSource() @@ -258,8 +256,6 @@ SrsRtcSource::~SrsRtcSource() srs_freep(req); srs_freep(bridger_); - srs_freep(format); - srs_freep(meta); } srs_error_t SrsRtcSource::initialize(SrsRequest* r) @@ -272,10 +268,6 @@ srs_error_t SrsRtcSource::initialize(SrsRequest* r) return srs_error_wrap(err, "bridge initialize"); } - if ((err = format->initialize()) != srs_success) { - return srs_error_wrap(err, "format initialize"); - } - return err; } @@ -325,11 +317,6 @@ ISrsSourceBridger* SrsRtcSource::bridger() return bridger_; } -SrsMetaCache* SrsRtcSource::cached_meta() -{ - return meta; -} - srs_error_t SrsRtcSource::create_consumer(SrsRtcConsumer*& consumer) { srs_error_t err = srs_success; @@ -381,10 +368,6 @@ srs_error_t SrsRtcSource::on_publish() return srs_error_wrap(err, "source id change"); } - // Reset the metadata cache, to make VLC happy when disable/enable stream. - // @see https://github.com/ossrs/srs/issues/1630#issuecomment-597979448 - meta->clear(); - // TODO: FIXME: Handle by statistic. return err; @@ -397,11 +380,6 @@ void SrsRtcSource::on_unpublish() return; } - // Reset the metadata cache, to make VLC happy when disable/enable stream. - // @see https://github.com/ossrs/srs/issues/1630#issuecomment-597979448 - meta->update_previous_vsh(); - meta->update_previous_ash(); - srs_trace("cleanup when unpublish"); _can_publish = true; @@ -434,103 +412,6 @@ srs_error_t SrsRtcSource::on_rtp(SrsRtpPacket2* pkt) return err; } -srs_error_t SrsRtcSource::on_audio_imp(SrsSharedPtrMessage* msg) -{ - srs_error_t err = srs_success; - - for (int i = 0; i < (int)consumers.size(); i++) { - SrsRtcConsumer* consumer = consumers.at(i); - if ((err = consumer->enqueue(msg, true, SrsRtmpJitterAlgorithmOFF)) != srs_success) { - return srs_error_wrap(err, "consume message"); - } - } - - return err; -} - -srs_error_t SrsRtcSource::on_video(SrsCommonMessage* shared_video) -{ - srs_error_t err = srs_success; - - // convert shared_video to msg, user should not use shared_video again. - // the payload is transfer to msg, and set to NULL in shared_video. - SrsSharedPtrMessage msg; - if ((err = msg.create(shared_video)) != srs_success) { - return srs_error_wrap(err, "create message"); - } - - bool is_sequence_header = SrsFlvVideo::sh(msg.payload, msg.size); - if (is_sequence_header && (err = meta->update_vsh(&msg)) != srs_success) { - return srs_error_wrap(err, "meta update video"); - } - - // user can disable the sps parse to workaround when parse sps failed. - // @see https://github.com/ossrs/srs/issues/474 - if (is_sequence_header) { - format->avc_parse_sps = _srs_config->get_parse_sps(req->vhost); - } - - if ((err = format->on_video(&msg)) != srs_success) { - return srs_error_wrap(err, "format consume video"); - } - - if ((err = filter(&msg, format)) != srs_success) { - return srs_error_wrap(err, "filter video"); - } - - // directly process the video message. - return on_video_imp(&msg); -} - -srs_error_t SrsRtcSource::on_video_imp(SrsSharedPtrMessage* msg) -{ - srs_error_t err = srs_success; - - // copy to all consumer - for (int i = 0; i < (int)consumers.size(); i++) { - SrsRtcConsumer* consumer = consumers.at(i); - if ((err = consumer->enqueue(msg, true, SrsRtmpJitterAlgorithmOFF)) != srs_success) { - return srs_error_wrap(err, "consume video"); - } - } - - return err; -} - -srs_error_t SrsRtcSource::filter(SrsSharedPtrMessage* shared_frame, SrsFormat* format) -{ - srs_error_t err = srs_success; - - // If IDR, we will insert SPS/PPS before IDR frame. - if (format->video && format->video->has_idr) { - shared_frame->set_has_idr(true); - } - - // Update samples to shared frame. - for (int i = 0; i < format->video->nb_samples; ++i) { - SrsSample* sample = &format->video->samples[i]; - - // Because RTC does not support B-frame, so we will drop them. - // TODO: Drop B-frame in better way, which not cause picture corruption. - if (true) { - if ((err = sample->parse_bframe()) != srs_success) { - return srs_error_wrap(err, "parse bframe"); - } - if (sample->bframe) { - continue; - } - } - } - - if (format->video->nb_samples <= 0) { - return err; - } - - shared_frame->set_samples(format->video->samples, format->video->nb_samples); - - return err; -} - SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcSource* source) { req = NULL; @@ -540,12 +421,14 @@ SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcSource* source) discard_aac = false; discard_bframe = false; merge_nalus = false; + meta = new SrsMetaCache(); } SrsRtcFromRtmpBridger::~SrsRtcFromRtmpBridger() { srs_freep(format); srs_freep(codec); + srs_freep(meta); } srs_error_t SrsRtcFromRtmpBridger::initialize(SrsRequest* r) @@ -581,6 +464,10 @@ srs_error_t SrsRtcFromRtmpBridger::on_publish() return srs_error_wrap(err, "source publish"); } + // Reset the metadata cache, to make VLC happy when disable/enable stream. + // @see https://github.com/ossrs/srs/issues/1630#issuecomment-597979448 + meta->clear(); + return err; } @@ -588,6 +475,11 @@ 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. + // @see https://github.com/ossrs/srs/issues/1630#issuecomment-597979448 + meta->update_previous_vsh(); + meta->update_previous_ash(); } srs_error_t SrsRtcFromRtmpBridger::on_audio(SrsSharedPtrMessage* msg) @@ -720,7 +612,6 @@ srs_error_t SrsRtcFromRtmpBridger::on_video(SrsSharedPtrMessage* msg) // cache the sequence header if h264 bool is_sequence_header = SrsFlvVideo::sh(msg->payload, msg->size); - SrsMetaCache* meta = source_->cached_meta(); if (is_sequence_header && (err = meta->update_vsh(msg)) != srs_success) { return srs_error_wrap(err, "meta update video"); } @@ -733,40 +624,6 @@ srs_error_t SrsRtcFromRtmpBridger::on_video(SrsSharedPtrMessage* msg) return srs_error_wrap(err, "filter video"); } - return source_->on_video_imp(msg); -} - -srs_error_t SrsRtcFromRtmpBridger::filter(SrsSharedPtrMessage* msg, SrsFormat* format) -{ - srs_error_t err = srs_success; - - // If IDR, we will insert SPS/PPS before IDR frame. - if (format->video && format->video->has_idr) { - msg->set_has_idr(true); - } - - // Update samples to shared frame. - for (int i = 0; i < format->video->nb_samples; ++i) { - SrsSample* sample = &format->video->samples[i]; - - // Because RTC does not support B-frame, so we will drop them. - // TODO: Drop B-frame in better way, which not cause picture corruption. - if (discard_bframe) { - if ((err = sample->parse_bframe()) != srs_success) { - return srs_error_wrap(err, "parse bframe"); - } - if (sample->bframe) { - continue; - } - } - } - - if (format->video->nb_samples <= 0) { - return err; - } - - // TODO: FIXME: Directly covert samples to RTP packets. - msg->set_samples(format->video->samples, format->video->nb_samples); int nn_samples = format->video->nb_samples; // Well, for each IDR, we append a SPS/PPS before it, which is packaged in STAP-A. @@ -819,15 +676,45 @@ srs_error_t SrsRtcFromRtmpBridger::filter(SrsSharedPtrMessage* msg, SrsFormat* f return consume_packets(pkts); } -srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcSource* source, SrsSharedPtrMessage* msg, SrsRtpPacket2** ppkt) +srs_error_t SrsRtcFromRtmpBridger::filter(SrsSharedPtrMessage* msg, SrsFormat* format) { srs_error_t err = srs_success; - SrsMetaCache* meta = source->cached_meta(); - if (!meta) { + // If IDR, we will insert SPS/PPS before IDR frame. + if (format->video && format->video->has_idr) { + msg->set_has_idr(true); + } + + // Update samples to shared frame. + for (int i = 0; i < format->video->nb_samples; ++i) { + SrsSample* sample = &format->video->samples[i]; + + // Because RTC does not support B-frame, so we will drop them. + // TODO: Drop B-frame in better way, which not cause picture corruption. + if (discard_bframe) { + if ((err = sample->parse_bframe()) != srs_success) { + return srs_error_wrap(err, "parse bframe"); + } + if (sample->bframe) { + continue; + } + } + } + + if (format->video->nb_samples <= 0) { return err; } + // TODO: FIXME: Directly covert samples to RTP packets. + msg->set_samples(format->video->samples, format->video->nb_samples); + + return err; +} + +srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcSource* source, SrsSharedPtrMessage* msg, SrsRtpPacket2** ppkt) +{ + srs_error_t err = srs_success; + SrsFormat* format = meta->vsh_format(); if (!format || !format->vcodec) { return err; diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 6e8608690..14fc689da 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -107,8 +107,6 @@ private: SrsRtcPublisher* rtc_publisher_; // Transmux RTMP to RTC. SrsRtcFromRtmpBridger* bridger_; - // The metadata cache. - SrsMetaCache* meta; private: // To delivery stream to clients. std::vector consumers; @@ -128,8 +126,6 @@ public: virtual int pre_source_id(); // Get the bridger. ISrsSourceBridger* bridger(); - // For RTC, we need to package SPS/PPS(in cached meta) before each IDR. - SrsMetaCache* cached_meta(); public: // Create consumer // @param consumer, output the create consumer. @@ -152,16 +148,6 @@ public: void set_rtc_publisher(SrsRtcPublisher* v); // Consume the shared RTP packet, user must free it. srs_error_t on_rtp(SrsRtpPacket2* pkt); - virtual srs_error_t on_audio_imp(SrsSharedPtrMessage* audio); - // When got RTC audio message, which is encoded in opus. - // TODO: FIXME: Merge with on_audio. - virtual srs_error_t on_video(SrsCommonMessage* video); - virtual srs_error_t on_video_imp(SrsSharedPtrMessage* video); -private: - // The format, codec information. - // TODO: FIXME: Remove it. - SrsRtmpFormat* format; - srs_error_t filter(SrsSharedPtrMessage* shared_video, SrsFormat* format); }; class SrsRtcFromRtmpBridger : public ISrsSourceBridger @@ -171,6 +157,8 @@ private: SrsRtcSource* source_; // The format, codec information. SrsRtmpFormat* format; + // The metadata cache. + SrsMetaCache* meta; private: bool discard_aac; SrsAudioRecode* codec;