summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/ScreenSharing/VP8RTPParser.cpp')
-rw-r--r--Swiften/ScreenSharing/VP8RTPParser.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/Swiften/ScreenSharing/VP8RTPParser.cpp b/Swiften/ScreenSharing/VP8RTPParser.cpp
index 053a50a..d44140b 100644
--- a/Swiften/ScreenSharing/VP8RTPParser.cpp
+++ b/Swiften/ScreenSharing/VP8RTPParser.cpp
@@ -11,37 +11,43 @@
namespace Swift {
VP8RTPParser::VP8RTPParser(VideoDecoder* decoder)
- : decoder(decoder), firstPacket(true)
+ : decoder(decoder), firstPacket(true), pictureID(0)
{
}
void VP8RTPParser::newPayloadReceived(const uint8_t* data, size_t len, bool hasMarker)
{
+ size_t headerSize = 1;
+
// Payload descriptor
uint8_t req = data[0];
if (firstPacket && !(req & SBit)) { /* Error */ }
- size_t headerSize;
+ if (req & XBit) { // Extension byte is present
+ uint8_t optX = data[headerSize++];
+ if (optX & IBit) { // PictureID byte is present
+ uint8_t optI = data[headerSize++];
+ pictureID = optI >> 1;
+ }
+ }
+
// Payload header
if (firstPacket) {
firstPacket = false;
-
- uint8_t o1 = data[1];
+ uint8_t o1 = data[headerSize];
showFrame = (o1 & 1);
isKeyFrame = (o1 & HBit);
o1 >>= Size0BitShift;
- frameSize = o1 + 8 * data[2] + 2048 * data[3];
+ frameSize = o1 + 8 * data[headerSize + 1] + 2048 * data[headerSize + 2];
- headerSize = 4;
- } else {
- headerSize = 1;
+ headerSize += 3;
}
buffer.insert(buffer.end(), data + headerSize, data + len);
if (hasMarker || buffer.size() >= frameSize) {
// Frame received
- decoder->decodeFrame(buffer);
+ decoder->decodeFrame(buffer, pictureID);
buffer.clear();
firstPacket = true;
}