Nalu slices test pass

This commit is contained in:
dijunkun
2023-09-07 15:46:26 +08:00
parent 952bb02df5
commit 58c73f10c6
9 changed files with 147 additions and 111 deletions

View File

@@ -2,9 +2,10 @@
#include <string>
RtpPacket::RtpPacket()
: buffer_(new uint8_t[MAX_NALU_LEN]), size_(MAX_NALU_LEN) {
memset(buffer_, 0, MAX_NALU_LEN);
#include "log.h"
RtpPacket::RtpPacket() : buffer_(new uint8_t[DEFAULT_MTU]), size_(DEFAULT_MTU) {
memset(buffer_, 0, DEFAULT_MTU);
}
RtpPacket::RtpPacket(const uint8_t *buffer, size_t size) {
@@ -23,8 +24,19 @@ RtpPacket::RtpPacket(const RtpPacket &rtp_packet) {
}
}
RtpPacket::RtpPacket(RtpPacket &&rtp_packet)
: buffer_((uint8_t *)std::move(rtp_packet.buffer_)),
size_(rtp_packet.size_) {
rtp_packet.buffer_ = nullptr;
rtp_packet.size_ = 0;
}
RtpPacket &RtpPacket::operator=(const RtpPacket &rtp_packet) {
if (&rtp_packet != this && rtp_packet.size_ > 0) {
if (&rtp_packet != this) {
if (buffer_) {
delete buffer_;
buffer_ = nullptr;
}
buffer_ = new uint8_t[rtp_packet.size_];
memcpy(buffer_, rtp_packet.buffer_, rtp_packet.size_);
size_ = rtp_packet.size_;
@@ -32,8 +44,15 @@ RtpPacket &RtpPacket::operator=(const RtpPacket &rtp_packet) {
return *this;
}
RtpPacket::RtpPacket(RtpPacket &&rtp_packet)
: buffer_((uint8_t *)rtp_packet.Buffer()), size_(rtp_packet.Size()) {}
RtpPacket &RtpPacket::operator=(RtpPacket &&rtp_packet) {
if (&rtp_packet != this) {
buffer_ = std::move(rtp_packet.buffer_);
rtp_packet.buffer_ = nullptr;
size_ = rtp_packet.size_;
rtp_packet.size_ = 0;
}
return *this;
}
RtpPacket::~RtpPacket() {
if (buffer_) {
@@ -47,11 +66,6 @@ RtpPacket::~RtpPacket() {
extension_data_ = nullptr;
}
extension_len_ = 0;
if (payload_) {
delete payload_;
payload_ = nullptr;
}
payload_size_ = 0;
}
@@ -227,10 +241,7 @@ size_t RtpPacket::DecodeH264Nalu(uint8_t *payload) {
nalu_header_.nal_unit_type = (buffer_[12 + payload_offset]) & 0x31;
payload_size_ = size_ - (13 + payload_offset);
// payload_ = new uint8_t[payload_size_];
// memcpy(payload_, buffer_ + 12 + payload_offset, payload_size_);
payload_ = buffer_ + 13 + payload_offset;
memcpy(payload, payload_, payload_size_);
return payload_size_;
}

View File

@@ -61,6 +61,7 @@
// |F|NRI| Type |S|E|R| Type |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#define DEFAULT_MTU 1500
#define MAX_NALU_LEN 1400
typedef enum { H264 = 96, OPUS = 97, USER_DEFINED = 127 } PAYLOAD_TYPE;
@@ -69,8 +70,9 @@ class RtpPacket {
RtpPacket();
RtpPacket(const uint8_t *buffer, size_t size);
RtpPacket(const RtpPacket &rtp_packet);
RtpPacket &operator=(const RtpPacket &rtp_packet);
RtpPacket(RtpPacket &&rtp_packet);
RtpPacket &operator=(const RtpPacket &rtp_packet);
RtpPacket &operator=(RtpPacket &&rtp_packet);
~RtpPacket();

View File

@@ -19,49 +19,50 @@ RtpSession ::~RtpSession() {
extension_data_ = nullptr;
}
if (rtp_packet_) {
delete rtp_packet_;
rtp_packet_ = nullptr;
}
// if (rtp_packet_) {
// delete rtp_packet_;
// rtp_packet_ = nullptr;
// }
}
std::vector<RtpPacket> RtpSession::Encode(uint8_t* buffer, size_t size) {
if (!rtp_packet_) {
rtp_packet_ = new RtpPacket();
}
void RtpSession::Encode(uint8_t* buffer, size_t size,
std::vector<RtpPacket>& packets) {
// if (!rtp_packet_) {
// rtp_packet_ = new RtpPacket();
// }
std::vector<RtpPacket> packets;
RtpPacket rtp_packet;
if (size <= MAX_NALU_LEN) {
rtp_packet_->SetVerion(version_);
rtp_packet_->SetHasPadding(has_padding_);
rtp_packet_->SetHasExtension(has_extension_);
rtp_packet_->SetMarker(1);
rtp_packet_->SetPayloadType(PAYLOAD_TYPE(payload_type_));
rtp_packet_->SetSequenceNumber(sequence_number_++);
rtp_packet.SetVerion(version_);
rtp_packet.SetHasPadding(has_padding_);
rtp_packet.SetHasExtension(has_extension_);
rtp_packet.SetMarker(1);
rtp_packet.SetPayloadType(PAYLOAD_TYPE(payload_type_));
rtp_packet.SetSequenceNumber(sequence_number_++);
timestamp_ =
std::chrono::high_resolution_clock::now().time_since_epoch().count();
rtp_packet_->SetTimestamp(timestamp_);
rtp_packet_->SetSsrc(ssrc_);
rtp_packet.SetTimestamp(timestamp_);
rtp_packet.SetSsrc(ssrc_);
if (!csrcs_.empty()) {
rtp_packet_->SetCsrcs(csrcs_);
rtp_packet.SetCsrcs(csrcs_);
}
if (has_extension_) {
rtp_packet_->SetExtensionProfile(extension_profile_);
rtp_packet_->SetExtensionData(extension_data_, extension_len_);
rtp_packet.SetExtensionProfile(extension_profile_);
rtp_packet.SetExtensionData(extension_data_, extension_len_);
}
RtpPacket::NALU_HEADER nalu_header;
nalu_header.forbidden_bit = 0;
nalu_header.nal_reference_idc = 1;
nalu_header.nal_unit_type = 1;
rtp_packet_->SetNaluHeader(nalu_header);
rtp_packet.SetNaluHeader(nalu_header);
rtp_packet_->EncodeH264Nalu(buffer, size);
packets.push_back(*rtp_packet_);
rtp_packet.EncodeH264Nalu(buffer, size);
packets.emplace_back(rtp_packet);
} else {
size_t last_packet_size = size % MAX_NALU_LEN;
@@ -69,36 +70,33 @@ std::vector<RtpPacket> RtpSession::Encode(uint8_t* buffer, size_t size) {
for (size_t index = 0; index * MAX_NALU_LEN < size + MAX_NALU_LEN;
index++) {
rtp_packet_->SetVerion(version_);
rtp_packet_->SetHasPadding(has_padding_);
rtp_packet_->SetHasExtension(has_extension_);
rtp_packet_->SetMarker(1);
rtp_packet_->SetPayloadType(PAYLOAD_TYPE(payload_type_));
rtp_packet_->SetSequenceNumber(sequence_number_++);
rtp_packet.SetVerion(version_);
rtp_packet.SetHasPadding(has_padding_);
rtp_packet.SetHasExtension(has_extension_);
rtp_packet.SetMarker(1);
rtp_packet.SetPayloadType(PAYLOAD_TYPE(payload_type_));
rtp_packet.SetSequenceNumber(sequence_number_++);
timestamp_ =
std::chrono::high_resolution_clock::now().time_since_epoch().count();
rtp_packet_->SetTimestamp(timestamp_);
rtp_packet_->SetSsrc(ssrc_);
rtp_packet.SetTimestamp(timestamp_);
rtp_packet.SetSsrc(ssrc_);
if (!csrcs_.empty()) {
rtp_packet_->SetCsrcs(csrcs_);
rtp_packet.SetCsrcs(csrcs_);
}
if (has_extension_) {
rtp_packet_->SetExtensionProfile(extension_profile_);
rtp_packet_->SetExtensionData(extension_data_, extension_len_);
rtp_packet.SetExtensionProfile(extension_profile_);
rtp_packet.SetExtensionData(extension_data_, extension_len_);
}
rtp_packet_->Encode(buffer, size);
packets.push_back(*rtp_packet_);
rtp_packet.Encode(buffer, size);
packets.emplace_back(rtp_packet);
}
}
return std::move(packets);
}
size_t RtpSession::Decode(uint8_t* buffer, size_t size, uint8_t* payload) {
*rtp_packet_ = std::move(RtpPacket(buffer, size));
return rtp_packet_->DecodeH264Nalu(payload);
size_t RtpSession::Decode(RtpPacket& packet, uint8_t* payload) {
return packet.DecodeH264Nalu(payload);
}

View File

@@ -15,8 +15,8 @@ class RtpSession
~RtpSession();
public:
std::vector<RtpPacket> Encode(uint8_t* buffer, size_t size);
size_t Decode(uint8_t* buffer, size_t size, uint8_t* payload);
void Encode(uint8_t* buffer, size_t size, std::vector<RtpPacket>& packets);
size_t Decode(RtpPacket& packet, uint8_t* payload);
private:
uint32_t version_ = 0;
@@ -35,7 +35,7 @@ class RtpSession
uint8_t* extension_data_ = nullptr;
private:
RtpPacket* rtp_packet_ = nullptr;
// RtpPacket* rtp_packet_ = nullptr;
};
#endif