annotate libmpdemux/stream_vcd.c @ 15148:067f10ad6538

New section: "menc-feat-dvd-mpeg4-muxing" about how to mux a video obtained with MEncoder into different containers. Based on Rich's guide and some tips by Nico Sabi. Reviewed by The Wanderer, Dominik 'Rathann' Mierzejewski and Diego Biurrun
author gpoirier
date Wed, 13 Apr 2005 18:53:30 +0000
parents 719883aa0adf
children 3758536dcef3
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 #ifdef HAVE_VCD
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
5 #include "mp_msg.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
6 #include "stream.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
7 #include "help_mp.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
8 #include "../m_option.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
9 #include "../m_struct.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
10
10121
d42177a0da2a Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents: 9886
diff changeset
11 #include <fcntl.h>
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
12 #include <stdlib.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
13 #include <unistd.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
14 #include <sys/ioctl.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
15 #include <errno.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
16
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
17 #ifdef __FreeBSD__
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
18 #include <sys/cdrio.h>
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
19 #include "vcd_read_fbsd.h"
12797
b2419eef04da OpenBSD portability patches from the OpenBSD ports tree
diego
parents: 10591
diff changeset
20 #elif defined(__NetBSD__) || defined (__OpenBSD__)
13678
dc1facd7c7b0 add vcd support to darwin for ppc
nplourde
parents: 12797
diff changeset
21 #include "vcd_read_nbsd.h"
13681
e52daf7f3bcc enable vcd for all darwin based sys not only mac osx
nplourde
parents: 13678
diff changeset
22 #elif defined(SYS_DARWIN)
e52daf7f3bcc enable vcd for all darwin based sys not only mac osx
nplourde
parents: 13678
diff changeset
23 #include "vcd_read_darwin.h"
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
24 #else
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
25 #include "vcd_read.h"
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
26 #endif
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
27
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
28 extern char *cdrom_device;
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
29
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
30 static struct stream_priv_s {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
31 int track;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
32 char* device;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
33 } stream_priv_dflts = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
34 1,
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
35 NULL
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
36 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
37
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
38 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
39 /// URL definition
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
40 static m_option_t stream_opts_fields[] = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
41 { "track", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL },
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
42 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
43 /// For url parsing
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
44 { "hostname", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL },
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
45 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
46 { NULL, NULL, 0, 0, 0, 0, NULL }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
47 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
48 static struct m_struct_st stream_opts = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
49 "vcd",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
50 sizeof(struct stream_priv_s),
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
51 &stream_priv_dflts,
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
52 stream_opts_fields
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
53 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
54
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
55 static int fill_buffer(stream_t *s, char* buffer, int max_len){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
56 return vcd_read(s->priv,buffer);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
57 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
58
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
59 static int seek(stream_t *s,off_t newpos) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
60 s->pos = newpos;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
61 vcd_set_msf(s->priv,s->pos/VCD_SECTOR_DATA);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
62 return 1;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
63 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
64
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
65 static void close_s(stream_t *stream) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
66 free(stream->priv);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
67 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
68
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
69 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
70 struct stream_priv_s* p = (struct stream_priv_s*)opts;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
71 int ret,ret2,f;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
72 mp_vcd_priv_t* vcd;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
73 #ifdef __FreeBSD__
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
74 int bsize = VCD_SECTOR_SIZE;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
75 #endif
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
76
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
77 if(mode != STREAM_READ) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
78 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
79 return STREAM_UNSUPORTED;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
80 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
81
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
82 if (!p->device) {
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
83 if(cdrom_device)
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
84 p->device = strdup(cdrom_device);
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
85 else
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
86 p->device = strdup(DEFAULT_CDROM_DEVICE);
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
87 }
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
88
9886
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
89 f=open(p->device,O_RDONLY);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
90 if(f<0){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
91 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CdDevNotfound,p->device);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
92 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
93 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
94 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
95
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
96 vcd = vcd_read_toc(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
97 if(!vcd) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
98 mp_msg(MSGT_OPEN,MSGL_ERR,"Failed to get cd toc\n");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
99 close(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
100 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
101 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
102 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
103 ret2=vcd_get_track_end(vcd,p->track);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
104 if(ret2<0){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
105 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (get)\n");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
106 close(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
107 free(vcd);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
108 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
109 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
110 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
111 ret=vcd_seek_to_track(vcd,p->track);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
112 if(ret<0){
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
113 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
114 close(f);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
115 free(vcd);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
116 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
117 return STREAM_ERROR;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
118 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
119 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
120
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
121 #ifdef __FreeBSD__
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
122 if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
123 mp_msg(MSGT_OPEN,MSGL_WARN,"Error in CDRIOCSETBLOCKSIZE");
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
124 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
125 #endif
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
126
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
127 stream->fd = f;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
128 stream->type = STREAMTYPE_VCD;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
129 stream->sector_size = VCD_SECTOR_DATA;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
130 stream->start_pos=ret;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
131 stream->end_pos=ret2;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
132 stream->priv = vcd;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
133
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
134 stream->fill_buffer = fill_buffer;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
135 stream->seek = seek;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
136 stream->close = close_s;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
137
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
138 m_struct_free(&stream_opts,opts);
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
139 return STREAM_OK;
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
140 }
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
141
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
142 stream_info_t stream_info_vcd = {
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
143 "Video CD",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
144 "vcd",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
145 "Albeu",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
146 "based on the code from ???",
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
147 open_s,
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
148 { "vcd", NULL },
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
149 &stream_opts,
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
150 1 // Urls are an option string
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
151 };
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
152
e578e4375434 Port vcd to the new API
albeu
parents:
diff changeset
153 #endif