annotate libmpdemux/stream_vcd.c @ 18971:ec2f6323fda3

Change SRC_PATH for ffmpeg back to '..' to avoid hardcoding current directory at configure time. This should work again now that libpostproc is no longer under libavcodec and all Makefiles included from ffmpeg are at the same directory level. The hardcoded paths caused breakage if the build directory was moved or copied after configure and prevented ccache from sharing compilation results between directories (different absolute include paths count as different compiler options).
author uau
date Sun, 09 Jul 2006 14:06:13 +0000
parents d2d9d011203f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
1
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
2 #include "config.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
3
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
4 #include "mp_msg.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
5 #include "stream.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
6 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15912
diff changeset
7 #include "m_option.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15912
diff changeset
8 #include "m_struct.h"
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
9
10121
d42177a0da2a Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents: 9886
diff changeset
10 #include <fcntl.h>
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
11 #include <stdlib.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
12 #include <unistd.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
13 #include <sys/ioctl.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
14 #include <errno.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
15
15566
3758536dcef3 DragonFly BSD support
diego
parents: 15057
diff changeset
16 #if defined(__FreeBSD__) || defined(__DragonFly__)
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
17 #include <sys/cdrio.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
18 #include "vcd_read_fbsd.h"
12797
b2419eef04da OpenBSD portability patches from the OpenBSD ports tree
diego
parents: 10591
diff changeset
19 #elif defined(__NetBSD__) || defined (__OpenBSD__)
13678
dc1facd7c7b0 add vcd support to darwin for ppc
nplourde
parents: 12797
diff changeset
20 #include "vcd_read_nbsd.h"
13681
e52daf7f3bcc enable vcd for all darwin based sys not only mac osx
nplourde
parents: 13678
diff changeset
21 #elif defined(SYS_DARWIN)
e52daf7f3bcc enable vcd for all darwin based sys not only mac osx
nplourde
parents: 13678
diff changeset
22 #include "vcd_read_darwin.h"
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
23 #else
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
24 #include "vcd_read.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
25 #endif
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
26
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
27 extern char *cdrom_device;
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
28
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
29 static struct stream_priv_s {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
30 int track;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
31 char* device;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
32 } stream_priv_dflts = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
33 1,
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
34 NULL
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
35 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
36
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
37 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
38 /// URL definition
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
39 static m_option_t stream_opts_fields[] = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
40 { "track", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL },
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
41 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
42 /// For url parsing
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
43 { "hostname", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL },
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
44 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
45 { NULL, NULL, 0, 0, 0, 0, NULL }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
46 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
47 static struct m_struct_st stream_opts = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
48 "vcd",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
49 sizeof(struct stream_priv_s),
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
50 &stream_priv_dflts,
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
51 stream_opts_fields
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
52 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
53
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
54 static int fill_buffer(stream_t *s, char* buffer, int max_len){
15912
25feca1387e7 don't read past the end of the selected track
nicodvb
parents: 15566
diff changeset
55 if(s->pos > s->end_pos) /// don't past end of current track
25feca1387e7 don't read past the end of the selected track
nicodvb
parents: 15566
diff changeset
56 return 0;
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
57 return vcd_read(s->priv,buffer);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
58 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
59
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
60 static int seek(stream_t *s,off_t newpos) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
61 s->pos = newpos;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
62 vcd_set_msf(s->priv,s->pos/VCD_SECTOR_DATA);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
63 return 1;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
64 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
65
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
66 static void close_s(stream_t *stream) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
67 free(stream->priv);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
68 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
69
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
70 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
71 struct stream_priv_s* p = (struct stream_priv_s*)opts;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
72 int ret,ret2,f;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
73 mp_vcd_priv_t* vcd;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
74 #ifdef __FreeBSD__
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
75 int bsize = VCD_SECTOR_SIZE;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
76 #endif
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
77
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
78 if(mode != STREAM_READ) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
79 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
80 return STREAM_UNSUPORTED;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
81 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
82
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
83 if (!p->device) {
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
84 if(cdrom_device)
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
85 p->device = strdup(cdrom_device);
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
86 else
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
87 p->device = strdup(DEFAULT_CDROM_DEVICE);
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
88 }
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
89
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
90 f=open(p->device,O_RDONLY);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
91 if(f<0){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
92 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CdDevNotfound,p->device);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
93 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
94 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
95 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
96
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
97 vcd = vcd_read_toc(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
98 if(!vcd) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
99 mp_msg(MSGT_OPEN,MSGL_ERR,"Failed to get cd toc\n");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
100 close(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
101 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
102 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
103 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
104 ret2=vcd_get_track_end(vcd,p->track);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
105 if(ret2<0){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
106 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (get)\n");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
107 close(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
108 free(vcd);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
109 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
110 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
111 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
112 ret=vcd_seek_to_track(vcd,p->track);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
113 if(ret<0){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
114 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
115 close(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
116 free(vcd);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
117 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
118 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
119 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
120 mp_msg(MSGT_OPEN,MSGL_V,"VCD start byte position: 0x%X end: 0x%X\n",ret,ret2);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
121
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
122 #ifdef __FreeBSD__
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
123 if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
124 mp_msg(MSGT_OPEN,MSGL_WARN,"Error in CDRIOCSETBLOCKSIZE");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
125 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
126 #endif
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
127
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
128 stream->fd = f;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
129 stream->type = STREAMTYPE_VCD;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
130 stream->sector_size = VCD_SECTOR_DATA;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
131 stream->start_pos=ret;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
132 stream->end_pos=ret2;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
133 stream->priv = vcd;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
134
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
135 stream->fill_buffer = fill_buffer;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
136 stream->seek = seek;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
137 stream->close = close_s;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
138
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
139 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
140 return STREAM_OK;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
141 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
142
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
143 stream_info_t stream_info_vcd = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
144 "Video CD",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
145 "vcd",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
146 "Albeu",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
147 "based on the code from ???",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
148 open_s,
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
149 { "vcd", NULL },
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
150 &stream_opts,
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
151 1 // Urls are an option string
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
152 };