Mercurial > libavformat.hg
annotate avio.c @ 3718:945722ee3c89 libavformat
Do not fill the pts reordering buffer with guessed dts.
These values should not matter at all in principle because they
do not correspond to the time of display of any frame but it seems
ffmpeg becomes confused by them if they are far off and its not
strictly correct to set them to guessed values.
Fixes video_stalls_at_start.wmv
author | michael |
---|---|
date | Thu, 14 Aug 2008 03:24:58 +0000 |
parents | 6f61c3b36632 |
children | b140b68a3747 |
rev | line source |
---|---|
0 | 1 /* |
2 * Unbuffered io for ffmpeg system | |
3 * Copyright (c) 2001 Fabrice Bellard | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
3286 | 21 |
22 #include "libavutil/avstring.h" | |
23 #include "libavcodec/opt.h" | |
0 | 24 #include "avformat.h" |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
25 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
26 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
27 /** @name Logging context. */ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
28 /*@{*/ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
29 static const char *urlcontext_to_name(void *ptr) |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
30 { |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
31 URLContext *h = (URLContext *)ptr; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
32 if(h->prot) return h->prot->name; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
33 else return "NULL"; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
34 } |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
35 static const AVOption options[] = {{NULL}}; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
36 static const AVClass urlcontext_class = |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
37 { "URLContext", urlcontext_to_name, options }; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
38 /*@}*/ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
39 #endif |
0 | 40 |
177 | 41 static int default_interrupt_cb(void); |
42 | |
0 | 43 URLProtocol *first_protocol = NULL; |
177 | 44 URLInterruptCB *url_interrupt_cb = default_interrupt_cb; |
0 | 45 |
2812 | 46 URLProtocol *av_protocol_next(URLProtocol *p) |
47 { | |
48 if(p) return p->next; | |
49 else return first_protocol; | |
50 } | |
51 | |
0 | 52 int register_protocol(URLProtocol *protocol) |
53 { | |
54 URLProtocol **p; | |
55 p = &first_protocol; | |
56 while (*p != NULL) p = &(*p)->next; | |
57 *p = protocol; | |
58 protocol->next = NULL; | |
59 return 0; | |
60 } | |
61 | |
62 int url_open(URLContext **puc, const char *filename, int flags) | |
63 { | |
64 URLContext *uc; | |
65 URLProtocol *up; | |
66 const char *p; | |
67 char proto_str[128], *q; | |
68 int err; | |
69 | |
70 p = filename; | |
71 q = proto_str; | |
72 while (*p != '\0' && *p != ':') { | |
67
22e4d9d88e25
avoid false URL protocol detection when using ':' in filenames
bellard
parents:
19
diff
changeset
|
73 /* protocols can only contain alphabetic chars */ |
22e4d9d88e25
avoid false URL protocol detection when using ':' in filenames
bellard
parents:
19
diff
changeset
|
74 if (!isalpha(*p)) |
22e4d9d88e25
avoid false URL protocol detection when using ':' in filenames
bellard
parents:
19
diff
changeset
|
75 goto file_proto; |
0 | 76 if ((q - proto_str) < sizeof(proto_str) - 1) |
77 *q++ = *p; | |
78 p++; | |
79 } | |
80 /* if the protocol has length 1, we consider it is a dos drive */ | |
81 if (*p == '\0' || (q - proto_str) <= 1) { | |
67
22e4d9d88e25
avoid false URL protocol detection when using ':' in filenames
bellard
parents:
19
diff
changeset
|
82 file_proto: |
0 | 83 strcpy(proto_str, "file"); |
84 } else { | |
85 *q = '\0'; | |
86 } | |
885 | 87 |
0 | 88 up = first_protocol; |
89 while (up != NULL) { | |
90 if (!strcmp(proto_str, up->name)) | |
91 goto found; | |
92 up = up->next; | |
93 } | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
94 err = AVERROR(ENOENT); |
0 | 95 goto fail; |
96 found: | |
1648
90987914ad57
makes the filename member of the URLContext a pointer, so that the
gpoirier
parents:
1613
diff
changeset
|
97 uc = av_malloc(sizeof(URLContext) + strlen(filename) + 1); |
0 | 98 if (!uc) { |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
99 err = AVERROR(ENOMEM); |
0 | 100 goto fail; |
101 } | |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
102 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
103 uc->av_class = &urlcontext_class; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
104 #endif |
1648
90987914ad57
makes the filename member of the URLContext a pointer, so that the
gpoirier
parents:
1613
diff
changeset
|
105 uc->filename = (char *) &uc[1]; |
19 | 106 strcpy(uc->filename, filename); |
0 | 107 uc->prot = up; |
108 uc->flags = flags; | |
109 uc->is_streamed = 0; /* default = not streamed */ | |
110 uc->max_packet_size = 0; /* default: stream file */ | |
111 err = up->url_open(uc, filename, flags); | |
112 if (err < 0) { | |
113 av_free(uc); | |
114 *puc = NULL; | |
115 return err; | |
116 } | |
3277 | 117 |
118 //We must be carefull here as url_seek() could be slow, for example for http | |
119 if( (flags & (URL_WRONLY | URL_RDWR)) | |
120 || !strcmp(proto_str, "file")) | |
121 if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0) | |
122 uc->is_streamed= 1; | |
0 | 123 *puc = uc; |
124 return 0; | |
125 fail: | |
126 *puc = NULL; | |
127 return err; | |
128 } | |
129 | |
130 int url_read(URLContext *h, unsigned char *buf, int size) | |
131 { | |
132 int ret; | |
133 if (h->flags & URL_WRONLY) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
134 return AVERROR(EIO); |
0 | 135 ret = h->prot->url_read(h, buf, size); |
136 return ret; | |
137 } | |
138 | |
139 int url_write(URLContext *h, unsigned char *buf, int size) | |
140 { | |
141 int ret; | |
142 if (!(h->flags & (URL_WRONLY | URL_RDWR))) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
143 return AVERROR(EIO); |
0 | 144 /* avoid sending too big packets */ |
145 if (h->max_packet_size && size > h->max_packet_size) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
146 return AVERROR(EIO); |
0 | 147 ret = h->prot->url_write(h, buf, size); |
148 return ret; | |
149 } | |
150 | |
151 offset_t url_seek(URLContext *h, offset_t pos, int whence) | |
152 { | |
153 offset_t ret; | |
154 | |
155 if (!h->prot->url_seek) | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
156 return AVERROR(EPIPE); |
0 | 157 ret = h->prot->url_seek(h, pos, whence); |
158 return ret; | |
159 } | |
160 | |
161 int url_close(URLContext *h) | |
162 { | |
2757 | 163 int ret = 0; |
2710 | 164 if (!h) return 0; /* can happen when url_open fails */ |
0 | 165 |
2757 | 166 if (h->prot->url_close) |
167 ret = h->prot->url_close(h); | |
0 | 168 av_free(h); |
169 return ret; | |
170 } | |
171 | |
172 int url_exist(const char *filename) | |
173 { | |
174 URLContext *h; | |
175 if (url_open(&h, filename, URL_RDONLY) < 0) | |
176 return 0; | |
177 url_close(h); | |
178 return 1; | |
179 } | |
180 | |
181 offset_t url_filesize(URLContext *h) | |
182 { | |
183 offset_t pos, size; | |
885 | 184 |
1612
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
185 size= url_seek(h, 0, AVSEEK_SIZE); |
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
186 if(size<0){ |
1613 | 187 pos = url_seek(h, 0, SEEK_CUR); |
1746
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
188 if ((size = url_seek(h, -1, SEEK_END)) < 0) |
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
189 return size; |
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
190 size++; |
1613 | 191 url_seek(h, pos, SEEK_SET); |
1612
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
192 } |
0 | 193 return size; |
194 } | |
195 | |
196 int url_get_max_packet_size(URLContext *h) | |
197 { | |
198 return h->max_packet_size; | |
199 } | |
19 | 200 |
201 void url_get_filename(URLContext *h, char *buf, int buf_size) | |
202 { | |
2189 | 203 av_strlcpy(buf, h->filename, buf_size); |
19 | 204 } |
177 | 205 |
206 | |
207 static int default_interrupt_cb(void) | |
208 { | |
209 return 0; | |
210 } | |
211 | |
212 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) | |
213 { | |
214 if (!interrupt_cb) | |
215 interrupt_cb = default_interrupt_cb; | |
216 url_interrupt_cb = interrupt_cb; | |
217 } | |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
218 |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
219 int av_url_read_pause(URLContext *h, int pause) |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
220 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
221 if (!h->prot->url_read_pause) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
222 return AVERROR(ENOSYS); |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
223 return h->prot->url_read_pause(h, pause); |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
224 } |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
225 |
2840
f51675f78402
Make recently added and still unused read_seek functions return offset_t.
michael
parents:
2839
diff
changeset
|
226 offset_t av_url_read_seek(URLContext *h, |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
227 int stream_index, int64_t timestamp, int flags) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
228 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
229 if (!h->prot->url_read_seek) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
230 return AVERROR(ENOSYS); |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
231 return h->prot->url_read_seek(h, stream_index, timestamp, flags); |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
232 } |