79 lines
2.0 KiB
C
79 lines
2.0 KiB
C
|
//
|
||
|
// Created by Grishka on 19/03/2019.
|
||
|
//
|
||
|
|
||
|
#ifndef LIBTGVOIP_VIDEOPACKETSENDER_H
|
||
|
#define LIBTGVOIP_VIDEOPACKETSENDER_H
|
||
|
|
||
|
#include "../threading.h"
|
||
|
#include "../Buffers.h"
|
||
|
#include "../PacketSender.h"
|
||
|
|
||
|
#include <memory>
|
||
|
#include <cstdint>
|
||
|
#include <vector>
|
||
|
|
||
|
namespace tgvoip
|
||
|
{
|
||
|
|
||
|
namespace video
|
||
|
{
|
||
|
|
||
|
class VideoSource;
|
||
|
|
||
|
class VideoPacketSender : public PacketSender
|
||
|
{
|
||
|
public:
|
||
|
VideoPacketSender(VoIPController* m_controller, VideoSource* videoSource, std::shared_ptr<VoIPController::Stream> stream);
|
||
|
~VideoPacketSender() override;
|
||
|
void PacketAcknowledged(std::uint32_t seq, double sendTime, double ackTime, PktType type, std::uint32_t size) override;
|
||
|
void PacketLost(std::uint32_t seq, PktType type, std::uint32_t size) override;
|
||
|
void SetSource(VideoSource* m_source);
|
||
|
[[nodiscard]] std::uint32_t GetBitrate() const;
|
||
|
|
||
|
private:
|
||
|
struct SentVideoFrame
|
||
|
{
|
||
|
std::vector<std::uint32_t> unacknowledgedPackets;
|
||
|
std::uint32_t seq;
|
||
|
std::uint32_t fragmentCount;
|
||
|
std::uint32_t fragmentsInQueue;
|
||
|
};
|
||
|
|
||
|
struct QueuedPacket
|
||
|
{
|
||
|
VoIPController::PendingOutgoingPacket packet;
|
||
|
std::uint32_t seq;
|
||
|
};
|
||
|
|
||
|
video::ScreamCongestionController m_videoCongestionControl;
|
||
|
std::vector<SentVideoFrame> m_sentVideoFrames;
|
||
|
std::vector<Buffer> m_packetsForFEC;
|
||
|
|
||
|
std::shared_ptr<VoIPController::Stream> m_stm;
|
||
|
VideoSource* m_source = nullptr;
|
||
|
|
||
|
std::size_t m_fecFrameCount = 0;
|
||
|
|
||
|
double m_firstVideoFrameTime = 0.0;
|
||
|
double m_lastVideoResolutionChangeTime = 0.0;
|
||
|
double m_sourceChangeTime = 0.0;
|
||
|
|
||
|
std::uint32_t m_videoFrameCount = 0;
|
||
|
std::uint32_t m_sendVideoPacketID = MessageThread::INVALID_ID;
|
||
|
std::uint32_t m_videoPacketLossCount = 0;
|
||
|
std::uint32_t m_currentVideoBitrate = 0;
|
||
|
std::uint32_t m_frameSeq = 0;
|
||
|
|
||
|
bool m_videoKeyframeRequested = false;
|
||
|
|
||
|
void SendFrame(const Buffer& frame, std::uint32_t flags, std::uint32_t rotation);
|
||
|
InitVideoRes GetVideoResolutionForCurrentBitrate();
|
||
|
};
|
||
|
|
||
|
} // namespace video
|
||
|
|
||
|
} // namespace tgvoip
|
||
|
|
||
|
#endif // LIBTGVOIP_VIDEOPACKETSENDER_H
|