/* * Copyright (c) 2012 Yoann Blein * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #pragma once #include #include #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" #include #pragma clang diagnostic pop #include #include namespace Swift { class Sender : public jrtplib::RTPExternalSender { public: Sender(boost::shared_ptr udpSocket); ~Sender(); virtual bool SendRTP(const void* data, size_t len); virtual bool SendRTCP(const void* data, size_t len); virtual bool ComesFromThisSender (const jrtplib::RTPAddress* address); private: void send(const void* data, size_t len); private: boost::shared_ptr udpSocket; jrtplib::RTPAddress* jRTPLocalAddress; }; class RTPSessionImpl : public RTPSession, jrtplib::RTPSession { public: RTPSessionImpl(boost::shared_ptr udpSocket, const RTPPayloadType& payloadType); virtual ~RTPSessionImpl(); virtual void poll(); virtual void checkIncomingPackets(); virtual void sendPacket(const SafeByteArray &data, int timestampinc, bool marker = false); virtual void injectData(const SafeByteArray &data); virtual void stop(int maxWaitMs = 100); virtual void sendSLIFeedback(int pictureID); virtual void sendRPSIFeedback(int pictureID); virtual size_t getMaxRTPPayloadSize() const; public: static jrtplib::RTPAddress* nativeAddressToJRTPAddress(const HostAddressPort& hostAddressPort); protected: void OnUnknownPacketType(jrtplib::RTCPPacket* rtcpPack, const jrtplib::RTPTime& /*receivetime*/, const jrtplib::RTPAddress* senderAddress); private: enum PacketType { PSFB = 206, }; enum SubPacketType { PSFB_SLI = 2, PSFB_RPSI = 3, }; private: void checkError(int rtperr) const; void handleDataRead(boost::shared_ptr data); void parseSLIFeedBack(uint8_t* data, size_t len); void parseRPSIFeedBack(uint8_t* data, size_t len); private: boost::shared_ptr udpSocket; RTPPayloadType payloadType; jrtplib::RTPAddress* jRTPRemotePeer; Sender sender; jrtplib::RTPExternalPacketInjecter *packetInjecter; }; }