1 #ifndef MPLAYER_VCD_READ_DARWIN_H
2 #define MPLAYER_VCD_READ_DARWIN_H
4 #define _XOPEN_SOURCE 500
12 #include <CoreFoundation/CFBase.h>
13 #include <IOKit/IOKitLib.h>
14 #include <IOKit/storage/IOCDTypes.h>
15 #include <IOKit/storage/IOCDMedia.h>
16 #include <IOKit/storage/IOCDMediaBSDClient.h>
21 //=================== VideoCD ==========================
22 #define CDROM_LEADOUT 0xAA
28 uint8_t subheader
[8];
33 typedef struct mp_vcd_priv_st
37 dk_cd_read_track_info_t entry
;
38 struct CDDiscInfo hdr
;
42 static inline void vcd_set_msf(mp_vcd_priv_t
* vcd
, unsigned int sect
)
44 vcd
->msf
= CDConvertLBAToMSF(sect
);
47 static inline unsigned int vcd_get_msf(mp_vcd_priv_t
* vcd
)
49 return CDConvertMSFToLBA(vcd
->msf
);
52 int vcd_seek_to_track(mp_vcd_priv_t
* vcd
, int track
)
54 struct CDTrackInfo entry
;
56 memset( &vcd
->entry
, 0, sizeof(vcd
->entry
));
57 vcd
->entry
.addressType
= kCDTrackInfoAddressTypeTrackNumber
;
58 vcd
->entry
.address
= track
;
59 vcd
->entry
.bufferLength
= sizeof(entry
);
60 vcd
->entry
.buffer
= &entry
;
62 if (ioctl(vcd
->fd
, DKIOCCDREADTRACKINFO
, &vcd
->entry
))
64 mp_msg(MSGT_STREAM
,MSGL_ERR
,"ioctl dif1: %s\n",strerror(errno
));
67 vcd
->msf
= CDConvertLBAToMSF(be2me_32(entry
.trackStartAddress
));
68 return VCD_SECTOR_DATA
*vcd_get_msf(vcd
);
71 int vcd_get_track_end(mp_vcd_priv_t
* vcd
, int track
)
73 struct CDTrackInfo entry
;
75 if (track
> vcd
->hdr
.lastTrackNumberInLastSessionLSB
) {
76 mp_msg(MSGT_OPEN
, MSGL_ERR
,
77 "track number %d greater than last track number %d\n",
78 track
, vcd
->hdr
.lastTrackNumberInLastSessionLSB
);
83 memset( &vcd
->entry
, 0, sizeof(vcd
->entry
));
84 vcd
->entry
.addressType
= kCDTrackInfoAddressTypeTrackNumber
;
85 vcd
->entry
.address
= track
<vcd
->hdr
.lastTrackNumberInLastSessionLSB
?track
+1:vcd
->hdr
.lastTrackNumberInLastSessionLSB
;
86 vcd
->entry
.bufferLength
= sizeof(entry
);
87 vcd
->entry
.buffer
= &entry
;
89 if (ioctl(vcd
->fd
, DKIOCCDREADTRACKINFO
, &vcd
->entry
))
91 mp_msg(MSGT_STREAM
,MSGL_ERR
,"ioctl dif2: %s\n",strerror(errno
));
94 if (track
== vcd
->hdr
.lastTrackNumberInLastSessionLSB
)
95 vcd
->msf
= CDConvertLBAToMSF(be2me_32(entry
.trackStartAddress
) +
96 be2me_32(entry
.trackSize
));
98 vcd
->msf
= CDConvertLBAToMSF(be2me_32(entry
.trackStartAddress
));
99 return VCD_SECTOR_DATA
*vcd_get_msf(vcd
);
102 mp_vcd_priv_t
* vcd_read_toc(int fd
)
104 dk_cd_read_disc_info_t tochdr
;
105 struct CDDiscInfo hdr
;
107 dk_cd_read_track_info_t tocentry
;
108 struct CDTrackInfo entry
;
112 int i
, min
= 0, sec
= 0, frame
= 0;
115 memset(&tochdr
, 0, sizeof(tochdr
));
116 tochdr
.buffer
= &hdr
;
117 tochdr
.bufferLength
= sizeof(hdr
);
119 if (ioctl(fd
, DKIOCCDREADDISCINFO
, &tochdr
) < 0)
121 mp_msg(MSGT_OPEN
,MSGL_ERR
,"read CDROM toc header: %s\n",strerror(errno
));
125 //print all track info
126 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VCD_START_TRACK=%d\n", hdr
.firstTrackNumberInLastSessionLSB
);
127 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VCD_END_TRACK=%d\n", hdr
.lastTrackNumberInLastSessionLSB
);
128 for (i
=hdr
.firstTrackNumberInLastSessionLSB
; i
<=hdr
.lastTrackNumberInLastSessionLSB
+ 1; i
++)
130 if (i
<= hdr
.lastTrackNumberInLastSessionLSB
) {
131 memset( &tocentry
, 0, sizeof(tocentry
));
132 tocentry
.addressType
= kCDTrackInfoAddressTypeTrackNumber
;
133 tocentry
.address
= i
;
134 tocentry
.bufferLength
= sizeof(entry
);
135 tocentry
.buffer
= &entry
;
137 if (ioctl(fd
,DKIOCCDREADTRACKINFO
,&tocentry
)==-1)
139 mp_msg(MSGT_OPEN
,MSGL_ERR
,"read CDROM toc entry: %s\n",strerror(errno
));
143 trackMSF
= CDConvertLBAToMSF(be2me_32(entry
.trackStartAddress
));
146 trackMSF
= CDConvertLBAToMSF(be2me_32(entry
.trackStartAddress
)
147 + be2me_32(entry
.trackSize
));
149 //mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n",
150 if (i
<=hdr
.lastTrackNumberInLastSessionLSB
)
151 mp_msg(MSGT_OPEN
,MSGL_INFO
,"track %02d: format=%d %02d:%02d:%02d\n",
152 (int)tocentry
.address
,
153 //(int)tocentry.entry.addr_type,
154 //(int)tocentry.entry.control,
155 (int)tocentry
.addressType
,
156 (int)trackMSF
.minute
,
157 (int)trackMSF
.second
,
161 if (mp_msg_test(MSGT_IDENTIFY
, MSGL_INFO
))
163 if (i
> hdr
.firstTrackNumberInLastSessionLSB
)
165 min
= trackMSF
.minute
- min
;
166 sec
= trackMSF
.second
- sec
;
167 frame
= trackMSF
.frame
- frame
;
178 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VCD_TRACK_%d_MSF=%02d:%02d:%02d\n", i
- 1, min
, sec
, frame
);
180 min
= trackMSF
.minute
;
181 sec
= trackMSF
.second
;
182 frame
= trackMSF
.frame
;
186 vcd
= malloc(sizeof(mp_vcd_priv_t
));
193 static int vcd_read(mp_vcd_priv_t
* vcd
,char *mem
)
195 if (pread(vcd
->fd
,&vcd
->buf
,VCD_SECTOR_SIZE
,vcd_get_msf(vcd
)*VCD_SECTOR_SIZE
) != VCD_SECTOR_SIZE
)
199 if (vcd
->msf
.frame
==75)
204 if (vcd
->msf
.second
==60)
211 memcpy(mem
,vcd
->buf
.data
,VCD_SECTOR_DATA
);
212 return VCD_SECTOR_DATA
;
215 #endif /* MPLAYER_VCD_READ_DARWIN_H */