/*
* libdatachannel streamer example
* Copyright (c) 2020 Filip Klembara (in2core)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; If not, see .
*/
#ifndef RTCPSenderReporter_hpp
#define RTCPSenderReporter_hpp
#if RTC_ENABLE_MEDIA
#include "message.hpp"
#include "rtppacketizationconfig.hpp"
namespace rtc {
/// Class for sending RTCP SR
class RTC_CPP_EXPORT RTCPSenderReportable {
bool needsToReport = false;
uint32_t packetCount = 0;
uint32_t payloadOctets = 0;
double timeOffset = 0;
uint32_t _previousReportedTimestamp = 0;
void addToReport(RTP * rtp, uint32_t rtpSize);
message_ptr getSenderReport(uint32_t timestamp);
protected:
/// Outgoing callback for sender reports
synchronized_callback senderReportOutgoingCallback;
public:
static uint64_t secondsToNTP(double seconds);
/// Timestamp of previous sender report
const uint32_t & previousReportedTimestamp = _previousReportedTimestamp;
/// RTP configuration
const std::shared_ptr rtpConfig;
RTCPSenderReportable(std::shared_ptr rtpConfig);
/// Set `needsToReport` flag. Sender report will be sent before next RTP packet with same timestamp.
void setNeedsToReport();
/// Set offset to compute NTS for RTCP SR packets. Offset represents relation between real start time and timestamp of the stream in RTP packets
/// @note `time_offset = rtpConfig->startTime_s - rtpConfig->timestampToSeconds(rtpConfig->timestamp)`
void startRecording();
/// Send RTCP SR with given timestamp
/// @param timestamp timestamp of the RTCP SR
void sendReport(uint32_t timestamp);
protected:
/// Calls given block with function for statistics. Sends RTCP SR packet with current timestamp before `block` call if `needs_to_report` flag is true.
/// @param block Block of code to run. This block has function for rtp stats recording.
template
T withStatsRecording(std::function)> block) {
if (needsToReport) {
sendReport(rtpConfig->timestamp);
needsToReport = false;
}
auto result = block([this](message_ptr _rtp) {
auto rtp = reinterpret_cast(_rtp->data());
this->addToReport(rtp, _rtp->size());
});
return result;
}
};
} // namespace
#endif /* RTC_ENABLE_MEDIA */
#endif /* RTCPSenderReporter_hpp */