@@ -32,9 +32,10 @@ const uint8_t naluTypeSTAPA = 24;
32
32
const uint8_t naluTypeFUA = 28 ;
33
33
34
34
message_vector H264RtpDepacketizer::buildFrames (message_vector::iterator begin,
35
- message_vector::iterator end) {
35
+ message_vector::iterator end, uint32_t timestamp ) {
36
36
message_vector out = {};
37
37
auto fua_buffer = std::vector<std::byte>{};
38
+ auto media_sample = std::make_shared<MediaSample>(timestamp);
38
39
39
40
for (auto it = begin; it != end; it++) {
40
41
auto pkt = it->get ();
@@ -58,11 +59,13 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
58
59
fua_buffer.at (0 ) =
59
60
std::byte (nalUnitHeader.idc () | nalUnitFragmentHeader.unitType ());
60
61
61
- out.push_back (make_message (std::move (fua_buffer)));
62
+ out.push_back (
63
+ make_message (std::move (fua_buffer), Message::Binary, 0 , nullptr , media_sample));
62
64
fua_buffer.clear ();
63
65
}
64
66
} else if (nalUnitHeader.unitType () > 0 && nalUnitHeader.unitType () < 24 ) {
65
- out.push_back (make_message (pkt->begin () + headerSize, pkt->end ()));
67
+ out.push_back (make_message (pkt->begin () + headerSize, pkt->end (), Message::Binary, 0 ,
68
+ nullptr , media_sample));
66
69
} else if (nalUnitHeader.unitType () == naluTypeSTAPA) {
67
70
auto currOffset = stapaHeaderSize + headerSize;
68
71
@@ -76,11 +79,11 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
76
79
throw std::runtime_error (" STAP-A declared size is larger then buffer" );
77
80
}
78
81
79
- out.push_back (
80
- make_message (pkt->begin () + currOffset, pkt->begin () + currOffset + naluSize));
82
+ out.push_back (make_message (pkt->begin () + currOffset,
83
+ pkt->begin () + currOffset + naluSize, Message::Binary, 0 ,
84
+ nullptr , media_sample));
81
85
currOffset += naluSize;
82
86
}
83
-
84
87
} else {
85
88
throw std::runtime_error (" Unknown H264 RTP Packetization" );
86
89
}
@@ -90,20 +93,22 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
90
93
}
91
94
92
95
void H264RtpDepacketizer::incoming (message_vector &messages, const message_callback &) {
93
- for (auto message : messages) {
94
- if (message->type == Message::Control) {
95
- continue ; // RTCP
96
- }
97
-
98
- if (message->size () < sizeof (RtpHeader)) {
99
- PLOG_VERBOSE << " RTP packet is too small, size=" << message->size ();
100
- continue ;
101
- }
102
-
103
- mRtpBuffer .push_back (message);
104
- }
105
-
106
- messages.clear ();
96
+ messages.erase (std::remove_if (messages.begin (), messages.end (),
97
+ [&](message_ptr message) {
98
+ if (message->type == Message::Control) {
99
+ return false ;
100
+ }
101
+
102
+ if (message->size () < sizeof (RtpHeader)) {
103
+ PLOG_VERBOSE << " RTP packet is too small, size="
104
+ << message->size ();
105
+ return false ;
106
+ }
107
+
108
+ mRtpBuffer .push_back (std::move (message));
109
+ return true ;
110
+ }),
111
+ messages.end ());
107
112
108
113
while (mRtpBuffer .size () != 0 ) {
109
114
uint32_t current_timestamp = 0 ;
@@ -128,7 +133,7 @@ void H264RtpDepacketizer::incoming(message_vector &messages, const message_callb
128
133
auto begin = mRtpBuffer .begin ();
129
134
auto end = mRtpBuffer .begin () + (packets_in_timestamp - 1 );
130
135
131
- auto frames = buildFrames (begin, end + 1 );
136
+ auto frames = buildFrames (begin, end + 1 , current_timestamp );
132
137
messages.insert (messages.end (), frames.begin (), frames.end ());
133
138
mRtpBuffer .erase (mRtpBuffer .begin (), mRtpBuffer .begin () + packets_in_timestamp);
134
139
}
0 commit comments