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