Mercurial > mplayer.hg
annotate libmpdemux/stream.h @ 10252:d275152390ee
I've found some time to implement the encoding support for the new
DivX API. Now it's possible to play and encode movies with the
latest DivX release.
One thing that doesn't work is the new Video Buffer Verifier (VBV)
multipass encoding. The encoder segfaults. Maybe it just isn't
supported with the standard profile of the released binary encoder.
Andreas Hess <jaska@gmx.net>
author | arpi |
---|---|
date | Fri, 06 Jun 2003 19:57:37 +0000 |
parents | d42177a0da2a |
children | 57bdcdb061d7 |
rev | line source |
---|---|
998
8c83e3ff26cc
Added ifndef to prevent multiple header file inclusion.
bertrand
parents:
692
diff
changeset
|
1 #ifndef __STREAM_H |
8c83e3ff26cc
Added ifndef to prevent multiple header file inclusion.
bertrand
parents:
692
diff
changeset
|
2 #define __STREAM_H |
578 | 3 |
5086 | 4 #include "mp_msg.h" |
7412
ecef4f2191b2
some cosmetics - reordering declarations, 10l for cache2
arpi
parents:
7408
diff
changeset
|
5 #include <string.h> |
4029
3c87dee7a324
patch for missing include by Steven M. Schultz <sms@2BSD.COM>
pl
parents:
3998
diff
changeset
|
6 #include <inttypes.h> |
5292 | 7 #include <sys/types.h> |
4029
3c87dee7a324
patch for missing include by Steven M. Schultz <sms@2BSD.COM>
pl
parents:
3998
diff
changeset
|
8 |
7407 | 9 #define STREAMTYPE_DUMMY -1 // for placeholders, when the actual reading is handled in the demuxer |
10 #define STREAMTYPE_FILE 0 // read from seekable file | |
11 #define STREAMTYPE_VCD 1 // raw mode-2 CDROM reading, 2324 bytes/sector | |
12 #define STREAMTYPE_STREAM 2 // same as FILE but no seeking (for net/stdin) | |
13 #define STREAMTYPE_DVD 3 // libdvdread | |
14 #define STREAMTYPE_MEMORY 4 // read data from memory area | |
15 #define STREAMTYPE_PLAYLIST 6 // FIXME!!! same as STREAMTYPE_FILE now | |
16 #define STREAMTYPE_DS 8 // read from a demuxer stream | |
17 #define STREAMTYPE_DVDNAV 9 // we cannot safely "seek" in this... | |
18 #define STREAMTYPE_CDDA 10 // raw audio CD reader | |
7630
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7412
diff
changeset
|
19 #define STREAMTYPE_SMB 11 // smb:// url, using libsmbclient (samba) |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8164
diff
changeset
|
20 #define STREAMTYPE_VCDBINCUE 12 // vcd directly from bin/cue files |
9610 | 21 #define STREAMTYPE_DVB 13 |
578 | 22 |
7412
ecef4f2191b2
some cosmetics - reordering declarations, 10l for cache2
arpi
parents:
7408
diff
changeset
|
23 #define STREAM_BUFFER_SIZE 2048 |
ecef4f2191b2
some cosmetics - reordering declarations, 10l for cache2
arpi
parents:
7408
diff
changeset
|
24 |
578 | 25 #define VCD_SECTOR_SIZE 2352 |
26 #define VCD_SECTOR_OFFS 24 | |
27 #define VCD_SECTOR_DATA 2324 | |
28 | |
9794 | 29 /// atm it will always use mode == STREAM_READ |
30 /// streams that use the new api should check the mode at open | |
31 #define STREAM_READ 0 | |
32 #define STREAM_WRITE 1 | |
33 /// Seek flags, if not mannualy set and s->seek isn't NULL | |
34 /// STREAM_SEEK is automaticly set | |
35 #define STREAM_SEEK_BW 2 | |
36 #define STREAM_SEEK_FW 4 | |
37 #define STREAM_SEEK (STREAM_SEEK_BW|STREAM_SEEK_FW) | |
38 | |
39 //////////// Open return code | |
40 /// This can't open the requested protocol (used by stream wich have a | |
41 /// * protocol when they don't know the requested protocol) | |
42 #define STREAM_UNSUPORTED -1 | |
43 #define STREAM_ERROR 0 | |
44 #define STREAM_OK 1 | |
45 | |
46 #define MAX_STREAM_PROTOCOLS 10 | |
47 | |
9851 | 48 #define STREAM_CTRL_RESET 0 |
9794 | 49 |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9886
diff
changeset
|
50 #ifdef MPLAYER_NETWORK |
3043
02a43ca97b52
Added a new struct to stream_t to handle, network streaming.
bertrand
parents:
2935
diff
changeset
|
51 #include "network.h" |
02a43ca97b52
Added a new struct to stream_t to handle, network streaming.
bertrand
parents:
2935
diff
changeset
|
52 #endif |
02a43ca97b52
Added a new struct to stream_t to handle, network streaming.
bertrand
parents:
2935
diff
changeset
|
53 |
9794 | 54 struct stream_st; |
55 typedef struct stream_info_st { | |
56 const char *info; | |
57 const char *name; | |
58 const char *author; | |
59 const char *comment; | |
60 /// mode isn't used atm (ie always READ) but it shouldn't be ignored | |
61 /// opts is at least in it's defaults settings and may have been | |
62 /// altered by url parsing if enabled and the options string parsing. | |
63 int (*open)(struct stream_st* st, int mode, void* opts, int* file_format); | |
64 char* protocols[MAX_STREAM_PROTOCOLS]; | |
65 void* opts; | |
66 int opts_url; /* If this is 1 we will parse the url as an option string | |
67 * too. Otherwise options are only parsed from the | |
68 * options string given to open_stream_plugin */ | |
69 } stream_info_t; | |
70 | |
8164
487cfc28525d
New config system + cleanup of header inter dependency
albeu
parents:
7854
diff
changeset
|
71 typedef struct stream_st { |
9794 | 72 // Read |
73 int (*fill_buffer)(struct stream_st *s, char* buffer, int max_len); | |
74 // Write | |
75 int (*write_buffer)(struct stream_st *s, char* buffer, int len); | |
76 // Seek | |
77 int (*seek)(struct stream_st *s,off_t pos); | |
78 // Control | |
79 // Will be later used to let streams like dvd and cdda report | |
80 // their structure (ie tracks, chapters, etc) | |
81 int (*control)(struct stream_st *s,int cmd,void* arg); | |
82 // Close | |
83 void (*close)(struct stream_st *s); | |
84 | |
7407 | 85 int fd; // file descriptor, see man open(2) |
86 int type; // see STREAMTYPE_* | |
9794 | 87 int flags; |
88 int sector_size; // sector size (seek will be aligned on this size if non 0) | |
578 | 89 unsigned int buf_pos,buf_len; |
6224
79b2b4c3c435
off_t fields reordered, to avoid problems due to struct padding
arpi
parents:
5819
diff
changeset
|
90 off_t pos,start_pos,end_pos; |
79b2b4c3c435
off_t fields reordered, to avoid problems due to struct padding
arpi
parents:
5819
diff
changeset
|
91 int eof; |
2322 | 92 unsigned int cache_pid; |
93 void* cache_data; | |
7329
9129781e5939
removed messy global 'tv_handle', use stream->priv for that purpose
arpi
parents:
7245
diff
changeset
|
94 void* priv; // used for DVD, TV, RTSP etc |
7407 | 95 char* url; // strdup() of filename/url |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9886
diff
changeset
|
96 #ifdef MPLAYER_NETWORK |
3043
02a43ca97b52
Added a new struct to stream_t to handle, network streaming.
bertrand
parents:
2935
diff
changeset
|
97 streaming_ctrl_t *streaming_ctrl; |
02a43ca97b52
Added a new struct to stream_t to handle, network streaming.
bertrand
parents:
2935
diff
changeset
|
98 #endif |
7407 | 99 unsigned char buffer[STREAM_BUFFER_SIZE>VCD_SECTOR_SIZE?STREAM_BUFFER_SIZE:VCD_SECTOR_SIZE]; |
578 | 100 } stream_t; |
101 | |
2322 | 102 #ifdef USE_STREAM_CACHE |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4551
diff
changeset
|
103 int stream_enable_cache(stream_t *stream,int size,int min,int prefill); |
7412
ecef4f2191b2
some cosmetics - reordering declarations, 10l for cache2
arpi
parents:
7408
diff
changeset
|
104 int cache_stream_fill_buffer(stream_t *s); |
ecef4f2191b2
some cosmetics - reordering declarations, 10l for cache2
arpi
parents:
7408
diff
changeset
|
105 int cache_stream_seek_long(stream_t *s,off_t pos); |
2322 | 106 #else |
7412
ecef4f2191b2
some cosmetics - reordering declarations, 10l for cache2
arpi
parents:
7408
diff
changeset
|
107 // no cache, define wrappers: |
2322 | 108 #define cache_stream_fill_buffer(x) stream_fill_buffer(x) |
109 #define cache_stream_seek_long(x,y) stream_seek_long(x,y) | |
5292 | 110 #define stream_enable_cache(x,y,z,w) 1 |
2322 | 111 #endif |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
998
diff
changeset
|
112 |
578 | 113 inline static int stream_read_char(stream_t *s){ |
114 return (s->buf_pos<s->buf_len)?s->buffer[s->buf_pos++]: | |
2322 | 115 (cache_stream_fill_buffer(s)?s->buffer[s->buf_pos++]:-256); |
578 | 116 // if(s->buf_pos<s->buf_len) return s->buffer[s->buf_pos++]; |
117 // stream_fill_buffer(s); | |
118 // if(s->buf_pos<s->buf_len) return s->buffer[s->buf_pos++]; | |
119 // return 0; // EOF | |
120 } | |
121 | |
122 inline static unsigned int stream_read_word(stream_t *s){ | |
123 int x,y; | |
124 x=stream_read_char(s); | |
125 y=stream_read_char(s); | |
126 return (x<<8)|y; | |
127 } | |
128 | |
129 inline static unsigned int stream_read_dword(stream_t *s){ | |
130 unsigned int y; | |
131 y=stream_read_char(s); | |
132 y=(y<<8)|stream_read_char(s); | |
133 y=(y<<8)|stream_read_char(s); | |
134 y=(y<<8)|stream_read_char(s); | |
135 return y; | |
136 } | |
137 | |
4189 | 138 #define stream_read_fourcc stream_read_dword_le |
139 | |
578 | 140 inline static unsigned int stream_read_word_le(stream_t *s){ |
141 int x,y; | |
142 x=stream_read_char(s); | |
143 y=stream_read_char(s); | |
144 return (y<<8)|x; | |
145 } | |
146 | |
147 inline static unsigned int stream_read_dword_le(stream_t *s){ | |
148 unsigned int y; | |
149 y=stream_read_char(s); | |
150 y|=stream_read_char(s)<<8; | |
151 y|=stream_read_char(s)<<16; | |
152 y|=stream_read_char(s)<<24; | |
153 return y; | |
154 } | |
155 | |
3998 | 156 inline static uint64_t stream_read_qword(stream_t *s){ |
157 uint64_t y; | |
158 y = stream_read_char(s); | |
159 y=(y<<8)|stream_read_char(s); | |
160 y=(y<<8)|stream_read_char(s); | |
161 y=(y<<8)|stream_read_char(s); | |
162 y=(y<<8)|stream_read_char(s); | |
163 y=(y<<8)|stream_read_char(s); | |
164 y=(y<<8)|stream_read_char(s); | |
165 y=(y<<8)|stream_read_char(s); | |
166 return y; | |
167 } | |
168 | |
5301 | 169 inline static unsigned int stream_read_int24(stream_t *s){ |
170 unsigned int y; | |
171 y = stream_read_char(s); | |
172 y=(y<<8)|stream_read_char(s); | |
173 y=(y<<8)|stream_read_char(s); | |
174 return y; | |
175 } | |
176 | |
2347 | 177 inline static int stream_read(stream_t *s,char* mem,int total){ |
178 int len=total; | |
578 | 179 while(len>0){ |
180 int x; | |
181 x=s->buf_len-s->buf_pos; | |
182 if(x==0){ | |
2347 | 183 if(!cache_stream_fill_buffer(s)) return total-len; // EOF |
578 | 184 x=s->buf_len-s->buf_pos; |
185 } | |
5086 | 186 if(s->buf_pos>s->buf_len) mp_msg(MSGT_DEMUX, MSGL_WARN, "stream_read: WARNING! s->buf_pos>s->buf_len\n"); |
578 | 187 if(x>len) x=len; |
188 memcpy(mem,&s->buffer[s->buf_pos],x); | |
189 s->buf_pos+=x; mem+=x; len-=x; | |
190 } | |
2347 | 191 return total; |
578 | 192 } |
193 | |
194 inline static int stream_eof(stream_t *s){ | |
195 return s->eof; | |
196 } | |
197 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
998
diff
changeset
|
198 inline static off_t stream_tell(stream_t *s){ |
578 | 199 return s->pos+s->buf_pos-s->buf_len; |
200 } | |
201 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
998
diff
changeset
|
202 inline static int stream_seek(stream_t *s,off_t pos){ |
578 | 203 |
5086 | 204 mp_dbg(MSGT_DEMUX, MSGL_DBG3, "seek to 0x%qX\n",(long long)pos); |
578 | 205 |
206 if(pos<s->pos){ | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
998
diff
changeset
|
207 off_t x=pos-(s->pos-s->buf_len); |
578 | 208 if(x>=0){ |
209 s->buf_pos=x; | |
210 // putchar('*');fflush(stdout); | |
211 return 1; | |
212 } | |
213 } | |
214 | |
2322 | 215 return cache_stream_seek_long(s,pos); |
578 | 216 } |
217 | |
3962 | 218 inline static int stream_skip(stream_t *s,off_t len){ |
692 | 219 if(len<0 || (len>2*STREAM_BUFFER_SIZE && s->type!=STREAMTYPE_STREAM)){ |
578 | 220 // negative or big skip! |
1491 | 221 return stream_seek(s,stream_tell(s)+len); |
578 | 222 } |
223 while(len>0){ | |
224 int x=s->buf_len-s->buf_pos; | |
225 if(x==0){ | |
2322 | 226 if(!cache_stream_fill_buffer(s)) return 0; // EOF |
578 | 227 x=s->buf_len-s->buf_pos; |
228 } | |
229 if(x>len) x=len; | |
230 //memcpy(mem,&s->buf[s->buf_pos],x); | |
231 s->buf_pos+=x; len-=x; | |
232 } | |
1491 | 233 return 1; |
578 | 234 } |
235 | |
236 void stream_reset(stream_t *s); | |
237 stream_t* new_stream(int fd,int type); | |
238 void free_stream(stream_t *s); | |
2144 | 239 stream_t* new_memory_stream(unsigned char* data,int len); |
9794 | 240 stream_t* open_stream(char* filename,char** options,int* file_format); |
241 stream_t* open_stream_full(char* filename,int mode, char** options, int* file_format); | |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2347
diff
changeset
|
242 |
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2347
diff
changeset
|
243 //#ifdef USE_DVDREAD |
4407 | 244 struct config; |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2347
diff
changeset
|
245 extern int dvd_title; |
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2347
diff
changeset
|
246 extern int dvd_chapter; |
4291
e889d37f25b2
Add option -last-chapter for DVD playing/encoding
kmkaplan
parents:
4189
diff
changeset
|
247 extern int dvd_last_chapter; |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2347
diff
changeset
|
248 extern int dvd_angle; |
4343
b0c8eed7473c
Extended DVD chapter specification. Remove -last-chapter option.
kmkaplan
parents:
4315
diff
changeset
|
249 int dvd_parse_chapter_range(struct config*, const char*); |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2347
diff
changeset
|
250 //#endif |
998
8c83e3ff26cc
Added ifndef to prevent multiple header file inclusion.
bertrand
parents:
692
diff
changeset
|
251 |
9611 | 252 extern int dvbin_param_on; |
253 | |
6623 | 254 extern char * audio_stream; |
255 | |
5471
348c7d83e710
dvdnav_stream functions - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5380
diff
changeset
|
256 #ifdef USE_DVDNAV |
348c7d83e710
dvdnav_stream functions - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5380
diff
changeset
|
257 #include "dvdnav_stream.h" |
348c7d83e710
dvdnav_stream functions - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5380
diff
changeset
|
258 #endif |
348c7d83e710
dvdnav_stream functions - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5380
diff
changeset
|
259 |
2935 | 260 #ifdef USE_DVDREAD |
261 | |
5819 | 262 #ifdef USE_MPDVDKIT |
7245 | 263 #if (USE_MPDVDKIT == 2) |
7196 | 264 #include "../libmpdvdkit2/dvd_reader.h" |
265 #include "../libmpdvdkit2/ifo_types.h" | |
266 #include "../libmpdvdkit2/ifo_read.h" | |
267 #include "../libmpdvdkit2/nav_read.h" | |
268 #else | |
5819 | 269 #include "../libmpdvdkit/dvd_reader.h" |
270 #include "../libmpdvdkit/ifo_types.h" | |
271 #include "../libmpdvdkit/ifo_read.h" | |
272 #include "../libmpdvdkit/nav_read.h" | |
7196 | 273 #endif |
5819 | 274 #else |
2935 | 275 #include <dvdread/dvd_reader.h> |
276 #include <dvdread/ifo_types.h> | |
277 #include <dvdread/ifo_read.h> | |
278 #include <dvdread/nav_read.h> | |
5819 | 279 #endif |
2935 | 280 |
281 typedef struct { | |
282 int id; // 0 - 31 mpeg; 128 - 159 ac3; 160 - 191 pcm | |
283 int language; | |
6651 | 284 int type; |
285 int channels; | |
3751
d9d2ee82a243
subtitle_t + audio_stream_t -> stream_language_t (cleanup)
arpi
parents:
3726
diff
changeset
|
286 } stream_language_t; |
3048 | 287 |
288 typedef struct { | |
2935 | 289 dvd_reader_t *dvd; |
290 dvd_file_t *title; | |
291 ifo_handle_t *vmg_file; | |
292 tt_srpt_t *tt_srpt; | |
293 ifo_handle_t *vts_file; | |
294 vts_ptt_srpt_t *vts_ptt_srpt; | |
295 pgc_t *cur_pgc; | |
296 // | |
297 int cur_cell; | |
4291
e889d37f25b2
Add option -last-chapter for DVD playing/encoding
kmkaplan
parents:
4189
diff
changeset
|
298 int last_cell; |
2935 | 299 int cur_pack; |
300 int cell_last_pack; | |
301 // Navi: | |
302 int packs_left; | |
303 dsi_t dsi_pack; | |
304 int angle_seek; | |
305 // audio datas | |
306 int nr_of_channels; | |
3751
d9d2ee82a243
subtitle_t + audio_stream_t -> stream_language_t (cleanup)
arpi
parents:
3726
diff
changeset
|
307 stream_language_t audio_streams[32]; |
3048 | 308 // subtitles |
309 int nr_of_subtitles; | |
3751
d9d2ee82a243
subtitle_t + audio_stream_t -> stream_language_t (cleanup)
arpi
parents:
3726
diff
changeset
|
310 stream_language_t subtitles[32]; |
2935 | 311 } dvd_priv_t; |
312 | |
3753 | 313 int dvd_aid_from_lang(stream_t *stream, unsigned char* lang); |
314 int dvd_sid_from_lang(stream_t *stream, unsigned char* lang); | |
7854 | 315 int dvd_chapter_from_cell(dvd_priv_t *dvd,int title,int cell); |
3753 | 316 |
2935 | 317 #endif |
318 | |
998
8c83e3ff26cc
Added ifndef to prevent multiple header file inclusion.
bertrand
parents:
692
diff
changeset
|
319 #endif // __STREAM_H |