15
15
16
16
namespace rtc {
17
17
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 }};
19
20
20
21
const uint8_t naluTypeSTAPA = 24 ;
21
22
const uint8_t naluTypeFUA = 28 ;
22
23
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
+
23
56
message_vector H264RtpDepacketizer::buildFrames (message_vector::iterator begin,
24
57
message_vector::iterator end, uint32_t timestamp) {
25
58
message_vector out = {};
@@ -49,8 +82,7 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
49
82
std::to_integer<uint8_t >(pkt->at (rtpHeaderSize + sizeof (NalUnitHeader)))};
50
83
51
84
if (nFrags++ == 0 ) {
52
- accessUnit.insert (accessUnit.end (), naluStartCode.begin (), naluStartCode.end ());
53
-
85
+ addSeparator (accessUnit);
54
86
accessUnit.emplace_back (
55
87
byte (nalUnitHeader.idc () | nalUnitFragmentHeader.unitType ()));
56
88
}
@@ -60,7 +92,7 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
60
92
sizeof (NalUnitFragmentHeader),
61
93
pkt->end ());
62
94
} else if (nalUnitHeader.unitType () > 0 && nalUnitHeader.unitType () < 24 ) {
63
- accessUnit. insert (accessUnit. end (), naluStartCode. begin (), naluStartCode. end () );
95
+ addSeparator (accessUnit);
64
96
accessUnit.insert (accessUnit.end (), pkt->begin () + rtpHeaderSize, pkt->end ());
65
97
} else if (nalUnitHeader.unitType () == naluTypeSTAPA) {
66
98
auto currOffset = rtpHeaderSize + sizeof (NalUnitHeader);
@@ -75,7 +107,7 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
75
107
throw std::runtime_error (" H264 STAP-A declared size is larger than buffer" );
76
108
}
77
109
78
- accessUnit. insert (accessUnit. end (), naluStartCode. begin (), naluStartCode. end () );
110
+ addSeparator (accessUnit);
79
111
accessUnit.insert (accessUnit.end (), pkt->begin () + currOffset,
80
112
pkt->begin () + currOffset + naluSize);
81
113
0 commit comments