mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 20:25:34 +08:00
Implement single OBU packetizer
This commit is contained in:
@@ -223,9 +223,7 @@ void RtpCodec::Encode(uint8_t* buffer, size_t size,
|
|||||||
for (int i = 0; i < obus.size(); i++) {
|
for (int i = 0; i < obus.size(); i++) {
|
||||||
LOG_ERROR("[{}] Obu size = [{}], Obu type [{}]", i, obus[i].size_,
|
LOG_ERROR("[{}] Obu size = [{}], Obu type [{}]", i, obus[i].size_,
|
||||||
ObuTypeToString((OBU_TYPE)ObuType(obus[i].header_)));
|
ObuTypeToString((OBU_TYPE)ObuType(obus[i].header_)));
|
||||||
}
|
if (obus[i].size_ <= MAX_NALU_LEN) {
|
||||||
|
|
||||||
if (size <= MAX_NALU_LEN) {
|
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
rtp_packet.SetVerion(version_);
|
rtp_packet.SetVerion(version_);
|
||||||
rtp_packet.SetHasPadding(has_padding_);
|
rtp_packet.SetHasPadding(has_padding_);
|
||||||
@@ -234,8 +232,9 @@ void RtpCodec::Encode(uint8_t* buffer, size_t size,
|
|||||||
rtp_packet.SetPayloadType(RtpPacket::PAYLOAD_TYPE(payload_type_));
|
rtp_packet.SetPayloadType(RtpPacket::PAYLOAD_TYPE(payload_type_));
|
||||||
rtp_packet.SetSequenceNumber(sequence_number_++);
|
rtp_packet.SetSequenceNumber(sequence_number_++);
|
||||||
|
|
||||||
timestamp_ =
|
timestamp_ = std::chrono::high_resolution_clock::now()
|
||||||
std::chrono::high_resolution_clock::now().time_since_epoch().count();
|
.time_since_epoch()
|
||||||
|
.count();
|
||||||
rtp_packet.SetTimestamp(timestamp_);
|
rtp_packet.SetTimestamp(timestamp_);
|
||||||
rtp_packet.SetSsrc(ssrc_);
|
rtp_packet.SetSsrc(ssrc_);
|
||||||
|
|
||||||
@@ -248,60 +247,82 @@ void RtpCodec::Encode(uint8_t* buffer, size_t size,
|
|||||||
rtp_packet.SetExtensionData(extension_data_, extension_len_);
|
rtp_packet.SetExtensionData(extension_data_, extension_len_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// int obu_header;
|
rtp_packet.SetAv1AggrHeader(0, 0, 1, 0);
|
||||||
// memcpy(&obu_header, buffer, sizeof(char));
|
|
||||||
// int obu_type = (obu_header & 0b0'1111'000) >> 3;
|
// rtp_packet.EncodeAv1(buffer, size);
|
||||||
// LOG_ERROR("OBU type {}", obu_type);
|
// packets.emplace_back(rtp_packet);
|
||||||
// if (obu_type == kObuTypeTemporalDelimiter ||
|
}
|
||||||
// obu_type == kObuTypeTileList || obu_type == kObuTypePadding) {
|
}
|
||||||
// LOG_ERROR("Unsupported OBU type", obu_type);
|
|
||||||
|
// if (size <= MAX_NALU_LEN) {
|
||||||
|
// RtpPacket rtp_packet;
|
||||||
|
// rtp_packet.SetVerion(version_);
|
||||||
|
// rtp_packet.SetHasPadding(has_padding_);
|
||||||
|
// rtp_packet.SetHasExtension(has_extension_);
|
||||||
|
// rtp_packet.SetMarker(1);
|
||||||
|
// rtp_packet.SetPayloadType(RtpPacket::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_);
|
||||||
|
|
||||||
|
// if (!csrcs_.empty()) {
|
||||||
|
// rtp_packet.SetCsrcs(csrcs_);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
RtpPacket::AV1_AGGR_HEADER av1_aggr_header;
|
// if (has_extension_) {
|
||||||
av1_aggr_header.z = av1_aggr_header.z;
|
// rtp_packet.SetExtensionProfile(extension_profile_);
|
||||||
av1_aggr_header.y = av1_aggr_header.y;
|
// rtp_packet.SetExtensionData(extension_data_, extension_len_);
|
||||||
av1_aggr_header.w = av1_aggr_header.w;
|
// }
|
||||||
av1_aggr_header.n = av1_aggr_header.n;
|
|
||||||
|
|
||||||
rtp_packet.SetAv1AggrHeader(av1_aggr_header);
|
// RtpPacket::AV1_AGGR_HEADER av1_aggr_header;
|
||||||
|
// av1_aggr_header.z = av1_aggr_header.z;
|
||||||
|
// av1_aggr_header.y = av1_aggr_header.y;
|
||||||
|
// av1_aggr_header.w = av1_aggr_header.w;
|
||||||
|
// av1_aggr_header.n = av1_aggr_header.n;
|
||||||
|
|
||||||
rtp_packet.EncodeAv1(buffer, size);
|
// rtp_packet.SetAv1AggrHeader(av1_aggr_header);
|
||||||
packets.emplace_back(rtp_packet);
|
|
||||||
|
|
||||||
} else {
|
// rtp_packet.EncodeAv1(buffer, size);
|
||||||
size_t last_packet_size = size % MAX_NALU_LEN;
|
// packets.emplace_back(rtp_packet);
|
||||||
size_t packet_num = size / MAX_NALU_LEN + (last_packet_size ? 1 : 0);
|
|
||||||
timestamp_ =
|
|
||||||
std::chrono::high_resolution_clock::now().time_since_epoch().count();
|
|
||||||
|
|
||||||
for (size_t index = 0; index < packet_num; index++) {
|
// } else {
|
||||||
RtpPacket rtp_packet;
|
// size_t last_packet_size = size % MAX_NALU_LEN;
|
||||||
rtp_packet.SetVerion(version_);
|
// size_t packet_num = size / MAX_NALU_LEN + (last_packet_size ? 1 : 0);
|
||||||
rtp_packet.SetHasPadding(has_padding_);
|
// timestamp_ =
|
||||||
rtp_packet.SetHasExtension(has_extension_);
|
// std::chrono::high_resolution_clock::now().time_since_epoch().count();
|
||||||
rtp_packet.SetMarker(index == packet_num - 1 ? 1 : 0);
|
|
||||||
rtp_packet.SetPayloadType(RtpPacket::PAYLOAD_TYPE(payload_type_));
|
|
||||||
rtp_packet.SetSequenceNumber(sequence_number_++);
|
|
||||||
rtp_packet.SetTimestamp(timestamp_);
|
|
||||||
rtp_packet.SetSsrc(ssrc_);
|
|
||||||
|
|
||||||
if (!csrcs_.empty()) {
|
// for (size_t index = 0; index < packet_num; index++) {
|
||||||
rtp_packet.SetCsrcs(csrcs_);
|
// RtpPacket rtp_packet;
|
||||||
}
|
// rtp_packet.SetVerion(version_);
|
||||||
|
// rtp_packet.SetHasPadding(has_padding_);
|
||||||
|
// rtp_packet.SetHasExtension(has_extension_);
|
||||||
|
// rtp_packet.SetMarker(index == packet_num - 1 ? 1 : 0);
|
||||||
|
// rtp_packet.SetPayloadType(RtpPacket::PAYLOAD_TYPE(payload_type_));
|
||||||
|
// rtp_packet.SetSequenceNumber(sequence_number_++);
|
||||||
|
// rtp_packet.SetTimestamp(timestamp_);
|
||||||
|
// rtp_packet.SetSsrc(ssrc_);
|
||||||
|
|
||||||
if (has_extension_) {
|
// if (!csrcs_.empty()) {
|
||||||
rtp_packet.SetExtensionProfile(extension_profile_);
|
// rtp_packet.SetCsrcs(csrcs_);
|
||||||
rtp_packet.SetExtensionData(extension_data_, extension_len_);
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
if (index == packet_num - 1 && last_packet_size > 0) {
|
// if (has_extension_) {
|
||||||
rtp_packet.EncodeAv1(buffer + index * MAX_NALU_LEN, last_packet_size);
|
// rtp_packet.SetExtensionProfile(extension_profile_);
|
||||||
} else {
|
// rtp_packet.SetExtensionData(extension_data_, extension_len_);
|
||||||
rtp_packet.EncodeAv1(buffer + index * MAX_NALU_LEN, MAX_NALU_LEN);
|
// }
|
||||||
}
|
|
||||||
packets.emplace_back(rtp_packet);
|
// if (index == packet_num - 1 && last_packet_size > 0) {
|
||||||
}
|
// rtp_packet.EncodeAv1(buffer + index * MAX_NALU_LEN,
|
||||||
}
|
// last_packet_size);
|
||||||
|
// } else {
|
||||||
|
// rtp_packet.EncodeAv1(buffer + index * MAX_NALU_LEN, MAX_NALU_LEN);
|
||||||
|
// }
|
||||||
|
// packets.emplace_back(rtp_packet);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
} else if (RtpPacket::PAYLOAD_TYPE::OPUS == payload_type_) {
|
} else if (RtpPacket::PAYLOAD_TYPE::OPUS == payload_type_) {
|
||||||
RtpPacket rtp_packet;
|
RtpPacket rtp_packet;
|
||||||
rtp_packet.SetVerion(version_);
|
rtp_packet.SetVerion(version_);
|
||||||
|
|||||||
@@ -424,14 +424,12 @@ const uint8_t *RtpPacket::EncodeAv1(uint8_t *payload, size_t payload_size) {
|
|||||||
memcpy(buffer_ + 16 + extension_offset, extension_data_, extension_len_);
|
memcpy(buffer_ + 16 + extension_offset, extension_data_, extension_len_);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t payload_offset =
|
uint32_t aggr_header_offset =
|
||||||
(has_extension_ && extension_data_ ? extension_len_ : 0) +
|
(has_extension_ && extension_data_ ? extension_len_ : 0) +
|
||||||
extension_offset;
|
extension_offset;
|
||||||
|
memcpy(buffer_ + 12 + aggr_header_offset, &av1_aggr_header_, 1);
|
||||||
|
|
||||||
buffer_[12 + payload_offset] = fu_indicator_.forbidden_bit << 7 |
|
uint32_t payload_offset = aggr_header_offset + 1;
|
||||||
fu_indicator_.nal_reference_idc << 6 |
|
|
||||||
fu_indicator_.nal_unit_type;
|
|
||||||
|
|
||||||
memcpy(buffer_ + 13 + payload_offset, payload, payload_size);
|
memcpy(buffer_ + 13 + payload_offset, payload, payload_size);
|
||||||
size_ = payload_size + (13 + payload_offset);
|
size_ = payload_size + (13 + payload_offset);
|
||||||
|
|
||||||
|
|||||||
@@ -218,20 +218,6 @@ class RtpPacket {
|
|||||||
uint8_t nal_unit_type : 5;
|
uint8_t nal_unit_type : 5;
|
||||||
} FU_HEADER;
|
} FU_HEADER;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t z : 1;
|
|
||||||
uint8_t y : 1;
|
|
||||||
uint8_t w : 2;
|
|
||||||
uint8_t n : 1;
|
|
||||||
} AV1_AGGR_HEADER;
|
|
||||||
|
|
||||||
// typedef struct Obu {
|
|
||||||
// uint8_t header;
|
|
||||||
// uint8_t extension_header; // undefined if (header & kXbit) == 0
|
|
||||||
// rtc::ArrayView<const uint8_t> payload;
|
|
||||||
// int size; // size of the header and payload combined.
|
|
||||||
// } OBU;
|
|
||||||
|
|
||||||
void SetFuIndicator(FU_INDICATOR fu_indicator) {
|
void SetFuIndicator(FU_INDICATOR fu_indicator) {
|
||||||
fu_indicator_.forbidden_bit = fu_indicator.forbidden_bit;
|
fu_indicator_.forbidden_bit = fu_indicator.forbidden_bit;
|
||||||
fu_indicator_.nal_reference_idc = fu_indicator.nal_reference_idc;
|
fu_indicator_.nal_reference_idc = fu_indicator.nal_reference_idc;
|
||||||
@@ -245,11 +231,11 @@ class RtpPacket {
|
|||||||
fu_header_.nal_unit_type = fu_header.nal_unit_type;
|
fu_header_.nal_unit_type = fu_header.nal_unit_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetAv1AggrHeader(AV1_AGGR_HEADER av1_aggr_header) {
|
void SetAv1AggrHeader(int z, int y, int w, int n) {
|
||||||
av1_aggr_header_.z = av1_aggr_header.z;
|
if (z) av1_aggr_header_ |= (1 << 7);
|
||||||
av1_aggr_header_.y = av1_aggr_header.y;
|
if (y) av1_aggr_header_ |= (1 << 6);
|
||||||
av1_aggr_header_.w = av1_aggr_header.w;
|
if (w) av1_aggr_header_ |= w << 4;
|
||||||
av1_aggr_header_.n = av1_aggr_header.n;
|
if (n) av1_aggr_header_ |= (1 << 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetFecSymbolId(uint8_t fec_symbol_id) { fec_symbol_id_ = fec_symbol_id; }
|
void SetFecSymbolId(uint8_t fec_symbol_id) { fec_symbol_id_ = fec_symbol_id; }
|
||||||
@@ -377,7 +363,7 @@ class RtpPacket {
|
|||||||
FU_HEADER fu_header_;
|
FU_HEADER fu_header_;
|
||||||
uint8_t fec_symbol_id_ = 0;
|
uint8_t fec_symbol_id_ = 0;
|
||||||
uint8_t fec_source_symbol_num_ = 0;
|
uint8_t fec_source_symbol_num_ = 0;
|
||||||
AV1_AGGR_HEADER av1_aggr_header_;
|
uint8_t av1_aggr_header_ = 0;
|
||||||
|
|
||||||
// Payload
|
// Payload
|
||||||
uint8_t *payload_ = nullptr;
|
uint8_t *payload_ = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user