diff options
author | phintuka <phintuka> | 2009-07-24 18:11:20 +0000 |
---|---|---|
committer | phintuka <phintuka> | 2009-07-24 18:11:20 +0000 |
commit | 0832d72a8d2b086b58ebdd3e9d49dd473e8ac1e4 (patch) | |
tree | d32318210ecd427b8645dd0072e6a5271ae99bb7 | |
parent | 7e1689816d6ca2dacc36ba20f9db79693529553f (diff) | |
download | xineliboutput-0832d72a8d2b086b58ebdd3e9d49dd473e8ac1e4.tar.gz xineliboutput-0832d72a8d2b086b58ebdd3e9d49dd473e8ac1e4.tar.bz2 |
When clearing, drop only one packet at time
-> do not break frames
-> keep control messages
-rw-r--r-- | tools/backgroundwriter.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/tools/backgroundwriter.c b/tools/backgroundwriter.c index 14c57e33..6b7c8ff4 100644 --- a/tools/backgroundwriter.c +++ b/tools/backgroundwriter.c @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: backgroundwriter.c,v 1.17 2009-07-24 18:02:51 phintuka Exp $ + * $Id: backgroundwriter.c,v 1.18 2009-07-24 18:11:20 phintuka Exp $ * */ @@ -181,11 +181,23 @@ void cTcpWriter::Action(void) if (DATA_IS_PES(pkt) || DATA_IS_TS(pkt)) { Count = min(Count, (int)(StartPos - GetPos)); + // size of next (complete) packet. + // drop only one packet at time. + stream_tcp_header_t *header = (stream_tcp_header_t*)Data; + int pkt_len = ntohl(header->len) + sizeof(stream_tcp_header_t); + if (Count >= pkt_len) { + // drop only complete packets. + // some packets are not dropped (packets overlapping end of ringbuffer) + Count = pkt_len; + m_RingBuffer.Del(Count); GetPos += Count; NextHeaderPos = GetPos; + CorkReq = true; // force sending last frame + continue; + } } } } |