14 #include <sys/ioctl.h>
17 #if defined(__FreeBSD__) || defined(__DragonFly__)
18 #include <sys/cdrio.h>
19 #include "vcd_read_fbsd.h"
20 #elif defined(__NetBSD__) || defined (__OpenBSD__)
21 #include "vcd_read_nbsd.h"
22 #elif defined(SYS_DARWIN)
23 #include "vcd_read_darwin.h"
28 extern char *cdrom_device
;
30 static struct stream_priv_s
{
33 } stream_priv_dflts
= {
38 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
40 static m_option_t stream_opts_fields
[] = {
41 { "track", ST_OFF(track
), CONF_TYPE_INT
, M_OPT_MIN
, 1, 0, NULL
},
42 { "device", ST_OFF(device
), CONF_TYPE_STRING
, 0, 0 ,0, NULL
},
44 { "hostname", ST_OFF(track
), CONF_TYPE_INT
, M_OPT_MIN
, 1, 0, NULL
},
45 { "filename", ST_OFF(device
), CONF_TYPE_STRING
, 0, 0 ,0, NULL
},
46 { NULL
, NULL
, 0, 0, 0, 0, NULL
}
48 static struct m_struct_st stream_opts
= {
50 sizeof(struct stream_priv_s
),
55 static int fill_buffer(stream_t
*s
, char* buffer
, int max_len
){
56 if(s
->pos
> s
->end_pos
) /// don't past end of current track
58 return vcd_read(s
->priv
,buffer
);
61 static int seek(stream_t
*s
,off_t newpos
) {
63 vcd_set_msf(s
->priv
,s
->pos
/VCD_SECTOR_DATA
);
67 static void close_s(stream_t
*stream
) {
71 static int open_s(stream_t
*stream
,int mode
, void* opts
, int* file_format
) {
72 struct stream_priv_s
* p
= (struct stream_priv_s
*)opts
;
76 int bsize
= VCD_SECTOR_SIZE
;
79 if(mode
!= STREAM_READ
) {
80 m_struct_free(&stream_opts
,opts
);
81 return STREAM_UNSUPORTED
;
86 p
->device
= strdup(cdrom_device
);
88 p
->device
= strdup(DEFAULT_CDROM_DEVICE
);
91 f
=open(p
->device
,O_RDONLY
);
93 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_CdDevNotfound
,p
->device
);
94 m_struct_free(&stream_opts
,opts
);
98 vcd
= vcd_read_toc(f
);
100 mp_msg(MSGT_OPEN
,MSGL_ERR
,"Failed to get cd toc\n");
102 m_struct_free(&stream_opts
,opts
);
105 ret2
=vcd_get_track_end(vcd
,p
->track
);
107 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_ErrTrackSelect
" (get)\n");
110 m_struct_free(&stream_opts
,opts
);
113 ret
=vcd_seek_to_track(vcd
,p
->track
);
115 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_ErrTrackSelect
" (seek)\n");
118 m_struct_free(&stream_opts
,opts
);
121 mp_msg(MSGT_OPEN
,MSGL_V
,"VCD start byte position: 0x%X end: 0x%X\n",ret
,ret2
);
124 if (ioctl (f
, CDRIOCSETBLOCKSIZE
, &bsize
) == -1) {
125 mp_msg(MSGT_OPEN
,MSGL_WARN
,"Error in CDRIOCSETBLOCKSIZE");
130 stream
->type
= STREAMTYPE_VCD
;
131 stream
->sector_size
= VCD_SECTOR_DATA
;
132 stream
->start_pos
=ret
;
133 stream
->end_pos
=ret2
;
136 stream
->fill_buffer
= fill_buffer
;
138 stream
->close
= close_s
;
140 m_struct_free(&stream_opts
,opts
);
144 stream_info_t stream_info_vcd
= {
148 "based on the code from ???",
152 1 // Urls are an option string