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_ssrc_ = kvz_rtp::random::generate_32();
rtp_payload_ = RTP_FORMAT_HEVC;
rtp_payload_ = RTP_FORMAT_GENERIC;
}
kvz_rtp::connection::~connection()

View File

@ -38,7 +38,7 @@ kvz_rtp::context::~context()
#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);
@ -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));
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);
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 *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;
}
conns_.insert(std::pair<int, connection *>(writer->get_ssrc(), writer));
writer->set_payload(fmt);
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);
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;
}
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));
writer->set_payload(fmt);
return writer;

View File

@ -16,15 +16,12 @@ namespace kvz_rtp {
*
* Read packets are stored in a ring buffer which can be read by
* 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);
/* Open connection for writing RTP packets to dst_addr:dst_port
*
* 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, int src_port);
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
@ -35,6 +32,8 @@ namespace kvz_rtp {
std::string& get_cname();
private:
kvz_rtp::writer *create_writer(std::string dst_addr, int dst_port);
/* Generate CNAME for participant using host and login names */
std::string generate_cname();

View File

@ -18,8 +18,10 @@
#include "writer.hh"
// 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) {
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;
namespace generic {
/* 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: */
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) {
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);
@ -157,7 +157,7 @@ static rtp_error_t __push_hevc_frame(kvz_rtp::connection *conn, uint8_t *data, s
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;
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 */
};
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
*

View File

@ -7,9 +7,9 @@
#include "send.hh"
/* 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
rtp_error_t ret;

View File

@ -10,7 +10,7 @@ namespace kvz_rtp {
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
* 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;
}
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:
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:
return kvz_rtp::opus::push_frame(this, data, data_len);
return kvz_rtp::opus::push_frame(this, data, data_len, flags);
default:
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
rtp_error_t start();
/* TODO: */
rtp_error_t push_frame(uint8_t *data, uint32_t data_len, rtp_format_t fmt);
/* TODO: */
rtp_error_t push_frame(uint8_t *data, uint32_t data_len, int flags);
/* TODO: remove */
sockaddr_in get_out_address();
const kvz_rtp::frame_queue& get_frame_queue() const;