mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
Nalu slices test pass
This commit is contained in:
@@ -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_;
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user