From 4305ec04f07d34aa56a72faa3c468518f8384195 Mon Sep 17 00:00:00 2001 From: Aaro Altonen Date: Thu, 23 May 2019 13:00:58 +0300 Subject: [PATCH] Create data and payload buffers for RTP frame Data points to the beginning of data that is sent and payload points to offset where user data can be copied to. --- src/frame.cc | 29 +++++++++++++++-------------- src/frame.hh | 13 ++++++------- src/reader.cc | 8 ++++---- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/frame.cc b/src/frame.cc index d49b3f4..bb1b3b7 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -35,16 +35,17 @@ kvz_rtp::frame::rtp_frame *kvz_rtp::frame::alloc_frame(size_t payload_len, frame return nullptr; } - if ((frame->header = new uint8_t[payload_len + header_len]) == nullptr) { + if ((frame->data = new uint8_t[payload_len + header_len]) == nullptr) { LOG_ERROR("Failed to allocate paylod for RTP frame"); delete frame; return nullptr; } - frame->header_len = header_len; - frame->data_len = payload_len; - frame->data = frame->header + header_len; - frame->type = type; + frame->header_len = header_len; + frame->payload_len = payload_len; + frame->total_len = payload_len + header_len; + frame->payload = frame->data + header_len; + frame->type = type; return frame; } @@ -54,8 +55,8 @@ rtp_error_t kvz_rtp::frame::dealloc_frame(kvz_rtp::frame::rtp_frame *frame) if (!frame) return RTP_INVALID_VALUE; - if (frame->header) - delete frame->header; + if (frame->data) + delete frame->data; LOG_DEBUG("Deallocating frame, type %u", frame->type); @@ -69,29 +70,29 @@ uint8_t *kvz_rtp::frame::get_rtp_header(kvz_rtp::frame::rtp_frame *frame) if (!frame) return nullptr; - return frame->header; + return frame->data; } uint8_t *kvz_rtp::frame::get_opus_header(kvz_rtp::frame::rtp_frame *frame) { - if (!frame || !frame->header || frame->type != FRAME_TYPE_OPUS) + if (!frame || !frame->data || frame->type != FRAME_TYPE_OPUS) return nullptr; - return frame->header + HEADER_SIZE_RTP; + return frame->data + HEADER_SIZE_RTP; } uint8_t *kvz_rtp::frame::get_hevc_rtp_header(kvz_rtp::frame::rtp_frame *frame) { - if (!frame || !frame->header || frame->type != FRAME_TYPE_HEVC_FU) + if (!frame || !frame->data || frame->type != FRAME_TYPE_HEVC_FU) return nullptr; - return frame->header + HEADER_SIZE_RTP; + return frame->data + HEADER_SIZE_RTP; } uint8_t *kvz_rtp::frame::get_hevc_fu_header(kvz_rtp::frame::rtp_frame *frame) { - if (!frame || !frame->header || frame->type != FRAME_TYPE_HEVC_FU) + if (!frame || !frame->data || frame->type != FRAME_TYPE_HEVC_FU) return nullptr; - return frame->header + HEADER_SIZE_RTP + HEADER_SIZE_HEVC_RTP; + return frame->data + HEADER_SIZE_RTP + HEADER_SIZE_HEVC_RTP; } diff --git a/src/frame.hh b/src/frame.hh index 6d14ac5..c3a6149 100644 --- a/src/frame.hh +++ b/src/frame.hh @@ -23,16 +23,15 @@ namespace kvz_rtp { uint32_t timestamp; uint32_t ssrc; uint16_t seq; - uint8_t payload; + uint8_t ptype; uint8_t marker; - /* TODO: rename header -> data and data -> payload */ + size_t total_len; /* total length of the frame (payload length + header length) */ + size_t header_len; /* length of header (varies based on the type of the frame) */ + size_t payload_len; /* length of the payload */ - uint8_t *header; - size_t header_len; - - uint8_t *data; - size_t data_len; + uint8_t *data; /* pointer to the start of the whole buffer */ + uint8_t *payload; /* pointer to actual payload */ rtp_format_t format; frame_type_t type; diff --git a/src/reader.cc b/src/reader.cc index f407cc5..90fb788 100644 --- a/src/reader.cc +++ b/src/reader.cc @@ -168,7 +168,7 @@ int kvz_rtp::reader::frame_receiver(kvz_rtp::reader *reader) } frame->marker = (inbuf[1] & 0x80) ? 1 : 0; - frame->payload = (inbuf[1] & 0x7f); + frame->ptype = (inbuf[1] & 0x7f); frame->seq = ntohs(*(uint16_t *)&inbuf[2]); frame->timestamp = ntohl(*(uint32_t *)&inbuf[4]); frame->ssrc = ntohl(*(uint32_t *)&inbuf[8]); @@ -178,15 +178,15 @@ int kvz_rtp::reader::frame_receiver(kvz_rtp::reader *reader) continue; } - frame->header = new uint8_t[ret]; - frame->header_len = ret; + frame->data = new uint8_t[ret]; + frame->total_len = ret; if (!frame->data) { LOG_ERROR("Failed to allocate buffer for RTP frame!"); continue; } - memcpy(frame->header, inbuf, ret); + memcpy(frame->data, inbuf, ret); if (reader->recv_hook_installed()) reader->recv_hook(frame);