Mercurial > libavformat.hg
annotate file.c @ 1282:faf64f0d3445 libavformat
AVISynth support, patch by Steve Lhomme % slhomme A divxcorp P com %
Original Thread:
Date: Aug 16, 2006 11:45 PM
Subject: [Ffmpeg-devel] [PATCH] AVISynth support
author | gpoirier |
---|---|
date | Tue, 29 Aug 2006 07:34:58 +0000 |
parents | 2a0c729ac640 |
children | 0899bfe4105c |
rev | line source |
---|---|
0 | 1 /* |
2 * Buffered file io for ffmpeg system | |
3 * Copyright (c) 2001 Fabrice Bellard | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 */ |
19 #include "avformat.h" | |
20 #include <fcntl.h> | |
1171
2a0c729ac640
CONFIG_WIN32 implies MinGW and Cygwin and possibly more, so use just
diego
parents:
896
diff
changeset
|
21 #ifndef __MINGW32__ |
0 | 22 #include <unistd.h> |
23 #include <sys/ioctl.h> | |
24 #include <sys/time.h> | |
25 #else | |
26 #include <io.h> | |
27 #define open(fname,oflag,pmode) _open(fname,oflag,pmode) | |
1171
2a0c729ac640
CONFIG_WIN32 implies MinGW and Cygwin and possibly more, so use just
diego
parents:
896
diff
changeset
|
28 #endif /* __MINGW32__ */ |
0 | 29 |
30 | |
31 /* standard file protocol */ | |
32 | |
33 static int file_open(URLContext *h, const char *filename, int flags) | |
34 { | |
35 int access; | |
36 int fd; | |
37 | |
3 | 38 strstart(filename, "file:", &filename); |
39 | |
364
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
40 if (flags & URL_RDWR) { |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
41 access = O_CREAT | O_TRUNC | O_RDWR; |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
42 } else if (flags & URL_WRONLY) { |
0 | 43 access = O_CREAT | O_TRUNC | O_WRONLY; |
44 } else { | |
45 access = O_RDONLY; | |
46 } | |
1171
2a0c729ac640
CONFIG_WIN32 implies MinGW and Cygwin and possibly more, so use just
diego
parents:
896
diff
changeset
|
47 #if defined(__MINGW32__) || defined(CONFIG_OS2) || defined(__CYGWIN__) |
0 | 48 access |= O_BINARY; |
49 #endif | |
50 fd = open(filename, access, 0666); | |
51 if (fd < 0) | |
52 return -ENOENT; | |
396 | 53 h->priv_data = (void *)(size_t)fd; |
0 | 54 return 0; |
55 } | |
56 | |
57 static int file_read(URLContext *h, unsigned char *buf, int size) | |
58 { | |
396 | 59 int fd = (size_t)h->priv_data; |
0 | 60 return read(fd, buf, size); |
61 } | |
62 | |
63 static int file_write(URLContext *h, unsigned char *buf, int size) | |
64 { | |
396 | 65 int fd = (size_t)h->priv_data; |
0 | 66 return write(fd, buf, size); |
67 } | |
68 | |
69 /* XXX: use llseek */ | |
70 static offset_t file_seek(URLContext *h, offset_t pos, int whence) | |
71 { | |
396 | 72 int fd = (size_t)h->priv_data; |
1171
2a0c729ac640
CONFIG_WIN32 implies MinGW and Cygwin and possibly more, so use just
diego
parents:
896
diff
changeset
|
73 #if defined(__MINGW32__) |
0 | 74 return _lseeki64(fd, pos, whence); |
75 #else | |
76 return lseek(fd, pos, whence); | |
77 #endif | |
78 } | |
79 | |
80 static int file_close(URLContext *h) | |
81 { | |
396 | 82 int fd = (size_t)h->priv_data; |
0 | 83 return close(fd); |
84 } | |
85 | |
86 URLProtocol file_protocol = { | |
87 "file", | |
88 file_open, | |
89 file_read, | |
90 file_write, | |
91 file_seek, | |
92 file_close, | |
93 }; | |
94 | |
95 /* pipe protocol */ | |
96 | |
97 static int pipe_open(URLContext *h, const char *filename, int flags) | |
98 { | |
99 int fd; | |
100 | |
101 if (flags & URL_WRONLY) { | |
102 fd = 1; | |
103 } else { | |
104 fd = 0; | |
105 } | |
1171
2a0c729ac640
CONFIG_WIN32 implies MinGW and Cygwin and possibly more, so use just
diego
parents:
896
diff
changeset
|
106 #if defined(__MINGW32__) || defined(CONFIG_OS2) || defined(__CYGWIN__) |
394 | 107 setmode(fd, O_BINARY); |
108 #endif | |
396 | 109 h->priv_data = (void *)(size_t)fd; |
605 | 110 h->is_streamed = 1; |
0 | 111 return 0; |
112 } | |
113 | |
114 static int pipe_read(URLContext *h, unsigned char *buf, int size) | |
115 { | |
396 | 116 int fd = (size_t)h->priv_data; |
0 | 117 return read(fd, buf, size); |
118 } | |
119 | |
120 static int pipe_write(URLContext *h, unsigned char *buf, int size) | |
121 { | |
396 | 122 int fd = (size_t)h->priv_data; |
0 | 123 return write(fd, buf, size); |
124 } | |
125 | |
126 static int pipe_close(URLContext *h) | |
127 { | |
128 return 0; | |
129 } | |
130 | |
131 URLProtocol pipe_protocol = { | |
132 "pipe", | |
133 pipe_open, | |
134 pipe_read, | |
135 pipe_write, | |
136 NULL, | |
137 pipe_close, | |
138 }; |