Create routines for (de)allocating different kinds of frames

This commit is contained in:
Aaro Altonen 2019-05-17 12:47:38 +03:00
parent d7d5f55e69
commit b84be50344
2 changed files with 114 additions and 0 deletions

78
src/frame.cc Normal file
View File

@ -0,0 +1,78 @@
#include "debug.hh"
#include "frame.hh"
#include "send.hh"
#include "util.hh"
RTPFrame::Frame *RTPFrame::allocFrame(size_t payloadLen, frame_type_t type)
{
if (payloadLen == 0 || !(type <= FRAME_TYPE_HEVC_FU && type >= FRAME_TYPE_GENERIC)) {
LOG_ERROR("Invalid parameter!");
return nullptr;
}
LOG_DEBUG("Allocating frame. Size %zu, Type %u", payloadLen, type);
RTPFrame::Frame *frame = new RTPFrame::Frame;
size_t headerLen = 0;
switch (type) {
case FRAME_TYPE_GENERIC:
headerLen = RTP_HEADER_SIZE;
break;
/* for now, opus header is not used */
case FRAME_TYPE_OPUS:
headerLen = RTP_HEADER_SIZE + 0;
break;
case FRAME_TYPE_HEVC_FU:
headerLen = RTP_HEADER_SIZE + HEVC_RTP_HEADER_SIZE + HEVC_FU_HEADER_SIZE;
break;
}
if (!frame)
return nullptr;
if ((frame->start = new uint8_t[payloadLen + headerLen]) == nullptr) {
delete frame;
return nullptr;
}
frame->headerLen = headerLen;
frame->dataLen = payloadLen;
frame->data = frame->start + headerLen;
return frame;
}
int RTPFrame::deallocFrame(RTPFrame::Frame *frame)
{
if (!frame)
return RTP_INVALID_VALUE;
if (frame->start)
delete frame->start;
delete frame;
return RTP_OK;
}
int RTPFrame::sendFrame(RTPConnection *conn, RTPFrame::Frame *frame)
{
if (!frame)
return RTP_INVALID_VALUE;
int ret;
if ((ret = RTPSender::writeGenericHeader(conn, frame->start, frame->headerLen)) != RTP_OK) {
LOG_ERROR("Failed to send header! Size %zu, Type %d", frame->headerLen, frame->frameType);
return ret;
}
if ((ret = RTPSender::writePayload(conn, frame->data, frame->dataLen)) != RTP_OK) {
LOG_ERROR("Failed to send payload! Size %zu, Type %d", frame->dataLen, frame->frameType);
return ret;
}
return RTP_OK;
}

36
src/frame.hh Normal file
View File

@ -0,0 +1,36 @@
#pragma once
#include "util.hh"
namespace RTPFrame {
typedef enum FRAME_TYPE {
FRAME_TYPE_GENERIC = 0, // payload length + RTP Header size (N + 12)
FRAME_TYPE_OPUS = 1, // payload length + RTP Header size + Opus header (N + 12 + 0 [for now])
FRAME_TYPE_HEVC_FU = 2, // payload length + RTP Header size + HEVC RTP Header + FU Header (N + 12 + 2 + 1)
} frame_type_t;
struct Frame {
uint32_t rtpTimestamp;
uint32_t rtpSsrc;
uint16_t rtpSequence;
uint8_t rtpPayload;
uint8_t marker;
uint8_t *start;
uint8_t *data;
size_t dataLen;
size_t headerLen;
rtp_format_t rtpFormat;
frame_type_t frameType;
};
/* TODO: */
RTPFrame::Frame *allocFrame(size_t payloadLen, frame_type_t type);
/* TODO: */
int deallocFrame(RTPFrame::Frame *frame);
/* TODO: */
int sendFrame(RTPConnection *conn, RTPFrame::Frame *frame);
};