Mercurial > mplayer.hg
annotate libmpdemux/vcd_read_nbsd.h @ 16347:da2926d990ce
Adds -idle, an option to make MPlayer wait for input ('loadfile' or
'loadlist') commands when it's done playing all files or there are no files
on the command line. When used with -fixed-vo, you get a "frozen" vo
window, but it can still accept input commands from there (clicking 'q'
from the xv window will cause MPlayer to close..)
author | ods15 |
---|---|
date | Fri, 02 Sep 2005 08:44:55 +0000 |
parents | b2419eef04da |
children | aa15d627a00b |
rev | line source |
---|---|
5872 | 1 |
2 #include <sys/types.h> | |
12797
b2419eef04da
OpenBSD portability patches from the OpenBSD ports tree
diego
parents:
9887
diff
changeset
|
3 #ifdef __NetBSD__ |
5872 | 4 #include <sys/inttypes.h> |
12797
b2419eef04da
OpenBSD portability patches from the OpenBSD ports tree
diego
parents:
9887
diff
changeset
|
5 #endif |
5872 | 6 #include <sys/cdio.h> |
7 #include <sys/scsiio.h> | |
8 | |
9 #define CDROM_LEADOUT 0xAA | |
10 | |
9887 | 11 typedef struct mp_vcd_priv_st { |
12 int fd; | |
13 struct ioc_read_toc_entry entry; | |
14 struct cd_toc_entry entry_data; | |
15 } mp_vcd_priv_t; | |
5872 | 16 |
17 static inline void | |
9887 | 18 vcd_set_msf(mp_vcd_priv_t* vcd, unsigned int sect) |
5872 | 19 { |
9887 | 20 vcd->entry_data.addr.msf.frame = sect % 75; |
5872 | 21 sect = sect / 75; |
9887 | 22 vcd->entry_data.addr.msf.second = sect % 60; |
5872 | 23 sect = sect / 60; |
9887 | 24 vcd->entry_data.addr.msf.minute = sect; |
5872 | 25 } |
26 | |
8532
9688aa033083
fix VCD playback - this is a patch from the netbsd pkgsrc tree,
arpi
parents:
7406
diff
changeset
|
27 static inline void |
9887 | 28 vcd_inc_msf(mp_vcd_priv_t* vcd) |
8532
9688aa033083
fix VCD playback - this is a patch from the netbsd pkgsrc tree,
arpi
parents:
7406
diff
changeset
|
29 { |
9887 | 30 vcd->entry_data.addr.msf.frame++; |
31 if (vcd->entry_data.addr.msf.frame==75){ | |
32 vcd->entry_data.addr.msf.frame=0; | |
33 vcd->entry_data.addr.msf.second++; | |
34 if (vcd->entry_data.addr.msf.second==60){ | |
35 vcd->entry_data.addr.msf.second=0; | |
36 vcd->entry_data.addr.msf.minute++; | |
8532
9688aa033083
fix VCD playback - this is a patch from the netbsd pkgsrc tree,
arpi
parents:
7406
diff
changeset
|
37 } |
9688aa033083
fix VCD playback - this is a patch from the netbsd pkgsrc tree,
arpi
parents:
7406
diff
changeset
|
38 } |
9688aa033083
fix VCD playback - this is a patch from the netbsd pkgsrc tree,
arpi
parents:
7406
diff
changeset
|
39 } |
9688aa033083
fix VCD playback - this is a patch from the netbsd pkgsrc tree,
arpi
parents:
7406
diff
changeset
|
40 |
5872 | 41 static inline unsigned int |
9887 | 42 vcd_get_msf(mp_vcd_priv_t* vcd) |
5872 | 43 { |
9887 | 44 return vcd->entry_data.addr.msf.frame + |
45 (vcd->entry_data.addr.msf.second + | |
46 vcd->entry_data.addr.msf.minute * 60) * 75; | |
5872 | 47 } |
48 | |
49 int | |
9887 | 50 vcd_seek_to_track(mp_vcd_priv_t* vcd, int track) |
5872 | 51 { |
9887 | 52 vcd->entry.address_format = CD_MSF_FORMAT; |
53 vcd->entry.starting_track = track; | |
54 vcd->entry.data_len = sizeof(struct cd_toc_entry); | |
55 vcd->entry.data = &vcd->entry_data; | |
56 if (ioctl(vcd->fd, CDIOREADTOCENTRIES, &vcd->entry)) { | |
57 mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif1: %s\n",strerror(errno)); | |
5872 | 58 return -1; |
59 } | |
9887 | 60 return VCD_SECTOR_DATA * vcd_get_msf(vcd); |
5872 | 61 } |
62 | |
63 int | |
9887 | 64 vcd_get_track_end(mp_vcd_priv_t* vcd, int track) |
5872 | 65 { |
66 struct ioc_toc_header tochdr; | |
9887 | 67 if (ioctl(vcd->fd, CDIOREADTOCHEADER, &tochdr) == -1) { |
68 mp_msg(MSGT_STREAM,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); | |
5872 | 69 return -1; |
70 } | |
9887 | 71 vcd->entry.address_format = CD_MSF_FORMAT; |
72 vcd->entry.starting_track = track < tochdr.ending_track ? (track + 1) : CDROM_LEADOUT; | |
73 vcd->entry.data_len = sizeof(struct cd_toc_entry); | |
74 vcd->entry.data = &vcd->entry_data; | |
75 if (ioctl(vcd->fd, CDIOREADTOCENTRYS, &vcd->entry)) { | |
76 mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif2: %s\n",strerror(errno)); | |
5872 | 77 return -1; |
78 } | |
9887 | 79 return VCD_SECTOR_DATA * vcd_get_msf(vcd); |
5872 | 80 } |
81 | |
9887 | 82 mp_vcd_priv_t* |
5872 | 83 vcd_read_toc(int fd) |
84 { | |
85 struct ioc_toc_header tochdr; | |
9887 | 86 mp_vcd_priv_t* vcd; |
5872 | 87 int i; |
88 if (ioctl(fd, CDIOREADTOCHEADER, &tochdr) == -1) { | |
9887 | 89 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); |
5872 | 90 return; |
91 } | |
92 for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { | |
93 struct ioc_read_toc_entry tocentry; | |
94 struct cd_toc_entry tocentry_data; | |
95 | |
96 tocentry.starting_track = i; | |
97 tocentry.address_format = CD_MSF_FORMAT; | |
98 tocentry.data_len = sizeof(struct cd_toc_entry); | |
99 tocentry.data = &tocentry_data; | |
100 | |
101 if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry) == -1) { | |
9887 | 102 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc entry: %s\n",strerror(errno)); |
103 return NULL; | |
5872 | 104 } |
9887 | 105 mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", |
5872 | 106 (int) tocentry.starting_track, |
107 (int) tocentry.data->addr_type, | |
108 (int) tocentry.data->control, | |
109 (int) tocentry.address_format, | |
110 (int) tocentry.data->addr.msf.minute, | |
111 (int) tocentry.data->addr.msf.second, | |
112 (int) tocentry.data->addr.msf.frame | |
113 ); | |
114 } | |
9887 | 115 vcd = malloc(sizeof(mp_vcd_priv_t)); |
116 vcd->fd = fd; | |
117 return vcd; | |
5872 | 118 } |
119 | |
120 static int | |
9887 | 121 vcd_read(mp_vcd_priv_t* vcd, char *mem) |
5872 | 122 { |
123 struct scsireq sc; | |
9887 | 124 int lba = vcd_get_msf(vcd); |
5872 | 125 int blocks; |
126 int sector_type; | |
127 int sync, header_code, user_data, edc_ecc, error_field; | |
128 int sub_channel; | |
129 int rc; | |
130 | |
131 blocks = 1; | |
132 sector_type = 5; /* mode2/form2 */ | |
133 sync = 0; | |
134 header_code = 0; | |
135 user_data = 1; | |
136 edc_ecc = 0; | |
137 error_field = 0; | |
138 sub_channel = 0; | |
139 | |
140 memset(&sc, 0, sizeof(sc)); | |
141 sc.cmd[0] = 0xBE; | |
142 sc.cmd[1] = (sector_type) << 2; | |
143 sc.cmd[2] = (lba >> 24) & 0xff; | |
144 sc.cmd[3] = (lba >> 16) & 0xff; | |
145 sc.cmd[4] = (lba >> 8) & 0xff; | |
146 sc.cmd[5] = lba & 0xff; | |
147 sc.cmd[6] = (blocks >> 16) & 0xff; | |
148 sc.cmd[7] = (blocks >> 8) & 0xff; | |
149 sc.cmd[8] = blocks & 0xff; | |
150 sc.cmd[9] = (sync << 7) | (header_code << 5) | (user_data << 4) | | |
151 (edc_ecc << 3) | (error_field << 1); | |
152 sc.cmd[10] = sub_channel; | |
153 sc.cmdlen = 12; | |
154 sc.databuf = (caddr_t) mem; | |
155 sc.datalen = 2328; | |
156 sc.senselen = sizeof(sc.sense); | |
157 sc.flags = SCCMD_READ; | |
158 sc.timeout = 10000; | |
9887 | 159 rc = ioctl(vcd->fd, SCIOCCOMMAND, &sc); |
5872 | 160 if (rc == -1) { |
9887 | 161 mp_msg(MSGT_STREAM,MSGL_ERR,"SCIOCCOMMAND: %s\n",strerror(errno)); |
5872 | 162 return -1; |
163 } | |
164 if (sc.retsts || sc.error) { | |
9887 | 165 mp_msg(MSGT_STREAM,MSGL_ERR,"scsi command failed: status %d error %d\n", |
166 sc.retsts,sc.error); | |
5872 | 167 return -1; |
168 } | |
9887 | 169 vcd_inc_msf(vcd); |
5872 | 170 return VCD_SECTOR_DATA; |
171 } | |
172 |