13 #include <sys/ioctl.h>
16 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
17 #include <sys/cdrio.h>
18 #include "vcd_read_fbsd.h"
19 #elif defined(__NetBSD__) || defined (__OpenBSD__)
20 #include "vcd_read_nbsd.h"
21 #elif defined(SYS_DARWIN)
22 #include "vcd_read_darwin.h"
27 #include "libmpdemux/demuxer.h"
29 extern char *cdrom_device
;
31 static struct stream_priv_s
{
34 } stream_priv_dflts
= {
39 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
41 static m_option_t stream_opts_fields
[] = {
42 { "track", ST_OFF(track
), CONF_TYPE_INT
, M_OPT_MIN
, 1, 0, NULL
},
43 { "device", ST_OFF(device
), CONF_TYPE_STRING
, 0, 0 ,0, NULL
},
45 { "hostname", ST_OFF(track
), CONF_TYPE_INT
, M_OPT_MIN
, 1, 0, NULL
},
46 { "filename", ST_OFF(device
), CONF_TYPE_STRING
, 0, 0 ,0, NULL
},
47 { NULL
, NULL
, 0, 0, 0, 0, NULL
}
49 static struct m_struct_st stream_opts
= {
51 sizeof(struct stream_priv_s
),
56 static int fill_buffer(stream_t
*s
, char* buffer
, int max_len
){
57 if(s
->pos
> s
->end_pos
) /// don't past end of current track
59 return vcd_read(s
->priv
,buffer
);
62 static int seek(stream_t
*s
,off_t newpos
) {
64 vcd_set_msf(s
->priv
,s
->pos
/VCD_SECTOR_DATA
);
68 static void close_s(stream_t
*stream
) {
72 static int open_s(stream_t
*stream
,int mode
, void* opts
, int* file_format
) {
73 struct stream_priv_s
* p
= (struct stream_priv_s
*)opts
;
76 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
77 int bsize
= VCD_SECTOR_SIZE
;
80 if(mode
!= STREAM_READ
) {
81 m_struct_free(&stream_opts
,opts
);
82 return STREAM_UNSUPORTED
;
87 p
->device
= strdup(cdrom_device
);
89 p
->device
= strdup(DEFAULT_CDROM_DEVICE
);
92 f
=open(p
->device
,O_RDONLY
);
94 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_CdDevNotfound
,p
->device
);
95 m_struct_free(&stream_opts
,opts
);
99 vcd
= vcd_read_toc(f
);
101 mp_msg(MSGT_OPEN
,MSGL_ERR
,"Failed to get cd toc\n");
103 m_struct_free(&stream_opts
,opts
);
106 ret2
=vcd_get_track_end(vcd
,p
->track
);
108 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_ErrTrackSelect
" (get)\n");
111 m_struct_free(&stream_opts
,opts
);
114 ret
=vcd_seek_to_track(vcd
,p
->track
);
116 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_ErrTrackSelect
" (seek)\n");
119 m_struct_free(&stream_opts
,opts
);
122 mp_msg(MSGT_OPEN
,MSGL_V
,"VCD start byte position: 0x%X end: 0x%X\n",ret
,ret2
);
124 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
125 if (ioctl (f
, CDRIOCSETBLOCKSIZE
, &bsize
) == -1) {
126 mp_msg(MSGT_OPEN
,MSGL_WARN
,"Error in CDRIOCSETBLOCKSIZE");
131 stream
->type
= STREAMTYPE_VCD
;
132 stream
->sector_size
= VCD_SECTOR_DATA
;
133 stream
->start_pos
=ret
;
134 stream
->end_pos
=ret2
;
137 stream
->fill_buffer
= fill_buffer
;
139 stream
->close
= close_s
;
140 *file_format
= DEMUXER_TYPE_MPEG_PS
;
142 m_struct_free(&stream_opts
,opts
);
146 stream_info_t stream_info_vcd
= {
150 "based on the code from ???",
154 1 // Urls are an option string