2 * This file has been modified for the cdrkit suite.
4 * The behaviour and appearence of the program code below can differ to a major
5 * extent from the version distributed by the original author(s).
7 * For details, see Changelog file distributed with the cdrkit package. If you
8 * received this file from another source then ask the distributing person for
9 * a log of modifications.
13 /* @(#)diskid.c 1.37 04/03/02 Copyright 1998-2004 J. Schilling */
15 * Disk Idientification Method
17 * Copyright (c) 1998-2004 J. Schilling
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License version 2
22 * as published by the Free Software Foundation.
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License along with
30 * this program; see the file COPYING. If not, write to the Free Software
31 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
42 void pr_manufacturer(msf_t *mp, BOOL rw, BOOL audio);
43 static struct disk_man *man_ptr(msf_t *mp);
44 int manufacturer_id(msf_t *mp);
45 long disk_rcap(msf_t *mp, long maxblock, BOOL rw, BOOL audio);
54 * Illegal (old) Manufacturer.
56 static char m_ill[] = "Unknown old Manufacturer code";
57 static char m_illrw[] = "Illegal Manufacturer code";
62 static char m_kingpro[] = "King Pro Mediatek Inc.";
63 static char m_custpo[] = "Customer Pressing Oosterhout";
64 static char m_taeil[] = "Taeil Media Co.,Ltd.";
65 static char m_doremi[] = "Doremi Media Co., Ltd.";
66 static char m_xcitec[] = "Xcitec Inc.";
67 static char m_leaddata[] = "Lead Data Inc.";
68 static char m_fuji[] = "FUJI Photo Film Co., Ltd.";
69 static char m_hitachi[] = "Hitachi Maxell, Ltd.";
70 static char m_kodakjp[] = "Kodak Japan Limited";
71 static char m_mitsui[] = "Mitsui Chemicals, Inc.";
72 static char m_pioneer[] = "Pioneer Video Corporation";
73 static char m_plasmon[] = "Plasmon Data systems Ltd.";
74 static char m_princo[] = "Princo Corporation";
75 static char m_ricoh[] = "Ricoh Company Limited";
76 static char m_skc[] = "SKC Co., Ltd.";
77 static char m_tyuden[] = "Taiyo Yuden Company Limited";
78 static char m_tdk[] = "TDK Corporation";
79 static char m_mitsubishi[] = "Mitsubishi Chemical Corporation";
80 static char m_auvistar[] = "Auvistar Industry Co.,Ltd.";
81 static char m_gigastore[] = "GIGASTORAGE CORPORATION";
82 static char m_fornet[] = "FORNET INTERNATIONAL PTE LTD.";
83 static char m_cmc[] = "CMC Magnetics Corporation";
84 static char m_odm[] = "Optical Disc Manufacturing Equipment";
85 static char m_ritek[] = "Ritek Co.";
90 static char m_bestdisk[] = "Bestdisc Technology Corporation";
91 static char m_wealth_fair[] = "WEALTH FAIR INVESTMENT LIMITED";
92 static char m_general_mag[] = "General Magnetics Ld";
93 static char m_mpo[] = "MPO";
94 static char m_jvc[] = "VICTOR COMPANY OF JAPAN, LIMITED";
95 static char m_vivistar[] = "VIVASTAR AG";
96 static char m_taroko[] = "TAROKO INTERNATIONAL CO.,LTD.";
97 static char m_unidisc[] = "UNIDISC TECHNOLOGY CO.,LTD";
98 static char m_hokodig[] = "Hong Kong Digital Technology Co., Ltd.";
99 static char m_viva[] = "VIVA MAGNETICS LIMITED";
100 static char m_hile[] = "Hile Optical Disc Technology Corp.";
101 static char m_friendly[] = "Friendly CD-Tek Co.";
102 static char m_soundsound[] = "Sound Sound Multi-Media Development Limited";
103 static char m_kdg[] = "kdg mediatech AG";
104 static char m_seantram[] = "Seantram Technology Inc.";
105 static char m_eximpo[] = "EXIMPO";
106 static char m_delphi[] = "DELPHI TECHNOLOGY INC.";
107 static char m_harmonic[] = "Harmonic Hall Optical Disc Ltd.";
108 static char m_guannyinn[] = "Guann Yinn Co.,Ltd.";
109 static char m_optime[] = "Opti.Me.S. S.p.A.";
110 static char m_nacar[] = "Nacar Media srl";
111 static char m_optrom[] = "OPTROM.INC.";
112 static char m_audiodis[] = "AUDIO DISTRIBUTORS CO., LTD.";
113 static char m_acer[] = "Acer Media Technology, Inc.";
114 static char m_woongjin[] = "Woongjin Media corp";
115 static char m_infodisk[] = "INFODISC Technology Co., Ltd.";
116 static char m_unitech[] = "UNITECH JAPAN INC.";
117 static char m_ams[] = "AMS Technology Inc.";
118 static char m_vanguard[] = "Vanguard Disc Inc.";
119 static char m_grandadv[] = "Grand Advance Technology Ltd.";
120 static char m_digitalstor[] = "DIGITAL STORAGE TECHNOLOGY CO.,LTD";
121 static char m_matsushita[] = "Matsushita Electric Industrial Co.,Ltd.";
122 static char m_albrechts[] = "CDA Datenträger Albrechts GmbH.";
123 static char m_xalbrechts[] = "??? CDA Datenträger Albrechts GmbH.";
125 static char m_prodisc[] = "Prodisc Technology Inc.";
126 static char m_postech[] = "POSTECH Corporation";
128 static char m_ncolumbia[] = "NIPPON COLUMBIA CO.,LTD.";
130 static char m_odc[] = "OPTICAL DISC CORPRATION";
131 static char m_sony[] = "SONY Corporation";
132 static char m_cis[] = "CIS Technology Inc.";
133 static char m_csitaly[] = "Computer Support Italy s.r.l.";
134 static char m_mmmm[] = "Multi Media Masters & Machinary SA";
139 /*static char m_seantram[] = "Seantram Technology Inc.";*/
140 static char m_advanced[] = "Advanced Digital Media";
141 static char m_moser[] = "Moser Baer India Limited";
142 static char m_nanya[] = "NAN-YA Plastics Corporation";
143 static char m_shenzen[] = "SHENZEN SG&GAST DIGITAL OPTICAL DISCS";
145 static struct disk_man notable =
146 {{00, 00, 00}, -1, "unknown (not in table)" };
149 * Old (illegal) code table. It lists single specific codes (97:xx:yy).
151 static struct disk_man odman[] = {
153 * Illegal (old) codes.
155 {{97, 25, 00}, 80, "ILLEGAL OLD CODE: TDK ???" },
156 {{97, 25, 15}, 0, m_ill },
157 {{97, 27, 00}, 81, "ILLEGAL OLD CODE: Old Ritek Co.???" },
158 {{97, 27, 25}, 0, m_ill },
159 {{97, 30, 00}, 0, m_ill },
160 {{97, 33, 00}, 82, "ILLEGAL OLD CODE: Old CDA Datenträger Albrechts GmbH." },
161 {{97, 35, 44}, 0, m_ill },
162 {{97, 39, 00}, 0, m_ill },
163 {{97, 45, 36}, 83, "ILLEGAL OLD CODE: Old Kodak Photo CD" },
164 {{97, 47, 00}, 0, m_ill },
165 {{97, 47, 30}, 0, m_ill },
166 {{97, 48, 14}, 0, m_ill },
167 {{97, 48, 33}, 0, m_ill },
168 {{97, 49, 00}, 0, m_ill },
169 {{97, 54, 00}, 0, m_ill },
170 {{97, 55, 06}, 0, m_ill },
171 {{97, 57, 00}, 0, m_ill },
175 {{00, 00, 00}, 0, NULL },
178 #define noman (sizeof (oman)/sizeof (oman[0]))
181 * Actual code table. It lists code ranges (97:xx:y0 - 97:xx:y9).
183 * Note that dp->mi_msf.msf_frame needs to be always rounded down
184 * to 0 even for media that has e.g. 97:27/01 in the official table.
186 static struct disk_man dman[] = {
191 {{97, 22, 10}, 53, m_seantram },
192 {{97, 15, 00}, 26, m_tdk },
193 {{97, 49, 30}, 47, m_optime },
194 {{97, 28, 00}, 47, m_optime },
195 {{97, 28, 40}, 36, m_kingpro },
196 {{97, 23, 60}, 49, m_custpo },
197 {{97, 29, 00}, 37, m_taeil },
198 {{97, 26, 10}, 19, m_postech },
199 {{97, 47, 40}, 19, m_postech },
200 {{97, 24, 10}, 24, m_sony },
201 /* {{97, 46, 10}, 24, m_sony },*/
202 {{97, 23, 10}, 33, m_doremi },
203 {{97, 25, 60}, 30, m_xcitec },
204 {{97, 45, 60}, 30, m_xcitec },
205 {{97, 26, 50}, 10, m_leaddata },
206 {{97, 48, 60}, 10, m_leaddata },
207 {{97, 26, 40}, 6, m_fuji },
208 {{97, 46, 40}, 6, m_fuji },
209 {{97, 25, 20}, 8, m_hitachi },
210 {{97, 47, 10}, 8, m_hitachi },
211 {{97, 27, 40}, 9, m_kodakjp },
212 {{97, 48, 10}, 9, m_kodakjp },
213 {{97, 27, 50}, 12, m_mitsui },
214 {{97, 48, 50}, 12, m_mitsui },
215 {{97, 27, 30}, 17, m_pioneer },
216 {{97, 48, 30}, 17, m_pioneer },
217 {{97, 27, 10}, 18, m_plasmon },
218 {{97, 48, 20}, 18, m_plasmon },
219 {{97, 27, 20}, 20, m_princo },
220 {{97, 47, 20}, 20, m_princo },
221 {{97, 27, 60}, 21, m_ricoh },
222 {{97, 48, 00}, 21, m_ricoh },
223 {{97, 26, 20}, 23, m_skc },
224 {{97, 24, 00}, 25, m_tyuden },
225 {{97, 46, 00}, 25, m_tyuden },
226 {{97, 32, 00}, 26, m_tdk },
227 {{97, 49, 00}, 26, m_tdk },
228 {{97, 34, 20}, 11, m_mitsubishi },
229 {{97, 50, 20}, 11, m_mitsubishi },
230 {{97, 28, 30}, 1, m_auvistar },
231 {{97, 46, 50}, 1, m_auvistar },
232 {{97, 28, 10}, 7, m_gigastore },
233 {{97, 49, 10}, 7, m_gigastore },
234 {{97, 26, 00}, 5, m_fornet },
235 {{97, 45, 00}, 5, m_fornet },
236 {{97, 26, 60}, 3, m_cmc },
237 {{97, 46, 60}, 3, m_cmc },
238 {{97, 21, 40}, 16, m_odm },
239 {{97, 31, 00}, 22, m_ritek },
240 {{97, 47, 50}, 22, m_ritek },
241 {{97, 28, 20}, 13, m_mmmm },
242 {{97, 46, 20}, 13, m_mmmm },
243 {{97, 32, 10}, 27, m_prodisc },
248 {{97, 21, 30}, 67, m_bestdisk },
249 {{97, 18, 10}, 66, m_wealth_fair },
250 {{97, 29, 50}, 65, m_general_mag },
251 {{97, 25, 00}, 64, m_mpo }, /* in reality 25/01 */
252 {{97, 49, 40}, 63, m_jvc },
253 {{97, 23, 40}, 63, m_jvc },
254 {{97, 25, 40}, 62, m_vivistar },
255 {{97, 18, 60}, 61, m_taroko },
256 {{97, 29, 20}, 60, m_unidisc },
257 {{97, 46, 10}, 59, m_hokodig }, /* XXX was m_sony */
258 {{97, 22, 50}, 59, m_hokodig },
259 {{97, 29, 40}, 58, m_viva },
260 {{97, 29, 30}, 57, m_hile },
261 {{97, 51, 50}, 57, m_hile },
262 {{97, 28, 60}, 56, m_friendly },
263 {{97, 21, 50}, 55, m_soundsound },
264 {{97, 24, 40}, 54, m_kdg },
265 {{97, 22, 30}, 52, m_eximpo },
266 {{97, 28, 50}, 51, m_delphi },
267 {{97, 29, 00}, 50, m_harmonic },
268 {{97, 15, 10}, 22, m_ritek },
269 {{97, 45, 50}, 48, m_guannyinn },
270 {{97, 24, 50}, 48, m_guannyinn },
271 {{97, 23, 20}, 46, m_nacar },
272 {{97, 23, 50}, 45, m_optrom },
273 {{97, 23, 30}, 44, m_audiodis },
274 {{97, 22, 60}, 43, m_acer },
275 {{97, 45, 20}, 43, m_acer },
276 {{97, 15, 20}, 11, m_mitsubishi },
277 {{97, 22, 00}, 39, m_woongjin },
278 {{97, 25, 30}, 40, m_infodisk },
279 {{97, 51, 20}, 40, m_infodisk },
280 {{97, 24, 30}, 41, m_unitech },
281 {{97, 25, 50}, 42, m_ams },
282 {{97, 29, 10}, 38, m_vanguard },
283 {{97, 50, 10}, 38, m_vanguard },
284 {{97, 16, 30}, 35, m_grandadv },
285 {{97, 31, 30}, 35, m_grandadv },
286 {{97, 51, 10}, 35, m_grandadv },
287 {{97, 49, 20}, 36, m_kingpro },
288 {{97, 27, 00}, 34, m_digitalstor }, /* in reality 27/01 */
289 {{97, 48, 40}, 34, m_digitalstor }, /* XXX was m_ncolumbia */
290 {{97, 23, 00}, 31, m_matsushita },
291 {{97, 49, 60}, 31, m_matsushita },
292 {{97, 30, 10}, 32, m_albrechts }, /* XXX was m_ncolumbia */
293 {{97, 50, 30}, 32, m_albrechts },
294 {{97, 47, 60}, 27, m_prodisc },
295 /* {{97, 30, 10}, 14, m_ncolumbia },*/
296 /* {{97, 48, 40}, 14, m_ncolumbia },*/
297 {{97, 26, 30}, 15, m_odc },
298 {{97, 22, 40}, 2, m_cis },
299 {{97, 45, 40}, 2, m_cis },
300 {{97, 24, 20}, 4, m_csitaly },
301 {{97, 46, 30}, 4, m_csitaly },
306 {{97, 20, 10}, 32, m_xalbrechts }, /* XXX guess */
307 /* {{97, 23, 40}, 32, m_xalbrechts },*/ /* Really is JVC */
310 * New guessed codes (2002 ff.).
311 * Id code >= 68 referres to a new manufacturer.
314 {{97, 22, 20}, 68, m_advanced },
315 {{97, 42, 20}, 68, m_advanced },
316 {{97, 24, 60}, 50, m_harmonic },
317 {{97, 17, 00}, 69, m_moser },
318 {{97, 15, 30}, 70, m_nanya },
319 {{97, 16, 20}, 71, m_shenzen },
320 {{97, 45, 10}, 41, m_unitech },
325 {{00, 00, 00}, 0, NULL },
328 #define ndman (sizeof (dman)/sizeof (dman[0]))
330 static struct disk_man *
333 struct disk_man * dp;
337 type = mp->msf_frame % 10;
338 frame = mp->msf_frame - type;
341 while (dp->mi_msf.msf_min != 0) {
342 if (mp->msf_min == dp->mi_msf.msf_min &&
343 mp->msf_sec == dp->mi_msf.msf_sec &&
344 mp->msf_frame == dp->mi_msf.msf_frame) {
350 while (dp->mi_msf.msf_min != 0) {
351 if (mp->msf_min == dp->mi_msf.msf_min &&
352 mp->msf_sec == dp->mi_msf.msf_sec &&
353 frame == dp->mi_msf.msf_frame) {
355 * Note that dp->mi_msf.msf_frame is always rounded
356 * down to 0 even for media that has 97:27/01 in the
366 void pr_manufacturer(msf_t *mp, BOOL rw, BOOL audio)
368 struct disk_man * dp;
369 struct disk_man xdman;
373 /* printf("pr_manufacturer rw: %d audio: %d\n", rw, audio);*/
375 type = mp->msf_frame % 10;
377 tname = "Long strategy type (Cyanine, AZO or similar)";
379 tname = "Short strategy type (Phthalocyanine or similar)";
382 tname = "Phase change";
387 if (dp->mi_num == 0 || dp->mi_num >= 80) {
389 tname = "unknown dye (old id code)";
394 dp->mi_name = m_illrw;
398 tname = "unknown dye (reserved id code)";
401 printf("Disk type: %s\n", tname);
402 printf("Manuf. index: %d\n", dp->mi_num);
403 printf("Manufacturer: %s\n", dp->mi_name);
405 if (mp->msf_min != 97) /* This may be garbage ATIP from a DVD */
408 if (dp >= &dman[I_GUESS] && dp < &dman[ndman]) {
409 printf("Manufacturer is guessed because of the orange forum embargo.\n");
410 printf("The orange forum likes to get money for recent information.\n");
411 printf("The information for this media may not be correct.\n");
413 if (dp == ¬able) {
414 printf("Manufacturer is unknown because of the orange forum embargo.\n");
415 printf("As the orange forum likes to get money for recent information,\n");
416 printf("it may be that this media does not use illegal manufacturer coding.\n");
420 int manufacturer_id(msf_t *mp)
422 struct disk_man * dp;
431 msf_t ci_msf; /* Lead in start time */
432 long ci_cap; /* Lead out start time */
433 long ci_rcap; /* Abs max lead out start */
436 static struct disk_rcap rcap[] = {
438 #ifdef __redbook_only__
439 {{97, 35, 44}, 359849, 404700 }, /*! Unknown 99 min (89:58/00)*/
441 {{97, 35, 44}, 359849, 449700 }, /*! Unknown 99 min (99:58/00) */
442 {{97, 31, 00}, 359849, 368923 }, /*! Arita CD-R 80 */
443 {{97, 26, 50}, 359849, 369096 }, /*! Lead Data CD-R 80 */
444 {{97, 26, 12}, 359849, 368000 }, /*X POSTECH 80 Min */
445 {{97, 25, 00}, 359849, 374002 }, /* TDK 80 Minuten */
446 {{97, 20, 14}, 359700, 376386 }, /*! Albrechts DataFile Plus */
447 {{97, 35, 44}, 359100, 368791 }, /*! NoName BC-1 700 Mb/80 Min */
449 {{97, 26, 60}, 337350, 349030 }, /* Koch grün CD-R74PRO */
450 {{97, 26, 50}, 337050, 351205 }, /* Saba */
451 {{97, 26, 00}, 337050, 351411 }, /*!DGN (FORNET) */
452 {{97, 22, 40}, 336631, 349971 }, /* Targa grün CD-R74 */
453 {{97, 26, 50}, 336631, 351727 }, /*! Sunstar (Lead Data) */
454 {{97, 26, 55}, 336631, 350474 }, /*! NoName ZAP (Lead Data) */
456 {{97, 27, 28}, 336601, 346489 }, /*! BTC CD-R (Princo) */
457 {{97, 27, 30}, 336601, 351646 }, /*! Pioneer blau CDM-W74S */
458 {{97, 27, 31}, 336601, 351379 }, /* Pioneer blau CDM-W74S */
459 {{97, 27, 33}, 336601, 347029 }, /*! Pioneer braun CDM-V74S */
460 {{97, 26, 40}, 336225, 346210 }, /* Fuji Silver Disk */
461 {{97, 28, 10}, 336225, 348757 }, /*!GigaStorage Cursor CD-R */
462 {{97, 31, 00}, 336225, 345460 }, /* Arita grün */
463 {{97, 25, 28}, 336075, 352879 }, /* Maxell gold CD-R74G */
464 {{97, 24, 01}, 336075, 346856 }, /*!Philips Premium Silver */
465 {{97, 24, 00}, 336075, 346741 }, /* Philips grün CD-R74 */
467 {{97, 22, 41}, 335206, 349385 }, /* Octek grün */
468 {{97, 34, 20}, 335100, 342460 }, /* Verbatim DataLifePlus */
469 {{97, 33, 00}, 335100, 344634 }, /*!ITS Singapore (braun/grün) */
470 {{97, 32, 19}, 335100, 343921 }, /*!Prodisc silber/silber */
471 {{97, 25, 21}, 335100, 346013 }, /* Maxell grün CD-R74XL */
472 {{97, 27, 00}, 335100, 353448 }, /* TDK grün CD-RXG74 */
473 {{97, 27, 31}, 335100, 351862 }, /*!Maxell CD-R74MU (Musik) */
474 {{97, 27, 33}, 335100, 351336 }, /* Pioneer RDD-74A */
476 {{97, 26, 60}, 334259, 349036 }, /* BASF grün */
477 {{97, 28, 21}, 333976, 348217 }, /*! Noname-B (MMMM) */
478 {{97, 28, 20}, 333976, 346485 }, /* Koch grün CD-R74 PRO */
479 {{97, 32, 00}, 333975, 345736 }, /* Imation 3M */
480 {{97, 32, 00}, 333975, 348835 }, /* TDK Reflex X CD-R74 */
481 {{97, 30, 18}, 333899, 344857 }, /* HiSpace grün */
482 {{97, 27, 66}, 333750, 352726 }, /*!Philips Megalife (Musik) */
483 {{97, 28, 43}, 333750, 345344 }, /*!MMore CD-R */
484 {{97, 27, 65}, 333750, 348343 }, /* Ricoh gold */
486 {{97, 27, 00}, 333750, 336246 }, /* BestMedia grün CD-R74 */
487 {{97, 27, 28}, 333491, 347473 }, /* Fuji grün (alt) */
488 {{97, 24, 48}, 333491, 343519 }, /* BASF (alt) */
489 {{97, 27, 55}, 333235, 343270 }, /* Teac gold CD-R74 */
490 {{97, 27, 45}, 333226, 343358 }, /* Kodak gold */
491 {{97, 28, 20}, 333226, 346483 }, /* SAST grün */
492 {{97, 27, 45}, 333226, 343357 }, /* Mitsumi gold */
493 {{97, 28, 25}, 333226, 346481 }, /* Cedar Grün */
494 {{97, 23, 00}, 333226, 346206 }, /* Fuji grün (alt) */
495 {{97, 33, 00}, 333225, 349623 }, /* DataFile Albrechts */
496 {{97, 24, 24}, 333198, 342536 }, /*!SUN CD Recordable */
498 {{97, 27, 19}, 332850, 348442 }, /* Plasmon gold PCD-R74 */
499 {{97, 32, 00}, 96600, 106502 }, /* TDK 80mm (for music only) */
504 {{00, 00, 00}, 0L, 0L },
508 disk_rcap(msf_t *mp, long maxblock, BOOL rw, BOOL audio)
510 struct disk_rcap * dp;
513 while (dp->ci_msf.msf_min != 0) {
514 if (mp->msf_min == dp->ci_msf.msf_min &&
515 mp->msf_sec == dp->ci_msf.msf_sec &&
516 mp->msf_frame == dp->ci_msf.msf_frame &&
517 maxblock == dp->ci_cap)
518 return (dp->ci_rcap);