mirror of https://github.com/ShaYmez/xlxd.git
Merge pull request #196 from narspt/patch-10
revert to closing streams immediately but fix last packets sent back
This commit is contained in:
commit
da2970d4f0
|
@ -139,11 +139,11 @@ void CProtocol::OnDvFramePacketIn(CDvFramePacket *Frame, const CIp *Ip)
|
||||||
// find the stream
|
// find the stream
|
||||||
CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip);
|
CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip);
|
||||||
if ( stream == NULL )
|
if ( stream == NULL )
|
||||||
{
|
{
|
||||||
// std::cout << "Deleting oprhaned Last Frame Packet with StreamId " << Frame->GetStreamId() << " from " << *Ip << std::endl;
|
// std::cout << "Deleting oprhaned Frame Packet with StreamId " << Frame->GetStreamId() << " from " << *Ip << std::endl;
|
||||||
delete Frame;
|
delete Frame;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//std::cout << "DV frame" << "from " << *Ip << std::endl;
|
//std::cout << "DV frame" << "from " << *Ip << std::endl;
|
||||||
// and push
|
// and push
|
||||||
|
@ -158,22 +158,40 @@ void CProtocol::OnDvLastFramePacketIn(CDvLastFramePacket *Frame, const CIp *Ip)
|
||||||
// find the stream
|
// find the stream
|
||||||
CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip);
|
CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip);
|
||||||
if ( stream == NULL )
|
if ( stream == NULL )
|
||||||
{
|
{
|
||||||
// std::cout << "Deleting oprhaned Last Frame Packet with StreamId " << Frame->GetStreamId() << " from " << *Ip << std::endl;
|
// std::cout << "Deleting oprhaned Last Frame Packet with StreamId " << Frame->GetStreamId() << " from " << *Ip << std::endl;
|
||||||
delete Frame;
|
delete Frame;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// push
|
// push
|
||||||
stream->Lock();
|
stream->Lock();
|
||||||
stream->Push(Frame);
|
stream->Push(Frame);
|
||||||
stream->Unlock();
|
stream->Unlock();
|
||||||
|
|
||||||
|
// wait stream queue is empty, same as done in CloseStream(), but we need it before HandleQueue()
|
||||||
|
bool bEmpty = false;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
stream->Lock();
|
||||||
|
// do not use stream->IsEmpty() has this "may" never succeed
|
||||||
|
// and anyway, the DvLastFramPacket short-circuit the transcoder
|
||||||
|
// loop queues
|
||||||
|
bEmpty = stream->empty();
|
||||||
|
stream->Unlock();
|
||||||
|
if ( !bEmpty )
|
||||||
|
{
|
||||||
|
// wait a bit
|
||||||
|
CTimePoint::TaskSleepFor(10);
|
||||||
|
}
|
||||||
|
} while (!bEmpty);
|
||||||
|
|
||||||
|
// handle queue from reflector a bit earlier, before closing the stream,
|
||||||
|
// this avoid last packets to be sent back to transmitting client (master)
|
||||||
|
HandleQueue();
|
||||||
|
|
||||||
// and don't close the stream yet but rely on CheckStreamsTimeout
|
// and close the stream
|
||||||
// mechanism, so the stream will be closed after the queues have
|
g_Reflector.CloseStream(stream);
|
||||||
// been sinked out. This avoid last packets to be send back
|
|
||||||
// to transmitting client (master)
|
|
||||||
// g_Reflector.CloseStream(stream);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue