Mercurial > libavformat.hg
annotate file.c @ 3754:8d267b43eaba libavformat
Move malloc() down until after all initializations, so that the resource is
only allocated if initialization worked. This means that on failure, we
don't have to deallocate it.
author | rbultje |
---|---|
date | Sat, 23 Aug 2008 18:46:30 +0000 |
parents | dc671b723b25 |
children | 549a09cf23fe |
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> | |
25 #include <unistd.h> | |
26 #include <sys/time.h> | |
2395 | 27 #include <stdlib.h> |
2774
477419a721a3
os_support.h is also needed for usleep and lseek on MinGW.
ramiro
parents:
2758
diff
changeset
|
28 #include "os_support.h" |
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 | |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
1787
diff
changeset
|
38 av_strstart(filename, "file:", &filename); |
3 | 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 } | |
2205
28eb72f5208a
Check for O_BINARY instead of a list of systems that need it
ramiro
parents:
2193
diff
changeset
|
47 #ifdef O_BINARY |
0 | 48 access |= O_BINARY; |
49 #endif | |
50 fd = open(filename, access, 0666); | |
51 if (fd < 0) | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1596
diff
changeset
|
52 return AVERROR(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; |
0 | 73 return lseek(fd, pos, whence); |
74 } | |
75 | |
76 static int file_close(URLContext *h) | |
77 { | |
396 | 78 int fd = (size_t)h->priv_data; |
0 | 79 return close(fd); |
80 } | |
81 | |
82 URLProtocol file_protocol = { | |
83 "file", | |
84 file_open, | |
85 file_read, | |
86 file_write, | |
87 file_seek, | |
88 file_close, | |
89 }; | |
90 | |
91 /* pipe protocol */ | |
92 | |
93 static int pipe_open(URLContext *h, const char *filename, int flags) | |
94 { | |
95 int fd; | |
3367 | 96 char *final; |
2395 | 97 av_strstart(filename, "pipe:", &filename); |
0 | 98 |
2395 | 99 fd = strtol(filename, &final, 10); |
100 if((filename == final) || *final ) {/* No digits found, or something like 10ab */ | |
2394 | 101 if (flags & URL_WRONLY) { |
102 fd = 1; | |
103 } else { | |
104 fd = 0; | |
105 } | |
2395 | 106 } |
2205
28eb72f5208a
Check for O_BINARY instead of a list of systems that need it
ramiro
parents:
2193
diff
changeset
|
107 #ifdef O_BINARY |
394 | 108 setmode(fd, O_BINARY); |
109 #endif | |
396 | 110 h->priv_data = (void *)(size_t)fd; |
605 | 111 h->is_streamed = 1; |
0 | 112 return 0; |
113 } | |
114 | |
115 URLProtocol pipe_protocol = { | |
116 "pipe", | |
117 pipe_open, | |
2352
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
118 file_read, |
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
119 file_write, |
0 | 120 }; |