Mercurial > mplayer.hg
annotate stream/vcd_read_nbsd.h @ 23011:365eef1fc4f0
Disable caching of rotated glyphs.
The following commits will add perspective distortion to the glyphs rotated
with \frx and \fry. Somewhere along the way correct caching of such glyphs
will become impossible, but in the end everything will be fine.
author | eugeni |
---|---|
date | Fri, 20 Apr 2007 22:49:48 +0000 |
parents | 64d82a45a05d |
children | 773e6c50d1b8 |
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; |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
87 int i, min = 0, sec = 0, frame = 0; |
5872 | 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 } | |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
92 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_START_TRACK=%d\n", tochdr.starting_track); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
93 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_END_TRACK=%d\n", tochdr.ending_track); |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
94 for (i = tochdr.starting_track; i <= tochdr.ending_track + 1; i++) { |
5872 | 95 struct ioc_read_toc_entry tocentry; |
96 struct cd_toc_entry tocentry_data; | |
97 | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
98 tocentry.starting_track = i<=tochdr.ending_track ? i : CDROM_LEADOUT; |
5872 | 99 tocentry.address_format = CD_MSF_FORMAT; |
100 tocentry.data_len = sizeof(struct cd_toc_entry); | |
101 tocentry.data = &tocentry_data; | |
102 | |
103 if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry) == -1) { | |
9887 | 104 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc entry: %s\n",strerror(errno)); |
105 return NULL; | |
5872 | 106 } |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
107 if (i <= tochdr.ending_track) |
9887 | 108 mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", |
5872 | 109 (int) tocentry.starting_track, |
110 (int) tocentry.data->addr_type, | |
111 (int) tocentry.data->control, | |
112 (int) tocentry.address_format, | |
113 (int) tocentry.data->addr.msf.minute, | |
114 (int) tocentry.data->addr.msf.second, | |
115 (int) tocentry.data->addr.msf.frame | |
116 ); | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
117 |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
118 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
119 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
120 if (i > tochdr.starting_track) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
121 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
122 min = tocentry.data->addr.msf.minute - min; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
123 sec = tocentry.data->addr.msf.second - sec; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
124 frame = tocentry.data->addr.msf.frame - frame; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
125 if ( frame < 0 ) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
126 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
127 frame += 75; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
128 sec --; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
129 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
130 if ( sec < 0 ) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
131 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
132 sec += 60; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
133 min --; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
134 } |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
135 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_TRACK_%d_MSF=%02d:%02d:%02d\n", i - 1, min, sec, frame); |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
136 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
137 min = tocentry.data->addr.msf.minute; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
138 sec = tocentry.data->addr.msf.second; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
139 frame = tocentry.data->addr.msf.frame; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
12797
diff
changeset
|
140 } |
5872 | 141 } |
9887 | 142 vcd = malloc(sizeof(mp_vcd_priv_t)); |
143 vcd->fd = fd; | |
144 return vcd; | |
5872 | 145 } |
146 | |
147 static int | |
9887 | 148 vcd_read(mp_vcd_priv_t* vcd, char *mem) |
5872 | 149 { |
150 struct scsireq sc; | |
9887 | 151 int lba = vcd_get_msf(vcd); |
5872 | 152 int blocks; |
153 int sector_type; | |
154 int sync, header_code, user_data, edc_ecc, error_field; | |
155 int sub_channel; | |
156 int rc; | |
157 | |
158 blocks = 1; | |
159 sector_type = 5; /* mode2/form2 */ | |
160 sync = 0; | |
161 header_code = 0; | |
162 user_data = 1; | |
163 edc_ecc = 0; | |
164 error_field = 0; | |
165 sub_channel = 0; | |
166 | |
167 memset(&sc, 0, sizeof(sc)); | |
168 sc.cmd[0] = 0xBE; | |
169 sc.cmd[1] = (sector_type) << 2; | |
170 sc.cmd[2] = (lba >> 24) & 0xff; | |
171 sc.cmd[3] = (lba >> 16) & 0xff; | |
172 sc.cmd[4] = (lba >> 8) & 0xff; | |
173 sc.cmd[5] = lba & 0xff; | |
174 sc.cmd[6] = (blocks >> 16) & 0xff; | |
175 sc.cmd[7] = (blocks >> 8) & 0xff; | |
176 sc.cmd[8] = blocks & 0xff; | |
177 sc.cmd[9] = (sync << 7) | (header_code << 5) | (user_data << 4) | | |
178 (edc_ecc << 3) | (error_field << 1); | |
179 sc.cmd[10] = sub_channel; | |
180 sc.cmdlen = 12; | |
181 sc.databuf = (caddr_t) mem; | |
182 sc.datalen = 2328; | |
183 sc.senselen = sizeof(sc.sense); | |
184 sc.flags = SCCMD_READ; | |
185 sc.timeout = 10000; | |
9887 | 186 rc = ioctl(vcd->fd, SCIOCCOMMAND, &sc); |
5872 | 187 if (rc == -1) { |
9887 | 188 mp_msg(MSGT_STREAM,MSGL_ERR,"SCIOCCOMMAND: %s\n",strerror(errno)); |
5872 | 189 return -1; |
190 } | |
191 if (sc.retsts || sc.error) { | |
9887 | 192 mp_msg(MSGT_STREAM,MSGL_ERR,"scsi command failed: status %d error %d\n", |
193 sc.retsts,sc.error); | |
5872 | 194 return -1; |
195 } | |
9887 | 196 vcd_inc_msf(vcd); |
5872 | 197 return VCD_SECTOR_DATA; |
198 } | |
199 |