|
@@ -32,9 +32,10 @@ const uint8_t naluTypeSTAPA = 24;
|
|
|
const uint8_t naluTypeFUA = 28;
|
|
|
|
|
|
message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
|
|
|
- message_vector::iterator end) {
|
|
|
+ message_vector::iterator end, uint32_t timestamp) {
|
|
|
message_vector out = {};
|
|
|
auto fua_buffer = std::vector<std::byte>{};
|
|
|
+ auto frameInfo = std::make_shared<FrameInfo>(timestamp);
|
|
|
|
|
|
for (auto it = begin; it != end; it++) {
|
|
|
auto pkt = it->get();
|
|
@@ -58,11 +59,13 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
|
|
|
fua_buffer.at(0) =
|
|
|
std::byte(nalUnitHeader.idc() | nalUnitFragmentHeader.unitType());
|
|
|
|
|
|
- out.push_back(make_message(std::move(fua_buffer)));
|
|
|
+ out.push_back(
|
|
|
+ make_message(std::move(fua_buffer), Message::Binary, 0, nullptr, frameInfo));
|
|
|
fua_buffer.clear();
|
|
|
}
|
|
|
} else if (nalUnitHeader.unitType() > 0 && nalUnitHeader.unitType() < 24) {
|
|
|
- out.push_back(make_message(pkt->begin() + headerSize, pkt->end()));
|
|
|
+ out.push_back(make_message(pkt->begin() + headerSize, pkt->end(), Message::Binary, 0,
|
|
|
+ nullptr, frameInfo));
|
|
|
} else if (nalUnitHeader.unitType() == naluTypeSTAPA) {
|
|
|
auto currOffset = stapaHeaderSize + headerSize;
|
|
|
|
|
@@ -76,11 +79,11 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
|
|
|
throw std::runtime_error("STAP-A declared size is larger then buffer");
|
|
|
}
|
|
|
|
|
|
- out.push_back(
|
|
|
- make_message(pkt->begin() + currOffset, pkt->begin() + currOffset + naluSize));
|
|
|
+ out.push_back(make_message(pkt->begin() + currOffset,
|
|
|
+ pkt->begin() + currOffset + naluSize, Message::Binary, 0,
|
|
|
+ nullptr, frameInfo));
|
|
|
currOffset += naluSize;
|
|
|
}
|
|
|
-
|
|
|
} else {
|
|
|
throw std::runtime_error("Unknown H264 RTP Packetization");
|
|
|
}
|
|
@@ -90,20 +93,22 @@ message_vector H264RtpDepacketizer::buildFrames(message_vector::iterator begin,
|
|
|
}
|
|
|
|
|
|
void H264RtpDepacketizer::incoming(message_vector &messages, const message_callback &) {
|
|
|
- for (auto message : messages) {
|
|
|
- if (message->type == Message::Control) {
|
|
|
- continue; // RTCP
|
|
|
- }
|
|
|
-
|
|
|
- if (message->size() < sizeof(RtpHeader)) {
|
|
|
- PLOG_VERBOSE << "RTP packet is too small, size=" << message->size();
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- mRtpBuffer.push_back(message);
|
|
|
- }
|
|
|
-
|
|
|
- messages.clear();
|
|
|
+ messages.erase(std::remove_if(messages.begin(), messages.end(),
|
|
|
+ [&](message_ptr message) {
|
|
|
+ if (message->type == Message::Control) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (message->size() < sizeof(RtpHeader)) {
|
|
|
+ PLOG_VERBOSE << "RTP packet is too small, size="
|
|
|
+ << message->size();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ mRtpBuffer.push_back(std::move(message));
|
|
|
+ return true;
|
|
|
+ }),
|
|
|
+ messages.end());
|
|
|
|
|
|
while (mRtpBuffer.size() != 0) {
|
|
|
uint32_t current_timestamp = 0;
|
|
@@ -128,7 +133,7 @@ void H264RtpDepacketizer::incoming(message_vector &messages, const message_callb
|
|
|
auto begin = mRtpBuffer.begin();
|
|
|
auto end = mRtpBuffer.begin() + (packets_in_timestamp - 1);
|
|
|
|
|
|
- auto frames = buildFrames(begin, end + 1);
|
|
|
+ auto frames = buildFrames(begin, end + 1, current_timestamp);
|
|
|
messages.insert(messages.end(), frames.begin(), frames.end());
|
|
|
mRtpBuffer.erase(mRtpBuffer.begin(), mRtpBuffer.begin() + packets_in_timestamp);
|
|
|
}
|