Ejemplo n.º 1
0
Archivo: RTMP.cpp Proyecto: aopui/gnash
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;
        }
    }
}
Ejemplo n.º 2
0
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;
            }
        }
    }
}