From 3389dc57512aedbc281fe59ce424364f496e26b8 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Mon, 4 Sep 2023 17:31:47 +0800 Subject: [PATCH] Add rtp module --- src/media/video/encode/nvcodec/nv_encoder.cpp | 2 +- src/pc/peer_connection.cpp | 1 + src/rtp/rtp_packet.cpp | 49 +++++++++ src/rtp/rtp_packet.h | 100 ++++++++++++++++++ 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/rtp/rtp_packet.cpp create mode 100644 src/rtp/rtp_packet.h diff --git a/src/media/video/encode/nvcodec/nv_encoder.cpp b/src/media/video/encode/nvcodec/nv_encoder.cpp index 6ff486e..5bbca74 100644 --- a/src/media/video/encode/nvcodec/nv_encoder.cpp +++ b/src/media/video/encode/nvcodec/nv_encoder.cpp @@ -79,7 +79,7 @@ int VideoEncoder::Encode(const uint8_t *pData, int nSize) { return -1; } - if (0 == seq_++ % (30)) { + if (0 == seq_++ % (30 * 5)) { ForceIdr(); } diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 370d61f..f0e01ee 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -254,6 +254,7 @@ int PeerConnection::SendVideoData(const char *data, size_t size) { int PeerConnection::OnEncodedImage(char *encoded_packets, size_t size) { for (auto ice_trans : ice_transmission_list_) { + LOG_ERROR("H264 frame size: [{}]", size); ice_trans.second->SendData(encoded_packets, size); } diff --git a/src/rtp/rtp_packet.cpp b/src/rtp/rtp_packet.cpp new file mode 100644 index 0000000..8e93bf5 --- /dev/null +++ b/src/rtp/rtp_packet.cpp @@ -0,0 +1,49 @@ +#include "rtp_packet.h" + +#include +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |V=2|P|X| CC |M| PT | sequence number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | timestamp | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | synchronization source (SSRC) identifier | +// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// | Contributing source (CSRC) identifiers | +// | .... | +// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// | header eXtension profile id | length in 32bits | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Extensions | +// | .... | +// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// | Payload | +// | .... : padding... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | padding | Padding size | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +RtpPacket::RtpPacket(const uint8_t *buffer, size_t size) { + if (size > 0) { + payload_ = new uint8_t[size]; + memcpy(payload_, buffer, size); + payload_size_ = size; + } +} + +RtpPacket::RtpPacket(const RtpPacket &rhs) { + if (rhs.payload_size_ > 0) { + payload_ = new uint8_t[rhs.payload_size_]; + memcpy(payload_, rhs.payload_, rhs.payload_size_); + payload_size_ = rhs.payload_size_; + } +} + +RtpPacket::~RtpPacket() { + if (payload_) { + delete payload_; + payload_ = nullptr; + } + payload_size_ = 0; +} \ No newline at end of file diff --git a/src/rtp/rtp_packet.h b/src/rtp/rtp_packet.h new file mode 100644 index 0000000..f78936f --- /dev/null +++ b/src/rtp/rtp_packet.h @@ -0,0 +1,100 @@ +#ifndef _RTP_PACKET_H_ +#define _RTP_PACKET_H_ + +#include +#include + +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |V=2|P|X| CC |M| PT | sequence number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | timestamp | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | synchronization source (SSRC) identifier | +// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// | Contributing source (CSRC) identifiers | +// | .... | +// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// | header eXtension profile id | length in 32bits | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Extensions | +// | .... | +// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// | Payload | +// | .... : padding... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | padding | Padding size | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +class RtpPacket { + public: + RtpPacket(const uint8_t *buffer, size_t size); + RtpPacket(const RtpPacket &rhs); + RtpPacket() {} + + ~RtpPacket(); + + public: + // Header + void SetMarker(bool marker) { marker_ = marker; } + void SetPayloadType(uint8_t payload_type) { payload_type_ = payload_type; } + void SetSequenceNumber(uint16_t sequence_number) { + sequence_number_ = sequence_number; + } + void SetTimestamp(uint32_t timestamp) { timestamp_ = timestamp; } + void SetSsrc(uint32_t ssrc) { ssrc_ = ssrc; } + void SetCsrcs(){}; + void SetHeadersSize(size_t payload_offset) { + payload_offset_ = payload_offset; + } + void SetHasExtension(bool has_extension) { has_extension_ = has_extension; }; + void SetExtensionID(uint16_t extension_id) { extension_id_ = extension_id; } + void SetExtensionData(uint8_t *extension_data) { + extension_data_ = extension_data; + } + + // Payload + void SetPayload(uint8_t *payload) { + payload_ = new uint8_t[payload_size_]; + memcpy(payload_, payload, payload_size_); + }; + void SetPayloadSize(size_t payload_size) { payload_size_ = payload_size; }; + void SetPaddingSize(size_t padding_size) { padding_size_ = padding_size; } + + // Header + bool Marker() const { return marker_; } + uint8_t PayloadType() const { return payload_type_; } + uint16_t SequenceNumber() const { return sequence_number_; } + uint32_t Timestamp() const { return timestamp_; } + uint32_t Ssrc() const { return ssrc_; } + std::vector Csrcs() const; + size_t HeadersSize() const { return payload_offset_; } + bool HasExtension() const { return has_extension_; }; + uint16_t ExtensionID() const { return extension_id_; } + uint8_t *ExtensionData() const { return extension_data_; } + + // Payload + uint8_t *Payload() const { return payload_; }; + size_t PayloadSize() const { return payload_size_; } + size_t PaddingSize() const { return padding_size_; } + + private: + // Header + bool marker_ = false; + uint8_t payload_type_ = 0; + uint16_t sequence_number_ = 0; + uint32_t timestamp_ = 0; + uint32_t ssrc_ = 0; + size_t payload_offset_ = 0; + bool has_extension_ = false; + uint16_t extension_id_ = 0; + uint8_t *extension_data_ = nullptr; + + // Payload + uint8_t *payload_ = nullptr; + size_t payload_size_ = 0; + uint8_t padding_size_; +}; + +#endif \ No newline at end of file