summaryrefslogtreecommitdiff
path: root/xine_input_vdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'xine_input_vdr.c')
-rw-r--r--xine_input_vdr.c128
1 files changed, 74 insertions, 54 deletions
diff --git a/xine_input_vdr.c b/xine_input_vdr.c
index 92bb712a..2313c5e6 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.260 2009-07-10 12:37:19 phintuka Exp $
+ * $Id: xine_input_vdr.c,v 1.261 2009-07-13 11:00:58 phintuka Exp $
*
*/
@@ -3872,6 +3872,76 @@ static buf_element_t *udp_parse_control(vdr_input_plugin_t *this, buf_element_t
return read_buffer;
}
+static void udp_process_queue(vdr_input_plugin_t *this)
+{
+ udp_data_t *udp = this->udp_data;
+
+ /*
+ * Stay inside receiving window:
+ * if window exceeded, skip missing frames
+ */
+
+ if (udp->queued > ((UDP_SEQ_MASK+1)>>2)) {
+#ifdef LOG_UDP
+ int start = udp->next_seq;
+#endif
+ while (!udp->queue[udp->next_seq]) {
+ INCSEQ(udp->next_seq);
+ udp->missed_frames++;
+ }
+ udp->resend_requested = 0;
+ LOGUDP("Re-ordering window exceeded, skipped missed frames %d-%d",
+ start, udp->next_seq-1);
+ }
+
+ /*
+ * flush continous part of queue to demuxer queue
+ */
+
+ while (udp->queued > 0 && udp->queue[udp->next_seq]) {
+ stream_udp_header_t *pkt = (stream_udp_header_t*)udp->queue[udp->next_seq]->content;
+ udp->queue_input_pos = pkt->pos + udp->queue[udp->next_seq]->size - sizeof(stream_udp_header_t);
+ if (udp->queue[udp->next_seq]->size > sizeof(stream_udp_header_t))
+ this->block_buffer->put(this->block_buffer, udp->queue[udp->next_seq]);
+ else
+ udp->queue[udp->next_seq]->free_buffer(udp->queue[udp->next_seq]);
+
+ udp->queue[udp->next_seq] = NULL;
+ udp->queued --;
+ INCSEQ(udp->next_seq);
+ if (udp->resend_requested)
+ udp->resend_requested --;
+ }
+}
+
+static void udp_process_resend(vdr_input_plugin_t *this, int current_seq)
+{
+ udp_data_t *udp = this->udp_data;
+
+ /* no new resend requests until previous has been completed or failed */
+ if (udp->resend_requested)
+ return;
+
+ /* If frames are missing, request re-send */
+ if (NEXTSEQ(current_seq) != udp->next_seq && udp->queued) {
+
+ int max_req = 20;
+
+ while (!udp->queue[current_seq] && --max_req > 0)
+ INCSEQ(current_seq);
+
+ printf_control(this, "UDP RESEND %d-%d %" PRIu64 "\r\n",
+ udp->next_seq, PREVSEQ(current_seq),
+ udp->queue_input_pos);
+
+ udp->resend_requested =
+ (current_seq + (UDP_SEQ_MASK+1) - udp->next_seq) & UDP_SEQ_MASK;
+
+ LOGUDP("%d-%d missing, requested re-send for %d frames",
+ udp->next_seq, PREVSEQ(current_seq), udp->resend_requested);
+ }
+}
+
static int vdr_plugin_read_net_udp(vdr_input_plugin_t *this)
{
struct sockaddr_in server_address;
@@ -4015,64 +4085,14 @@ static int vdr_plugin_read_net_udp(vdr_input_plugin_t *this)
else
udp->queued--;
}
+
udp->queue[current_seq] = read_buffer;
read_buffer = NULL;
udp->queued ++;
- /* stay inside receiving window:
- If window exceeded, skip missing frames */
- if (udp->queued > ((UDP_SEQ_MASK+1)>>2)) {
-#ifdef LOG_UDP
- int start = udp->next_seq;
-#endif
- while (!udp->queue[udp->next_seq]) {
- INCSEQ(udp->next_seq);
- udp->missed_frames++;
- }
- udp->resend_requested = 0;
- LOGUDP("Re-ordering window exceeded, skipped missed frames %d-%d",
- start, udp->next_seq-1);
- }
-
- /* flush continous part of queue to demuxer queue */
- while (udp->queued > 0 && udp->queue[udp->next_seq]) {
- pkt = (stream_udp_header_t*)udp->queue[udp->next_seq]->content;
- udp->queue_input_pos = pkt->pos + udp->queue[udp->next_seq]->size - sizeof(stream_udp_header_t);
- if (udp->queue[udp->next_seq]->size > sizeof(stream_udp_header_t))
- this->block_buffer->put(this->block_buffer, udp->queue[udp->next_seq]);
- else
- udp->queue[udp->next_seq]->free_buffer(udp->queue[udp->next_seq]);
-
- udp->queue[udp->next_seq] = NULL;
- udp->queued --;
- INCSEQ(udp->next_seq);
- if (udp->resend_requested)
- udp->resend_requested --;
- }
-
- /* no new resend requests until previous has been completed or failed */
- if (udp->resend_requested)
- continue;
+ udp_process_queue(this);
- /* If frames are missing, request re-send */
- if (NEXTSEQ(current_seq) != udp->next_seq && udp->queued) {
-
- if (!udp->resend_requested) {
- int max_req = 20;
-
- while (!udp->queue[current_seq] && --max_req > 0)
- INCSEQ(current_seq);
-
- printf_control(this, "UDP RESEND %d-%d %" PRIu64 "\r\n",
- udp->next_seq, PREVSEQ(current_seq),
- udp->queue_input_pos);
- udp->resend_requested =
- (current_seq + (UDP_SEQ_MASK+1) - udp->next_seq) & UDP_SEQ_MASK;
-
- LOGUDP("%d-%d missing, requested re-send for %d frames",
- udp->next_seq, PREVSEQ(current_seq), udp->resend_requested);
- }
- }
+ udp_process_resend(this, current_seq);
#ifdef LOG_UDP
/* Link quality statistics */