Mercurial > mplayer.hg
annotate stream/stream.c @ 35965:7038dec225b1
Fix KEY_BACKSPACE, KEY_DELETE and KEY_ESC to map to their ASCII equivalents.
Also avoids some issues with our X11 key string lookup
ending up translating these to their ASCII values,
which before resulted in "unknown key" messages.
author | reimar |
---|---|
date | Mon, 25 Mar 2013 22:54:54 +0000 |
parents | 3389262720da |
children | a5fd69f820f3 |
rev | line source |
---|---|
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
1 /* |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
2 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
7 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
8 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
12 * GNU General Public License for more details. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
13 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
30361
diff
changeset
|
17 */ |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
18 |
1430 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <unistd.h> | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
22 |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
23 #include <sys/types.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
24 #include <sys/stat.h> |
9798 | 25 #ifndef __MINGW32__ |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
26 #include <sys/ioctl.h> |
6814 | 27 #include <sys/wait.h> |
9798 | 28 #endif |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
29 #include <fcntl.h> |
9794 | 30 #include <strings.h> |
32794
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32511
diff
changeset
|
31 #include <assert.h> |
578 | 32 |
1430 | 33 #include "config.h" |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
34 |
28402 | 35 #if HAVE_WINSOCK2_H |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
36 #include <winsock2.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
37 #endif |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
38 |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
39 #include "mp_msg.h" |
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
40 #include "help_mp.h" |
17012 | 41 #include "osdep/shmem.h" |
31496 | 42 #include "osdep/timer.h" |
27473
ae5da477539e
Move '#define closesocket close' preprocessor directive to a common place
diego
parents:
27472
diff
changeset
|
43 #include "network.h" |
578 | 44 #include "stream.h" |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19301
diff
changeset
|
45 #include "libmpdemux/demuxer.h" |
31592
a4ceb52caa30
Fix compilation broken due to GET_UTF8 being undefined.
reimar
parents:
31565
diff
changeset
|
46 #include "libavutil/common.h" |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
47 #include "libavutil/intreadwrite.h" |
578 | 48 |
17012 | 49 #include "m_option.h" |
50 #include "m_struct.h" | |
9794 | 51 |
19808
5385740067a1
* remove extern definitions of functions in .c files
attila
parents:
19568
diff
changeset
|
52 #include "cache2.h" |
1 | 53 |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
54 static int (*stream_check_interrupt_cb)(int time) = NULL; |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
55 |
31836
dcd515ac5f6c
Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
31683
diff
changeset
|
56 extern const stream_info_t stream_info_bd; |
25211 | 57 extern const stream_info_t stream_info_vcd; |
58 extern const stream_info_t stream_info_cdda; | |
59 extern const stream_info_t stream_info_netstream; | |
60 extern const stream_info_t stream_info_pnm; | |
61 extern const stream_info_t stream_info_asf; | |
62 extern const stream_info_t stream_info_rtsp; | |
63 extern const stream_info_t stream_info_rtp; | |
64 extern const stream_info_t stream_info_udp; | |
65 extern const stream_info_t stream_info_http1; | |
66 extern const stream_info_t stream_info_http2; | |
67 extern const stream_info_t stream_info_dvb; | |
68 extern const stream_info_t stream_info_tv; | |
69 extern const stream_info_t stream_info_radio; | |
70 extern const stream_info_t stream_info_pvr; | |
71 extern const stream_info_t stream_info_ftp; | |
72 extern const stream_info_t stream_info_vstream; | |
73 extern const stream_info_t stream_info_dvdnav; | |
74 extern const stream_info_t stream_info_smb; | |
75 extern const stream_info_t stream_info_sdp; | |
76 extern const stream_info_t stream_info_rtsp_sip; | |
10560 | 77 |
25211 | 78 extern const stream_info_t stream_info_cue; |
79 extern const stream_info_t stream_info_null; | |
80 extern const stream_info_t stream_info_mf; | |
29881
5797dc687a8e
Add preliminary support for streaming via FFmpeg's URProtocol functions.
reimar
parents:
29819
diff
changeset
|
81 extern const stream_info_t stream_info_ffmpeg; |
25211 | 82 extern const stream_info_t stream_info_file; |
83 extern const stream_info_t stream_info_ifo; | |
84 extern const stream_info_t stream_info_dvd; | |
31565
9a590e7aac57
Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
31496
diff
changeset
|
85 extern const stream_info_t stream_info_bluray; |
9794 | 86 |
25209 | 87 static const stream_info_t* const auto_open_streams[] = { |
31836
dcd515ac5f6c
Add support for bd:// streams as a test for a part of the AACS algorithm.
reimar
parents:
31683
diff
changeset
|
88 &stream_info_bd, |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
89 #ifdef CONFIG_VCD |
9886 | 90 &stream_info_vcd, |
91 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27370
diff
changeset
|
92 #ifdef CONFIG_CDDA |
9801 | 93 &stream_info_cdda, |
9810 | 94 #endif |
31683
db0b49579eeb
Rename network build system variable and command line option to networking.
diego
parents:
31592
diff
changeset
|
95 #ifdef CONFIG_NETWORKING |
9853 | 96 &stream_info_netstream, |
15585 | 97 &stream_info_http1, |
98 &stream_info_asf, | |
99 &stream_info_pnm, | |
100 &stream_info_rtsp, | |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
101 #ifdef CONFIG_LIVE555 |
15585 | 102 &stream_info_sdp, |
103 &stream_info_rtsp_sip, | |
104 #endif | |
19313
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
105 &stream_info_rtp, |
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
106 &stream_info_udp, |
15585 | 107 &stream_info_http2, |
9853 | 108 #endif |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
109 #ifdef CONFIG_DVBIN |
10560 | 110 &stream_info_dvb, |
111 #endif | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
112 #ifdef CONFIG_TV |
19273
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
113 &stream_info_tv, |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
114 #endif |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
115 #ifdef CONFIG_RADIO |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
116 &stream_info_radio, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
117 #endif |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
118 #ifdef CONFIG_PVR |
18997 | 119 &stream_info_pvr, |
120 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27370
diff
changeset
|
121 #ifdef CONFIG_FTP |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
122 &stream_info_ftp, |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
123 #endif |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27370
diff
changeset
|
124 #ifdef CONFIG_VSTREAM |
14836
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
125 &stream_info_vstream, |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
126 #endif |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
127 #ifdef CONFIG_LIBSMBCLIENT |
15520 | 128 &stream_info_smb, |
129 #endif | |
15476
5eb4994a691f
ported cue:// to the new stream api; note: this stream must still be optimized in its read() and seek() functions
nicodvb
parents:
15421
diff
changeset
|
130 &stream_info_cue, |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
131 #ifdef CONFIG_DVDREAD |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25209
diff
changeset
|
132 &stream_info_ifo, |
15518 | 133 &stream_info_dvd, |
17191
6ac0b5f0d1ed
fix compilation when dvdkit and dvdread are not available
nicodvb
parents:
17012
diff
changeset
|
134 #endif |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
135 #ifdef CONFIG_DVDNAV |
18712
cb7da1894b00
restored support for dvdnav only in the stream layer; all other functionalities are disabled
nicodvb
parents:
18558
diff
changeset
|
136 &stream_info_dvdnav, |
15518 | 137 #endif |
31565
9a590e7aac57
Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
31496
diff
changeset
|
138 #ifdef CONFIG_LIBBLURAY |
9a590e7aac57
Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
31496
diff
changeset
|
139 &stream_info_bluray, |
9a590e7aac57
Support for unencrypted Blu-ray playback through libbluray.
ben
parents:
31496
diff
changeset
|
140 #endif |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31918
diff
changeset
|
141 #ifdef CONFIG_FFMPEG |
29881
5797dc687a8e
Add preliminary support for streaming via FFmpeg's URProtocol functions.
reimar
parents:
29819
diff
changeset
|
142 &stream_info_ffmpeg, |
5797dc687a8e
Add preliminary support for streaming via FFmpeg's URProtocol functions.
reimar
parents:
29819
diff
changeset
|
143 #endif |
15518 | 144 |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
145 &stream_info_null, |
19301 | 146 &stream_info_mf, |
9794 | 147 &stream_info_file, |
148 NULL | |
149 }; | |
150 | |
30697
9a49143918aa
Mark stream open filename parameter as const, the filename string is not
reimar
parents:
30626
diff
changeset
|
151 static stream_t* open_stream_plugin(const stream_info_t* sinfo, const char* filename, |
30557
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
152 int mode, char** options, int* file_format, |
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
153 int* ret, char** redirected_url) |
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
154 { |
9794 | 155 void* arg = NULL; |
156 stream_t* s; | |
157 m_struct_t* desc = (m_struct_t*)sinfo->opts; | |
158 | |
159 // Parse options | |
160 if(desc) { | |
161 arg = m_struct_alloc(desc); | |
162 if(sinfo->opts_url) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
163 m_option_t url_opt = |
9794 | 164 { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; |
165 if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { | |
33367 | 166 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_URLParsingFailed,filename); |
9794 | 167 m_struct_free(desc,arg); |
168 return NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
169 } |
9794 | 170 } |
171 if(options) { | |
172 int i; | |
173 for(i = 0 ; options[i] != NULL ; i += 2) { | |
174 mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", | |
175 options[i],options[i+1]); | |
176 if(!m_struct_set(desc,arg,options[i],options[i+1])) | |
33367 | 177 mp_msg(MSGT_OPEN,MSGL_WARN, MSGTR_FailedSetStreamOption, |
9794 | 178 options[i],options[i+1]); |
179 } | |
180 } | |
181 } | |
182 s = new_stream(-2,-2); | |
32438
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
183 s->capture_file = NULL; |
9794 | 184 s->url=strdup(filename); |
185 s->flags |= mode; | |
186 *ret = sinfo->open(s,mode,arg,file_format); | |
187 if((*ret) != STREAM_OK) { | |
31683
db0b49579eeb
Rename network build system variable and command line option to networking.
diego
parents:
31592
diff
changeset
|
188 #ifdef CONFIG_NETWORKING |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
189 if (*ret == STREAM_REDIRECTED && redirected_url) { |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
190 if (s->streaming_ctrl && s->streaming_ctrl->url |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
191 && s->streaming_ctrl->url->url) |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
192 *redirected_url = strdup(s->streaming_ctrl->url->url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
193 else |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
194 *redirected_url = NULL; |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
195 } |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
196 streaming_ctrl_free(s->streaming_ctrl); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
197 #endif |
9794 | 198 free(s->url); |
199 free(s); | |
200 return NULL; | |
201 } | |
202 if(s->type <= -2) | |
33367 | 203 mp_msg(MSGT_OPEN,MSGL_WARN, MSGTR_StreamNeedType); |
29920
4f740437ed2b
Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many
reimar
parents:
29887
diff
changeset
|
204 if(s->flags & MP_STREAM_SEEK && !s->seek) |
4f740437ed2b
Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many
reimar
parents:
29887
diff
changeset
|
205 s->flags &= ~MP_STREAM_SEEK; |
4f740437ed2b
Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many
reimar
parents:
29887
diff
changeset
|
206 if(s->seek && !(s->flags & MP_STREAM_SEEK)) |
4f740437ed2b
Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many
reimar
parents:
29887
diff
changeset
|
207 s->flags |= MP_STREAM_SEEK; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
208 |
21659 | 209 s->mode = mode; |
9794 | 210 |
211 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); | |
212 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); | |
213 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); | |
214 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
215 |
9794 | 216 return s; |
217 } | |
218 | |
219 | |
30697
9a49143918aa
Mark stream open filename parameter as const, the filename string is not
reimar
parents:
30626
diff
changeset
|
220 stream_t* open_stream_full(const char* filename,int mode, char** options, int* file_format) { |
9794 | 221 int i,j,l,r; |
25207
21d672c608ef
auto_open_streams should have const type, fix also the places where it is used
reimar
parents:
25186
diff
changeset
|
222 const stream_info_t* sinfo; |
9794 | 223 stream_t* s; |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
224 char *redirected_url = NULL; |
9794 | 225 |
226 for(i = 0 ; auto_open_streams[i] ; i++) { | |
227 sinfo = auto_open_streams[i]; | |
228 if(!sinfo->protocols) { | |
33367 | 229 mp_msg(MSGT_OPEN,MSGL_WARN, MSGTR_StreamProtocolNULL, sinfo->name); |
9794 | 230 continue; |
231 } | |
232 for(j = 0 ; sinfo->protocols[j] ; j++) { | |
233 l = strlen(sinfo->protocols[j]); | |
234 // l == 0 => Don't do protocol matching (ie network and filenames) | |
21493
8ca0be3a46a0
Make sure invalid protocols are rejected instead of treated
reimar
parents:
20635
diff
changeset
|
235 if((l == 0 && !strstr(filename, "://")) || |
25429 | 236 ((strncasecmp(sinfo->protocols[j],filename,l) == 0) && |
9794 | 237 (strncmp("://",filename+l,3) == 0))) { |
238 *file_format = DEMUXER_TYPE_UNKNOWN; | |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
239 s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r, |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
240 &redirected_url); |
9794 | 241 if(s) return s; |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
242 if(r == STREAM_REDIRECTED && redirected_url) { |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
243 mp_msg(MSGT_OPEN,MSGL_V, "[%s] open %s redirected to %s\n", |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
244 sinfo->info, filename, redirected_url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
245 s = open_stream_full(redirected_url, mode, options, file_format); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
246 free(redirected_url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
247 return s; |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
248 } |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
249 else if(r != STREAM_UNSUPPORTED) { |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16762
diff
changeset
|
250 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_FailedToOpen,filename); |
9794 | 251 return NULL; |
252 } | |
253 break; | |
254 } | |
255 } | |
256 } | |
257 | |
33367 | 258 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_StreamCantHandleURL,filename); |
9794 | 259 return NULL; |
260 } | |
261 | |
30697
9a49143918aa
Mark stream open filename parameter as const, the filename string is not
reimar
parents:
30626
diff
changeset
|
262 stream_t* open_output_stream(const char* filename, char** options) { |
21659 | 263 int file_format; //unused |
264 if(!filename) { | |
33367 | 265 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_StreamNULLFilename); |
21659 | 266 return NULL; |
267 } | |
268 | |
269 return open_stream_full(filename,STREAM_WRITE,options,&file_format); | |
270 } | |
271 | |
1 | 272 //=================== STREAMER ========================= |
273 | |
32438
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
274 void stream_capture_do(stream_t *s) |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
275 { |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
276 if (fwrite(s->buffer, s->buf_len, 1, s->capture_file) < 1) { |
33367 | 277 mp_msg(MSGT_GLOBAL, MSGL_ERR, MSGTR_StreamErrorWritingCapture, |
32438
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
278 strerror(errno)); |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
279 fclose(s->capture_file); |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
280 s->capture_file = NULL; |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
281 } |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
282 } |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
283 |
34783 | 284 static int stream_reconnect(stream_t *s) |
285 { | |
286 #define MAX_RECONNECT_RETRIES 5 | |
287 #define RECONNECT_SLEEP_MS 1000 | |
288 int retry = 0; | |
35885
3389262720da
Fix previous commit, off_t must be replaced by int64_t
reimar
parents:
35881
diff
changeset
|
289 int64_t pos = s->pos; |
34783 | 290 // Seeking is used as a hack to make network streams |
291 // reopen the connection, ideally they would implement | |
292 // e.g. a STREAM_CTRL_RECONNECT to do this | |
293 do { | |
294 if (retry >= MAX_RECONNECT_RETRIES) | |
295 return 0; | |
296 if (retry) usec_sleep(RECONNECT_SLEEP_MS * 1000); | |
297 retry++; | |
298 s->eof=1; | |
299 stream_reset(s); | |
300 } while (stream_seek_internal(s, pos) >= 0 || s->pos != pos); // seek failed | |
301 return 1; | |
302 } | |
303 | |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
304 int stream_read_internal(stream_t *s, void *buf, int len) |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
305 { |
32870 | 306 int orig_len = len; |
31169 | 307 // we will retry even if we already reached EOF previously. |
1 | 308 switch(s->type){ |
692 | 309 case STREAMTYPE_STREAM: |
31683
db0b49579eeb
Rename network build system variable and command line option to networking.
diego
parents:
31592
diff
changeset
|
310 #ifdef CONFIG_NETWORKING |
24963
0a733c2c577e
Fix possible null-pointer-dereference in stream_fill_buffer().
cehoyos
parents:
24257
diff
changeset
|
311 if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_read ) { |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
312 len=s->streaming_ctrl->streaming_read(s->fd, buf, len, s->streaming_ctrl); |
34785 | 313 if (s->streaming_ctrl->status == streaming_stopped_e && |
314 (!s->end_pos || s->pos == s->end_pos)) | |
33720 | 315 s->eof = 1; |
29819
2c2733d12823
The code for the non-networking case is the same whether networking
reimar
parents:
29818
diff
changeset
|
316 } else |
2c2733d12823
The code for the non-networking case is the same whether networking
reimar
parents:
29818
diff
changeset
|
317 #endif |
29883
306e614b92cb
Use fill_buffer if available also for STREAMTYPE_STREAM
reimar
parents:
29881
diff
changeset
|
318 if (s->fill_buffer) |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
319 len = s->fill_buffer(s, buf, len); |
29883
306e614b92cb
Use fill_buffer if available also for STREAMTYPE_STREAM
reimar
parents:
29881
diff
changeset
|
320 else |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
321 len = read(s->fd, buf, len); |
29818 | 322 break; |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
323 case STREAMTYPE_DS: |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
324 len = demux_read_data((demux_stream_t*)s->priv, buf, len); |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
325 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
326 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
327 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
328 default: |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
329 len= s->fill_buffer ? s->fill_buffer(s, buf, len) : 0; |
1 | 330 } |
32867
454f6decbd93
When reading from a stream fails, try one more time after a reset.
reimar
parents:
32794
diff
changeset
|
331 if(len<=0){ |
33721
1bb847d89fd5
Improve checks for when to try reconnecting to be more thorough and readable.
reimar
parents:
33720
diff
changeset
|
332 // do not retry if this looks like proper eof |
34783 | 333 if (s->eof || (s->end_pos && s->pos == s->end_pos)) |
33721
1bb847d89fd5
Improve checks for when to try reconnecting to be more thorough and readable.
reimar
parents:
33720
diff
changeset
|
334 goto eof_out; |
33035
f5dc85f6f84b
Add ugly hack to compensate DVDNAV's ugly hacks and fix seeking.
reimar
parents:
32890
diff
changeset
|
335 // dvdnav has some horrible hacks to "suspend" reads, |
f5dc85f6f84b
Add ugly hack to compensate DVDNAV's ugly hacks and fix seeking.
reimar
parents:
32890
diff
changeset
|
336 // we need to skip this code or seeks will hang. |
33721
1bb847d89fd5
Improve checks for when to try reconnecting to be more thorough and readable.
reimar
parents:
33720
diff
changeset
|
337 if (s->type == STREAMTYPE_DVDNAV) |
1bb847d89fd5
Improve checks for when to try reconnecting to be more thorough and readable.
reimar
parents:
33720
diff
changeset
|
338 goto eof_out; |
33722 | 339 |
340 // just in case this is an error e.g. due to network | |
341 // timeout reset and retry | |
34783 | 342 if (!stream_reconnect(s)) |
33721
1bb847d89fd5
Improve checks for when to try reconnecting to be more thorough and readable.
reimar
parents:
33720
diff
changeset
|
343 goto eof_out; |
33722 | 344 // make sure EOF is set to ensure no endless loops |
345 s->eof=1; | |
346 return stream_read_internal(s, buf, orig_len); | |
347 | |
33721
1bb847d89fd5
Improve checks for when to try reconnecting to be more thorough and readable.
reimar
parents:
33720
diff
changeset
|
348 eof_out: |
32867
454f6decbd93
When reading from a stream fails, try one more time after a reset.
reimar
parents:
32794
diff
changeset
|
349 s->eof=1; |
454f6decbd93
When reading from a stream fails, try one more time after a reset.
reimar
parents:
32794
diff
changeset
|
350 return 0; |
454f6decbd93
When reading from a stream fails, try one more time after a reset.
reimar
parents:
32794
diff
changeset
|
351 } |
31169 | 352 // When reading succeeded we are obviously not at eof. |
353 // This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS | |
354 s->eof=0; | |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
355 s->pos+=len; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
356 return len; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
357 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
358 |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
359 int stream_fill_buffer(stream_t *s){ |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
360 int len = stream_read_internal(s, s->buffer, STREAM_BUFFER_SIZE); |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
361 if (len <= 0) |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
362 return 0; |
1 | 363 s->buf_pos=0; |
364 s->buf_len=len; | |
365 // printf("[%d]",len);fflush(stdout); | |
32438
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
366 if (s->capture_file) |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
367 stream_capture_do(s); |
1 | 368 return len; |
369 } | |
370 | |
21659 | 371 int stream_write_buffer(stream_t *s, unsigned char *buf, int len) { |
372 int rd; | |
373 if(!s->write_buffer) | |
374 return -1; | |
375 rd = s->write_buffer(s, buf, len); | |
376 if(rd < 0) | |
377 return -1; | |
378 s->pos += rd; | |
32794
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32511
diff
changeset
|
379 assert(rd == len && "stream_write_buffer(): unexpected short write"); |
21659 | 380 return rd; |
381 } | |
382 | |
35885
3389262720da
Fix previous commit, off_t must be replaced by int64_t
reimar
parents:
35881
diff
changeset
|
383 int stream_seek_internal(stream_t *s, int64_t newpos) |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
384 { |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
385 if(newpos==0 || newpos!=s->pos){ |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
386 switch(s->type){ |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
387 case STREAMTYPE_STREAM: |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
388 //s->pos=newpos; // real seek |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
389 // Some streaming protocol allow to seek backward and forward |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
390 // A function call that return -1 can tell that the protocol |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
391 // doesn't support seeking. |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
392 #ifdef CONFIG_NETWORKING |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
393 if(s->seek) { // new stream seek is much cleaner than streaming_ctrl one |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
394 if(!s->seek(s,newpos)) { |
33367 | 395 mp_msg(MSGT_STREAM,MSGL_ERR, MSGTR_StreamSeekFailed); |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
396 return 0; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
397 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
398 break; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
399 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
400 |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
401 if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_seek ) { |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
402 if( s->streaming_ctrl->streaming_seek( s->fd, newpos, s->streaming_ctrl )<0 ) { |
33367 | 403 mp_msg(MSGT_STREAM,MSGL_INFO,MSGTR_StreamNotSeekable); |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
404 return 1; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
405 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
406 break; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
407 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
408 #endif |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
409 if(newpos<s->pos){ |
33367 | 410 mp_msg(MSGT_STREAM,MSGL_INFO,MSGTR_StreamCannotSeekBackward); |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
411 return 1; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
412 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
413 break; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
414 default: |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
415 // This should at the beginning as soon as all streams are converted |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
416 if(!s->seek) |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
417 return 0; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
418 // Now seek |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
419 if(!s->seek(s,newpos)) { |
33367 | 420 mp_msg(MSGT_STREAM,MSGL_ERR, MSGTR_StreamSeekFailed); |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
421 return 0; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
422 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
423 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
424 // putchar('.');fflush(stdout); |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
425 //} else { |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
426 // putchar('%');fflush(stdout); |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
427 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
428 return -1; |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
429 } |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
430 |
35885
3389262720da
Fix previous commit, off_t must be replaced by int64_t
reimar
parents:
35881
diff
changeset
|
431 int stream_seek_long(stream_t *s, int64_t pos){ |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
432 int res; |
35885
3389262720da
Fix previous commit, off_t must be replaced by int64_t
reimar
parents:
35881
diff
changeset
|
433 int64_t newpos=0; |
1 | 434 |
17932 | 435 // if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ) printf("seek_long to 0x%X\n",(unsigned int)pos); |
1 | 436 |
437 s->buf_pos=s->buf_len=0; | |
438 | |
21659 | 439 if(s->mode == STREAM_WRITE) { |
440 if(!s->seek || !s->seek(s,pos)) | |
441 return 0; | |
442 return 1; | |
443 } | |
444 | |
22362
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
445 if(s->sector_size) |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
446 newpos = (pos/s->sector_size)*s->sector_size; |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
447 else |
35885
3389262720da
Fix previous commit, off_t must be replaced by int64_t
reimar
parents:
35881
diff
changeset
|
448 newpos = pos&(~((int64_t)STREAM_BUFFER_SIZE-1)); |
1 | 449 |
17932 | 450 if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ){ |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
17932
diff
changeset
|
451 mp_msg(MSGT_STREAM,MSGL_DBG3, "s->pos=%"PRIX64" newpos=%"PRIX64" new_bufpos=%"PRIX64" buflen=%X \n", |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16572
diff
changeset
|
452 (int64_t)s->pos,(int64_t)newpos,(int64_t)pos,s->buf_len); |
2050 | 453 } |
1 | 454 pos-=newpos; |
455 | |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
456 res = stream_seek_internal(s, newpos); |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
457 if (res >= 0) |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
458 return res; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
459 |
32472
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
460 while(s->pos<newpos){ |
5d1d67cf8718
Add internal read and seek function to avoid a useless memcpy when using
reimar
parents:
32438
diff
changeset
|
461 if(stream_fill_buffer(s)<=0) break; // EOF |
1 | 462 } |
463 | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
464 while(stream_fill_buffer(s) > 0 && pos >= 0) { |
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
465 if(pos<=s->buf_len){ |
1 | 466 s->buf_pos=pos; // byte position in sector |
467 return 1; | |
468 } | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
469 pos -= s->buf_len; |
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
470 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
471 |
1999 | 472 // if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
473 |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16572
diff
changeset
|
474 mp_msg(MSGT_STREAM,MSGL_V,"stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
1 | 475 return 0; |
476 } | |
477 | |
478 | |
479 void stream_reset(stream_t *s){ | |
480 if(s->eof){ | |
30626
27b133678bbd
Do not discard stream buffer on eof, instead reuse it to slightly improve
reimar
parents:
30557
diff
changeset
|
481 s->pos=0; |
27b133678bbd
Do not discard stream buffer on eof, instead reuse it to slightly improve
reimar
parents:
30557
diff
changeset
|
482 s->buf_pos=s->buf_len=0; |
1 | 483 s->eof=0; |
484 } | |
9853 | 485 if(s->control) s->control(s,STREAM_CTRL_RESET,NULL); |
1 | 486 //stream_seek(s,0); |
487 } | |
488 | |
17712 | 489 int stream_control(stream_t *s, int cmd, void *arg){ |
24257 | 490 if(!s->control) return STREAM_UNSUPPORTED; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
491 #ifdef CONFIG_STREAM_CACHE |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
492 if (s->cache_pid) |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
493 return cache_do_control(s, cmd, arg); |
27178
023835d5dfb9
Surround stream cache specific code by an appropriate #ifdef; fixes linking
diego
parents:
26833
diff
changeset
|
494 #endif |
17696
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
495 return s->control(s, cmd, arg); |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
496 } |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
497 |
2144 | 498 stream_t* new_memory_stream(unsigned char* data,int len){ |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
499 stream_t *s; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
500 |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
501 if(len < 0) |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
502 return NULL; |
29887 | 503 s=calloc(1, sizeof(stream_t)+len); |
2144 | 504 s->fd=-1; |
505 s->type=STREAMTYPE_MEMORY; | |
506 s->buf_pos=0; s->buf_len=len; | |
507 s->start_pos=0; s->end_pos=len; | |
508 stream_reset(s); | |
509 s->pos=len; | |
510 memcpy(s->buffer,data,len); | |
511 return s; | |
512 } | |
513 | |
1 | 514 stream_t* new_stream(int fd,int type){ |
29887 | 515 stream_t *s=calloc(1, sizeof(stream_t)); |
3291 | 516 if(s==NULL) return NULL; |
10281 | 517 |
28402 | 518 #if HAVE_WINSOCK2_H |
10281 | 519 { |
520 WSADATA wsdata; | |
521 int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later) | |
522 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp); | |
523 } | |
524 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
525 |
1 | 526 s->fd=fd; |
527 s->type=type; | |
180 | 528 s->buf_pos=s->buf_len=0; |
598 | 529 s->start_pos=s->end_pos=0; |
1642 | 530 s->priv=NULL; |
7407 | 531 s->url=NULL; |
2322 | 532 s->cache_pid=0; |
1 | 533 stream_reset(s); |
534 return s; | |
535 } | |
536 | |
537 void free_stream(stream_t *s){ | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5982
diff
changeset
|
538 // printf("\n*** free_stream() called ***\n"); |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
539 #ifdef CONFIG_STREAM_CACHE |
9915 | 540 cache_uninit(s); |
9798 | 541 #endif |
32438
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
542 if (s->capture_file) { |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
543 fclose(s->capture_file); |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
544 s->capture_file = NULL; |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
545 } |
faefba58f413
Implement a basic capture feature, available through -capture.
diego
parents:
32142
diff
changeset
|
546 |
15520 | 547 if(s->close) s->close(s); |
15421
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
548 if(s->fd>0){ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
549 /* on unix we define closesocket to close |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
550 on windows however we have to distinguish between |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
551 network socket and file */ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
552 if(s->url && strstr(s->url,"://")) |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
553 closesocket(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
554 else close(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
555 } |
28402 | 556 #if HAVE_WINSOCK2_H |
10281 | 557 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n"); |
558 WSACleanup(); // there might be a better place for this (-> later) | |
559 #endif | |
9794 | 560 // Disabled atm, i don't like that. s->priv can be anything after all |
561 // streams should destroy their priv on close | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32472
diff
changeset
|
562 //free(s->priv); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32472
diff
changeset
|
563 free(s->url); |
1 | 564 free(s); |
565 } | |
566 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
567 stream_t* new_ds_stream(demux_stream_t *ds) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
568 stream_t* s = new_stream(-1,STREAMTYPE_DS); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
569 s->priv = ds; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
570 return s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
571 } |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
572 |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
573 void stream_set_interrupt_callback(int (*cb)(int)) { |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
574 stream_check_interrupt_cb = cb; |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
575 } |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
576 |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
577 int stream_check_interrupt(int time) { |
31194
b2bb87b92146
stream_check_interrupt should sleep even if no callback is set.
reimar
parents:
31169
diff
changeset
|
578 if(!stream_check_interrupt_cb) { |
b2bb87b92146
stream_check_interrupt should sleep even if no callback is set.
reimar
parents:
31169
diff
changeset
|
579 usec_sleep(time * 1000); |
b2bb87b92146
stream_check_interrupt should sleep even if no callback is set.
reimar
parents:
31169
diff
changeset
|
580 return 0; |
b2bb87b92146
stream_check_interrupt should sleep even if no callback is set.
reimar
parents:
31169
diff
changeset
|
581 } |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
582 return stream_check_interrupt_cb(time); |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
583 } |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
584 |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
585 /** |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
586 * Helper function to read 16 bits little-endian and advance pointer |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
587 */ |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
588 static uint16_t get_le16_inc(const uint8_t **buf) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
589 { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
590 uint16_t v = AV_RL16(*buf); |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
591 *buf += 2; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
592 return v; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
593 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
594 |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
595 /** |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
596 * Helper function to read 16 bits big-endian and advance pointer |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
597 */ |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
598 static uint16_t get_be16_inc(const uint8_t **buf) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
599 { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
600 uint16_t v = AV_RB16(*buf); |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
601 *buf += 2; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
602 return v; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
603 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
604 |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
605 /** |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
606 * Find a termination character in buffer |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
607 * \param buf buffer to search |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
608 * \param len amount of bytes to search in buffer, may not overread |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
609 * \param utf16 chose between UTF-8/ASCII/other and LE and BE UTF-16 |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
610 * 0 = UTF-8/ASCII/other, 1 = UTF-16-LE, 2 = UTF-16-BE |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
611 */ |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
612 static const uint8_t *find_term_char(const uint8_t *buf, int len, uint8_t term, int utf16) |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
613 { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
614 uint32_t c; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
615 const uint8_t *end = buf + len; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
616 switch (utf16) { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
617 case 0: |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
618 return (uint8_t *)memchr(buf, term, len); |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
619 case 1: |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
620 while (buf < end - 1) { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
621 GET_UTF16(c, buf < end - 1 ? get_le16_inc(&buf) : 0, return NULL;) |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
622 if (buf <= end && c == term) |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
623 return buf - 1; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
624 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
625 break; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
626 case 2: |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
627 while (buf < end - 1) { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
628 GET_UTF16(c, buf < end - 1 ? get_be16_inc(&buf) : 0, return NULL;) |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
629 if (buf <= end && c == term) |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
630 return buf - 1; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
631 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
632 break; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
633 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
634 return NULL; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
635 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
636 |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
637 /** |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
638 * Copy a number of bytes, converting to UTF-8 if input is UTF-16 |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
639 * \param dst buffer to copy to |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
640 * \param dstsize size of dst buffer |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
641 * \param src buffer to copy from |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
642 * \param len amount of bytes to copy from src |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
643 * \param utf16 chose between UTF-8/ASCII/other and LE and BE UTF-16 |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
644 * 0 = UTF-8/ASCII/other, 1 = UTF-16-LE, 2 = UTF-16-BE |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
645 */ |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
646 static int copy_characters(uint8_t *dst, int dstsize, |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
647 const uint8_t *src, int *len, int utf16) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
648 { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
649 uint32_t c; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
650 uint8_t *dst_end = dst + dstsize; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
651 const uint8_t *end = src + *len; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
652 switch (utf16) { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
653 case 0: |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
654 if (*len > dstsize) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
655 *len = dstsize; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
656 memcpy(dst, src, *len); |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
657 return *len; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
658 case 1: |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
659 while (src < end - 1 && dst_end - dst > 8) { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
660 uint8_t tmp; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
661 GET_UTF16(c, src < end - 1 ? get_le16_inc(&src) : 0, ;) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
662 PUT_UTF8(c, tmp, *dst++ = tmp;) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
663 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
664 *len -= end - src; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
665 return dstsize - (dst_end - dst); |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
666 case 2: |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
667 while (src < end - 1 && dst_end - dst > 8) { |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
668 uint8_t tmp; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
669 GET_UTF16(c, src < end - 1 ? get_be16_inc(&src) : 0, ;) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
670 PUT_UTF8(c, tmp, *dst++ = tmp;) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
671 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
672 *len -= end - src; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
673 return dstsize - (dst_end - dst); |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
674 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
675 return 0; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
676 } |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
677 |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
678 uint8_t *stream_read_until(stream_t *s, uint8_t *mem, int max, |
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
679 uint8_t term, int utf16) |
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
680 { |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
681 int len; |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
682 const unsigned char *end; |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
683 unsigned char *ptr = mem; |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
684 if (max < 1) return NULL; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
685 max--; // reserve one for 0-termination |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
686 do { |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
687 len = s->buf_len-s->buf_pos; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
688 // try to fill the buffer |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
689 if(len <= 0 && |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
690 (!cache_stream_fill_buffer(s) || |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
691 (len = s->buf_len-s->buf_pos) <= 0)) break; |
33906
3c172a874b4b
Convert stream_read_line function into more generic stream_read_until function.
reimar
parents:
33722
diff
changeset
|
692 end = find_term_char(s->buffer+s->buf_pos, len, term, utf16); |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
693 if(end) len = end - (s->buffer+s->buf_pos) + 1; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
694 if(len > 0 && max > 0) { |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
695 int l = copy_characters(ptr, max, s->buffer+s->buf_pos, &len, utf16); |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
696 max -= l; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
697 ptr += l; |
30757
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
698 if (!len) |
6a5957bf5b70
Extend stream_read_line to support reading lines from UTF-16 encoded files
reimar
parents:
30754
diff
changeset
|
699 break; |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
700 } |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
701 s->buf_pos += len; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
702 } while(!end); |
31918
3103448dcf28
Make sure we return an "empty" line on eof, to make sure we get
reimar
parents:
31836
diff
changeset
|
703 ptr[0] = 0; |
30754
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
704 if(s->eof && ptr == mem) return NULL; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
705 return mem; |
dff9ee89b7c1
Move stream_read_line implementation from stream.h to stream.c,
reimar
parents:
30697
diff
changeset
|
706 } |