summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/ScreenSharing/VP8RTPParser.cpp')
-rw-r--r--Swiften/ScreenSharing/VP8RTPParser.cpp50
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;
+ }
+}
+
+}