void RTMP::update() { if (!connected()) { _handShaker->call(); if (_handShaker->error()) { _error = true; } if (!_handShaker->success()) return; _connected = true; } const size_t reads = 10; for (size_t i = 0; i < reads; ++i) { /// No need to continue reading (though it should do no harm). if (error()) return; RTMPPacket p; // If we haven't finished reading a packet, retrieve it; otherwise // use an empty one. if (_incompletePacket.get()) { log_debug("Doing incomplete packet"); p = *_incompletePacket; _incompletePacket.reset(); } else { if (!readPacketHeader(p)) continue; } // Get the payload if possible. if (hasPayload(p) && !readPacketPayload(p)) { // If the payload is not completely readable, store it and // continue. _incompletePacket.reset(new RTMPPacket(p)); continue; } // Store a copy of the packet for later additions and as a reference for // future sends. RTMPPacket& stored = storePacket(CHANNELS_IN, p.header.channel, p); // If the packet is complete, the stored packet no longer needs to // keep the data alive. if (isReady(p)) { clearPayload(stored); handlePacket(p); return; } } }
void DataBus::PacketParser::processReceivedData(const QByteArray &data) { // Add data to buffer m_buffer.append(data); // Execute state machine bool finished = false; while (finished == false) { switch (m_state) { case State_WaitForStartOfFrame: { finished = waitForStartOfFrame(); break; } case State_ReadPacketHeader: { finished = readPacketHeader(); break; } case State_ReadPacketPayload: { finished = readPacketPayload(); break; } case State_WaitForEndOfFrame: { finished = waitForEndOfFrame(); break; } default: { // Error, reinitialize the state machine m_state = State_WaitForStartOfFrame; finished = false; break; } } } }