Commit | Line | Data |
---|---|---|
de6d9b64 FB |
1 | /* |
2 | * Buffered file io for ffmpeg system | |
19720f15 | 3 | * Copyright (c) 2001 Fabrice Bellard |
de6d9b64 | 4 | * |
b78e7197 DB |
5 | * This file is part of FFmpeg. |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
19720f15 FB |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either | |
b78e7197 | 10 | * version 2.1 of the License, or (at your option) any later version. |
de6d9b64 | 11 | * |
b78e7197 | 12 | * FFmpeg is distributed in the hope that it will be useful, |
de6d9b64 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19720f15 FB |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | * Lesser General Public License for more details. | |
de6d9b64 | 16 | * |
19720f15 | 17 | * You should have received a copy of the GNU Lesser General Public |
b78e7197 | 18 | * License along with FFmpeg; if not, write to the Free Software |
5509bffa | 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
de6d9b64 | 20 | */ |
245976da DB |
21 | |
22 | #include "libavutil/avstring.h" | |
8be1c656 | 23 | #include "avformat.h" |
de6d9b64 | 24 | #include <fcntl.h> |
b250f9c6 | 25 | #if HAVE_SETMODE |
b507ebd1 RP |
26 | #include <io.h> |
27 | #endif | |
8be1c656 | 28 | #include <unistd.h> |
de6d9b64 | 29 | #include <sys/time.h> |
9e33b10f | 30 | #include <stdlib.h> |
a5e979f4 | 31 | #include "os_support.h" |
de6d9b64 | 32 | |
de6d9b64 FB |
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 | ||
f7d78f36 | 41 | av_strstart(filename, "file:", &filename); |
a1dfc201 | 42 | |
ac9fe33d GB |
43 | if (flags & URL_RDWR) { |
44 | access = O_CREAT | O_TRUNC | O_RDWR; | |
45 | } else if (flags & URL_WRONLY) { | |
de6d9b64 FB |
46 | access = O_CREAT | O_TRUNC | O_WRONLY; |
47 | } else { | |
48 | access = O_RDONLY; | |
49 | } | |
05d00e95 | 50 | #ifdef O_BINARY |
8be1c656 FB |
51 | access |= O_BINARY; |
52 | #endif | |
de6d9b64 FB |
53 | fd = open(filename, access, 0666); |
54 | if (fd < 0) | |
8fa36ae0 | 55 | return AVERROR(ENOENT); |
f989d397 | 56 | h->priv_data = (void *) fd; |
de6d9b64 FB |
57 | return 0; |
58 | } | |
59 | ||
60 | static int file_read(URLContext *h, unsigned char *buf, int size) | |
61 | { | |
f989d397 | 62 | int fd = (int) h->priv_data; |
de6d9b64 FB |
63 | return read(fd, buf, size); |
64 | } | |
65 | ||
66 | static int file_write(URLContext *h, unsigned char *buf, int size) | |
67 | { | |
f989d397 | 68 | int fd = (int) h->priv_data; |
de6d9b64 FB |
69 | return write(fd, buf, size); |
70 | } | |
71 | ||
72 | /* XXX: use llseek */ | |
bc5c918e | 73 | static int64_t file_seek(URLContext *h, int64_t pos, int whence) |
de6d9b64 | 74 | { |
f989d397 | 75 | int fd = (int) h->priv_data; |
de6d9b64 FB |
76 | return lseek(fd, pos, whence); |
77 | } | |
78 | ||
79 | static int file_close(URLContext *h) | |
80 | { | |
f989d397 | 81 | int fd = (int) h->priv_data; |
de6d9b64 FB |
82 | return close(fd); |
83 | } | |
84 | ||
f0a80394 RB |
85 | static int file_get_handle(URLContext *h) |
86 | { | |
87 | return (int) h->priv_data; | |
88 | } | |
89 | ||
de6d9b64 FB |
90 | URLProtocol file_protocol = { |
91 | "file", | |
92 | file_open, | |
93 | file_read, | |
94 | file_write, | |
95 | file_seek, | |
96 | file_close, | |
f0a80394 | 97 | .url_get_file_handle = file_get_handle, |
de6d9b64 FB |
98 | }; |
99 | ||
100 | /* pipe protocol */ | |
101 | ||
102 | static int pipe_open(URLContext *h, const char *filename, int flags) | |
103 | { | |
104 | int fd; | |
fbcb0811 | 105 | char *final; |
9e33b10f | 106 | av_strstart(filename, "pipe:", &filename); |
de6d9b64 | 107 | |
9e33b10f VF |
108 | fd = strtol(filename, &final, 10); |
109 | if((filename == final) || *final ) {/* No digits found, or something like 10ab */ | |
de79849e VF |
110 | if (flags & URL_WRONLY) { |
111 | fd = 1; | |
112 | } else { | |
113 | fd = 0; | |
114 | } | |
9e33b10f | 115 | } |
b250f9c6 | 116 | #if HAVE_SETMODE |
c43e7a66 MN |
117 | setmode(fd, O_BINARY); |
118 | #endif | |
f989d397 | 119 | h->priv_data = (void *) fd; |
f9a35124 | 120 | h->is_streamed = 1; |
de6d9b64 FB |
121 | return 0; |
122 | } | |
123 | ||
de6d9b64 FB |
124 | URLProtocol pipe_protocol = { |
125 | "pipe", | |
126 | pipe_open, | |
ee7db7b0 RP |
127 | file_read, |
128 | file_write, | |
f0a80394 | 129 | .url_get_file_handle = file_get_handle, |
de6d9b64 | 130 | }; |