Pvrinput-plugin

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Probleme)
(Aktualisierung, da vdr seit 1.724 das ganze /dev/dvb directory scannt und nicht mehr die Suche in einer Loop-Schleife abbricht, wenn eine adapater-Nr. nicht vorhanden ist)
 
(79 dazwischenliegende Versionen von 16 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
==Beschreibung==
 
==Beschreibung==
'''Autor:''' Andreas Regel
+
'''Autor:''' Andreas Regel (bis 2006). Weiterentwicklung seitdem durch Winfried Koehler, Martin Dauskardt und Lars Hanisch
  
Dieses Plugin ermöglicht es, analoges TV mit dem VDR in Verbindung mit einer [[Hauppauge]] [[HauppaugePVR|PVR-Karte]] zu benutzen. Die Funktion ist prinzipiell die gleiche wie beim [[analogtv-plugin]], die Bedienung und Einrichtung jedoch deutlich einfacher.
+
Dieses Plugin ermöglicht es, analoges TV und UKW-Radio mit dem VDR in Verbindung mit einer vom Plugin unterstützen [[HauppaugePVR|PVR-Karte]] zu benutzen.
Mit ivtv >= 0.8.0 wurde die Treiber Struktur geändert, so dass z.Z. einige Funktionen von pvrinput damit nicht funktionieren.
+
Für die Erstellung der channels.conf siehe das README zum Plugin. Alternativ kann die channels.conf auch mit [[w pvrscan]] erstellt werden, w_pvrscan führt einen automatischen Kanalsuchlauf durch.
+
  
<!-- ===Status=== -->
+
===Status===
<!--
+
Letztes Update 04/2012
==Bilder==
+
{|
+
|[[Bild:pvrinput-plugin-00.jpg|thumb|none|''kurze beschreibung'']]
+
|[[Bild:pvrinput-plugin-01.jpg|thumb|none|''kurze beschreibung'']]
+
|}
+
-->
+
  
 
==Hardwareanforderungen==
 
==Hardwareanforderungen==
* [[HauppaugePVR|PVR Karte]]
+
* Unterstützt werden derzeit [[HauppaugePVR|die folgenden analogen TV-Karten mit MPEG-Encoder]]:
 +
**PVR-150
 +
**PVR-250
 +
**PVR-350
 +
**PVR-500
 +
**PVR-USB2
 +
**HVR-1900
 +
**HVR-1950
 +
**HVR-1955 und HVR-1975 müssten ebenfalls funktionieren (Unterstützung für den pvrusb2-Treiber kam im Juni 2019 in den media_tree.git von linuxtv)
 +
**HD PVR
 +
 
 +
 
  
 
==Softwareanforderungen==
 
==Softwareanforderungen==
* ivtv Treiber (jeweils aktuelle Version verwenden)
+
Einer der folgenden Treiber, je nach TV Karte:
 +
* '''ivtv Treiber''' für PVR150/250/350/500, im Kernel enthalten
 +
* '''pvrusb2 Treiber''' für PVR USB2.0, HVR-1900, HVR-1950
 +
* '''hdpvr Treiber''' für HD PVR
 +
 
 +
==Konfiguration==
 +
 
 +
Für die Erstellung der channels.conf siehe die Datei '''README''' zum Plugin. Alternativ kann die channels.conf auch mit [[w pvrscan]] oder dem [[Wirbelscan-plugin]] erstellt werden, die einen automatischen Kanalsuchlauf durchführen.
 +
 
 +
Die [http://projects.vdr-developer.org/repositories/entry/plg-pvrinput/README README des plugins] enthält eine genaue Beschreibung des Aufbaus der channels.conf. In den Plugin-Sourcen sind zudem [http://projects.vdr-developer.org/repositories/browse/plg-pvrinput/example Beispiele für die channels.conf-Einträge enthalten.
  
<!-- ==Bedienung== -->
 
<!-- ===[[SVDRP]] Befehle=== -->
 
<!-- ==Hardwareanforderungen== -->
 
<!-- ==Softwareanforderungen== -->
 
<!-- ==Installation== -->
 
<!-- ===Optionen=== -->
 
<!-- ===Patches=== -->
 
<!-- ==Konfiguration== -->
 
<!-- ===Einstellungen=== -->
 
<!-- ===Parameter=== -->
 
 
==Sonstiges==
 
==Sonstiges==
===Probleme===
+
===TV-Karten mit BlackBird Design===
<!--
+
TV-Karten nach dem blackbird Design, wie z.B. die HVR-1300, waren trotz Anstrengungen nicht sinnvoll in das pvrinput Plugin zu integrieren. Vom Betrieb solcher TV-Karten mit dem pvrinput Plugin ist abzuraten.
* Im Zusammenhang mit [[Text2skin-plugin|text2skin]] kann es zu einem ruckelnden Bild und stotterndem Ton beim Analog-TV kommen. In diesem Fall das text2skin-Plugin vor dem pvrinput-Plugin laden, also im VDR-Aufruf -P'text2skin' vor -P'pvrinput' stellen.
+
 
-->
+
===Hybride von Digital TV und Analogem TV===
* Mit neueren Versionen der IVTV-Treiber kann es beim Setzen des VBI-Modes zu Fehlern kommen. Im Zusammenhang mit dem osdteletext-Plugins kann daher für analoges TV kein Teletext angezeigt werden.
+
Einige TV-Karten, wie z.B. die Hauppauge HVR 1900 sind Hybridgeräte, die ihre Hardware zwischen analogem und digitalem TV teilen. Analoges TV und DVB können deswegen nicht gleichzeitig benutzt werden. Sobald VDR den digitalen DVB Teil gefunden hat und benutzt, steht der analoge Teil für pvrinput nicht mehr zur Verfügung.
  
Die Fehlermeldungen lauten:
+
* Lösung: Zunächst muss beim Laden des pvrusb2-Treibers mit der Moduloption adapter_nr eine bestimmte device Nummer vorgegeben werden.
* IVTV_IOC_G_CODEC failed, 22: Das Argument ist ungültig.
+
**Beispiel: vdr soll nur die DVB-Karten /dev/dvb/adapter0 und /dev/dvb/adapter1 verwenden. Man lädt pvrusb2 nun wie folgt: "modprobe pvrusb2 adapter_nr=2". Zusätzlich muss vdr mit den Optionen "--device=0 --device=1" vorgegeben werden, dass nur adapter 0 und 1, nicht aber der adapter2 (DVB-device der HVR1900) verwendet werden soll. Somit wird letzteres von vdr nicht geöffnet, und pvrinput kann das analoge device der HVR1900 öffnen.
* Error setting vbi embedded mode, 22: Das Argument ist ungültig.
+
  
Die Lösung ist die Datei device.c zu patchen:
+
==Entwicklerversion und aktuelle Version==
 +
git clone git://projects.vdr-developer.org/vdr-plugin-pvrinput.git pvrinput
  
--- device.c.old        2006-04-30 17:35:56.000000000 +0200
 
+++ device.c    2007-04-04 22:51:32.000000000 +0200
 
@@ -22,7 +22,7 @@
 
 
  const short kVideoPid = 301;
 
  const short kAudioPid = 300;
 
-const short kTeletextPid = 305;
 
+const uint8_t kTeletextPid = (uint8_t)305;
 
 
  typedef enum
 
  {
 
@@ -408,18 +408,36 @@
 
 
        if (vbi_fd > 0)
 
        {
 
-              int vbi_insert = 1;
 
-              if (ioctl(vbi_fd, IVTV_IOC_S_VBI_EMBED, &vbi_insert) < 0)
 
-              {
 
-                      log(0, "Error setting vbi embedded mode, %d:%s", errno, strerror(errno));
 
-              }
 
-    struct v4l2_format vbi_fmt;
 
-    vbi_fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
 
-    vbi_fmt.fmt.sliced.service_set = V4L2_SLICED_TELETEXT_B;
 
-              if (ioctl(vbi_fd, VIDIOC_S_FMT, &vbi_fmt) < 0)
 
-              {
 
-                      log(0, "Error setting vbi mode, %d:%s", errno, strerror(errno));
 
-              }
 
+              struct v4l2_ext_control vbi_ctrl;
 
+              vbi_ctrl.id      = V4L2_CID_MPEG_STREAM_VBI_FMT;
 
+              vbi_ctrl.value  = V4L2_MPEG_STREAM_VBI_FMT_IVTV;
 
+
 
+              struct v4l2_ext_controls ctrls;
 
+              bzero(&ctrls, sizeof(struct v4l2_ext_controls));
 
+              ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
 
+              ctrls.count      = 1;
 
+              ctrls.controls  = &vbi_ctrl;
 
+
 
+              if (ioctl(vbi_fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
 
+              {
 
+                      log(0, "Can't enable VBI recording %d:%s", errno, strerror(errno));
 
+              }
 
+
 
+              struct v4l2_format vbifmt;
 
+              bzero(&vbifmt, sizeof(struct v4l2_format));
 
+              vbifmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
 
+              vbifmt.fmt.sliced.service_set = V4L2_SLICED_VBI_625;
 
+
 
+              if (ioctl(vbi_fd, VIDIOC_S_FMT, &vbifmt) < 0)
 
+              {
 
+                      log(0, "Can't enable VBI recording %d:%s", errno, strerror(errno));
 
+
 
+              }
 
+
 
+              if (ioctl(vbi_fd, VIDIOC_G_FMT, &vbifmt) >= 0)
 
+              {
 
+                      log(0, "VBI service: %d, io size: %d" ,vbifmt.fmt.sliced.service_set, vbifmt.fmt.sliced.io_size);
 
+              }
 
        }
 
 
        while (active)
 
@@ -734,38 +752,65 @@
 
 
  bool cPvrDevice::SetCodec(void)
 
  {
 
-      struct ivtv_ioctl_codec codec;
 
+      static const uint numCtrls = 7;
 
+      struct v4l2_ext_controls ctrls;
 
+      struct v4l2_ext_control ext_ctrl[numCtrls];
 
 
-      if (IOCTL(video_fd, IVTV_IOC_G_CODEC, &codec) != 0)
 
-      {
 
-              log(0, "IVTV_IOC_G_CODEC failed, %d:%s", errno, strerror(errno));
 
-              return false;
 
-      }
 
-      codec.stream_type = IVTV_STREAM_PS; // IVTV_STREAM_DVD_S2
 
-      codec.aspect = PvrSetup.AspectRatio + 1;
 
-      codec.pulldown = PvrSetup.Pulldown;
 
-      codec.bitrate = PvrSetup.VideoBitrate * 1000;
 
-      codec.bitrate_peak = 15000000;
 
-      codec.bitrate_mode = bitrateCBR;
 
+      /* Set controls */
 
+      bzero(&ctrls,    sizeof(struct v4l2_ext_controls));
 
+      bzero(&ext_ctrl, sizeof(struct v4l2_ext_control) * numCtrls);
 
 
-      codec.framespergop = PvrSetup.FramesPerGop; // 15 for NTSC
 
-      codec.bframes = PvrSetup.BFrames + 1;
 
-      codec.gop_closure = PvrSetup.GopClosure;
 
+      ext_ctrl[0].id    = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
 
+      ext_ctrl[0].value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
 
 
-      codec.dnr_mode    = PvrSetup.DnrMode;
 
-      codec.dnr_type    = PvrSetup.DnrType;
 
-      codec.dnr_spatial  = PvrSetup.DnrSpatial;
 
-      codec.dnr_temporal = PvrSetup.DnrTemporal;
 
+      ext_ctrl[2].id    = V4L2_CID_MPEG_AUDIO_ENCODING;
 
+      ext_ctrl[2].value = V4L2_MPEG_AUDIO_ENCODING_LAYER_2;
 
 
-      codec.audio_bitmask = 0x0009 | ((PvrSetup.AudioBitrate + 1) << 4);
 
-      codec.framerate = 1;
 
+      ext_ctrl[3].id    = V4L2_CID_MPEG_AUDIO_L2_BITRATE;
 
+      ext_ctrl[3].value = PvrSetup.AudioBitrate;
 
 
-      if (IOCTL(video_fd, IVTV_IOC_S_CODEC, &codec) != 0)
 
-      {
 
-              log(0, "IVTV_IOC_S_CODEC failed, %d:%s", errno, strerror(errno));
 
-              return false;
 
-      }
 
-      return true;
 
+
 
+      ext_ctrl[1].id    = V4L2_CID_MPEG_VIDEO_ASPECT;
 
+      ext_ctrl[1].value = PvrSetup.AspectRatio;
 
+
 
+
 
+      ext_ctrl[4].id    = V4L2_CID_MPEG_VIDEO_BITRATE;
 
+      ext_ctrl[4].value = PvrSetup.VideoBitrate * 1000;
 
+
 
+      ext_ctrl[5].id    = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK;
 
+      ext_ctrl[5].value = 15000000;
 
+
 
+      ext_ctrl[6].id    = V4L2_CID_MPEG_STREAM_TYPE;
 
+      ext_ctrl[6].value = V4L2_MPEG_STREAM_TYPE_MPEG2_PS;
 
+
 
+      for (uint i = 0; i < numCtrls; i++)
 
+      {
 
+              int value = ext_ctrl[i].value;
 
+
 
+              ctrls.ctrl_class  = V4L2_CTRL_CLASS_MPEG;
 
+              ctrls.count      = 1;
 
+              ctrls.controls    = ext_ctrl + i;
 
+
 
+              if (IOCTL(video_fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
 
+              {
 
+                      log(0, "VIDIOC_S_EXT_CTRLS set to %d failed  %d:%s", value, errno, strerror(errno));
 
+              }
 
+      }
 
+
 
+      /* Get controls */
 
+      ext_ctrl[0].id    = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
 
+      ext_ctrl[0].value = 0;
 
+
 
+      ctrls.ctrl_class  = V4L2_CTRL_CLASS_MPEG;
 
+      ctrls.count      = 1;
 
+      ctrls.controls    = ext_ctrl;
 
+
 
+      if (IOCTL(video_fd, VIDIOC_G_EXT_CTRLS, &ctrls) < 0)
 
+      {
 
+              log(0, "Get V4L2_CID_MPEG_VIDEO_GOP_SIZE failed, defaulting to 12  %d:%s", errno, strerror(errno));
 
+              ext_ctrl[0].value = 12;
 
+      }
 
+      return true;
 
  }
 
 
  bool cPvrDevice::SetPicture(int brightness, int contrast, int saturation, int hue)
 
 
 
<!-- ===Tipps=== -->
 
<!-- ===Wunschliste=== -->
 
<!-- ===Snapshot=== -->
 
  
 
==Links==
 
==Links==
# [http://www.ivtvdriver.org Ivtv Treiber]
+
# [http://projects.vdr-developer.org/projects/plg-pvrinput Homepage des Plugins]
# [http://home.arcor.de/andreas.regel/files/pvrinput Homepage des Plugins]
+
  
 
[[Kategorie:Plugins]]
 
[[Kategorie:Plugins]]
 +
[[Kategorie:Empfänger-Plugins]]
 
[[Kategorie:AnalogTV]]
 
[[Kategorie:AnalogTV]]
 
{{i18n|pvrinput-plugin}}
 
{{i18n|pvrinput-plugin}}

Aktuelle Version vom 22. Februar 2020, 15:22 Uhr

Inhaltsverzeichnis

[Bearbeiten] Beschreibung

Autor: Andreas Regel (bis 2006). Weiterentwicklung seitdem durch Winfried Koehler, Martin Dauskardt und Lars Hanisch

Dieses Plugin ermöglicht es, analoges TV und UKW-Radio mit dem VDR in Verbindung mit einer vom Plugin unterstützen PVR-Karte zu benutzen.

[Bearbeiten] Status

Letztes Update 04/2012

[Bearbeiten] Hardwareanforderungen

  • Unterstützt werden derzeit die folgenden analogen TV-Karten mit MPEG-Encoder:
    • PVR-150
    • PVR-250
    • PVR-350
    • PVR-500
    • PVR-USB2
    • HVR-1900
    • HVR-1950
    • HVR-1955 und HVR-1975 müssten ebenfalls funktionieren (Unterstützung für den pvrusb2-Treiber kam im Juni 2019 in den media_tree.git von linuxtv)
    • HD PVR


[Bearbeiten] Softwareanforderungen

Einer der folgenden Treiber, je nach TV Karte:

  • ivtv Treiber für PVR150/250/350/500, im Kernel enthalten
  • pvrusb2 Treiber für PVR USB2.0, HVR-1900, HVR-1950
  • hdpvr Treiber für HD PVR

[Bearbeiten] Konfiguration

Für die Erstellung der channels.conf siehe die Datei README zum Plugin. Alternativ kann die channels.conf auch mit w pvrscan oder dem Wirbelscan-plugin erstellt werden, die einen automatischen Kanalsuchlauf durchführen.

Die README des plugins enthält eine genaue Beschreibung des Aufbaus der channels.conf. In den Plugin-Sourcen sind zudem [http://projects.vdr-developer.org/repositories/browse/plg-pvrinput/example Beispiele für die channels.conf-Einträge enthalten.

[Bearbeiten] Sonstiges

[Bearbeiten] TV-Karten mit BlackBird Design

TV-Karten nach dem blackbird Design, wie z.B. die HVR-1300, waren trotz Anstrengungen nicht sinnvoll in das pvrinput Plugin zu integrieren. Vom Betrieb solcher TV-Karten mit dem pvrinput Plugin ist abzuraten.

[Bearbeiten] Hybride von Digital TV und Analogem TV

Einige TV-Karten, wie z.B. die Hauppauge HVR 1900 sind Hybridgeräte, die ihre Hardware zwischen analogem und digitalem TV teilen. Analoges TV und DVB können deswegen nicht gleichzeitig benutzt werden. Sobald VDR den digitalen DVB Teil gefunden hat und benutzt, steht der analoge Teil für pvrinput nicht mehr zur Verfügung.

  • Lösung: Zunächst muss beim Laden des pvrusb2-Treibers mit der Moduloption adapter_nr eine bestimmte device Nummer vorgegeben werden.
    • Beispiel: vdr soll nur die DVB-Karten /dev/dvb/adapter0 und /dev/dvb/adapter1 verwenden. Man lädt pvrusb2 nun wie folgt: "modprobe pvrusb2 adapter_nr=2". Zusätzlich muss vdr mit den Optionen "--device=0 --device=1" vorgegeben werden, dass nur adapter 0 und 1, nicht aber der adapter2 (DVB-device der HVR1900) verwendet werden soll. Somit wird letzteres von vdr nicht geöffnet, und pvrinput kann das analoge device der HVR1900 öffnen.

[Bearbeiten] Entwicklerversion und aktuelle Version

git clone git://projects.vdr-developer.org/vdr-plugin-pvrinput.git pvrinput


[Bearbeiten] Links

  1. Homepage des Plugins
In anderen Sprachen