Mercurial > libavformat.hg
annotate file.c @ 6118:6780dc315f36 libavformat
Remove support for pre-Haiku, non-POSIX, non-C99 BeOS variants.
BeOS support has been broken for many years and the "maintainer" of the port
has not reacted to countless requests to get the port fixed.
approved by Mans
author | diego |
---|---|
date | Thu, 10 Jun 2010 16:51:14 +0000 |
parents | 7fdda2416684 |
children | 9be5a847f59c |
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> |
5932
310b3b1b2921
Implement support to the AVSEEK_SIZE operation in file_seek().
stefano
parents:
5654
diff
changeset
|
29 #include <sys/stat.h> |
0 | 30 #include <sys/time.h> |
2395 | 31 #include <stdlib.h> |
2774
477419a721a3
os_support.h is also needed for usleep and lseek on MinGW.
ramiro
parents:
2758
diff
changeset
|
32 #include "os_support.h" |
0 | 33 |
34 | |
35 /* standard file protocol */ | |
36 | |
37 static int file_open(URLContext *h, const char *filename, int flags) | |
38 { | |
39 int access; | |
40 int fd; | |
41 | |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
1787
diff
changeset
|
42 av_strstart(filename, "file:", &filename); |
3 | 43 |
364
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
44 if (flags & URL_RDWR) { |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
45 access = O_CREAT | O_TRUNC | O_RDWR; |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
46 } else if (flags & URL_WRONLY) { |
0 | 47 access = O_CREAT | O_TRUNC | O_WRONLY; |
48 } else { | |
49 access = O_RDONLY; | |
50 } | |
2205
28eb72f5208a
Check for O_BINARY instead of a list of systems that need it
ramiro
parents:
2193
diff
changeset
|
51 #ifdef O_BINARY |
0 | 52 access |= O_BINARY; |
53 #endif | |
54 fd = open(filename, access, 0666); | |
5110
147adb327b84
Only consider -1 as an error return value for open().
benoit
parents:
4792
diff
changeset
|
55 if (fd == -1) |
5983
cb7e1e218016
Make file_open() return the error code set in errno if open() fails,
stefano
parents:
5932
diff
changeset
|
56 return AVERROR(errno); |
4792 | 57 h->priv_data = (void *) (intptr_t) fd; |
0 | 58 return 0; |
59 } | |
60 | |
61 static int file_read(URLContext *h, unsigned char *buf, int size) | |
62 { | |
4792 | 63 int fd = (intptr_t) h->priv_data; |
0 | 64 return read(fd, buf, size); |
65 } | |
66 | |
6068 | 67 static int file_write(URLContext *h, const unsigned char *buf, int size) |
0 | 68 { |
4792 | 69 int fd = (intptr_t) h->priv_data; |
0 | 70 return write(fd, buf, size); |
71 } | |
72 | |
73 /* XXX: use llseek */ | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3367
diff
changeset
|
74 static int64_t file_seek(URLContext *h, int64_t pos, int whence) |
0 | 75 { |
4792 | 76 int fd = (intptr_t) h->priv_data; |
5932
310b3b1b2921
Implement support to the AVSEEK_SIZE operation in file_seek().
stefano
parents:
5654
diff
changeset
|
77 if (whence == AVSEEK_SIZE) { |
310b3b1b2921
Implement support to the AVSEEK_SIZE operation in file_seek().
stefano
parents:
5654
diff
changeset
|
78 struct stat st; |
310b3b1b2921
Implement support to the AVSEEK_SIZE operation in file_seek().
stefano
parents:
5654
diff
changeset
|
79 int ret = fstat(fd, &st); |
310b3b1b2921
Implement support to the AVSEEK_SIZE operation in file_seek().
stefano
parents:
5654
diff
changeset
|
80 return ret < 0 ? AVERROR(errno) : st.st_size; |
310b3b1b2921
Implement support to the AVSEEK_SIZE operation in file_seek().
stefano
parents:
5654
diff
changeset
|
81 } |
0 | 82 return lseek(fd, pos, whence); |
83 } | |
84 | |
85 static int file_close(URLContext *h) | |
86 { | |
4792 | 87 int fd = (intptr_t) h->priv_data; |
0 | 88 return close(fd); |
89 } | |
90 | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
91 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
|
92 { |
4792 | 93 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
|
94 } |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
95 |
0 | 96 URLProtocol file_protocol = { |
97 "file", | |
98 file_open, | |
99 file_read, | |
100 file_write, | |
101 file_seek, | |
102 file_close, | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
103 .url_get_file_handle = file_get_handle, |
0 | 104 }; |
105 | |
106 /* pipe protocol */ | |
107 | |
108 static int pipe_open(URLContext *h, const char *filename, int flags) | |
109 { | |
110 int fd; | |
3367 | 111 char *final; |
2395 | 112 av_strstart(filename, "pipe:", &filename); |
0 | 113 |
2395 | 114 fd = strtol(filename, &final, 10); |
115 if((filename == final) || *final ) {/* No digits found, or something like 10ab */ | |
2394 | 116 if (flags & URL_WRONLY) { |
117 fd = 1; | |
118 } else { | |
119 fd = 0; | |
120 } | |
2395 | 121 } |
4206 | 122 #if HAVE_SETMODE |
394 | 123 setmode(fd, O_BINARY); |
124 #endif | |
4792 | 125 h->priv_data = (void *) (intptr_t) fd; |
605 | 126 h->is_streamed = 1; |
0 | 127 return 0; |
128 } | |
129 | |
130 URLProtocol pipe_protocol = { | |
131 "pipe", | |
132 pipe_open, | |
2352
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
133 file_read, |
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
134 file_write, |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
135 .url_get_file_handle = file_get_handle, |
0 | 136 }; |