Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 27f238f

Browse files
committedApr 13, 2024·
H264RtpDepacketizer: Make start sequence configurable
Add a parameter to the constructor for configuring the start sequence to use when writing NALUs.
1 parent e9663d8 commit 27f238f

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed
 

‎include/rtc/h264rtpdepacketizer.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "common.hpp"
1616
#include "mediahandler.hpp"
1717
#include "message.hpp"
18+
#include "nalunit.hpp"
1819
#include "rtp.hpp"
1920

2021
#include <iterator>
@@ -24,14 +25,18 @@ namespace rtc {
2425
/// RTP depacketization for H264
2526
class RTC_CPP_EXPORT H264RtpDepacketizer : public MediaHandler {
2627
public:
27-
H264RtpDepacketizer() = default;
28+
using Separator = NalUnit::Separator;
29+
30+
H264RtpDepacketizer(Separator separator = Separator::LongStartSequence);
2831
virtual ~H264RtpDepacketizer() = 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/h264rtpdepacketizer.cpp

+37-5
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{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 naluTypeSTAPA = 24;
2122
const uint8_t naluTypeFUA = 28;
2223

24+
H264RtpDepacketizer::H264RtpDepacketizer(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 H264RtpDepacketizer::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 H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
2457
message_vector::iterator end, uint32_t timestamp) {
2558
message_vector out = {};
@@ -49,8 +82,7 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
4982
std::to_integer<uint8_t>(pkt->at(rtpHeaderSize + sizeof(NalUnitHeader)))};
5083

5184
if (nFrags++ == 0) {
52-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
53-
85+
addSeparator(accessUnit);
5486
accessUnit.emplace_back(
5587
byte(nalUnitHeader.idc() | nalUnitFragmentHeader.unitType()));
5688
}
@@ -60,7 +92,7 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
6092
sizeof(NalUnitFragmentHeader),
6193
pkt->end());
6294
} else if (nalUnitHeader.unitType() > 0 && nalUnitHeader.unitType() < 24) {
63-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
95+
addSeparator(accessUnit);
6496
accessUnit.insert(accessUnit.end(), pkt->begin() + rtpHeaderSize, pkt->end());
6597
} else if (nalUnitHeader.unitType() == naluTypeSTAPA) {
6698
auto currOffset = rtpHeaderSize + sizeof(NalUnitHeader);
@@ -75,7 +107,7 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
75107
throw std::runtime_error("H264 STAP-A declared size is larger than buffer");
76108
}
77109

78-
accessUnit.insert(accessUnit.end(), naluStartCode.begin(), naluStartCode.end());
110+
addSeparator(accessUnit);
79111
accessUnit.insert(accessUnit.end(), pkt->begin() + currOffset,
80112
pkt->begin() + currOffset + naluSize);
81113

0 commit comments

Comments
 (0)
Please sign in to comment.