Create routines for (de)allocating different kinds of frames
This commit is contained in:
parent
d7d5f55e69
commit
b84be50344
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
};
|
Loading…
Reference in New Issue