Ejemplo n.º 1
0
void RTMPPublisher::SendPacket(BYTE *data, UINT size, DWORD timestamp, PacketType type)
{
    //OSDebugOut (TEXT("SendPacket (%08x)\n"), quickHash(data,size));
    if(!bConnected && !bConnecting && !bStopping)
    {
        hConnectionThread = OSCreateThread((XTHREAD)CreateConnectionThread, this);
        bConnecting = true;
    }

    if (bFirstKeyframe)
    {
        if (!bConnected || type != PacketType_VideoHighest)
            return;

        firstTimestamp = timestamp;
        bFirstKeyframe = false;
    }

    if (bufferedPackets.Num() == MAX_BUFFERED_PACKETS)
    {
        if (!bBufferFull)
        {
            InitializeBuffer();
            bBufferFull = true;
        }

        TimedPacket packet;
        mcpy(&packet, &bufferedPackets[0], sizeof(TimedPacket));
        bufferedPackets.Remove(0);

        SendPacketForReal(packet.data.Array(), packet.data.Num(), packet.timestamp, packet.type);
    }

    timestamp -= firstTimestamp;

    TimedPacket *packet;
    
    if (type == PacketType_Audio)
    {
        UINT newID;
        timestamp -= audioTimeOffset;

        newID = FindClosestBufferIndex(timestamp);
        packet = bufferedPackets.InsertNew(newID);
    }
    else
    {
        packet = bufferedPackets.CreateNew();
    }

    packet->data.CopyArray(data, size);
    packet->timestamp = timestamp;
    packet->type = type;

    /*for (UINT i=0; i<bufferedPackets.Num(); i++)
    {
        if (bufferedPackets[i].data.Array() == 0)
            nop();
    }*/
}
Ejemplo n.º 2
0
void RTMPPublisher::FlushBufferedPackets()
{
    if (!bufferedPackets.Num())
        return;

    QWORD startTime = GetQPCTimeMS();
    DWORD baseTimestamp = bufferedPackets[0].timestamp;

    for (unsigned int i = 0; i < bufferedPackets.Num(); i++)
    {
        TimedPacket &packet = bufferedPackets[i];

        QWORD curTime;
        do
        {
            curTime = GetQPCTimeMS();
            OSSleep (1);
        } while (curTime - startTime < packet.timestamp - baseTimestamp);

        SendPacketForReal(packet.data.Array(), packet.data.Num(), packet.timestamp, packet.type);

        packet.data.Clear();
    }

    bufferedPackets.Clear();
}
Ejemplo n.º 3
0
void RTMPPublisher::FlushBufferedPackets()
{
    unsigned i;
    for (i = 0; i < bufferedPackets.Num(); i++)
    {
        TimedPacket packet;
        packet = bufferedPackets[i];
        SendPacketForReal(packet.data.Array(), packet.data.Num(), packet.timestamp, packet.type);
    }

    bufferedPackets.Clear();
}
Ejemplo n.º 4
0
void RTMPPublisher::SendPacket(BYTE *data, UINT size, DWORD timestamp, PacketType type)
{
    if(!bConnected && !bConnecting && !bStopping)
    {
        hConnectionThread = OSCreateThread((XTHREAD)CreateConnectionThread, this);
        bConnecting = true;
    }

    if (bFastInitialKeyframe)
    {
        if (!bConnected)
        {
            //while not connected, keep at most one keyframe buffered
            if (type != PacketType_VideoHighest)
                return;
        
            bufferedPackets.Clear();
        }

        if (bConnected && bFirstKeyframe)
        {
            bFirstKeyframe = false;
            firstTimestamp = timestamp;

            //send out our buffered keyframe immediately, unless this packet happens to also be a keyframe
            if (type != PacketType_VideoHighest && bufferedPackets.Num() == 1)
            {
                TimedPacket packet;
                mcpy(&packet, &bufferedPackets[0], sizeof(TimedPacket));
                bufferedPackets.Remove(0);
                packet.timestamp = 0;

                SendPacketForReal(packet.data.Array(), packet.data.Num(), packet.timestamp, packet.type);
            }
            else
                bufferedPackets.Clear();
        }
    }
    else
    {
        if (bFirstKeyframe)
        {
            if (!bConnected || type != PacketType_VideoHighest)
                return;

            firstTimestamp = timestamp;
            bFirstKeyframe = false;
        }
    }

    //OSDebugOut (TEXT("%u: SendPacket (%d bytes - %08x @ %u)\n"), OSGetTime(), size, quickHash(data,size), timestamp);

    if (bufferedPackets.Num() == MAX_BUFFERED_PACKETS)
    {
        if (!bBufferFull)
        {
            InitializeBuffer();
            bBufferFull = true;
        }

        TimedPacket packet;
        mcpy(&packet, &bufferedPackets[0], sizeof(TimedPacket));
        bufferedPackets.Remove(0);

        SendPacketForReal(packet.data.Array(), packet.data.Num(), packet.timestamp, packet.type);
    }

    timestamp -= firstTimestamp;

    TimedPacket *packet;
    
    if (type == PacketType_Audio)
    {
        UINT newID;
        timestamp -= audioTimeOffset;

        newID = FindClosestBufferIndex(timestamp);
        packet = bufferedPackets.InsertNew(newID);
    }
    else
    {
        packet = bufferedPackets.CreateNew();
    }

    packet->data.CopyArray(data, size);
    packet->timestamp = timestamp;
    packet->type = type;

    /*for (UINT i=0; i<bufferedPackets.Num(); i++)
    {
        if (bufferedPackets[i].data.Array() == 0)
            nop();
    }*/
}