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:
Aaro Altonen 2019-08-21 08:49:35 +03:00
parent c041a9c703
commit 977a53c11b
11 changed files with 30 additions and 58 deletions

View File

@ -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()

View File

@ -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;

View File

@ -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();

View File

@ -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);
} }

View File

@ -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);

View File

@ -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;

View File

@ -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
* *

View File

@ -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;

View File

@ -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

View File

@ -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);
} }
} }

View File

@ -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;