| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Buffered file io for ffmpeg system | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * Copyright (c) 2001 Fabrice Bellard | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * License along with FFmpeg; if not, write to the Free Software | 
					
						
							| 
									
										
										
										
											2006-01-12 22:43:26 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-05-09 11:56:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "libavutil/avstring.h"
 | 
					
						
							| 
									
										
										
										
											2001-08-13 21:37:10 +00:00
										 |  |  | #include "avformat.h"
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | #include <fcntl.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if HAVE_SETMODE
 | 
					
						
							| 
									
										
										
										
											2009-01-11 22:05:43 +00:00
										 |  |  | #include <io.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-08-13 21:37:10 +00:00
										 |  |  | #include <unistd.h>
 | 
					
						
							| 
									
										
										
										
											2010-04-04 14:21:29 +00:00
										 |  |  | #include <sys/stat.h>
 | 
					
						
							| 
									
										
										
										
											2007-08-17 15:14:29 +00:00
										 |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2007-11-22 02:27:39 +00:00
										 |  |  | #include "os_support.h"
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* standard file protocol */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int file_open(URLContext *h, const char *filename, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int access; | 
					
						
							|  |  |  |     int fd; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-24 11:27:12 +00:00
										 |  |  |     av_strstart(filename, "file:", &filename); | 
					
						
							| 
									
										
										
										
											2002-11-29 19:19:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-14 16:25:32 +00:00
										 |  |  |     if (flags & URL_RDWR) { | 
					
						
							|  |  |  |         access = O_CREAT | O_TRUNC | O_RDWR; | 
					
						
							|  |  |  |     } else if (flags & URL_WRONLY) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         access = O_CREAT | O_TRUNC | O_WRONLY; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         access = O_RDONLY; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-06-25 20:34:20 +00:00
										 |  |  | #ifdef O_BINARY
 | 
					
						
							| 
									
										
										
										
											2001-08-13 21:37:10 +00:00
										 |  |  |     access |= O_BINARY; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     fd = open(filename, access, 0666); | 
					
						
							| 
									
										
										
										
											2009-07-27 12:36:22 +00:00
										 |  |  |     if (fd == -1) | 
					
						
							| 
									
										
										
										
											2010-04-26 22:36:51 +00:00
										 |  |  |         return AVERROR(errno); | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     h->priv_data = (void *) (intptr_t) fd; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int file_read(URLContext *h, unsigned char *buf, int size) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     int fd = (intptr_t) h->priv_data; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return read(fd, buf, size); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-01 07:46:23 +00:00
										 |  |  | static int file_write(URLContext *h, const unsigned char *buf, int size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     int fd = (intptr_t) h->priv_data; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return write(fd, buf, size); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* XXX: use llseek */ | 
					
						
							| 
									
										
										
										
											2008-10-03 10:16:29 +00:00
										 |  |  | static int64_t file_seek(URLContext *h, int64_t pos, int whence) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     int fd = (intptr_t) h->priv_data; | 
					
						
							| 
									
										
										
										
											2010-04-04 14:21:29 +00:00
										 |  |  |     if (whence == AVSEEK_SIZE) { | 
					
						
							|  |  |  |         struct stat st; | 
					
						
							|  |  |  |         int ret = fstat(fd, &st); | 
					
						
							|  |  |  |         return ret < 0 ? AVERROR(errno) : st.st_size; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return lseek(fd, pos, whence); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int file_close(URLContext *h) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     int fd = (intptr_t) h->priv_data; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return close(fd); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-03 17:04:51 +00:00
										 |  |  | static int file_get_handle(URLContext *h) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     return (intptr_t) h->priv_data; | 
					
						
							| 
									
										
										
										
											2009-03-03 17:04:51 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | URLProtocol file_protocol = { | 
					
						
							|  |  |  |     "file", | 
					
						
							|  |  |  |     file_open, | 
					
						
							|  |  |  |     file_read, | 
					
						
							|  |  |  |     file_write, | 
					
						
							|  |  |  |     file_seek, | 
					
						
							|  |  |  |     file_close, | 
					
						
							| 
									
										
										
										
											2009-03-03 17:04:51 +00:00
										 |  |  |     .url_get_file_handle = file_get_handle, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* pipe protocol */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int pipe_open(URLContext *h, const char *filename, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int fd; | 
					
						
							| 
									
										
										
										
											2008-05-27 01:19:19 +00:00
										 |  |  |     char *final; | 
					
						
							| 
									
										
										
										
											2007-08-17 15:14:29 +00:00
										 |  |  |     av_strstart(filename, "pipe:", &filename); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-17 15:14:29 +00:00
										 |  |  |     fd = strtol(filename, &final, 10); | 
					
						
							|  |  |  |     if((filename == final) || *final ) {/* No digits found, or something like 10ab */ | 
					
						
							| 
									
										
										
										
											2007-08-17 15:12:30 +00:00
										 |  |  |         if (flags & URL_WRONLY) { | 
					
						
							|  |  |  |             fd = 1; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             fd = 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2007-08-17 15:14:29 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if HAVE_SETMODE
 | 
					
						
							| 
									
										
										
										
											2004-03-24 18:29:30 +00:00
										 |  |  |     setmode(fd, O_BINARY); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-03-26 01:34:02 +00:00
										 |  |  |     h->priv_data = (void *) (intptr_t) fd; | 
					
						
							| 
									
										
										
										
											2004-12-06 00:08:37 +00:00
										 |  |  |     h->is_streamed = 1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | URLProtocol pipe_protocol = { | 
					
						
							|  |  |  |     "pipe", | 
					
						
							|  |  |  |     pipe_open, | 
					
						
							| 
									
										
										
										
											2007-08-09 23:41:59 +00:00
										 |  |  |     file_read, | 
					
						
							|  |  |  |     file_write, | 
					
						
							| 
									
										
										
										
											2009-03-03 17:04:51 +00:00
										 |  |  |     .url_get_file_handle = file_get_handle, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | }; |