Remove the payload type from push_frame()
Make it mandatory to specify the payload when creating reader/writer. Reader needs to type anyway because it must start the correct frame receiver. For writer it's not absolutely necessary but this makes the API cleaner
This commit is contained in:
parent
c041a9c703
commit
977a53c11b
|
|
@ -23,7 +23,7 @@ kvz_rtp::connection::connection(bool reader):
|
||||||
{
|
{
|
||||||
rtp_sequence_ = kvz_rtp::random::generate_32();
|
rtp_sequence_ = kvz_rtp::random::generate_32();
|
||||||
rtp_ssrc_ = kvz_rtp::random::generate_32();
|
rtp_ssrc_ = kvz_rtp::random::generate_32();
|
||||||
rtp_payload_ = RTP_FORMAT_HEVC;
|
rtp_payload_ = RTP_FORMAT_GENERIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
kvz_rtp::connection::~connection()
|
kvz_rtp::connection::~connection()
|
||||||
|
|
|
||||||
47
src/lib.cc
47
src/lib.cc
|
|
@ -38,7 +38,7 @@ kvz_rtp::context::~context()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
kvz_rtp::reader *kvz_rtp::context::create_reader(std::string srcAddr, int srcPort)
|
kvz_rtp::reader *kvz_rtp::context::create_reader(std::string srcAddr, int srcPort, rtp_format_t fmt)
|
||||||
{
|
{
|
||||||
kvz_rtp::reader *reader = new kvz_rtp::reader(srcAddr, srcPort);
|
kvz_rtp::reader *reader = new kvz_rtp::reader(srcAddr, srcPort);
|
||||||
|
|
||||||
|
|
@ -48,65 +48,34 @@ kvz_rtp::reader *kvz_rtp::context::create_reader(std::string srcAddr, int srcPor
|
||||||
}
|
}
|
||||||
|
|
||||||
conns_.insert(std::pair<int, connection *>(reader->get_ssrc(), reader));
|
conns_.insert(std::pair<int, connection *>(reader->get_ssrc(), reader));
|
||||||
return reader;
|
|
||||||
}
|
|
||||||
|
|
||||||
kvz_rtp::reader *kvz_rtp::context::create_reader(std::string srcAddr, int srcPort, rtp_format_t fmt)
|
|
||||||
{
|
|
||||||
kvz_rtp::reader *reader = nullptr;
|
|
||||||
|
|
||||||
if ((reader = create_reader(srcAddr, srcPort)) == nullptr)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
reader->set_payload(fmt);
|
reader->set_payload(fmt);
|
||||||
|
|
||||||
return reader;
|
return reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
kvz_rtp::writer *kvz_rtp::context::create_writer(std::string dstAddr, int dstPort)
|
|
||||||
{
|
|
||||||
kvz_rtp::writer *writer = new kvz_rtp::writer(dstAddr, dstPort);
|
|
||||||
|
|
||||||
if (!writer) {
|
|
||||||
std::cerr << "Failed to create writer for " << dstAddr << ":" << dstPort << "!" << std::endl;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
|
|
||||||
kvz_rtp::writer *kvz_rtp::context::create_writer(std::string dstAddr, int dstPort, rtp_format_t fmt)
|
kvz_rtp::writer *kvz_rtp::context::create_writer(std::string dstAddr, int dstPort, rtp_format_t fmt)
|
||||||
{
|
{
|
||||||
kvz_rtp::writer *writer = nullptr;
|
kvz_rtp::writer *writer = new kvz_rtp::writer(dstAddr, dstPort);
|
||||||
|
|
||||||
if ((writer = create_writer(dstAddr, dstPort)) == nullptr)
|
if (!writer) {
|
||||||
|
LOG_ERROR("Failed to create writer for %s:%d!", dstAddr.c_str(), dstPort);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
|
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
|
||||||
writer->set_payload(fmt);
|
writer->set_payload(fmt);
|
||||||
return writer;
|
return writer;
|
||||||
}
|
}
|
||||||
|
|
||||||
kvz_rtp::writer *kvz_rtp::context::create_writer(std::string dstAddr, int dstPort, int srcPort)
|
kvz_rtp::writer *kvz_rtp::context::create_writer(std::string dstAddr, int dstPort, int srcPort, rtp_format_t fmt)
|
||||||
{
|
{
|
||||||
kvz_rtp::writer *writer = new kvz_rtp::writer(dstAddr, dstPort, srcPort);
|
kvz_rtp::writer *writer = new kvz_rtp::writer(dstAddr, dstPort, srcPort);
|
||||||
|
|
||||||
if (!writer) {
|
if (!writer) {
|
||||||
std::cerr << "Failed to create writer for " << dstAddr << ":" << dstPort << "!" << std::endl;
|
LOG_ERROR("Failed to create writer for %s:%d!", dstAddr.c_str(), dstPort);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
|
|
||||||
kvz_rtp::writer *kvz_rtp::context::create_writer(std::string dstAddr, int dstPort, int srcPort, rtp_format_t fmt)
|
|
||||||
{
|
|
||||||
kvz_rtp::writer *writer = nullptr;
|
|
||||||
|
|
||||||
if ((writer = create_writer(dstAddr, dstPort, srcPort)) == nullptr)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
|
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
|
||||||
writer->set_payload(fmt);
|
writer->set_payload(fmt);
|
||||||
return writer;
|
return writer;
|
||||||
|
|
|
||||||
|
|
@ -16,15 +16,12 @@ namespace kvz_rtp {
|
||||||
*
|
*
|
||||||
* Read packets are stored in a ring buffer which can be read by
|
* Read packets are stored in a ring buffer which can be read by
|
||||||
* calling kvz_rtp::reader::pull_frame() */
|
* calling kvz_rtp::reader::pull_frame() */
|
||||||
kvz_rtp::reader *create_reader(std::string src_addr, int src_port);
|
|
||||||
kvz_rtp::reader *create_reader(std::string src_addr, int src_port, rtp_format_t fmt);
|
kvz_rtp::reader *create_reader(std::string src_addr, int src_port, rtp_format_t fmt);
|
||||||
|
|
||||||
/* Open connection for writing RTP packets to dst_addr:dst_port
|
/* Open connection for writing RTP packets to dst_addr:dst_port
|
||||||
*
|
*
|
||||||
* Packets can be sent by calling kvz_rtp::writer::push_frame() */
|
* Packets can be sent by calling kvz_rtp::writer::push_frame() */
|
||||||
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port);
|
|
||||||
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port, rtp_format_t fmt);
|
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port, rtp_format_t fmt);
|
||||||
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port, int src_port);
|
|
||||||
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port, int src_port, rtp_format_t fmt);
|
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port, int src_port, rtp_format_t fmt);
|
||||||
|
|
||||||
/* call reader/writer-specific destroy functions, send an RTCP BYE message
|
/* call reader/writer-specific destroy functions, send an RTCP BYE message
|
||||||
|
|
@ -35,6 +32,8 @@ namespace kvz_rtp {
|
||||||
std::string& get_cname();
|
std::string& get_cname();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port);
|
||||||
|
|
||||||
/* Generate CNAME for participant using host and login names */
|
/* Generate CNAME for participant using host and login names */
|
||||||
std::string generate_cname();
|
std::string generate_cname();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,10 @@
|
||||||
#include "writer.hh"
|
#include "writer.hh"
|
||||||
|
|
||||||
// TODO implement frame splitting if data_len > MTU
|
// TODO implement frame splitting if data_len > MTU
|
||||||
rtp_error_t kvz_rtp::generic::push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len)
|
rtp_error_t kvz_rtp::generic::push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len, int flags)
|
||||||
{
|
{
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
if (data_len > MAX_PAYLOAD) {
|
if (data_len > MAX_PAYLOAD) {
|
||||||
LOG_WARN("packet is larger (%zu bytes) than MAX_PAYLOAD (%u bytes)", data_len, MAX_PAYLOAD);
|
LOG_WARN("packet is larger (%zu bytes) than MAX_PAYLOAD (%u bytes)", data_len, MAX_PAYLOAD);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,9 @@ namespace kvz_rtp {
|
||||||
class reader;
|
class reader;
|
||||||
|
|
||||||
namespace generic {
|
namespace generic {
|
||||||
|
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
rtp_error_t push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len);
|
rtp_error_t push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len, int flags);
|
||||||
|
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
rtp_error_t frame_receiver(kvz_rtp::reader *reader);
|
rtp_error_t frame_receiver(kvz_rtp::reader *reader);
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ static rtp_error_t __push_hevc_frame(kvz_rtp::connection *conn, uint8_t *data, s
|
||||||
|
|
||||||
if (data_len <= MAX_PAYLOAD) {
|
if (data_len <= MAX_PAYLOAD) {
|
||||||
LOG_DEBUG("send unfrag size %zu, type %u", data_len, nalType);
|
LOG_DEBUG("send unfrag size %zu, type %u", data_len, nalType);
|
||||||
return kvz_rtp::generic::push_frame(conn, data, data_len);
|
return kvz_rtp::generic::push_frame(conn, data, data_len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEBUG("send frag size: %zu, type %u", data_len, nalType);
|
LOG_DEBUG("send frag size: %zu, type %u", data_len, nalType);
|
||||||
|
|
@ -157,7 +157,7 @@ static rtp_error_t __push_hevc_frame(kvz_rtp::connection *conn, uint8_t *data, s
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtp_error_t kvz_rtp::hevc::push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len)
|
rtp_error_t kvz_rtp::hevc::push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len, int flags)
|
||||||
{
|
{
|
||||||
uint8_t start_len;
|
uint8_t start_len;
|
||||||
int32_t prev_offset = 0;
|
int32_t prev_offset = 0;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ namespace kvz_rtp {
|
||||||
FT_END = 3, /* frame contains a fragment with E bit set */
|
FT_END = 3, /* frame contains a fragment with E bit set */
|
||||||
};
|
};
|
||||||
|
|
||||||
rtp_error_t push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len);
|
rtp_error_t push_frame(kvz_rtp::connection *conn, uint8_t *data, size_t data_len, int flags);
|
||||||
|
|
||||||
/* Inspect the type of "frame" and return its type to caller
|
/* Inspect the type of "frame" and return its type to caller
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@
|
||||||
#include "send.hh"
|
#include "send.hh"
|
||||||
|
|
||||||
/* Validity of arguments is checked by kvz_rtp::sender. We just need to relay them there */
|
/* Validity of arguments is checked by kvz_rtp::sender. We just need to relay them there */
|
||||||
rtp_error_t kvz_rtp::opus::push_frame(connection *conn, uint8_t *data, uint32_t data_len)
|
rtp_error_t kvz_rtp::opus::push_frame(connection *conn, uint8_t *data, uint32_t data_len, int flags)
|
||||||
{
|
{
|
||||||
return kvz_rtp::generic::push_frame(conn, data, data_len);
|
return kvz_rtp::generic::push_frame(conn, data, data_len, flags);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
rtp_error_t ret;
|
rtp_error_t ret;
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ namespace kvz_rtp {
|
||||||
uint8_t config_number;
|
uint8_t config_number;
|
||||||
};
|
};
|
||||||
|
|
||||||
rtp_error_t push_frame(connection *conn, uint8_t *data, uint32_t data_len);
|
rtp_error_t push_frame(connection *conn, uint8_t *data, uint32_t data_len, int flags);
|
||||||
|
|
||||||
/* Process the incoming Opus frame
|
/* Process the incoming Opus frame
|
||||||
* The RTP frame "frame" given as parameter should be considered invalid after calling this function
|
* The RTP frame "frame" given as parameter should be considered invalid after calling this function
|
||||||
|
|
|
||||||
|
|
@ -73,18 +73,18 @@ rtp_error_t kvz_rtp::writer::start()
|
||||||
return RTP_OK;
|
return RTP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtp_error_t kvz_rtp::writer::push_frame(uint8_t *data, uint32_t data_len, rtp_format_t fmt)
|
rtp_error_t kvz_rtp::writer::push_frame(uint8_t *data, uint32_t data_len, int flags)
|
||||||
{
|
{
|
||||||
switch (fmt) {
|
switch (get_payload()) {
|
||||||
case RTP_FORMAT_HEVC:
|
case RTP_FORMAT_HEVC:
|
||||||
return kvz_rtp::hevc::push_frame(this, data, data_len);
|
return kvz_rtp::hevc::push_frame(this, data, data_len, flags);
|
||||||
|
|
||||||
case RTP_FORMAT_OPUS:
|
case RTP_FORMAT_OPUS:
|
||||||
return kvz_rtp::opus::push_frame(this, data, data_len);
|
return kvz_rtp::opus::push_frame(this, data, data_len, flags);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG_DEBUG("Format not recognized, pushing the frame as generic");
|
LOG_DEBUG("Format not recognized, pushing the frame as generic");
|
||||||
return kvz_rtp::generic::push_frame(this, data, data_len);
|
return kvz_rtp::generic::push_frame(this, data, data_len, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,10 @@ namespace kvz_rtp {
|
||||||
// open socket for sending frames
|
// open socket for sending frames
|
||||||
rtp_error_t start();
|
rtp_error_t start();
|
||||||
|
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
rtp_error_t push_frame(uint8_t *data, uint32_t data_len, rtp_format_t fmt);
|
rtp_error_t push_frame(uint8_t *data, uint32_t data_len, int flags);
|
||||||
|
|
||||||
|
/* TODO: remove */
|
||||||
sockaddr_in get_out_address();
|
sockaddr_in get_out_address();
|
||||||
|
|
||||||
const kvz_rtp::frame_queue& get_frame_queue() const;
|
const kvz_rtp::frame_queue& get_frame_queue() const;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue