Hola otra vez.
Supongo que casi nadie debe acordarse ya
del parche que publiqué en su momento para que funcionase el VOD con varios decos. En su momento dejé sin solución el funcionamiento de la pausa:
... por la implementación de nat-rtsp, si la pausa de la reproducción es prolongada, quizás más de 30 segundos, la restauración de la sesión no funciona. Esto implica que merece la pena cancelar la reproducción y luego reiniciarla desde el último punto. Quiero mirarlo, espero tener tiempo....
La verdad es que lo dejé abandonado, pero con las últimas modificaciones en la plataforma, eso de que en vivo puedas usar la pausa, marcha atrás y esas cosas, me volví a interesar por el tema. Estos días he tenido algo de tiempo y lo he gastado en repasar cómo era esto, ya casi ni me acordaba, y en trabajar un poco en él.
No encontré nada en el protocolo que indicase la forma de mantener viva una conexión, pero como mi interés es hacerlo funcionar para movistar+ pues me fijé en cómo trabajan los decos. Una vez pulsada la pausa el deco envía cada 30 segundos un GET_PARAMETER hasta que se vuelve a pulsar el play. Esto me servirá para refrescar la conexión esperada y que no temporice. Para refrescar el
expect, y como mi nivel es nulo en el kernel, decidí copiarlo de otro módulo, en este caso de
nf_conntrack_sip.c. Y esta es la diferencia:
--- orig/nf_conntrack_rtsp.c 2014-09-23 16:42:13.849035808 +0200
+++ new/nf_conntrack_rtsp.c 2016-11-06 00:19:27.731663215 +0100
@@ -41,6 +41,7 @@
#include <net/tcp.h>
#include <net/netfilter/nf_conntrack.h>
+#include <net/netfilter/nf_conntrack_core.h>
#include <net/netfilter/nf_conntrack_expect.h>
#include <net/netfilter/nf_conntrack_helper.h>
#include "nf_conntrack_rtsp.h"
@@ -261,6 +262,28 @@
}
+static void
+refresh_expectation(struct nf_conn *ct,
+ unsigned int expires)
+{
+ struct nf_conn_help *help = nfct_help(ct);
+ struct nf_conntrack_expect *exp;
+ struct hlist_node *next;
+
+ spin_lock_bh(&nf_conntrack_expect_lock);
+ hlist_for_each_entry_safe(exp, next, &help->expectations, lnode) {
+ pr_debug("refresh_expectaion dport: %u, expires old: %d, new: %d\n",
+ ntohs(exp->tuple.dst.u.udp.port),
+ exp->timeout.expires,
+ jiffies + expires * HZ);
+ if (!del_timer(&exp->timeout))
+ continue;
+ exp->timeout.expires = jiffies + expires * HZ;
+ add_timer(&exp->timeout);
+ }
+ spin_unlock_bh(&nf_conntrack_expect_lock);
+}
+
/*** conntrack functions ***/
/* outbound packet: client->server */
@@ -312,6 +335,14 @@
break;
}
+ if (strncmp(pdata+cmdoff, "GET_PARAMETER ", 14) == 0) {
+ pr_debug("GET_PARAMETER handled, timeout new: %d, old: %d\n",
+ jiffies + setup_timeout * HZ,
+ ct->timeout.expires);
+ refresh_expectation(ct, setup_timeout);
+ break;
+ }
+
if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
continue; /* not a SETUP message */
Con este parche se consigue el comportamiento deseado. He tenido pausas de 20 minutos y al pulsar el play sigue reproduciendo. Éste complementa el anterior.
Espero que sea útil.
P.D.: Disculpad si esto ya se ha solucionado en algún envío anterior, no he podido repasar las 58 - 23 = 35 páginas anteriores.