HSExt.cpp 3.18 KB
Newer Older
1 2 3
#include "HSExt.hpp"

namespace SRT {
ziyue committed
4

5
bool HSExtMessage::loadFromData(uint8_t *buf, size_t len) {
ziyue committed
6
    if (buf == NULL || len != HSEXT_MSG_SIZE) {
7 8 9 10
        return false;
    }

    _data = BufferRaw::create();
ziyue committed
11
    _data->assign((char *)buf, len);
12 13 14 15 16
    extension_length = 3;
    HSExt::loadHeader();

    assert(extension_type == SRT_CMD_HSREQ || extension_type == SRT_CMD_HSRSP);

ziyue committed
17 18
    uint8_t *ptr = (uint8_t *)_data->data() + 4;
    srt_version = loadUint32(ptr);
19 20 21 22 23 24 25 26 27 28 29 30
    ptr += 4;

    srt_flag = loadUint32(ptr);
    ptr += 4;

    recv_tsbpd_delay = loadUint16(ptr);
    ptr += 2;

    send_tsbpd_delay = loadUint16(ptr);
    ptr += 2;

    return true;
ziyue committed
31 32 33 34 35 36 37 38
}

std::string HSExtMessage::dump() {
    _StrPrinter printer;
    printer << "srt version : " << std::hex << srt_version << " srt flag : " << std::hex << srt_flag
            << " recv_tsbpd_delay=" << recv_tsbpd_delay << " send_tsbpd_delay = " << send_tsbpd_delay;
    return std::move(printer);
}
39

ziyue committed
40
bool HSExtMessage::storeToData() {
41 42 43 44 45
    _data = BufferRaw::create();
    _data->setCapacity(HSEXT_MSG_SIZE);
    _data->setSize(HSEXT_MSG_SIZE);
    extension_length = 3;
    HSExt::storeHeader();
ziyue committed
46
    uint8_t *ptr = (uint8_t *)_data->data() + 4;
47

ziyue committed
48 49
    storeUint32(ptr, srt_version);
    ptr += 4;
50

ziyue committed
51 52
    storeUint32(ptr, srt_flag);
    ptr += 4;
53

ziyue committed
54 55
    storeUint16(ptr, recv_tsbpd_delay);
    ptr += 2;
56

ziyue committed
57 58 59
    storeUint16(ptr, send_tsbpd_delay);
    ptr += 2;
    return true;
60 61
}

ziyue committed
62 63
bool HSExtStreamID::loadFromData(uint8_t *buf, size_t len) {
    if (buf == NULL || len < 4) {
64 65 66
        return false;
    }
    _data = BufferRaw::create();
ziyue committed
67
    _data->assign((char *)buf, len);
68 69 70

    HSExt::loadHeader();

ziyue committed
71 72
    size_t content_size = extension_length * 4;
    if (len < content_size + 4) {
73 74 75
        return false;
    }
    streamid.clear();
ziyue committed
76
    char *ptr = _data->data() + 4;
77

ziyue committed
78 79 80 81
    for (size_t i = 0; i < extension_length; ++i) {
        streamid.push_back(*(ptr + 3));
        streamid.push_back(*(ptr + 2));
        streamid.push_back(*(ptr + 1));
82
        streamid.push_back(*(ptr));
ziyue committed
83
        ptr += 4;
84
    }
xiongguangjie committed
85
    char zero = 0x00;
ziyue committed
86 87
    if (streamid.back() == zero) {
        streamid.erase(streamid.find_first_of(zero), streamid.size());
88
    }
89
    return true;
ziyue committed
90
}
91

ziyue committed
92 93
bool HSExtStreamID::storeToData() {
    size_t content_size = ((streamid.length() + 4) + 3) / 4 * 4;
94 95 96 97

    _data = BufferRaw::create();
    _data->setCapacity(content_size);
    _data->setSize(content_size);
ziyue committed
98
    extension_length = (content_size - 4) / 4;
99 100
    extension_type = SRT_CMD_SID;
    HSExt::storeHeader();
ziyue committed
101 102 103 104 105 106
    auto ptr = _data->data() + 4;
    memset(ptr, 0, extension_length * 4);
    const char *src = streamid.c_str();
    for (size_t i = 0; i < streamid.length() / 4; ++i) {
        *ptr = *(src + 3 + i * 4);
        ptr++;
107

ziyue committed
108 109
        *ptr = *(src + 2 + i * 4);
        ptr++;
110

ziyue committed
111 112
        *ptr = *(src + 1 + i * 4);
        ptr++;
113

ziyue committed
114 115
        *ptr = *(src + 0 + i * 4);
        ptr++;
116
    }
ziyue committed
117

118
    ptr += 3;
ziyue committed
119 120 121 122
    size_t offset = streamid.length() / 4 * 4;
    for (size_t i = 0; i < streamid.length() % 4; ++i) {
        *ptr = *(src + offset + i);
        ptr -= 1;
123 124 125 126
    }

    return true;
}
ziyue committed
127 128 129 130 131 132

std::string HSExtStreamID::dump() {
    _StrPrinter printer;
    printer << " streamid : " << streamid;
    return std::move(printer);
}
133 134

} // namespace SRT