diff options
author | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-04-27 22:42:27 +0000 |
---|---|---|
committer | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-04-27 22:42:27 +0000 |
commit | 30d0116d16a40b641a4fc772435e0cbb09fe3e83 (patch) | |
tree | 814b49212bb351300b13dd77272b6c80f850e34c /libmpdemux | |
parent | 38a7d8e282893074240754cce4d00a9237d557e5 (diff) | |
download | mpv-30d0116d16a40b641a4fc772435e0cbb09fe3e83.tar.bz2 mpv-30d0116d16a40b641a4fc772435e0cbb09fe3e83.tar.xz |
OpenBSD, NetBSD portability patches by
Björn Sandell <biorn@dce.chalmers.se>
Marcus <core@antbear.org>
Bernd Ernesti <mplayer@lists.veego.de>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5873 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/dvdauth.c | 14 | ||||
-rw-r--r-- | libmpdemux/stream.c | 2 | ||||
-rw-r--r-- | libmpdemux/tvi_bsdbt848.c | 4 | ||||
-rw-r--r-- | libmpdemux/vcd_read_nbsd.h | 198 |
4 files changed, 217 insertions, 1 deletions
diff --git a/libmpdemux/dvdauth.c b/libmpdemux/dvdauth.c index ead0926357..3266a383e6 100644 --- a/libmpdemux/dvdauth.c +++ b/libmpdemux/dvdauth.c @@ -31,8 +31,11 @@ #include <sys/wait.h> // #include <css.h> -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +#if defined(__FreeBSD__) || defined(__NetBSD__) # include <sys/dvdio.h> +#elif defined(__OpenBSD__) +# include <sys/cdio.h> +# define RTLD_NOW RTLD_LAZY #elif defined(__linux__) # include <linux/cdrom.h> #elif defined(__sun) @@ -169,6 +172,9 @@ static void reset_agids ( DVDHandle dvd ) ioctl(dvd, DVDIOCREPORTKEY, &ai); } #else +#if defined(__OpenBSD__) + union +#endif dvd_authinfo ai; int i; for (i = 0; i < 4; i++) { @@ -219,9 +225,15 @@ int dvd_auth ( char *dev , char *filename ) return 1; } printf("DVD: dlopen OK!\n"); +#ifdef __OpenBSD__ +#define CSS_DLSYM(v,s) if (!(v=dlsym(dlid,"_" s))) {\ +fprintf(stderr,"DVD: %s\n Hint: use libcss version 0.1!\n",dlerror());\ +return 1; } +#else #define CSS_DLSYM(v,s) if (!(v=dlsym(dlid,s))) {\ fprintf(stderr,"DVD: %s\n Hint: use libcss version 0.1!\n",dlerror());\ return 1; } +#endif CSS_DLSYM(dl_CSSisEncrypted,"CSSisEncrypted"); CSS_DLSYM(dl_CSSAuthDisc,"CSSAuthDisc"); diff --git a/libmpdemux/stream.c b/libmpdemux/stream.c index 3cbd2eec48..75bd926213 100644 --- a/libmpdemux/stream.c +++ b/libmpdemux/stream.c @@ -22,6 +22,8 @@ extern int verbose; // defined in mplayer.c #ifdef __FreeBSD__ #include "vcd_read_fbsd.h" +#elif defined(__NetBSD__) +#include "vcd_read_nbsd.h" #else #include "vcd_read.h" #endif diff --git a/libmpdemux/tvi_bsdbt848.c b/libmpdemux/tvi_bsdbt848.c index 6e7e4967f1..b39d3c5e49 100644 --- a/libmpdemux/tvi_bsdbt848.c +++ b/libmpdemux/tvi_bsdbt848.c @@ -39,8 +39,12 @@ #include <signal.h> #include <string.h> +#ifdef __NetBSD__ +#include <dev/ic/bt8xx.h> +#else #include <machine/ioctl_meteor.h> #include <machine/ioctl_bt848.h> +#endif #ifdef HAVE_SYS_SOUNDCARD_H #include <sys/soundcard.h> diff --git a/libmpdemux/vcd_read_nbsd.h b/libmpdemux/vcd_read_nbsd.h new file mode 100644 index 0000000000..0166facd08 --- /dev/null +++ b/libmpdemux/vcd_read_nbsd.h @@ -0,0 +1,198 @@ + +#include <sys/types.h> +#include <sys/inttypes.h> +#include <sys/cdio.h> +#include <sys/scsiio.h> + +#define CDROM_LEADOUT 0xAA + +static struct ioc_read_toc_entry vcd_entry; +static struct cd_toc_entry vcd_entry_data; +static char vcd_buf[VCD_SECTOR_SIZE]; + +static inline void +vcd_set_msf(unsigned int sect) +{ + unsigned int s = sect; + vcd_entry_data.addr.msf.frame = sect % 75; + sect = sect / 75; + vcd_entry_data.addr.msf.second = sect % 60; + sect = sect / 60; + vcd_entry_data.addr.msf.minute = sect; +} + +static inline unsigned int +vcd_get_msf() +{ + return vcd_entry_data.addr.msf.frame + + (vcd_entry_data.addr.msf.second + + vcd_entry_data.addr.msf.minute * 60) * 75; +} + +int +vcd_seek_to_track(int fd, int track) +{ + vcd_entry.address_format = CD_MSF_FORMAT; + vcd_entry.starting_track = track; + vcd_entry.data_len = sizeof(struct cd_toc_entry); + vcd_entry.data = &vcd_entry_data; + if (ioctl(fd, CDIOREADTOCENTRIES, &vcd_entry)) { + perror("ioctl dif1"); + return -1; + } + return VCD_SECTOR_DATA * vcd_get_msf(); +} + +int +vcd_get_track_end(int fd, int track) +{ + struct ioc_toc_header tochdr; + if (ioctl(fd, CDIOREADTOCHEADER, &tochdr) == -1) { + perror("read CDROM toc header: "); + return -1; + } + vcd_entry.address_format = CD_MSF_FORMAT; + vcd_entry.starting_track = track < tochdr.ending_track ? (track + 1) : CDROM_LEADOUT; + vcd_entry.data_len = sizeof(struct cd_toc_entry); + vcd_entry.data = &vcd_entry_data; + if (ioctl(fd, CDIOREADTOCENTRYS, &vcd_entry)) { + perror("ioctl dif2"); + return -1; + } + return VCD_SECTOR_DATA * vcd_get_msf(); +} + +void +vcd_read_toc(int fd) +{ + struct ioc_toc_header tochdr; + int i; + if (ioctl(fd, CDIOREADTOCHEADER, &tochdr) == -1) { + perror("read CDROM toc header: "); + return; + } + for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { + struct ioc_read_toc_entry tocentry; + struct cd_toc_entry tocentry_data; + + tocentry.starting_track = i; + tocentry.address_format = CD_MSF_FORMAT; + tocentry.data_len = sizeof(struct cd_toc_entry); + tocentry.data = &tocentry_data; + + if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry) == -1) { + perror("read CDROM toc entry: "); + return; + } + printf("track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", + (int) tocentry.starting_track, + (int) tocentry.data->addr_type, + (int) tocentry.data->control, + (int) tocentry.address_format, + (int) tocentry.data->addr.msf.minute, + (int) tocentry.data->addr.msf.second, + (int) tocentry.data->addr.msf.frame + ); + } +} + +static int +vcd_read(int fd, char *mem) +{ + struct scsireq sc; + int lba = vcd_get_msf(); + int blocks; + int sector_type; + int sync, header_code, user_data, edc_ecc, error_field; + int sub_channel; + int rc; + + blocks = 1; + sector_type = 5; /* mode2/form2 */ + sync = 0; + header_code = 0; + user_data = 1; + edc_ecc = 0; + error_field = 0; + sub_channel = 0; + + memset(&sc, 0, sizeof(sc)); + sc.cmd[0] = 0xBE; + sc.cmd[1] = (sector_type) << 2; + sc.cmd[2] = (lba >> 24) & 0xff; + sc.cmd[3] = (lba >> 16) & 0xff; + sc.cmd[4] = (lba >> 8) & 0xff; + sc.cmd[5] = lba & 0xff; + sc.cmd[6] = (blocks >> 16) & 0xff; + sc.cmd[7] = (blocks >> 8) & 0xff; + sc.cmd[8] = blocks & 0xff; + sc.cmd[9] = (sync << 7) | (header_code << 5) | (user_data << 4) | + (edc_ecc << 3) | (error_field << 1); + sc.cmd[10] = sub_channel; + sc.cmdlen = 12; + sc.databuf = (caddr_t) mem; + sc.datalen = 2328; + sc.senselen = sizeof(sc.sense); + sc.flags = SCCMD_READ; + sc.timeout = 10000; + rc = ioctl(fd, SCIOCCOMMAND, &sc); + if (rc == -1) { + perror("SCIOCCOMMAND"); + return -1; + } + if (sc.retsts || sc.error) { + fprintf(stderr, "scsi command failed: status %d error %d\n", sc.retsts, + sc.error); + return -1; + } + return VCD_SECTOR_DATA; +} + +#ifdef VCD_CACHE + +static int vcd_cache_size = 0; +static char *vcd_cache_data = NULL; +static int *vcd_cache_sectors = NULL; +static int vcd_cache_index = 0; +static int vcd_cache_current = -1; + +void +vcd_cache_init(int s) +{ + vcd_cache_size = s; + vcd_cache_sectors = malloc(s * sizeof(int)); + vcd_cache_data = malloc(s * VCD_SECTOR_SIZE); + memset(vcd_cache_sectors, 255, s * sizeof(int)); +} + +static inline void +vcd_cache_seek(int sect) +{ + vcd_cache_current = sect; +} + +int +vcd_cache_read(int fd, char *mem) +{ + int i; + char *vcd_buf; + for (i = 0; i < vcd_cache_size; i++) + if (vcd_cache_sectors[i] == vcd_cache_current) { + vcd_buf = &vcd_cache_data[i * VCD_SECTOR_SIZE]; + ++vcd_cache_current; + memcpy(mem, &vcd_buf[VCD_SECTOR_OFFS], VCD_SECTOR_DATA); + return VCD_SECTOR_DATA; + } + vcd_buf = &vcd_cache_data[vcd_cache_index * VCD_SECTOR_SIZE]; + vcd_cache_sectors[vcd_cache_index] = vcd_cache_current; + ++vcd_cache_index; + if (vcd_cache_index >= vcd_cache_size) + vcd_cache_index = 0; + vcd_set_msf(vcd_cache_current); + memcpy(vcd_buf, &vcd_entry_data.addr.msf, sizeof(vcd_entry_data.addr.msf)); + ++vcd_cache_current; + memcpy(mem, &vcd_buf[VCD_SECTOR_OFFS], VCD_SECTOR_DATA); + return VCD_SECTOR_DATA; +} +#endif + |