Analogtv-plugin

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Softwareanforderungen)
K (Hierarchie)
Zeile 6: Zeile 6:
 
Unterstützt werden analoge TV-Karten (mit und ohne Hardware-MPEG-encoder) und Video-Grabber Karten, es kann also vom analogen TV-Tuner, Videorekorder o.ä. angeschaut und aufgezeichnet werden.
 
Unterstützt werden analoge TV-Karten (mit und ohne Hardware-MPEG-encoder) und Video-Grabber Karten, es kann also vom analogen TV-Tuner, Videorekorder o.ä. angeschaut und aufgezeichnet werden.
  
 +
<!-- ===Status=== -->
 
==Bilder==
 
==Bilder==
 
[[Bild:analogtv-plugin.jpg|thumb|none|''Einstellungen'']]
 
[[Bild:analogtv-plugin.jpg|thumb|none|''Einstellungen'']]
 +
 +
<!-- ==Bedienung== -->
 +
<!-- ===[[SVDRP]] Befehle=== -->
  
 
==Hardwareanforderungen==
 
==Hardwareanforderungen==
Zeile 21: Zeile 25:
  
 
==Installation==
 
==Installation==
<pre>
+
cd $SOURCEDIR
cd $SOURCEDIR
+
tar xvzf libdvb-<VERSION>.tar.gz
tar xvzf libdvb-<VERSION>.tar.gz
+
cd libdvb-<VERSION>
cd libdvb-<VERSION>
+
make
make
+
make install
make install
+
ldconfig
ldconfig
+
</pre>
+
  
 +
<!-- ===Optionen=== -->
 +
===Patches===
 
Plugin ist zu patchen (damit erspart man sich das Patchen der libdvb wie im Plugin-README eigentlich beschrieben).
 
Plugin ist zu patchen (damit erspart man sich das Patchen der libdvb wie im Plugin-README eigentlich beschrieben).
  
Zeile 65: Zeile 69:
 
Hinweis: Für ivtv > 0.1.9 muss VPID=301, APID=300 in der channels.conf verwendet werden.
 
Hinweis: Für ivtv > 0.1.9 muss VPID=301, APID=300 in der channels.conf verwendet werden.
  
Ein Grundgerüst für eine analoge channels.conf findet sich [[channels.conf_analog|hier]].
+
Ein Grundgerüst für eine analoge ''channels.conf'' findet sich [[channels.conf_analog|hier]].
  
<!-- ==Patches== -->
 
 
<!-- ==Konfiguration== -->
 
<!-- ==Konfiguration== -->
<!-- ==Einstellungen== -->
+
<!-- ===Einstellungen=== -->
<!-- ==Parameter== -->
+
<!-- ===Parameter=== -->
<!-- ==Bedienung== -->
+
<!-- ==[[SVDRP]] Befehle== -->
+
  
==Probleme==
+
==Sonstiges==
 +
===Probleme===
 
* nur eine TV-Karte möglich
 
* nur eine TV-Karte möglich
  
===Stottern nach Kanalwechsel===
+
* Stottern nach Kanalwechsel, Abhilfe mit [http://cvs.sourceforge.net/viewcvs.py/vdr-analogtv/analogtv/patches/?sortby=date#dirlist vdr-1.3.23-stuttering.patch (VDR >= 1.3.23!)]
Abhilfe mit [http://cvs.sourceforge.net/viewcvs.py/vdr-analogtv/analogtv/patches/?sortby=date#dirlist vdr-1.3.23-stuttering.patch (VDR >= 1.3.23!)]
+
 
+
===Compilerfehler (gcc4) ===
+
Compilerfehler '''invalid lvalue in assignment''' mit gcc4: Abhilfe bringt folgender Patch.
+
  
 +
* Compilerfehler '''invalid lvalue in assignment''' mit gcc4: Abhilfe bringt folgender Patch.
 
<pre>
 
<pre>
 
diff -ur analogtv-0.9.37/memcpy.c analogtv-0.9.37-new/memcpy.c
 
diff -ur analogtv-0.9.37/memcpy.c analogtv-0.9.37-new/memcpy.c
Zeile 133: Zeile 132:
 
</pre>
 
</pre>
  
===cDevice unbekannt===
+
* Klasse '''cDevice''' unbekannt bei Einsatz eines aktuellen VDR 1.3.x: Abhilfe bringt folgender Patch.
Klasse '''cDevice''' unbekannt bei Einsatz eines aktuellen VDR 1.3.x: Abhilfe bringt folgender Patch.
+
 
+
 
<pre>diff -ur analogtv-0.9.37/device.h analogtv-0.9.37-new/device.h
 
<pre>diff -ur analogtv-0.9.37/device.h analogtv-0.9.37-new/device.h
 
--- analogtv-0.9.37/device.h    2005-01-09 19:16:08.000000000 +0100
 
--- analogtv-0.9.37/device.h    2005-01-09 19:16:08.000000000 +0100
Zeile 147: Zeile 144:
  
 
  #include "redremote.h"
 
  #include "redremote.h"
 
 
</pre>
 
</pre>
  
===Compilerfehler cpu_accel.c:63===
+
* Compilerfehler '''cpu_accel.c:63: error: can't find a register in class `BREG' while reloading `asm' ''': Abhilfe: Patch für die cpuid Funktion, damit diese sich mit -fPIC kompilieren läßt.
Compilerfehler '''cpu_accel.c:63: error: can't find a register in class `BREG' while reloading `asm' ''': Abhilfe: Patch für die cpuid Funktion, damit diese sich mit -fPIC kompilieren läßt.
+
 
+
 
<pre>
 
<pre>
 
diff -ru analogtv-0.9.37.orig/cpu_accel.c analogtv-0.9.37/cpu_accel.c
 
diff -ru analogtv-0.9.37.orig/cpu_accel.c analogtv-0.9.37/cpu_accel.c
Zeile 219: Zeile 213:
 
</pre>
 
</pre>
  
===Compilerfehler cpuinfo.c===
+
* Compilerfehler: '''cpuinfo.c:72: error: PIC register ‘%ebx’ clobbered in ‘asm’''', Abhilfe: Der folgende patch, oder Deaktivieren der kompletten Routinen durch Deaktiveren von <tt>HAVE_FAST_MEMCPY</tt> im <tt>Makefile</tt>
Compilerfehler: '''cpuinfo.c:72: error: PIC register ‘%ebx’ clobbered in ‘asm’'''
+
 
+
Abhilfe: Der folgende patch, oder Deaktivieren der kompletten Routinen durch Deaktiveren von <tt>HAVE_FAST_MEMCPY</tt> im <tt>Makefile</tt>
+
  
 
<pre>
 
<pre>
Zeile 345: Zeile 336:
 
</pre>
 
</pre>
  
<!-- ==Tipps== -->
+
<!-- ===Tipps=== -->
<!-- ==Wunschliste== -->
+
<!-- ===Wunschliste=== -->
  
==Snapshot==
+
===Snapshot===
 
<pre>
 
<pre>
 
cvs -d:pserver:anonymous@vdr-analogtv.cvs.sourceforge.net:/cvsroot/vdr-analogtv login
 
cvs -d:pserver:anonymous@vdr-analogtv.cvs.sourceforge.net:/cvsroot/vdr-analogtv login

Version vom 6. August 2006, 22:15 Uhr

Inhaltsverzeichnis

Beschreibung

Autor: Andreas Kool

Mit diesem Plugin ist es möglich, analoges TV mit VDR zu benutzen. Die Ausgabe erfolgt über das DVB-Ausgabegerät, d.h. das Plugin verhält sich dem VDR gegenüber wie eine Budget-DVB-Karte.

Unterstützt werden analoge TV-Karten (mit und ohne Hardware-MPEG-encoder) und Video-Grabber Karten, es kann also vom analogen TV-Tuner, Videorekorder o.ä. angeschaut und aufgezeichnet werden.

Bilder

Einstellungen


Hardwareanforderungen

  • Man benötigt eine Analog-TV-Karte. Diese Karte muss entweder vom bttv Treiber, dem ivtv Treiber oder dem pvrusb2 Treiber unterstützt werden.
  • Weiterhin ist ein Realtime MPEG-Encoder nötig, entweder in Hardware, s.h. Hauppauge PVR250/350/PVR USB2, oder als Software (s.u.).

Softwareanforderungen

  • Wenn kein Hardware-MPEG-Encoder mit linux-Treiberunterstützung auf der TV-Karte drauf ist, ist ein Software-Encoder nötig. Idealerweise mp1e oder FFmpeg.
  • Bei PVR 250/350 neuesten Treiber von ivtvdriver.org. Beim Laden sicherstellen, dass ivtv vor den dvb Treibern geladen wird oder aber die channels.conf entsprechend angepaßt wird.
  • libdvb
  • Video4Linux2 (v4l2) (entfällt für PVR Karten)
  • ALSA (entfällt für PVR Karten)

Installation

cd $SOURCEDIR
tar xvzf libdvb-<VERSION>.tar.gz
cd libdvb-<VERSION>
make
make install
ldconfig

Patches

Plugin ist zu patchen (damit erspart man sich das Patchen der libdvb wie im Plugin-README eigentlich beschrieben).

--- VDR.org/PLUGINS/src/analogtv-0.9.37/player-analogtv.c	2005-07-07 16:32:50.000000000 +0200
+++ VDR/PLUGINS/src/analogtv-0.9.37/player-analogtv.c	2005-07-07 16:36:30.000000000 +0200
@@ -28,7 +28,6 @@
 #include <sys/soundcard.h>

 #include <transform.h>
-extern void pes_in_ts(p2p *p);
 #undef MIN
 #undef MAX

@@ -828,7 +827,7 @@
                 pes++;
                 spes += r;
 
-                get_pes(buffer, r, &p2t, pes_in_ts); // PES -> TS
+                kpes_to_ts(&p2t, buffer, r);
               }
             }
           }
@@ -937,7 +936,7 @@
       spes += r;

       if (r > 0)
-        get_pes(buffer, r, &p2t, pes_in_ts); // PES -> TS
+        kpes_to_ts(&p2t, buffer, r); // PES -> TS
     }
   }

Der Rest der Installation folgt der README und README.de des Plugins. Hinweis: Für ivtv > 0.1.9 muss VPID=301, APID=300 in der channels.conf verwendet werden.

Ein Grundgerüst für eine analoge channels.conf findet sich hier.


Sonstiges

Probleme

  • nur eine TV-Karte möglich
  • Compilerfehler invalid lvalue in assignment mit gcc4: Abhilfe bringt folgender Patch.
diff -ur analogtv-0.9.37/memcpy.c analogtv-0.9.37-new/memcpy.c
--- analogtv-0.9.37/memcpy.c    2005-01-09 19:16:09.000000000 +0100
+++ analogtv-0.9.37-new/memcpy.c        2005-11-14 22:17:22.000000000 +0100
@@ -211,8 +211,8 @@
         "movntps %%xmm2, 32(%1)\n"
         "movntps %%xmm3, 48(%1)\n"
         :: "r" (from), "r" (to) : "memory");
-        ((const unsigned char *)from)+=64;
-        ((unsigned char *)to)+=64;
+        from=((const unsigned char*)from)+64;
+        to=((unsigned char *)to)+64;
       }
     else
       /*
@@ -233,8 +233,8 @@
         "movntps %%xmm2, 32(%1)\n"
         "movntps %%xmm3, 48(%1)\n"
         :: "r" (from), "r" (to) : "memory");
-        ((const unsigned char *)from)+=64;
-        ((unsigned char *)to)+=64;
+        from=((const unsigned char *)from)+64;
+        to=((unsigned char *)to)+64;
       }
     /* since movntq is weakly-ordered, a "sfence"
      * is needed to become ordered again. */
@@ -288,8 +288,8 @@
       "movq %%mm6, 48(%1)\n"
       "movq %%mm7, 56(%1)\n"
       :: "r" (from), "r" (to) : "memory");
-      ((const unsigned char *)from)+=64;
-      ((unsigned char *)to)+=64;
+      from=((const unsigned char *)from)+64;
+      to=((unsigned char *)to)+64;
     }
     __asm__ __volatile__ ("emms":::"memory");
   }
@@ -349,8 +349,8 @@
       "movntq %%mm6, 48(%1)\n"
       "movntq %%mm7, 56(%1)\n"
       :: "r" (from), "r" (to) : "memory");
-      ((const unsigned char *)from)+=64;
-      ((unsigned char *)to)+=64;
+      from=((const unsigned char *)from)+64;
+      to=((unsigned char *)to)+64;
     }
      /* since movntq is weakly-ordered, a "sfence"
      * is needed to become ordered again. */
  • Klasse cDevice unbekannt bei Einsatz eines aktuellen VDR 1.3.x: Abhilfe bringt folgender Patch.
diff -ur analogtv-0.9.37/device.h analogtv-0.9.37-new/device.h
--- analogtv-0.9.37/device.h    2005-01-09 19:16:08.000000000 +0100
+++ analogtv-0.9.37-new/device.h        2005-11-14 21:26:59.000000000 +0100
@@ -14,7 +14,8 @@
 #ifndef DEVICE_H
 #define DEVICE_H

 #include <vdr/plugin.h>
+#include <vdr/device.h>

 #include "redremote.h"
  • Compilerfehler cpu_accel.c:63: error: can't find a register in class `BREG' while reloading `asm' : Abhilfe: Patch für die cpuid Funktion, damit diese sich mit -fPIC kompilieren läßt.
diff -ru analogtv-0.9.37.orig/cpu_accel.c analogtv-0.9.37/cpu_accel.c
--- analogtv-0.9.37.orig/cpu_accel.c	2005-05-13 23:49:38.000000000 +0200
+++ analogtv-0.9.37/cpu_accel.c	2005-05-13 23:57:49.000000000 +0200
@@ -50,30 +50,44 @@
     int AMD;
     uint32_t caps;
 
+#if !defined(PIC) && !defined(__PIC__)
 #define cpuid(op,eax,ebx,ecx,edx)	\
-    asm ("cpuid"			\
+    __asm__ ("cpuid"			\
 	 : "=a" (eax),			\
 	   "=b" (ebx),			\
 	   "=c" (ecx),			\
 	   "=d" (edx)			\
 	 : "a" (op)			\
 	 : "cc")
+#else   /* PIC version : save ebx */
+#define cpuid(op,eax,ebx,ecx,edx)       \
+    __asm__ ("push %%ebx\n\t"           \
+             "cpuid\n\t"                \
+             "movl %%ebx,%1\n\t"        \
+             "pop %%ebx"                \
+             : "=a" (eax),              \
+               "=r" (ebx),              \
+               "=c" (ecx),              \
+               "=d" (edx)               \
+             : "a" (op)                 \
+             : "cc")
+#endif
 
     
-    asm ("pushfl\n\t"
-	 "pushfl\n\t"
-	 "popl %0\n\t"
-	 "movl %0,%1\n\t"
-	 "xorl $0x200000,%0\n\t"
-	 "pushl %0\n\t"
-	 "popfl\n\t"
-	 "pushfl\n\t"
-	 "popl %0\n\t"
-	 "popfl"
-         : "=a" (eax),
-	   "=b" (ebx)
-	 :
-	 : "cc");
+   __asm__ ("pushf\n\t"
+             "pushf\n\t"
+             "pop %0\n\t"
+             "movl %0,%1\n\t"
+             "xorl $0x200000,%0\n\t"
+             "push %0\n\t"
+             "popf\n\t"
+             "pushf\n\t"
+             "pop %0\n\t"
+             "popf"
+             : "=r" (eax),
+               "=r" (ebx)
+             :
+             : "cc");
 
     if (eax == ebx)		/* no cpuid */
       return 0; 
  • Compilerfehler: cpuinfo.c:72: error: PIC register ‘%ebx’ clobbered in ‘asm’, Abhilfe: Der folgende patch, oder Deaktivieren der kompletten Routinen durch Deaktiveren von HAVE_FAST_MEMCPY im Makefile
diff -uprN new/cpuinfo.c orig/cpuinfo.c
--- new/cpuinfo.c	2005-12-11 14:22:27.000000000 +0100
+++ orig/cpuinfo.c	2005-12-11 14:10:21.000000000 +0100
@@ -62,18 +62,15 @@ typedef struct cpuid_regs {
     unsigned int edx;
 } cpuid_regs_t;
 
-static cpuid_regs_t
-cpuid(int func) {
-	cpuid_regs_t regs;
-#define	CPUID	".byte 0x0f, 0xa2; "
-	asm("push %%ebx; "
-	    "movl %4,%%eax; " CPUID
-	    "movl %%eax,%0; movl %%ebx,%1; movl %%ecx,%2; movl %%edx,%3; "
-	    "pop %%ebx"
-		: "=m" (regs.eax), "=m" (regs.ebx), "=m" (regs.ecx), "=m" (regs.edx)
-		: "g" (func)
-		: "%eax", "%ecx", "%edx");
-	return regs;
+static cpuid_regs_t cpuid( int func ) {
+    cpuid_regs_t regs;
+#define CPUID ".byte 0x0f, 0xa2; "
+    asm("movl %4,%%eax; " CPUID
+        "movl %%eax,%0; movl %%ebx,%1; movl %%ecx,%2; movl %%edx,%3"
+            : "=m" (regs.eax), "=m" (regs.ebx), "=m" (regs.ecx), "=m" (regs.edx)
+            : "g" (func)
+            : "%eax", "%ebx", "%ecx", "%edx");
+    return regs;
 }
 
 #define X86_VENDOR_INTEL 0
diff -uprN new/memcpy.c orig/memcpy.c
--- new/memcpy.c	2005-12-11 14:03:54.000000000 +0100
+++ orig/memcpy.c	2005-12-11 14:10:21.000000000 +0100
@@ -168,11 +168,9 @@ int d0, d1, d2;
 /* SSE note: i tried to move 128 bytes a time instead of 64 but it
 didn't make any measureable difference. i'm using 64 for the sake of
 simplicity. [MF] */
-static void * sse_memcpy(void * into, const void * infrom, size_t len)
+static void * sse_memcpy(void * to, const void * from, size_t len)
 {
   void *retval;
-  unsigned char* to=(unsigned char*)into;
-  unsigned char* from=(unsigned char*)infrom;
   size_t i;
   retval = to;
     
@@ -213,8 +211,8 @@ static void * sse_memcpy(void * into, co
         "movntps %%xmm2, 32(%1)\n"
         "movntps %%xmm3, 48(%1)\n"
         :: "r" (from), "r" (to) : "memory");
-        *from+=64;
-        *to+=64;
+        ((const unsigned char *)from)+=64;
+        ((unsigned char *)to)+=64;
       }
     else 
       /*
@@ -235,8 +233,8 @@ static void * sse_memcpy(void * into, co
         "movntps %%xmm2, 32(%1)\n"
         "movntps %%xmm3, 48(%1)\n"
         :: "r" (from), "r" (to) : "memory");
-        *from+=64;
-        *to+=64;
+        ((const unsigned char *)from)+=64;
+        ((unsigned char *)to)+=64;
       }
     /* since movntq is weakly-ordered, a "sfence"
      * is needed to become ordered again. */
@@ -251,11 +249,9 @@ static void * sse_memcpy(void * into, co
   return retval;
 }
 
-static void * mmx_memcpy(void * into, const void * infrom, size_t len)
+static void * mmx_memcpy(void * to, const void * from, size_t len)
 {
   void *retval;
-  unsigned char* to=(unsigned char*)into;
-  unsigned char* from=(unsigned char*)infrom;
   size_t i;
   retval = to;
 
@@ -292,8 +288,8 @@ static void * mmx_memcpy(void * into, co
       "movq %%mm6, 48(%1)\n"
       "movq %%mm7, 56(%1)\n"
       :: "r" (from), "r" (to) : "memory");
-      *from+=64;
-      *to+=64;
+      ((const unsigned char *)from)+=64;
+      ((unsigned char *)to)+=64;
     }
     __asm__ __volatile__ ("emms":::"memory");
   }
@@ -304,11 +300,9 @@ static void * mmx_memcpy(void * into, co
   return retval;
 }
 
-void * mmx2_memcpy(void * into, const void * infrom, size_t len)
+void * mmx2_memcpy(void * to, const void * from, size_t len)
 {
   void *retval;
-  unsigned char* to=(unsigned char*)into;
-  unsigned char* from=(unsigned char*)infrom;
   size_t i;
   retval = to;
 
@@ -355,8 +349,8 @@ void * mmx2_memcpy(void * into, const vo
       "movntq %%mm6, 48(%1)\n"
       "movntq %%mm7, 56(%1)\n"
       :: "r" (from), "r" (to) : "memory");
-      *from+=64;
-      *to+=64;
+      ((const unsigned char *)from)+=64;
+      ((unsigned char *)to)+=64;
     }
      /* since movntq is weakly-ordered, a "sfence"
      * is needed to become ordered again. */


Snapshot

cvs -d:pserver:anonymous@vdr-analogtv.cvs.sourceforge.net:/cvsroot/vdr-analogtv login
cvs -z3 -d:pserver:anonymous@vdr-analogtv.cvs.sourceforge.net:/cvsroot/vdr-analogtv co analogtv

Links

  1. Homepage des Plugins
  2. Dowload des Plugins
  3. Projektseite auf Sourceforge
  4. neue IVTV Treiber
  5. Libdvb
  6. IVTV Wiki
  7. Kanalliste Pal Zuordnung Kanal-Frequenz
  8. Grundgerüst analoge channels.conf
In anderen Sprachen