summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Caujolle-Bert <f1rmb@users.sourceforge.net>2001-05-05 23:44:33 +0000
committerDaniel Caujolle-Bert <f1rmb@users.sourceforge.net>2001-05-05 23:44:33 +0000
commitf2181d0641c5ebd684f8e9113d14bb49bb390eef (patch)
treea31427a862247de0e63bba5e747495440ae369be /src
parent12c24dc5e31a15655248ba6df01b27cdd2b182d1 (diff)
downloadxine-lib-f2181d0641c5ebd684f8e9113d14bb49bb390eef.tar.gz
xine-lib-f2181d0641c5ebd684f8e9113d14bb49bb390eef.tar.bz2
re-enable and sync to new API dvd input plugin.
CVS patchset: 62 CVS date: 2001/05/05 23:44:33
Diffstat (limited to 'src')
-rw-r--r--src/input/Makefile.am6
-rw-r--r--src/input/input_dvd.c421
-rw-r--r--src/input/input_file.c3
3 files changed, 272 insertions, 158 deletions
diff --git a/src/input/Makefile.am b/src/input/Makefile.am
index db9224a44..272eda927 100644
--- a/src/input/Makefile.am
+++ b/src/input/Makefile.am
@@ -18,13 +18,13 @@ libdir = $(XINE_PLUGINDIR)
#lib_LTLIBRARIES = xineplug_inp_net.la xineplug_inp_dvd.la \
# xineplug_inp_vcd.la xineplug_inp_stdin_fifo.la \
# xineplug_inp_rtp.la
-lib_LTLIBRARIES = xineplug_inp_file.la
+lib_LTLIBRARIES = xineplug_inp_file.la xineplug_inp_dvd.la
xineplug_inp_file_la_SOURCES = input_file.c
xineplug_inp_file_la_LDFLAGS = -avoid-version -module
-#xineplug_inp_dvd_la_SOURCES = input_dvd.c dvd_udf.c
-#xineplug_inp_dvd_la_LDFLAGS = -avoid-version -module
+xineplug_inp_dvd_la_SOURCES = input_dvd.c dvd_udf.c
+xineplug_inp_dvd_la_LDFLAGS = -avoid-version -module
#xineplug_inp_net_la_SOURCES = input_net.c
#xineplug_inp_net_la_LDFLAGS = -avoid-version -module
diff --git a/src/input/input_dvd.c b/src/input/input_dvd.c
index cf1ac339e..e821ca728 100644
--- a/src/input/input_dvd.c
+++ b/src/input/input_dvd.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_dvd.c,v 1.2 2001/04/19 09:46:57 f1rmb Exp $
+ * $Id: input_dvd.c,v 1.3 2001/05/05 23:44:33 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -51,51 +51,64 @@ static uint32_t xine_debug;
#define DVD "/dev/dvd"
#define RDVD "/dev/rdvd"
-/*
- * global Variables:
- */
+typedef struct {
-static int dvd_fd, raw_fd;
-static off_t file_size, file_size_left;
-static int file_lbstart, file_lbcur;
-static int gVTSMinor, gVTSMajor;
+ input_plugin_t input_plugin;
+
+ char *mrl;
+ config_values_t *config;
+
+ int dvd_fd;
+ int raw_fd;
+ off_t file_size;
+ off_t file_size_left;
+ int file_lbstart;
+ int file_lbcur;
+ int gVTSMinor;
+ int gVTSMajor;
+
+ /*
+ * udf dir function
+ */
+#define MAX_DIR_ENTRIES 250
+
+ char *filelist[MAX_DIR_ENTRIES];
+ char *filelist2[MAX_DIR_ENTRIES];
-/*
- * udf dir function
- */
+} dvd_input_plugin_t;
-#define MAX_DIR_ENTRIES 250
-static char *filelist[MAX_DIR_ENTRIES];
-static char *filelist2[MAX_DIR_ENTRIES];
-static int openDrive () {
+/* ***************************************************************** */
+/* Private functions */
+/* ***************************************************************** */
+static int openDrive (dvd_input_plugin_t *this) {
- dvd_fd = open(DVD, O_RDONLY | O_NONBLOCK);
+ this->dvd_fd = open(DVD, O_RDONLY | O_NONBLOCK);
- if (dvd_fd < 0) {
+ if (this->dvd_fd < 0) {
printf ("input_dvd: unable to open dvd drive (%s): %s\n", DVD,
strerror(errno));
return -1;
}
- raw_fd = open(RDVD, O_RDONLY | O_NONBLOCK);
- if (raw_fd < 0) {
- raw_fd = dvd_fd;
+ this->raw_fd = open(RDVD, O_RDONLY | O_NONBLOCK);
+ if (this->raw_fd < 0) {
+ this->raw_fd = this->dvd_fd;
}
- return raw_fd;
+ return this->raw_fd;
}
-static void closeDrive () {
+static void closeDrive (dvd_input_plugin_t *this) {
- if (dvd_fd<0)
+ if (this->dvd_fd < 0)
return;
- close (dvd_fd);
- if (raw_fd!=dvd_fd)
- close (raw_fd);
+ close (this->dvd_fd);
+ if (this->raw_fd != this->dvd_fd)
+ close (this->raw_fd);
- dvd_fd = -1;
+ this->dvd_fd = -1;
}
/*
@@ -103,102 +116,106 @@ static void closeDrive () {
*
* returns lbnum on success, 0 otherwise
*/
+static int openDVDFile (dvd_input_plugin_t *this,
+ char *filename, off_t *size) {
+ char str[256];
+ int lbnum;
-static int openDVDFile (char *filename, off_t *size) {
-
- char str[256];
- int lbnum;
+ xprintf (VERBOSE|INPUT, "input_dvd : openDVDFile >%s<\n", filename);
- xprintf (VERBOSE|INPUT, "input_dvd : openDVDFile >%s<\n",filename);
-
- if (openDrive() < 0) {
+ if (openDrive(this) < 0) {
printf ("input_dvd: cannot open dvd drive >%s<\n", DVD);
return 0;
}
snprintf (str, sizeof(str), "/VIDEO_TS/%s", filename);
- xprintf (VERBOSE|INPUT, "UDFFindFile %s\n",str);
+ xprintf (VERBOSE|INPUT, "UDFFindFile %s\n", str);
- if (!(lbnum=UDFFindFile(dvd_fd, str, size))) {
+ if (!(lbnum = UDFFindFile(this->dvd_fd, str, size))) {
printf ("input_dvd: cannot open file >%s<\n", filename);
- closeDrive ();
+ closeDrive (this);
return 0;
}
- lseek (raw_fd, lbnum * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET) ;
+ lseek (this->raw_fd, lbnum * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET) ;
return lbnum;
}
+/* ***************************************************************** */
+/* END OF PRIVATES */
+/* ***************************************************************** */
-
-static void input_plugin_init (void) {
- int i;
-
- /*
- * allocate space for directory listing
- */
-
- for (i=0; i<MAX_DIR_ENTRIES; i++) {
- filelist[i] = (char *) malloc (256);
- filelist2[i] = (char *) malloc (256);
- }
+/*
+ *
+ */
+static uint32_t dvd_plugin_get_capabilities (input_plugin_t *this) {
+ return INPUT_CAP_SEEKABLE | INPUT_CAP_BLOCK | INPUT_CAP_AUTOPLAY;
}
-static int input_plugin_open (const char *mrl) {
+/*
+ *
+ */
+static int dvd_plugin_open (input_plugin_t *this_gen, char *mrl) {
+ char *filename;
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
- char *filename;
+ this->mrl = mrl;
xprintf (VERBOSE|INPUT, "input dvd : input_plugin_open >%s<\n", mrl);
/*
* do we handle this kind of MRL ?
*/
-
- if (strncasecmp (mrl, "dvd://",6))
+ if (strncasecmp (mrl, "dvd://", 6))
return 0;
filename = (char *) &mrl[6];
- xprintf (VERBOSE|INPUT, "input dvd : input_plugin_open media type correct. file name is %s\n",
- filename);
+ xprintf (VERBOSE|INPUT, "input dvd : dvd_plugin_open media type correct."
+ " file name is %s\n", filename);
- sscanf (filename, "VTS_%d_%d.VOB", &gVTSMajor, &gVTSMinor);
+ sscanf (filename, "VTS_%d_%d.VOB", &this->gVTSMajor, &this->gVTSMinor);
- file_lbstart = openDVDFile (filename, &file_size) ;
- file_lbcur = file_lbstart;
+ this->file_lbstart = openDVDFile (this, filename, &this->file_size) ;
+ this->file_lbcur = this->file_lbstart;
- if (!file_lbstart) {
- fprintf (stderr, "unable to find >%s< on dvd.\n",filename);
+ if (!this->file_lbstart) {
+ fprintf (stderr, "Unable to find >%s< on dvd.\n", filename);
return 0;
}
- file_size_left = file_size;
+ this->file_size_left = this->file_size;
return 1 ;
}
-static uint32_t input_plugin_read (char *buf, uint32_t nlen) {
+/*
+ *
+ */
+static off_t dvd_plugin_read (input_plugin_t *this_gen,
+ char *buf, off_t nlen) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
if (nlen != DVD_VIDEO_LB_LEN) {
/*
* Hide the error reporting now, demuxer try to read 6 bytes
* at STAGE_BY_CONTENT probe stage
*/
- fprintf (stderr, "ERROR in input_dvd plugin read: %d bytes "
- "is not a sector!\n", nlen);
+ fprintf (stderr, "ERROR in input_dvd plugin read: %Ld bytes "
+ "is not a sector!\n", nlen);
return 0;
}
-
- if (file_size_left < nlen)
+
+ if (this->file_size_left < nlen)
return 0;
- if (read (raw_fd, buf, DVD_VIDEO_LB_LEN)) {
+ if (read (this->raw_fd, buf, DVD_VIDEO_LB_LEN)) {
- file_lbcur++;
- file_size_left -= DVD_VIDEO_LB_LEN;
+ this->file_lbcur++;
+ this->file_size_left -= DVD_VIDEO_LB_LEN;
return DVD_VIDEO_LB_LEN;
} else
@@ -207,50 +224,108 @@ static uint32_t input_plugin_read (char *buf, uint32_t nlen) {
return 0;
}
-static off_t input_plugin_seek (off_t offset, int origin) {
+/*
+ *
+ */
+static buf_element_t *dvd_plugin_read_block (input_plugin_t *this_gen,
+ fifo_buffer_t *fifo, off_t nlen) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
+ buf_element_t *buf = fifo->buffer_pool_alloc (fifo);
+
+ if (nlen != DVD_VIDEO_LB_LEN) {
+ /*
+ * Hide the error reporting now, demuxer try to read 6 bytes
+ * at STAGE_BY_CONTENT probe stage
+ */
+ fprintf (stderr, "ERROR in input_dvd plugin read: %Ld bytes "
+ "is not a sector!\n", nlen);
+ return NULL;
+ }
+
+ if (this->file_size_left < nlen)
+ return NULL;
+
+ if (read (this->raw_fd, buf, DVD_VIDEO_LB_LEN)) {
+
+ this->file_lbcur++;
+ this->file_size_left -= DVD_VIDEO_LB_LEN;
+
+ return buf;
+ } else
+ fprintf (stderr, "read error in input_dvd plugin\n");
+
+ return NULL;
+}
+
+/*
+ *
+ */
+static off_t dvd_plugin_seek (input_plugin_t *this_gen, off_t offset, int origin) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
offset /= DVD_VIDEO_LB_LEN;
switch (origin) {
case SEEK_END:
- offset = (file_size / DVD_VIDEO_LB_LEN) - offset;
+ offset = (this->file_size / DVD_VIDEO_LB_LEN) - offset;
case SEEK_SET:
- file_lbcur = file_lbstart + offset;
- file_size_left = file_size - (offset * DVD_VIDEO_LB_LEN);
+ this->file_lbcur = this->file_lbstart + offset;
+ this->file_size_left = this->file_size - (offset * DVD_VIDEO_LB_LEN);
break;
case SEEK_CUR:
if (offset) {
- file_lbcur += offset;
- file_size_left = file_size - ((file_lbcur - file_lbstart) * DVD_VIDEO_LB_LEN);
+ this->file_lbcur += offset;
+ this->file_size_left = this->file_size -
+ ((this->file_lbcur - this->file_lbstart) * DVD_VIDEO_LB_LEN);
} else {
- return (file_lbcur - file_lbstart) * (off_t) DVD_VIDEO_LB_LEN;
+ return (this->file_lbcur - this->file_lbstart) *
+ (off_t) DVD_VIDEO_LB_LEN;
}
break;
default:
- fprintf (stderr, "error in input dvd plugin seek:%d is an unknown origin\n"
- ,origin);
+ fprintf (stderr, "error in input dvd plugin seek: %d is an unknown "
+ "origin\n", origin);
}
- return lseek (raw_fd, file_lbcur * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET) - file_lbstart * (off_t) DVD_VIDEO_LB_LEN;
+ return lseek (this->raw_fd,
+ this->file_lbcur * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET)
+ - this->file_lbstart * (off_t) DVD_VIDEO_LB_LEN;
}
-static off_t input_plugin_get_length (void) {
- return file_size;
+/*
+ *
+ */
+static off_t dvd_plugin_get_current_pos (input_plugin_t *this_gen){
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
+
+ return (this->file_lbcur * DVD_VIDEO_LB_LEN);
}
-static uint32_t input_plugin_get_capabilities (void) {
- return INPUT_CAP_SEEKABLE | INPUT_CAP_BLOCK | INPUT_CAP_AUTOPLAY;
+/*
+ *
+ */
+static off_t dvd_plugin_get_length (input_plugin_t *this_gen) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
+
+ return this->file_size;
}
-static uint32_t input_plugin_get_blocksize (void) {
+/*
+ *
+ */
+static uint32_t dvd_plugin_get_blocksize (input_plugin_t *this_gen) {
+
return DVD_VIDEO_LB_LEN;
}
-static int input_plugin_eject (void) {
- int ret, status;
- int fd;
+/*
+ *
+ */
+static int dvd_plugin_eject_media (input_plugin_t *this_gen) {
+ int ret, status;
+ int fd;
if((fd = open(DVD, O_RDONLY|O_NONBLOCK)) > -1) {
@@ -259,7 +334,8 @@ static int input_plugin_eject (void) {
switch(status) {
case CDS_TRAY_OPEN:
if((ret = ioctl(fd, CDROMCLOSETRAY)) != 0) {
- xprintf(VERBOSE|INPUT, "CDROMCLOSETRAY failed: %s\n", strerror(errno));
+ xprintf(VERBOSE|INPUT, "CDROMCLOSETRAY failed: %s\n",
+ strerror(errno));
}
break;
case CDS_DISC_OK:
@@ -293,16 +369,37 @@ static int input_plugin_eject (void) {
return 1;
}
-static void input_plugin_close (void) {
- closeDrive ();
+/*
+ *
+ */
+static void dvd_plugin_close (input_plugin_t *this_gen) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
+
+ closeDrive (this);
}
-static char *input_plugin_get_identifier (void) {
- return "DVD";
+/*
+ *
+ */
+static char *dvd_plugin_get_description (input_plugin_t *this_gen) {
+
+ return "dvd device input plugin as shipped with xine";
}
-static char** input_plugin_get_dir (char *filename, int *nEntries) {
+/*
+ *
+ */
+static char *dvd_plugin_get_identifier (input_plugin_t *this_gen) {
+ return "DVD";
+}
+
+/*
+ *
+ */
+static char **dvd_plugin_get_dir (input_plugin_t *this_gen,
+ char *filename, int *nEntries) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
int i, fd;
if (filename) {
@@ -314,20 +411,20 @@ static char** input_plugin_get_dir (char *filename, int *nEntries) {
int nFiles, nFiles2;
- UDFListDir (fd, "/VIDEO_TS", MAX_DIR_ENTRIES, filelist, &nFiles);
+ UDFListDir (fd, "/VIDEO_TS", MAX_DIR_ENTRIES, this->filelist, &nFiles);
nFiles2 = 0;
for (i=0; i<nFiles; i++) {
int nLen;
- nLen = strlen (filelist[i]);
+ nLen = strlen (this->filelist[i]);
if (nLen<4)
continue;
- if (!strcasecmp (&filelist[i][nLen-4], ".VOB")) {
+ if (!strcasecmp (&this->filelist[i][nLen-4], ".VOB")) {
- sprintf (filelist2[nFiles2], "dvd://%s",filelist[i]);
+ sprintf (this->filelist2[nFiles2], "dvd://%s", this->filelist[i]);
nFiles2++;
}
@@ -343,30 +440,34 @@ static char** input_plugin_get_dir (char *filename, int *nEntries) {
return NULL;
}
- return filelist2;
+ return this->filelist2;
}
-static char **input_plugin_get_autoplay_list (int *nFiles) {
-
+/*
+ *
+ */
+static char **dvd_plugin_get_autoplay_list (input_plugin_t *this_gen,
+ int *nFiles) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
int i, fd;
-
+
if((fd = open(DVD, O_RDONLY|O_NONBLOCK)) > -1) {
int nFiles3, nFiles2;
-
- UDFListDir (fd, "/VIDEO_TS", MAX_DIR_ENTRIES, filelist, &nFiles3);
-
+
+ UDFListDir (fd, "/VIDEO_TS", MAX_DIR_ENTRIES, this->filelist, &nFiles3);
+
nFiles2 = 0;
for (i=0; i<nFiles3; i++) {
int nLen;
- nLen = strlen (filelist[i]);
+ nLen = strlen (this->filelist[i]);
if (nLen<4)
continue;
- if (!strcasecmp (&filelist[i][nLen-4], ".VOB")) {
+ if (!strcasecmp (&this->filelist[i][nLen-4], ".VOB")) {
- sprintf (filelist2[nFiles2], "dvd://%s",filelist[i]);
+ sprintf (this->filelist2[nFiles2], "dvd://%s", this->filelist[i]);
nFiles2++;
}
@@ -382,57 +483,69 @@ static char **input_plugin_get_autoplay_list (int *nFiles) {
return NULL;
}
- return filelist2;
+ return this->filelist2;
}
-static int input_plugin_is_branch_possible (const char *next_mrl) {
-
- char *filename;
- int vts_minor, vts_major;
-
- printf ("input_dvd: is_branch_possible to %s ?\n", next_mrl);
-
- /*
- * do we handle this kind of MRL ?
- */
+/*
+ *
+ */
+static char* dvd_plugin_get_mrl (input_plugin_t *this_gen) {
+ dvd_input_plugin_t *this = (dvd_input_plugin_t *) this_gen;
- if (strncmp (next_mrl, "dvd://",6))
- return 0;
+ return this->mrl;
+}
- filename = (char *) &next_mrl[6];
+/*
+ *
+ */
+input_plugin_t *init_input_plugin (int iface, config_values_t *config) {
+ dvd_input_plugin_t *this;
- if (sscanf (filename, "VTS_%d_%d.VOB", &vts_major, &vts_minor) == 2) {
- if ((vts_major==gVTSMajor) && (vts_minor==(gVTSMinor+1))) {
- printf ("input_dvd: branching is possible\n");
- return 1;
+ xine_debug = config->lookup_int (config, "xine_debug", 0);
+
+ switch (iface) {
+ case 1: {
+ int i;
+
+ this = (dvd_input_plugin_t *) malloc (sizeof (dvd_input_plugin_t));
+
+ for (i = 0; i < MAX_DIR_ENTRIES; i++) {
+ this->filelist[i] = (char *) malloc (256);
+ this->filelist2[i] = (char *) malloc (256);
}
+
+ this->input_plugin.interface_version = INPUT_PLUGIN_IFACE_VERSION;
+ this->input_plugin.get_capabilities = dvd_plugin_get_capabilities;
+ this->input_plugin.open = dvd_plugin_open;
+ this->input_plugin.read = dvd_plugin_read;
+ this->input_plugin.read_block = dvd_plugin_read_block;
+ this->input_plugin.seek = dvd_plugin_seek;
+ this->input_plugin.get_current_pos = dvd_plugin_get_current_pos;
+ this->input_plugin.get_length = dvd_plugin_get_length;
+ this->input_plugin.get_blocksize = dvd_plugin_get_blocksize;
+ this->input_plugin.eject_media = dvd_plugin_eject_media;
+ this->input_plugin.close = dvd_plugin_close;
+ this->input_plugin.get_identifier = dvd_plugin_get_identifier;
+ this->input_plugin.get_description = dvd_plugin_get_description;
+ this->input_plugin.get_dir = dvd_plugin_get_dir;
+ this->input_plugin.get_mrl = dvd_plugin_get_mrl;
+ this->input_plugin.get_autoplay_list = dvd_plugin_get_autoplay_list;
+ this->input_plugin.get_clut = NULL;
+
+ // this->fh = -1;
+ this->mrl = NULL;
+ this->config = config;
+
+ return (input_plugin_t *) this;
+ }
+ break;
+ default:
+ fprintf(stderr,
+ "File input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n",
+ iface);
+ return NULL;
}
-
- return 0;
-}
-
-static input_plugin_t plugin_op = {
- NULL,
- NULL,
- input_plugin_init,
- input_plugin_open,
- input_plugin_read,
- input_plugin_seek,
- input_plugin_get_length,
- input_plugin_get_capabilities,
- input_plugin_get_dir,
- input_plugin_get_blocksize,
- input_plugin_eject,
- input_plugin_close,
- input_plugin_get_identifier,
- input_plugin_get_autoplay_list,
- input_plugin_is_branch_possible,
- NULL
-};
-
-input_plugin_t *input_plugin_getinfo(uint32_t dbglvl) {
-
- xine_debug = dbglvl;
-
- return &plugin_op;
}
diff --git a/src/input/input_file.c b/src/input/input_file.c
index be1cd12de..aef614ec8 100644
--- a/src/input/input_file.c
+++ b/src/input/input_file.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_file.c,v 1.7 2001/05/03 00:02:42 f1rmb Exp $
+ * $Id: input_file.c,v 1.8 2001/05/05 23:44:33 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -25,6 +25,7 @@
#endif
#include <stdio.h>
+#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>