Skip to content

Commit 710023d

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 014ce5b commit 710023d

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
@@ -14,6 +14,7 @@
1414
#if RTC_ENABLE_MEDIA
1515

1616
#include "common.hpp"
17+
#include "h265nalunit.hpp"
1718
#include "mediahandler.hpp"
1819
#include "message.hpp"
1920
#include "rtp.hpp"
@@ -25,14 +26,18 @@ namespace rtc {
2526
/// RTP depacketization for H265
2627
class RTC_CPP_EXPORT H265RtpDepacketizer : public MediaHandler {
2728
public:
28-
H265RtpDepacketizer() = default;
29+
using Separator = NalUnit::Separator;
30+
31+
H265RtpDepacketizer(Separator separator = Separator::LongStartSequence);
2932
virtual ~H265RtpDepacketizer() = default;
3033

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

3336
private:
3437
std::vector<message_ptr> mRtpBuffer;
38+
const NalUnit::Separator separator;
3539

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

src/h265rtpdepacketizer.cpp

+37-6
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,44 @@
1616

1717
namespace rtc {
1818

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

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

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

5487
if (nFrags++ == 0) {
55-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
56-
88+
addSeparator(accessUnit);
5789
nalUnitHeader.setUnitType(nalUnitFragmentHeader.unitType());
5890
accessUnit.emplace_back(byte(nalUnitHeader._first));
5991
accessUnit.emplace_back(byte(nalUnitHeader._second));
@@ -76,8 +108,7 @@ message_vector H265RtpDepacketizer::buildFrames(message_vector::iterator begin,
76108
throw std::runtime_error("H265 AP declared size is larger than buffer");
77109
}
78110

79-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
80-
111+
addSeparator(accessUnit);
81112
accessUnit.insert(accessUnit.end(), pkt->begin() + currOffset,
82113
pkt->begin() + currOffset + naluSize);
83114

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

0 commit comments

Comments
 (0)