summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend_svr.c3
-rw-r--r--tools/udp_pes_scheduler.c12
-rw-r--r--xine_input_vdr.c31
3 files changed, 21 insertions, 25 deletions
diff --git a/frontend_svr.c b/frontend_svr.c
index 51bbcb27..9b9a6929 100644
--- a/frontend_svr.c
+++ b/frontend_svr.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: frontend_svr.c,v 1.5 2006-06-11 19:08:05 phintuka Exp $
+ * $Id: frontend_svr.c,v 1.6 2006-06-11 21:02:54 phintuka Exp $
*
*/
@@ -414,6 +414,7 @@ bool cXinelibServer::Flush(int TimeoutMs)
sprintf(tmp, "FLUSH %d %" PRIu64, TimeoutMs, m_StreamPos);
result = (PlayFileCtrl(tmp)) <= 0 && result;
}
+
return result;
}
diff --git a/tools/udp_pes_scheduler.c b/tools/udp_pes_scheduler.c
index b9a929fe..d44d3c38 100644
--- a/tools/udp_pes_scheduler.c
+++ b/tools/udp_pes_scheduler.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: udp_pes_scheduler.c,v 1.4 2006-06-11 19:08:05 phintuka Exp $
+ * $Id: udp_pes_scheduler.c,v 1.5 2006-06-11 21:02:54 phintuka Exp $
*
*/
@@ -220,8 +220,8 @@ void cUdpScheduler::Clear(void)
cMutexLock ml(&m_Lock);
m_BackLog->Clear(m_QueuePending);
+
m_QueuePending = 0;
-
m_Cond.Broadcast();
}
@@ -414,9 +414,11 @@ void cUdpScheduler::Action(void)
static unsigned char padding[] = {0x00,0x00,0x01,0xBE,0x00,0x02,0xff,0xff};
int prevseq = (m_QueueNextSeq + UDP_BUFFER_SIZE - 1) & UDP_BUFFER_MASK;
stream_udp_header_t *frame = m_BackLog->Get(prevseq);
- if(frame)
- m_BackLog->MakeFrame(ntohll(frame->pos), padding, 8);
- else
+ if(frame) {
+ int prevlen = m_BackLog->PayloadSize(prevseq);
+ uint64_t pos = ntohll(frame->pos) + prevlen - 8;
+ m_BackLog->MakeFrame(pos, padding, 8);
+ } else
m_BackLog->MakeFrame(0, padding, 8);
m_QueuePending++;
}
diff --git a/xine_input_vdr.c b/xine_input_vdr.c
index 0835cbba..ea5dd6d3 100644
--- a/xine_input_vdr.c
+++ b/xine_input_vdr.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: xine_input_vdr.c,v 1.6 2006-06-11 19:08:05 phintuka Exp $
+ * $Id: xine_input_vdr.c,v 1.7 2006-06-11 21:02:54 phintuka Exp $
*
*/
@@ -2248,7 +2248,6 @@ static int vdr_plugin_poll(vdr_input_plugin_t *this, int timeout_ms);
static int vdr_plugin_flush_remote(vdr_input_plugin_t *this, int timeout_ms, uint64_t offset)
{
int r;
- buf_element_t *bufelem;
pthread_mutex_lock(&this->lock);
this->live_mode = 0; /* --> 1 again when data arrives ... */
@@ -2259,8 +2258,8 @@ static int vdr_plugin_flush_remote(vdr_input_plugin_t *this, int timeout_ms, uin
pthread_mutex_unlock(&this->lock);
while(this->curpos < offset && timeout_ms > 0) {
- LOGDBG("FLUSH: wait position (%" PRIu64 " ; need %" PRIu64 ")",
- this->curpos, offset);
+ TRACE("FLUSH: wait position (%" PRIu64 " ; need %" PRIu64 ")",
+ this->curpos, offset);
xine_usec_sleep(3*1000);
timeout_ms -= 3;
}
@@ -2273,17 +2272,10 @@ static int vdr_plugin_flush_remote(vdr_input_plugin_t *this, int timeout_ms, uin
}
pthread_mutex_unlock(&this->lock);
- bufelem = this->buffer_pool->buffer_pool_try_alloc(this->buffer_pool);
- if(bufelem) {
- bufelem->type = BUF_CONTROL_FLUSH_DECODER;
- this->block_buffer->put(this->block_buffer, bufelem);
- }
-
- r = vdr_plugin_flush(this, timeout_ms);
+ r = vdr_plugin_flush(this, MAX(5, timeout_ms));
printf_control(this, "RESULT %d %d\r\n", this->token, r);
xine_usec_sleep(20*1000);
- /*#warning test sleep*/
this->live_mode = 1;
@@ -2973,23 +2965,23 @@ static int vdr_plugin_flush(vdr_input_plugin_t *this, int timeout_ms)
create_timeout_time(&abstime, timeout_ms);
- pthread_mutex_lock(&pool->buffer_pool_mutex);
while(result > 0 && waitresult != ETIMEDOUT) {
TRACE("vdr_plugin_flush waiting (max %d ms), %d+%d buffers used, "
"%d frames (rd pos=%" PRIu64 ")\n", timeout_ms,
- pool->fifo_size, this->block_buffer->fifo_size,
+ pool->size(pool), this->block_buffer->size(this->block_buffer),
(int)this->stream->video_out->get_property(this->stream->video_out,
VO_PROP_BUFS_IN_FIFO),
this->curpos);
+ pthread_mutex_lock(&pool->buffer_pool_mutex);
waitresult = pthread_cond_timedwait (&pool->buffer_pool_cond_not_empty,
&pool->buffer_pool_mutex, &abstime);
- result = MAX(0, pool->fifo_size) +
- MAX(0, this->block_buffer->fifo_size) +
+ pthread_mutex_unlock(&pool->buffer_pool_mutex);
+ result = MAX(0, pool->size(pool)) +
+ MAX(0, this->block_buffer->size(this->block_buffer)) +
this->stream->video_out->get_property(this->stream->video_out,
VO_PROP_BUFS_IN_FIFO);
}
- pthread_mutex_unlock(&pool->buffer_pool_mutex);
TRACE("vdr_plugin_flush returns %d (%d+%d used, %d frames)\n", result,
pool->size(pool),
@@ -3683,6 +3675,7 @@ static buf_element_t *vdr_plugin_read_block (input_plugin_t *this_gen,
continue;
loops=0;
+ pthread_mutex_lock(&this->lock);
if(buf->type == BUF_MAJOR_MASK) {
/* Strip network headers */
if(this->udp||this->rtp) {
@@ -3700,10 +3693,10 @@ static buf_element_t *vdr_plugin_read_block (input_plugin_t *this_gen,
/* control buffers go always to demuxer */
if ((buf->type & BUF_MAJOR_MASK) == BUF_CONTROL_BASE) {
+ pthread_mutex_unlock(&this->lock);
return buf;
}
-
- pthread_mutex_lock(&this->lock);
+
this->curpos += buf->size;
if(this->discard_index > this->curpos && this->guard_index < this->curpos) {
pthread_mutex_unlock(&this->lock);