Forráskód Böngészése

Added a requestKeyframe()

Staz M 4 éve
szülő
commit
1cb53362d1
5 módosított fájl, 27 hozzáadás és 2 törlés
  1. 6 0
      include/rtc/rtcp.hpp
  2. 2 0
      include/rtc/track.hpp
  3. 1 2
      src/peerconnection.cpp
  4. 12 0
      src/rtcp.cpp
  5. 6 0
      src/track.cpp

+ 6 - 0
include/rtc/rtcp.hpp

@@ -58,6 +58,8 @@ public:
      */
      */
     void onOutgoing(const std::function<void(rtc::message_ptr)>& cb);
     void onOutgoing(const std::function<void(rtc::message_ptr)>& cb);
 
 
+    virtual bool requestKeyframe() {return false;}
+
 };
 };
 
 
 class Track;
 class Track;
@@ -72,10 +74,14 @@ public:
 
 
 	void requestBitrate(unsigned int newBitrate);
 	void requestBitrate(unsigned int newBitrate);
 
 
+    bool requestKeyframe() override;
+
 protected:
 protected:
 	void pushREMB(unsigned int bitrate);
 	void pushREMB(unsigned int bitrate);
 	void pushRR(unsigned int lastSR_delay);
 	void pushRR(unsigned int lastSR_delay);
 
 
+    void pushPLI();
+
 	unsigned int mRequestedBitrate = 0;
 	unsigned int mRequestedBitrate = 0;
 	SSRC mSsrc = 0;
 	SSRC mSsrc = 0;
 	uint32_t mGreatestSeqNo = 0;
 	uint32_t mGreatestSeqNo = 0;

+ 2 - 0
include/rtc/track.hpp

@@ -55,6 +55,8 @@ public:
 	size_t availableAmount() const override;
 	size_t availableAmount() const override;
 	std::optional<message_variant> receive() override;
 	std::optional<message_variant> receive() override;
 
 
+	bool requestKeyframe();
+
 	// RTCP handler
 	// RTCP handler
 	void setRtcpHandler(std::shared_ptr<RtcpHandler> handler);
 	void setRtcpHandler(std::shared_ptr<RtcpHandler> handler);
 
 

+ 1 - 2
src/peerconnection.cpp

@@ -573,8 +573,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
 				mMidFromSssrc.emplace(ssrc, *found);
 				mMidFromSssrc.emplace(ssrc, *found);
 				mid = *found;
 				mid = *found;
 				break;
 				break;
-			}else
-                PLOG_WARNING << "Unknown SSRC " << ssrc;
+			}
 		}
 		}
 	}
 	}
 
 

+ 12 - 0
src/rtcp.cpp

@@ -123,6 +123,18 @@ bool RtcpReceivingSession::send(message_ptr msg) {
 	return false;
 	return false;
 }
 }
 
 
+bool RtcpReceivingSession::requestKeyframe() {
+    pushPLI();
+    return true; // TODO Make this false when it is impossible (i.e. Opus).
+}
+
+void RtcpReceivingSession::pushPLI() {
+    auto msg = rtc::make_message(rtc::RTCP_PLI::size(), rtc::Message::Type::Control);
+    auto *pli = (rtc::RTCP_PLI *) msg->data();
+    pli->preparePacket(mSsrc);
+    send(msg);
+}
+
 void RtcpHandler::onOutgoing(const std::function<void(rtc::message_ptr)>& cb) {
 void RtcpHandler::onOutgoing(const std::function<void(rtc::message_ptr)>& cb) {
     this->outgoingCallback = synchronized_callback<rtc::message_ptr>(cb);
     this->outgoingCallback = synchronized_callback<rtc::message_ptr>(cb);
 }
 }

+ 6 - 0
src/track.cpp

@@ -152,5 +152,11 @@ void Track::setRtcpHandler(std::shared_ptr<RtcpHandler> handler) {
 	});
 	});
 }
 }
 
 
+bool Track::requestKeyframe() {
+    if (mRtcpHandler)
+        return mRtcpHandler->requestKeyframe();
+    return false;
+}
+
 } // namespace rtc
 } // namespace rtc