diff options
author | Petri Hintukainen <phintuka@users.sourceforge.net> | 2011-12-14 10:54:59 +0200 |
---|---|---|
committer | Petri Hintukainen <phintuka@users.sourceforge.net> | 2011-12-14 10:54:59 +0200 |
commit | 981a3c413789f0194a1b9c351994f0fb70b9b524 (patch) | |
tree | c87ace2b4f5f34cbd5230ea173f900c6d17216e3 | |
parent | b723173e991c1ad3302fc28c568a70acc6b27131 (diff) | |
download | xine-lib-981a3c413789f0194a1b9c351994f0fb70b9b524.tar.gz xine-lib-981a3c413789f0194a1b9c351994f0fb70b9b524.tar.bz2 |
demux_ts: Retry read few times after failure. Allow handling events and checking for demux_action_pending flag before retry.
Input can return -1 with errno set to EAGAIN or EINTR.
-rw-r--r-- | src/demuxers/demux_ts.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 8e89145b9..fb1d63ad8 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -332,6 +332,7 @@ typedef struct { fifo_buffer_t *video_fifo; input_plugin_t *input; + unsigned int read_retries; int status; @@ -1975,8 +1976,19 @@ static unsigned char * demux_synchronise(demux_ts_t* this) { this->frame_pos = this->input->get_current_pos (this->input); read_length = this->input->read(this->input, this->buf, - this->pkt_size * NPKT_PER_READ); - if (read_length < 0 || read_length % this->pkt_size) { + this->pkt_size * NPKT_PER_READ); + + if (read_length < 0) { + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + "demux_ts: read returned %d\n", read_length); + if (this->read_retries > 2) + this->status = DEMUX_FINISHED; + this->read_retries++; + return NULL; + } + this->read_retries = 0; + + if (read_length % this->pkt_size) { xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_ts: read returned %d bytes (not a multiple of %d!)\n", read_length, this->pkt_size); |