mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
Add rtp module
This commit is contained in:
@@ -79,7 +79,7 @@ int VideoEncoder::Encode(const uint8_t *pData, int nSize) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == seq_++ % (30)) {
|
if (0 == seq_++ % (30 * 5)) {
|
||||||
ForceIdr();
|
ForceIdr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ int PeerConnection::SendVideoData(const char *data, size_t size) {
|
|||||||
|
|
||||||
int PeerConnection::OnEncodedImage(char *encoded_packets, size_t size) {
|
int PeerConnection::OnEncodedImage(char *encoded_packets, size_t size) {
|
||||||
for (auto ice_trans : ice_transmission_list_) {
|
for (auto ice_trans : ice_transmission_list_) {
|
||||||
|
LOG_ERROR("H264 frame size: [{}]", size);
|
||||||
ice_trans.second->SendData(encoded_packets, size);
|
ice_trans.second->SendData(encoded_packets, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
49
src/rtp/rtp_packet.cpp
Normal file
49
src/rtp/rtp_packet.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#include "rtp_packet.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
100
src/rtp/rtp_packet.h
Normal file
100
src/rtp/rtp_packet.h
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
#ifndef _RTP_PACKET_H_
|
||||||
|
#define _RTP_PACKET_H_
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// 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<uint32_t> 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
|
||||||
Reference in New Issue
Block a user