1 /****************************************************************************
2  * cdrom_internals.h: cdrom tools private header
3  *****************************************************************************
4  * Copyright (C) 1998-2001 VLC authors and VideoLAN
5  * $Id: 6fa6aa7d42f938eaca6e82f9c56e3d11256f02f1 $
6  *
7  * Authors: Johan Bilien <jobi@via.ecp.fr>
8  *          Gildas Bazin <gbazin@netcourrier.com>
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation; either version 2.1 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24 
25 /*****************************************************************************
26  * The vcddev structure
27  *****************************************************************************/
28 struct vcddev_s
29 {
30     char   *psz_dev;                                      /* vcd device name */
31 
32     /* Section used in vcd image mode */
33     int    i_vcdimage_handle;                   /* vcd image file descriptor */
34     int    i_tracks;                          /* number of tracks of the vcd */
35     int    *p_sectors;                           /* tracks layout on the vcd */
36 
37     /* Section used in vcd device mode */
38 
39 #ifdef _WIN32
40     HANDLE h_device_handle;                         /* vcd device descriptor */
41 #elif defined( __OS2__ )
42     HFILE  hcd;                                     /* vcd device descriptor */
43 #else
44     int    i_device_handle;                         /* vcd device descriptor */
45 #endif
46 
47 };
48 
49 #ifndef O_BINARY
50 #   define O_BINARY 0
51 #endif
52 
53 #define VCDDEV_T 1
54 
55 /*****************************************************************************
56  * Platform specifics
57  *****************************************************************************/
58 #if defined( __APPLE__ )
59 #define darwin_freeTOC( p ) free( (void*)p )
60 #define CD_MIN_TRACK_NO 01
61 #define CD_MAX_TRACK_NO 99
62 #endif
63 
64 #if defined( _WIN32 )
65 
66 /* Win32 DeviceIoControl specifics */
67 #ifndef MAXIMUM_NUMBER_TRACKS
68 #    define MAXIMUM_NUMBER_TRACKS 100
69 #endif
70 typedef struct _TRACK_DATA {
71     UCHAR Reserved;
72     UCHAR Control : 4;
73     UCHAR Adr : 4;
74     UCHAR TrackNumber;
75     UCHAR Reserved1;
76     UCHAR Address[4];
77 } TRACK_DATA, *PTRACK_DATA;
78 typedef struct _CDROM_TOC {
79     UCHAR Length[2];
80     UCHAR FirstTrack;
81     UCHAR LastTrack;
82     TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
83 } CDROM_TOC, *PCDROM_TOC;
84 typedef enum _TRACK_MODE_TYPE {
85     YellowMode2,
86     XAForm2,
87     CDDA
88 } TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
89 typedef struct __RAW_READ_INFO {
90     LARGE_INTEGER DiskOffset;
91     ULONG SectorCount;
92     TRACK_MODE_TYPE TrackMode;
93 } RAW_READ_INFO, *PRAW_READ_INFO;
94 typedef struct _CDROM_READ_TOC_EX {
95   UCHAR  Format : 4;
96   UCHAR  Reserved1 : 3;
97   UCHAR  Msf : 1;
98   UCHAR  SessionTrack;
99   UCHAR  Reserved2;
100   UCHAR  Reserved3;
101 } CDROM_READ_TOC_EX, *PCDROM_READ_TOC_EX;
102 
103 #ifndef IOCTL_CDROM_BASE
104 #    define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
105 #endif
106 #ifndef IOCTL_CDROM_READ_TOC
107 #    define IOCTL_CDROM_READ_TOC CTL_CODE(IOCTL_CDROM_BASE, 0x0000, \
108                                           METHOD_BUFFERED, FILE_READ_ACCESS)
109 #endif
110 #ifndef IOCTL_CDROM_RAW_READ
111 #define IOCTL_CDROM_RAW_READ CTL_CODE(IOCTL_CDROM_BASE, 0x000F, \
112                                       METHOD_OUT_DIRECT, FILE_READ_ACCESS)
113 #endif
114 #define IOCTL_CDROM_READ_TOC_EX CTL_CODE(IOCTL_CDROM_BASE, 0x0015, \
115                                          METHOD_BUFFERED, FILE_READ_ACCESS)
116 
117 
118 #define MINIMUM_CDROM_READ_TOC_EX_SIZE    2
119 #define CDROM_READ_TOC_EX_FORMAT_CDTEXT   0x05
120 
121 #endif /* _WIN32 */
122 
123 #ifdef __OS2__
124 #pragma pack( push, 1 )
125 typedef struct os2_msf_s
126 {
127     unsigned char frame;
128     unsigned char second;
129     unsigned char minute;
130     unsigned char reserved;
131 } os2_msf_t;
132 
133 typedef struct cdrom_get_tochdr_s
134 {
135     unsigned char sign[4];
136 } cdrom_get_tochdr_t;
137 
138 typedef struct cdrom_tochdr_s
139 {
140     unsigned char first_track;
141     unsigned char last_track;
142     os2_msf_t     lead_out;
143 } cdrom_tochdr_t;
144 
145 typedef struct cdrom_get_track_s
146 {
147     unsigned char sign[4];
148     unsigned char track;
149 } cdrom_get_track_t;
150 
151 typedef struct cdrom_track_s
152 {
153     os2_msf_t     start;
154     unsigned char adr:4;
155     unsigned char control:4;
156 } cdrom_track_t;
157 
158 typedef struct cdrom_readlong_s
159 {
160     unsigned char  sign[4];
161     unsigned char  addr_mode;
162     unsigned short sectors;
163     unsigned long  start;
164     unsigned char  reserved;
165     unsigned char  interleaved_size;
166 } cdrom_readlong_t;
167 
168 #pragma pack( pop )
169 #endif
170 
171 #define SECTOR_TYPE_MODE2_FORM2 0x14
172 #define SECTOR_TYPE_CDDA 0x04
173 #define READ_CD_RAW_MODE2 0xF0
174 #define READ_CD_USERDATA 0x10
175 
176 /*****************************************************************************
177  * Local Prototypes
178  *****************************************************************************/
179 static int    OpenVCDImage( vlc_object_t *, const char *, struct vcddev_s * );
180 static void   CloseVCDImage( vlc_object_t *, struct vcddev_s * );
181 
182 #if defined( __APPLE__ )
183 static CDTOC *darwin_getTOC( vlc_object_t *, const struct vcddev_s * );
184 static int    darwin_getNumberOfTracks( CDTOC *, int );
185 
186 #elif defined( _WIN32 )
187 static int    win32_vcd_open( vlc_object_t *, const char *, struct vcddev_s *);
188 
189 #elif defined( __OS2__ )
190 static int    os2_vcd_open( vlc_object_t *, const char *, struct vcddev_s *);
191 #endif
192