Ack.hpp 3.31 KB
Newer Older
1 2 3 4
#ifndef ZLMEDIAKIT_SRT_ACK_H
#define ZLMEDIAKIT_SRT_ACK_H
#include "Packet.hpp"

ziyue committed
5
namespace SRT {
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/*
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+- SRT Header +-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|        Control Type         |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgement Number                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Destination Socket ID                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- CIF -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Last Acknowledged Packet Sequence Number           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              RTT                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          RTT Variance                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Available Buffer Size                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Packets Receiving Rate                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Estimated Link Capacity                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Receiving Rate                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    Figure 13: ACK control packet
    https://haivision.github.io/srt-rfc/draft-sharabayko-srt.html#name-ack-acknowledgment
*/
ziyue committed
35
class ACKPacket : public ControlPacket {
36 37 38 39 40
public:
    using Ptr = std::shared_ptr<ACKPacket>;
    ACKPacket() = default;
    ~ACKPacket() = default;

ziyue committed
41
    enum { ACK_CIF_SIZE = 7 * 4 };
42
    std::string dump();
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    ///////ControlPacket override///////
    bool loadFromData(uint8_t *buf, size_t len) override;
    bool storeToData() override;

    uint32_t ack_number;

    uint32_t last_ack_pkt_seq_number;
    uint32_t rtt;
    uint32_t rtt_variance;
    uint32_t available_buf_size;
    uint32_t pkt_recv_rate;
    uint32_t estimated_link_capacity;
    uint32_t recv_rate;
};

ziyue committed
58
class ACKACKPacket : public ControlPacket {
59 60 61 62 63
public:
    using Ptr = std::shared_ptr<ACKACKPacket>;
    ACKACKPacket() = default;
    ~ACKACKPacket() = default;
    ///////ControlPacket override///////
ziyue committed
64 65
    bool loadFromData(uint8_t *buf, size_t len) override {
        if (len < ControlPacket::HEADER_SIZE) {
66 67 68 69 70 71 72 73
            return false;
        }
        _data = BufferRaw::create();
        _data->assign((char *)(buf), len);
        ControlPacket::loadHeader();
        ack_number = loadUint32(type_specific_info);
        return true;
    }
ziyue committed
74
    bool storeToData() override {
75 76
        _data = BufferRaw::create();
        _data->setCapacity(HEADER_SIZE);
ziyue committed
77
        _data->setSize(HEADER_SIZE);
78 79 80
        control_type = ControlPacket::ACKACK;
        sub_type = 0;

ziyue committed
81
        storeUint32(type_specific_info, ack_number);
82 83 84 85 86 87 88
        storeToHeader();
        return true;
    }

    uint32_t ack_number;
};

ziyue committed
89
} // namespace SRT
90
#endif // ZLMEDIAKIT_SRT_ACK_H