[MPlayer-dev-eng] [PATCH] vstream client support

Joey Parrish joey at nicewarrior.org
Wed Feb 23 00:34:23 CET 2005


Hello,

Attached is a patch to add vstream client support to MPlayer.
It creates a new stream module that is only compiled in if the vstream
client library is available.

This patch will allow MPlayer to stream video directly from a TiVo
running the vstream server.  (Many hacked TiVos are.)  Documentation of
the new URL format is included in a few languages.  I don't speak all of
those languages, but it's easy to copy and paste from similar blocks
elsewhere in the docs.

The vstream client library is maintained at
http://armory.nicewarrior.org/projects/vstream-client/ and is based on
the work of the TiVo-MPlayer project.  My contribution was to clean up
the code and move it into a small library.

I'd appreciate your comments.  And if there are no objections, I'll
commit this very soon.

--Joey

-- 
"I can read it better than you can read it with your eyes closed." --Gu
-------------- next part --------------
Index: configure
===================================================================
RCS file: /cvsroot/mplayer/main/configure,v
retrieving revision 1.968
diff -u -r1.968 configure
--- configure	22 Feb 2005 14:40:43 -0000	1.968
+++ configure	22 Feb 2005 22:25:08 -0000
@@ -189,6 +189,7 @@
   --disable-gethostbyname2  gethostbyname() function is not provided by the C
                             library [autodetect]
   --disable-ftp          Disable ftp support [enabled]
+  --disable-vstream      Disable tivo vstream client support [autodetect]
 
 Codecs:
   --enable-gif		 enable gif support [autodetect]
@@ -1405,6 +1406,7 @@
 _inet6=auto
 _gethostbyname2=auto
 _ftp=yes
+_vstream=auto
 for ac_option do
   case "$ac_option" in
   # Skip 1st pass
@@ -1648,6 +1650,8 @@
   --disable-unrarlib)	_unrarlib=no	;;
   --enable-ftp)         _ftp=yes        ;;
   --disable-ftp)        _ftp=no         ;;
+  --enable-vstream)     _vstream=yes    ;;
+  --disable-vstream)    _vstream=no     ;;
 
   --enable-fribidi)     _fribidi=yes    ;;
   --disable-fribidi)    _fribidi=no     ;;
@@ -6186,6 +6190,26 @@
 fi
 echores "$_ftp"
 
+echocheck "vstream client"
+if test "$_vstream" = auto ; then
+  _vstream=no
+  cat > $TMPC <<EOF
+#include <vstream-client.h>
+void vstream_error(const char *format, ... ) {}
+int main(void) { vstream_start(); return 0; }
+EOF
+  cc_check -lvstream-client && _vstream=yes
+fi
+if test "$_vstream" = yes ; then
+  _def_vstream='#define HAVE_VSTREAM 1'
+  _inputmodules="vstream $_inputmodules"
+  _ld_vstream='-lvstream-client'
+else
+  _noinputmodules="vstream $_noinputmodules"
+  _def_vstream='#undef HAVE_VSTREAM'
+fi
+echores "$_vstream"
+
 # endian testing
 echocheck "byte order"
 if test "$_big_endian" = auto ; then
@@ -6658,7 +6682,7 @@
 
 MPLAYER_NETWORK = $_network
 STREAMING_LIVE_DOT_COM = $_live
-MPLAYER_NETWORK_LIB = $_ld_live $_ld_network
+MPLAYER_NETWORK_LIB = $_ld_live $_ld_vstream $_ld_network
 DVBIN = $_dvbin
 VIDIX = $_vidix
 SHARED_PP = $_shared_pp
@@ -7336,6 +7360,9 @@
 /* enable ftp support */
 $_def_ftp
 
+/* enable vstream support */
+$_def_vstream
+
 /* enable winsock2 instead of Unix functions*/
 $_def_winsock2
 
Index: DOCS/man/de/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/de/mplayer.1,v
retrieving revision 1.123
diff -u -r1.123 mplayer.1
--- DOCS/man/de/mplayer.1	4 Feb 2005 20:47:44 -0000	1.123
+++ DOCS/man/de/mplayer.1	22 Feb 2005 22:25:12 -0000
@@ -142,6 +142,24 @@
 .
 .br
 .in
+.B mplayer
+'in +\n[.k]u
+.I tivo://Rechnername/list
+[Optionen]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://Rechnername/llist
+[Optionen]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://Rechnername/fsid
+[Optionen]
+.br
+.in
 .B gmplayer
 [Optionen]
 [\-skin\ skin]
Index: DOCS/man/en/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/en/mplayer.1,v
retrieving revision 1.883
diff -u -r1.883 mplayer.1
--- DOCS/man/en/mplayer.1	22 Feb 2005 12:53:31 -0000	1.883
+++ DOCS/man/en/mplayer.1	22 Feb 2005 22:25:15 -0000
@@ -137,6 +137,24 @@
 .
 .br
 .in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/list
+[options]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/llist
+[options]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/fsid
+[options]
+.br
+.in
 .B gmplayer
 [options]
 [\-skin\ skin]
Index: DOCS/man/es/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/es/mplayer.1,v
retrieving revision 1.54
diff -u -r1.54 mplayer.1
--- DOCS/man/es/mplayer.1	16 Dec 2004 23:54:56 -0000	1.54
+++ DOCS/man/es/mplayer.1	22 Feb 2005 22:25:18 -0000
@@ -153,6 +153,24 @@
 .
 .br
 .in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/list
+[opciones]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/llist
+[opciones]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/fsid
+[opciones]
+.br
+.in
 .B gmplayer
 [opciones]
 [\-skin\ skin]
Index: DOCS/man/fr/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/fr/mplayer.1,v
retrieving revision 1.209
diff -u -r1.209 mplayer.1
--- DOCS/man/fr/mplayer.1	15 Feb 2005 20:51:28 -0000	1.209
+++ DOCS/man/fr/mplayer.1	22 Feb 2005 22:25:21 -0000
@@ -139,6 +139,24 @@
 [options]
 .
 .br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://h?te/list
+[options]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://h?te/llist
+[options]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://h?te/fsid
+[options]
+.br
 .B gmplayer
 [options]
 [\-skin\ skin]
Index: DOCS/man/hu/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/hu/mplayer.1,v
retrieving revision 1.98
diff -u -r1.98 mplayer.1
--- DOCS/man/hu/mplayer.1	16 Dec 2004 23:54:57 -0000	1.98
+++ DOCS/man/hu/mplayer.1	22 Feb 2005 22:25:23 -0000
@@ -136,6 +136,24 @@
 .RI [ \ file\  | \ URL\  | \ -\  ]
 [\-o\ file]
 .br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://g?pn?v/list
+[opci?k]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://g?pn?v/llist
+[opci?k]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://g?pn?v/fsid
+[opci?k]
+.br
 .B gmplayer
 [opci?k]
 [\-skin\ skin]
Index: DOCS/man/it/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/it/mplayer.1,v
retrieving revision 1.32
diff -u -r1.32 mplayer.1
--- DOCS/man/it/mplayer.1	11 Jan 2005 11:54:04 -0000	1.32
+++ DOCS/man/it/mplayer.1	22 Feb 2005 22:25:27 -0000
@@ -141,6 +141,24 @@
 .
 .br
 .in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/list
+[opzioni]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/llist
+[opzioni]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/fsid
+[opzioni]
+.br
+.in
 .B gmplayer
 [opzioni]
 [\-skin\ skin]
Index: DOCS/man/pl/mplayer.1
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/man/pl/mplayer.1,v
retrieving revision 1.110
diff -u -r1.110 mplayer.1
--- DOCS/man/pl/mplayer.1	19 Feb 2005 23:15:34 -0000	1.110
+++ DOCS/man/pl/mplayer.1	22 Feb 2005 22:25:30 -0000
@@ -141,6 +141,24 @@
 .
 .br
 .in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/list
+[opcje]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/llist
+[opcje]
+.br
+.in
+.B mplayer
+'in +\n[.k]u
+.I tivo://host/fsid
+[opcje]
+.br
+.in
 .B gmplayer
 [opcje]
 [\-skin\ sk?rka]
Index: DOCS/xml/en/formats.xml
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/xml/en/formats.xml,v
retrieving revision 1.20
diff -u -r1.20 formats.xml
--- DOCS/xml/en/formats.xml	7 Dec 2004 02:54:38 -0000	1.20
+++ DOCS/xml/en/formats.xml	22 Feb 2005 22:25:31 -0000
@@ -60,6 +60,14 @@
   MP2 and uncompressed LPCM are allowed, too. <emphasis role="bold">Read the
   <link linkend="dvd">DVD</link> section</emphasis>!
   </simpara></listitem>
+<listitem><simpara>
+  TY: This is a TiVo MPEG stream.  It contains MPEG PES data for audio and
+  video streams, as well as extra information like closed captions.  The
+  container is not an MPEG program stream, but a closed format created by
+  TiVo.  For more information on TiVo stream format, please refer to
+  <ulink url="http://dvd-create.sourceforge.net/tystudio/tystream.shtml">
+  the TyStudio page</ulink>.
+  </simpara></listitem>
 </itemizedlist>
 
 <para>
Index: libmpdemux/Makefile
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/Makefile,v
retrieving revision 1.87
diff -u -r1.87 Makefile
--- libmpdemux/Makefile	21 Feb 2005 23:18:31 -0000	1.87
+++ libmpdemux/Makefile	22 Feb 2005 22:25:31 -0000
@@ -3,7 +3,7 @@
 
 include ../config.mak
 
-SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c demux_vqf.c
+SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c stream_vstream.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c demux_vqf.c
 ifeq ($(XMMS_PLUGINS),yes)
 SRCS += demux_xmms.c
 endif 
Index: libmpdemux/open.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/open.c,v
retrieving revision 1.101
diff -u -r1.101 open.c
--- libmpdemux/open.c	3 Dec 2004 14:14:29 -0000	1.101
+++ libmpdemux/open.c	22 Feb 2005 22:25:33 -0000
@@ -496,7 +496,7 @@
   if (strncmp("tv://", filename, 5) && strncmp("mf://", filename, 5) &&
     strncmp("vcd://", filename, 6) && strncmp("dvb://", filename, 6) &&
     strncmp("cdda://", filename, 7) && strncmp("cddb://", filename, 7) &&
-    strncmp("mpst://", filename, 7) &&
+    strncmp("mpst://", filename, 7) && strncmp("tivo://", filename, 7) &&
     strstr(filename, "://")) {
      url = url_new(filename);
     }
Index: libmpdemux/stream.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/stream.c,v
retrieving revision 1.72
diff -u -r1.72 stream.c
--- libmpdemux/stream.c	13 Mar 2004 16:10:02 -0000	1.72
+++ libmpdemux/stream.c	22 Feb 2005 22:25:33 -0000
@@ -64,6 +64,9 @@
 #ifdef HAVE_FTP
 extern stream_info_t stream_info_ftp;
 #endif
+#ifdef HAVE_VSTREAM
+extern stream_info_t stream_info_vstream;
+#endif
 
 extern stream_info_t stream_info_null;
 extern stream_info_t stream_info_file;
@@ -84,6 +87,9 @@
 #ifdef HAVE_FTP
   &stream_info_ftp,
 #endif
+#ifdef HAVE_VSTREAM
+  &stream_info_vstream,
+#endif
   &stream_info_null,
   &stream_info_file,
   NULL
Index: libmpdemux/stream.h
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/stream.h,v
retrieving revision 1.69
diff -u -r1.69 stream.h
--- libmpdemux/stream.h	22 Aug 2004 18:47:48 -0000	1.69
+++ libmpdemux/stream.h	22 Feb 2005 22:25:33 -0000
@@ -19,6 +19,7 @@
 #define STREAMTYPE_SMB 11      // smb:// url, using libsmbclient (samba)
 #define STREAMTYPE_VCDBINCUE 12      // vcd directly from bin/cue files
 #define STREAMTYPE_DVB 13
+#define STREAMTYPE_VSTREAM 14
 
 #define STREAM_BUFFER_SIZE 2048
 
--- /dev/null	Mon Jul  5 11:22:17 2004
+++ libmpdemux/stream_vstream.c	Tue Feb 22 16:23:17 2005
@@ -0,0 +1,184 @@
+/*
+ *  stream_vstream.c
+ *
+ *	Copyright (C) Joey Parrish
+ *
+ *  This file is part of MPlayer, a free movie player.
+ *	
+ *  MPlayer is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *   
+ *  MPlayer is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *   
+ *  You should have received a copy of the GNU General Public License
+ *  along with GNU Make; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
+ *
+ *
+ */
+
+/*
+ *   If you have a tivo with the vstream server installed, (and most tivo
+ *   hackers do,) then you can connect to it and stream ty files using
+ *   this module.  The url syntax is tivo://host/fsid or tivo://host/list
+ *   to list the available recordings and their fsid's.
+ *   This module depends on libvstream-client, which is available from
+ *   http://armory.nicewarrior.org/projects/vstream-client .
+ *
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_VSTREAM
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <errno.h>
+
+#include "mp_msg.h"
+#include "stream.h"
+#include "help_mp.h"
+#include "../m_option.h"
+#include "../m_struct.h"
+
+#include <vstream-client.h>
+
+void vstream_error(const char *format, ...) {
+    char buf[1024];
+    va_list va;
+    va_start(va, format);
+    vsnprintf(buf, 1024, format, va);
+    va_end(va);
+    mp_msg(MSGT_STREAM, MSGL_ERR, buf);
+}
+
+static struct stream_priv_s {
+  char* host;
+  char* fsid;
+} stream_priv_dflts = {
+  NULL,
+  NULL
+};
+
+#define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
+/// URL definition
+static m_option_t stream_opts_fields[] = {
+  {"hostname", ST_OFF(host), CONF_TYPE_STRING, 0, 0 ,0, NULL},
+  {"filename", ST_OFF(fsid), CONF_TYPE_STRING, 0, 0 ,0, NULL},
+  { NULL, NULL, 0, 0, 0, 0,  NULL }
+};
+
+static struct m_struct_st stream_opts = {
+  "vstream",
+  sizeof(struct stream_priv_s),
+  &stream_priv_dflts,
+  stream_opts_fields
+};
+
+static int fill_buffer(stream_t *s, char* buffer, int max_len){
+  struct stream_priv_s* p = (struct stream_priv_s*)s->priv;
+  int len = vstream_load_chunk(p->fsid, buffer, max_len, s->pos);
+  if (len <= 0) return 0;
+  return len;
+}
+
+static int seek(stream_t *s,off_t newpos) {
+  s->pos = newpos;
+  return 1;
+}
+
+static int control(struct stream_st *s,int cmd,void* arg) {
+  return STREAM_UNSUPORTED;
+}
+
+static void close_s(struct stream_st *s) {
+}
+
+static int open_s(stream_t *stream, int mode, void* opts, int* file_format) {
+  int f;
+  struct stream_priv_s* p = (struct stream_priv_s*)opts;
+
+  if(mode != STREAM_READ)
+    return STREAM_UNSUPORTED;
+
+  if(!p->host) {
+    mp_msg(MSGT_OPEN, MSGL_ERR, "We need a host name (ex: tivo://hostname/fsid)\n");
+    m_struct_free(&stream_opts, opts);
+    return STREAM_ERROR;
+  }
+
+  if(!p->fsid || strlen(p->fsid) == 0) {
+    mp_msg(MSGT_OPEN, MSGL_ERR, "We need an fsid (ex: tivo://hostname/fsid)\n");
+    m_struct_free(&stream_opts, opts);
+    return STREAM_ERROR;
+  }
+
+  f = connect2Server(p->host, VSERVER_PORT, 1);
+
+  if(f < 0) {
+    mp_msg(MSGT_OPEN, MSGL_ERR, "Connection to %s failed\n", p->host);
+    m_struct_free(&stream_opts, opts);
+    return STREAM_ERROR;
+  }
+  stream->fd = f;
+
+  vstream_set_socket_fd(f);
+
+  if (!strcmp(p->fsid, "list")) {
+    vstream_list_streams(0);
+    return STREAM_ERROR;
+  } else if (!strcmp(p->fsid, "llist")) {
+    vstream_list_streams(1);
+    return STREAM_ERROR;
+  }
+
+  if (vstream_start()) {
+    mp_msg(MSGT_OPEN, MSGL_ERR, "Cryptic internal error #1\n");
+    m_struct_free(&stream_opts, opts);
+    return STREAM_ERROR;
+  }
+  if (vstream_startstream(p->fsid)) {
+    mp_msg(MSGT_OPEN, MSGL_ERR, "Cryptic internal error #2\n");
+    m_struct_free(&stream_opts, opts);
+    return STREAM_ERROR;
+  }
+  
+  stream->start_pos = 0;
+  stream->end_pos = vstream_streamsize();
+  mp_msg(MSGT_OPEN, MSGL_DBG2, "Tivo stream size is %d\n", stream->end_pos);
+
+  stream->priv = p;
+  stream->fill_buffer = fill_buffer;
+  stream->control = control;
+  stream->seek = seek;
+  stream->close = close_s;
+  stream->type = STREAMTYPE_VSTREAM;
+
+  return STREAM_OK;
+}
+
+stream_info_t stream_info_vstream = {
+  "vstream client",
+  "vstream",
+  "Joey",
+  "",
+  open_s,
+  { "tivo", NULL },
+  &stream_opts,
+  1 // Url is an option string
+};
+
+#endif


More information about the MPlayer-dev-eng mailing list