Skip to content

Commit ee96c7a

Browse files
committed
H265RtpDepacketizer: Make start sequence configurable
Per PR review feedback, add a parameter to the constructor for configuring the start sequence to use when writing NALUs.
1 parent c144694 commit ee96c7a

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

include/rtc/h265rtpdepacketizer.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#if RTC_ENABLE_MEDIA
1414

1515
#include "common.hpp"
16+
#include "h265nalunit.hpp"
1617
#include "mediahandler.hpp"
1718
#include "message.hpp"
1819
#include "rtp.hpp"
@@ -24,14 +25,18 @@ namespace rtc {
2425
/// RTP depacketization for H265
2526
class RTC_CPP_EXPORT H265RtpDepacketizer : public MediaHandler {
2627
public:
27-
H265RtpDepacketizer() = default;
28+
using Separator = NalUnit::Separator;
29+
30+
H265RtpDepacketizer(Separator separator = Separator::LongStartSequence);
2831
virtual ~H265RtpDepacketizer() = default;
2932

3033
void incoming(message_vector &messages, const message_callback &send) override;
3134

3235
private:
3336
std::vector<message_ptr> mRtpBuffer;
37+
const NalUnit::Separator separator;
3438

39+
void addSeparator(binary& accessUnit);
3540
message_vector buildFrames(message_vector::iterator firstPkt, message_vector::iterator lastPkt,
3641
uint32_t timestamp);
3742
};

src/h265rtpdepacketizer.cpp

+37-6
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,44 @@
1515

1616
namespace rtc {
1717

18-
const binary naluStartCode = {byte{0}, byte{0}, byte{0}, byte{1}};
18+
const binary naluLongStartCode = {byte{0}, byte{0}, byte{0}, byte{1}};
19+
const binary naluShortStartCode = {byte{0}, byte{0}, byte{1}};
1920

2021
const uint8_t naluTypeAP = 48;
2122
const uint8_t naluTypeFU = 49;
2223

24+
H265RtpDepacketizer::H265RtpDepacketizer(Separator separator) : separator(separator) {
25+
switch (separator) {
26+
case Separator::StartSequence: [[fallthrough]];
27+
case Separator::LongStartSequence: [[fallthrough]];
28+
case Separator::ShortStartSequence:
29+
break;
30+
case Separator::Length: [[fallthrough]];
31+
default:
32+
throw std::invalid_argument("Invalid separator");
33+
}
34+
}
35+
36+
void H265RtpDepacketizer::addSeparator(binary& accessUnit)
37+
{
38+
switch (separator) {
39+
case Separator::StartSequence: [[fallthrough]];
40+
case Separator::LongStartSequence:
41+
accessUnit.insert(accessUnit.end(),
42+
naluLongStartCode.begin(),
43+
naluLongStartCode.end());
44+
break;
45+
case Separator::ShortStartSequence:
46+
accessUnit.insert(accessUnit.end(),
47+
naluShortStartCode.begin(),
48+
naluShortStartCode.end());
49+
break;
50+
case Separator::Length: [[fallthrough]];
51+
default:
52+
throw std::invalid_argument("Invalid separator");
53+
}
54+
}
55+
2356
message_vector H265RtpDepacketizer::buildFrames(message_vector::iterator begin,
2457
message_vector::iterator end, uint32_t timestamp) {
2558
message_vector out = {};
@@ -51,8 +84,7 @@ message_vector H265RtpDepacketizer::buildFrames(message_vector::iterator begin,
5184
std::to_integer<uint8_t>(pkt->at(rtpHeaderSize + sizeof(H265NalUnitHeader)))};
5285

5386
if (nFrags++ == 0) {
54-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
55-
87+
addSeparator(accessUnit);
5688
nalUnitHeader.setUnitType(nalUnitFragmentHeader.unitType());
5789
accessUnit.emplace_back(byte(nalUnitHeader._first));
5890
accessUnit.emplace_back(byte(nalUnitHeader._second));
@@ -75,8 +107,7 @@ message_vector H265RtpDepacketizer::buildFrames(message_vector::iterator begin,
75107
throw std::runtime_error("H265 AP declared size is larger than buffer");
76108
}
77109

78-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
79-
110+
addSeparator(accessUnit);
80111
accessUnit.insert(accessUnit.end(), pkt->begin() + currOffset,
81112
pkt->begin() + currOffset + naluSize);
82113

@@ -85,7 +116,7 @@ message_vector H265RtpDepacketizer::buildFrames(message_vector::iterator begin,
85116
} else if (nalUnitHeader.unitType() < naluTypeAP) {
86117
// "NAL units with NAL unit type values in the range of 0 to 47, inclusive, may be
87118
// passed to the decoder."
88-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
119+
addSeparator(accessUnit);
89120
accessUnit.insert(accessUnit.end(), pkt->begin() + rtpHeaderSize, pkt->end());
90121
} else {
91122
// "NAL-unit-like structures with NAL unit type values in the range of 48 to 63,

0 commit comments

Comments
 (0)