diff options
author | dknn <yoann.blein@free.fr> | 2012-08-16 16:05:33 (GMT) |
---|---|---|
committer | dknn <yoann.blein@free.fr> | 2012-09-22 09:32:38 (GMT) |
commit | 867a950d5b3eb1422051a57c2533509188014b1a (patch) | |
tree | 01c9d7372c7e780aaa90456df2bac55082632dae /Swiften/ScreenSharing/VP8RTPParser.cpp | |
parent | 054bf7baf02cf088930c340fead40b464c1ed015 (diff) | |
download | swift-contrib-867a950d5b3eb1422051a57c2533509188014b1a.zip swift-contrib-867a950d5b3eb1422051a57c2533509188014b1a.tar.bz2 |
Add error resilence (buggy)
Diffstat (limited to 'Swiften/ScreenSharing/VP8RTPParser.cpp')
-rw-r--r-- | Swiften/ScreenSharing/VP8RTPParser.cpp | 24 |
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; } |