diff options
Diffstat (limited to 'Swiften/ScreenSharing/VP8RTPParser.cpp')
-rw-r--r-- | Swiften/ScreenSharing/VP8RTPParser.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Swiften/ScreenSharing/VP8RTPParser.cpp b/Swiften/ScreenSharing/VP8RTPParser.cpp new file mode 100644 index 0000000..5a725ea --- /dev/null +++ b/Swiften/ScreenSharing/VP8RTPParser.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012 Yoann Blein + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include <Swiften/ScreenSharing/VP8RTPParser.h> + +#include <Swiften/ScreenSharing/VP8Decoder.h> + +namespace Swift { + +VP8RTPParser::VP8RTPParser(VP8Decoder* decoder) + : decoder(decoder), firstPacket(true) +{ +} + +void VP8RTPParser::newPayloadReceived(const uint8_t* data, size_t len, bool hasMarker) +{ + // Payload descriptor + uint8_t req = data[0]; + if (firstPacket && !(req & SBit)) { /* Error */ } + + size_t headerSize; + // Payload header + if (firstPacket) { + firstPacket = false; + + uint8_t o1 = data[1]; + showFrame = (o1 & 1); + isKeyFrame = (o1 & HBit); + o1 >>= Size0BitShift; + frameSize = o1 + 8 * data[2] + 2048 * data[3]; + + headerSize = 4; + } else { + headerSize = 1; + } + + buffer.insert(buffer.end(), data + headerSize, data + len); + + if (hasMarker || buffer.size() >= frameSize) { + // Frame received + decoder->decodeFrame(buffer); + buffer.clear(); + firstPacket = true; + } +} + +} |