From 96baaa6affc11ebd71b8f84c11086c92e1c7248b Mon Sep 17 00:00:00 2001
From: Fabrice Bellard <fabrice@bellard.org>
Date: Mon, 24 Sep 2001 23:25:28 +0000
Subject: [PATCH] changed av_open_input_file() prototype

Originally committed as revision 146 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libav/avformat.h | 12 +++++++++-
 libav/utils.c    | 61 ++++++++++++++++++++++++++----------------------
 2 files changed, 44 insertions(+), 29 deletions(-)

diff --git a/libav/avformat.h b/libav/avformat.h
index 48a8f3f5905..630c5af95bc 100644
--- a/libav/avformat.h
+++ b/libav/avformat.h
@@ -180,7 +180,10 @@ int fifo_size(FifoBuffer *f, UINT8 *rptr);
 int fifo_read(FifoBuffer *f, UINT8 *buf, int buf_size, UINT8 **rptr_ptr);
 void fifo_write(FifoBuffer *f, UINT8 *buf, int size, UINT8 **wptr_ptr);
 
-AVFormatContext *av_open_input_file(const char *filename, int buf_size);
+AVFormatContext *av_open_input_file(const char *filename, 
+                                    const char *format_name,
+                                    int buf_size,
+                                    AVFormatParameters *ap);
 int av_read_packet(AVFormatContext *s, AVPacket *pkt);
 void av_close_input_file(AVFormatContext *s);
 
@@ -204,3 +207,10 @@ int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);
 
 int get_frame_filename(char *buf, int buf_size,
                        const char *path, int number);
+
+/* grab/output specific */
+extern AVFormat video_grab_device_format;
+extern AVFormat audio_device_format;
+
+extern const char *v4l_device;
+extern const char *audio_device;
diff --git a/libav/utils.c b/libav/utils.c
index c3e8899be8d..aafc4e78632 100644
--- a/libav/utils.c
+++ b/libav/utils.c
@@ -161,13 +161,14 @@ void register_all(void)
     register_avformat(&pgmpipe_format);
     register_avformat(&pgmyuvpipe_format);
     register_avformat(&ppmpipe_format);
+#ifdef CONFIG_GRAB
+    register_avformat(&video_grab_device_format);
+    register_avformat(&audio_device_format);
+#endif
 
+    /* file protocols */
     register_protocol(&file_protocol);
     register_protocol(&pipe_protocol);
-#ifdef CONFIG_GRAB
-    register_protocol(&audio_protocol);
-    register_protocol(&video_protocol);
-#endif
 #ifndef CONFIG_WIN32
     register_protocol(&udp_protocol);
     register_protocol(&http_protocol);
@@ -274,49 +275,51 @@ void fifo_write(FifoBuffer *f, UINT8 *buf, int size, UINT8 **wptr_ptr)
     *wptr_ptr = wptr;
 }
 
-/* media file handling */
-
-AVFormatContext *av_open_input_file(const char *filename, int buf_size)
+/* media file handling. 
+   'filename' is the filename to open.
+   'format_name' is used to force the file format (NULL if auto guess).
+   'buf_size' is the optional buffer size (zero if default is OK).
+   'ap' are additionnal parameters needed when opening the file (NULL if default).
+*/
+
+AVFormatContext *av_open_input_file(const char *filename, 
+                                    const char *format_name,
+                                    int buf_size,
+                                    AVFormatParameters *ap)
 {
-    AVFormatParameters params, *ap;
     AVFormat *fmt;
     AVFormatContext *ic = NULL;
-    URLFormat url_format;
     int err;
 
     ic = av_mallocz(sizeof(AVFormatContext));
     if (!ic)
         goto fail;
-    if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0)
-        goto fail;
-    
-    if (buf_size > 0) {
-        url_setbufsize(&ic->pb, buf_size);
-    }
 
     /* find format */
-    err = url_getformat(url_fileno(&ic->pb), &url_format);
-    if (err >= 0) {
-        fmt = guess_format(url_format.format_name, NULL, NULL);
-        ap = &params;
-        ap->sample_rate = url_format.sample_rate;
-        ap->frame_rate = url_format.frame_rate;
-        ap->channels = url_format.channels;
-        ap->width = url_format.width;
-        ap->height = url_format.height;
-        ap->pix_fmt = url_format.pix_fmt;
+    if (format_name != NULL) {
+        fmt = guess_format(format_name, NULL, NULL);
     } else {
         fmt = guess_format(NULL, filename, NULL);
-        ap = NULL;
     }
     if (!fmt || !fmt->read_header) {
         return NULL;
     }
     ic->format = fmt;
 
+    /* if no file needed do not try to open one */
+    if (!(fmt->flags & AVFMT_NOFILE)) {
+        if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0)
+            goto fail;
+        if (buf_size > 0) {
+            url_setbufsize(&ic->pb, buf_size);
+        }
+    }
+    
     err = ic->format->read_header(ic, ap);
     if (err < 0) {
-        url_fclose(&ic->pb);
+        if (!(fmt->flags & AVFMT_NOFILE)) {
+            url_fclose(&ic->pb);
+        }
         goto fail;
     }
     
@@ -364,7 +367,9 @@ void av_close_input_file(AVFormatContext *s)
         }
         s->packet_buffer = NULL;
     }
-    url_fclose(&s->pb);
+    if (!(s->format->flags & AVFMT_NOFILE)) {
+        url_fclose(&s->pb);
+    }
     free(s);
 }
 
-- 
GitLab