Mercurial > mplayer.hg
annotate stream/vcd_read_nbsd.h @ 21881:a10888bc9758
Fix invalid read for gifs with a palette for less than 256 colors
author | reimar |
---|---|
date | Sat, 13 Jan 2007 11:06:40 +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 |