Mercurial > libavformat.hg
annotate file.c @ 5149:4a53fcd622ea libavformat
Check for seek failures in avi_load_index, otherwise if the index offset
is invalid (e.g. truncated file) we might end up reading the whole file
since trying to seek beyond the end of file does not set EOF.
author | reimar |
---|---|
date | Wed, 26 Aug 2009 08:38:44 +0000 |
parents | 147adb327b84 |
children | 2f09b8dc4e08 |
rev | line source |
---|---|
0 | 1 /* |
2 * Buffered file 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:
1171
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
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:
1171
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:
1171
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:
1171
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" | |
0 | 23 #include "avformat.h" |
24 #include <fcntl.h> | |
4206 | 25 #if HAVE_SETMODE |
4200
898c3d1d9e4e
Use setmode() if it exists in <io.h>, and not based on O_BINARY.
ramiro
parents:
3973
diff
changeset
|
26 #include <io.h> |
898c3d1d9e4e
Use setmode() if it exists in <io.h>, and not based on O_BINARY.
ramiro
parents:
3973
diff
changeset
|
27 #endif |
0 | 28 #include <unistd.h> |
29 #include <sys/time.h> | |
2395 | 30 #include <stdlib.h> |
2774
477419a721a3
os_support.h is also needed for usleep and lseek on MinGW.
ramiro
parents:
2758
diff
changeset
|
31 #include "os_support.h" |
0 | 32 |
33 | |
34 /* standard file protocol */ | |
35 | |
36 static int file_open(URLContext *h, const char *filename, int flags) | |
37 { | |
38 int access; | |
39 int fd; | |
40 | |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
1787
diff
changeset
|
41 av_strstart(filename, "file:", &filename); |
3 | 42 |
364
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
43 if (flags & URL_RDWR) { |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
44 access = O_CREAT | O_TRUNC | O_RDWR; |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
45 } else if (flags & URL_WRONLY) { |
0 | 46 access = O_CREAT | O_TRUNC | O_WRONLY; |
47 } else { | |
48 access = O_RDONLY; | |
49 } | |
2205
28eb72f5208a
Check for O_BINARY instead of a list of systems that need it
ramiro
parents:
2193
diff
changeset
|
50 #ifdef O_BINARY |
0 | 51 access |= O_BINARY; |
52 #endif | |
53 fd = open(filename, access, 0666); | |
5110
147adb327b84
Only consider -1 as an error return value for open().
benoit
parents:
4792
diff
changeset
|
54 if (fd == -1) |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1596
diff
changeset
|
55 return AVERROR(ENOENT); |
4792 | 56 h->priv_data = (void *) (intptr_t) fd; |
0 | 57 return 0; |
58 } | |
59 | |
60 static int file_read(URLContext *h, unsigned char *buf, int size) | |
61 { | |
4792 | 62 int fd = (intptr_t) h->priv_data; |
0 | 63 return read(fd, buf, size); |
64 } | |
65 | |
66 static int file_write(URLContext *h, unsigned char *buf, int size) | |
67 { | |
4792 | 68 int fd = (intptr_t) h->priv_data; |
0 | 69 return write(fd, buf, size); |
70 } | |
71 | |
72 /* XXX: use llseek */ | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3367
diff
changeset
|
73 static int64_t file_seek(URLContext *h, int64_t pos, int whence) |
0 | 74 { |
4792 | 75 int fd = (intptr_t) h->priv_data; |
0 | 76 return lseek(fd, pos, whence); |
77 } | |
78 | |
79 static int file_close(URLContext *h) | |
80 { | |
4792 | 81 int fd = (intptr_t) h->priv_data; |
0 | 82 return close(fd); |
83 } | |
84 | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
85 static int file_get_handle(URLContext *h) |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
86 { |
4792 | 87 return (intptr_t) h->priv_data; |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
88 } |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
89 |
0 | 90 URLProtocol file_protocol = { |
91 "file", | |
92 file_open, | |
93 file_read, | |
94 file_write, | |
95 file_seek, | |
96 file_close, | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
97 .url_get_file_handle = file_get_handle, |
0 | 98 }; |
99 | |
100 /* pipe protocol */ | |
101 | |
102 static int pipe_open(URLContext *h, const char *filename, int flags) | |
103 { | |
104 int fd; | |
3367 | 105 char *final; |
2395 | 106 av_strstart(filename, "pipe:", &filename); |
0 | 107 |
2395 | 108 fd = strtol(filename, &final, 10); |
109 if((filename == final) || *final ) {/* No digits found, or something like 10ab */ | |
2394 | 110 if (flags & URL_WRONLY) { |
111 fd = 1; | |
112 } else { | |
113 fd = 0; | |
114 } | |
2395 | 115 } |
4206 | 116 #if HAVE_SETMODE |
394 | 117 setmode(fd, O_BINARY); |
118 #endif | |
4792 | 119 h->priv_data = (void *) (intptr_t) fd; |
605 | 120 h->is_streamed = 1; |
0 | 121 return 0; |
122 } | |
123 | |
124 URLProtocol pipe_protocol = { | |
125 "pipe", | |
126 pipe_open, | |
2352
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
127 file_read, |
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
128 file_write, |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
129 .url_get_file_handle = file_get_handle, |
0 | 130 }; |