Analogtv-plugin

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Probleme)
 
(23 dazwischenliegende Versionen von 15 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
 
'''Autor:''' Andreas Kool
 
'''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.
+
Dieses Plugin war das erste Plugin, welches analoges TV in VDR ermöglichte.
  
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.
+
{{Box Hinweis|'''BITTE NICHT MEHR AUF DIESES PLUGIN IN VDR-WIKIs VERWEISEN.'''<br>Dieses Plugin ist seit Jahren verweist, hat keine offizielle Homepage mehr, nicht mehr mit aktuellen VDR Versionen funktionierend und ohne Änderungen nicht mehr verwendbar. Bitte benutzt und empfehlt das [[pvrinput-plugin]] anstelle dieses Plugins.}}
  
==Bilder==
 
[[Bild:analogtv-plugin.jpg|thumb|none|''Einstellungen'']]
 
  
==Hardwareanforderungen==
+
==Links==
* Man benötigt eine [[Analog-TV]]-Karte. Diese Karte muss entweder vom bttv Treiber, dem ivtv Treiber oder dem pvrusb2 Treiber unterstützt werden.
+
# [[pvrinput-plugin]]
* Weiterhin ist ein Realtime [[MPEG]]-Encoder nötig, entweder in Hardware, s.h. Hauppauge PVR250/350/PVR USB2, oder als Software (s.u.).
+
  
==Softwareanforderungen==
+
[[Kategorie:Veraltete Plugins]]
* 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.
+
{{i18n|analogtv-plugin}}
* Bei PVR 250/350 neuesten Treiber von [http://www.ivtvdriver.org/index.php/Main_Page 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==
+
<pre>
+
cd $SOURCEDIR
+
tar xvzf libdvb-<VERSION>.tar.gz
+
cd libdvb-<VERSION>
+
make
+
make install
+
ldconfig
+
</pre>
+
 
+
Plugin ist zu patchen (damit erspart man sich das Patchen der libdvb wie im Plugin-README eigentlich beschrieben).
+
 
+
<pre>
+
--- 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
+
    }
+
  }
+
</pre>
+
 
+
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 [[channels.conf_analog|hier]].
+
 
+
<!-- ==Patches== -->
+
<!-- ==Konfiguration== -->
+
<!-- ==Einstellungen== -->
+
<!-- ==Parameter== -->
+
<!-- ==Bedienung== -->
+
 
+
==Probleme==
+
*nur eine TV-Karte möglich.
+
*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!)]
+
*Compilerfehler '''invalid lvalue in assignment''' mit gcc4: Abhilfe bringt folgender Patch:
+
<pre>
+
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. */
+
</pre>
+
*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
+
--- 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"
+
 
+
</pre>
+
*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>
+
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;
+
</pre>
+
 
+
*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>
+
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. */
+
 
+
</pre>
+
 
+
<!-- ==Tipps== -->
+
<!-- ==Wunschliste== -->
+
 
+
==Snapshot==
+
<pre>cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/vdr-analogtv login
+
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/vdr-analogtv co analogtv</pre>
+
 
+
==Links==
+
{|
+
| [1]
+
| http://www.akool.homepage.t-online.de/index.html
+
| Homepage des Plugins
+
|-
+
| [2]
+
| http://sourceforge.net/projects/vdr-analogtv
+
| Projektseite auf Sourceforge
+
|-
+
| [3]
+
| http://www.ivtvdriver.org/index.php/Main_Page
+
| neue IVTV Treiber
+
|-
+
| [4]
+
| http://www.metzlerbros.org/dvb/index.html
+
| Libdvb
+
|-
+
| [5]
+
| [[Kanal PAL|Kanalliste Pal]]
+
| Zuordnung Kanal-Frequenz
+
|-
+
| [6]
+
| http://ivtv.writeme.ch
+
| IVTV Wiki
+
|-
+
| [7]
+
| [[channels.conf analog]]
+
| Grundgerüst analoge channels.conf
+
|}[[Kategorie:Plugins]][[Kategorie:AnalogTV]][[en:analogtv-plugin]]
+

Aktuelle Version vom 3. Januar 2014, 11:42 Uhr

[Bearbeiten] Beschreibung

Autor: Andreas Kool

Dieses Plugin war das erste Plugin, welches analoges TV in VDR ermöglichte.

Hinweis
Hinweis

BITTE NICHT MEHR AUF DIESES PLUGIN IN VDR-WIKIs VERWEISEN.
Dieses Plugin ist seit Jahren verweist, hat keine offizielle Homepage mehr, nicht mehr mit aktuellen VDR Versionen funktionierend und ohne Änderungen nicht mehr verwendbar. Bitte benutzt und empfehlt das pvrinput-plugin anstelle dieses Plugins.



[Bearbeiten] Links

  1. pvrinput-plugin
In anderen Sprachen