/* * Copyright (c) 2012 Yoann Blein * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include #include namespace Swift { VP8RTPParser::VP8RTPParser(VideoDecoder* decoder) : 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 */ } 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[headerSize]; showFrame = (o1 & 1); isKeyFrame = (o1 & HBit); o1 >>= Size0BitShift; frameSize = o1 + 8 * data[headerSize + 1] + 2048 * data[headerSize + 2]; headerSize += 3; } buffer.insert(buffer.end(), data + headerSize, data + len); if (hasMarker || buffer.size() >= frameSize) { // Frame received decoder->decodeFrame(buffer, pictureID); buffer.clear(); firstPacket = true; } } }