[FFmpeg-cvslog] LAVFAPI: avformat_alloc_output_context() / simplify usage of muxers.

Michael Niedermayer git at videolan.org
Sat Apr 30 22:08:51 CEST 2011


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sat Apr 30 20:43:16 2011 +0200| [7d727f1338fb23ce26975ba0e5487d2fa5783d16] | committer: Michael Niedermayer

LAVFAPI: avformat_alloc_output_context() / simplify usage of muxers.
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7d727f1338fb23ce26975ba0e5487d2fa5783d16
---

 ffmpeg.c               |   23 +++--------------------
 libavformat/avformat.h |    9 ++++++++-
 libavformat/utils.c    |   44 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+), 21 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index b61df52..bde23e0 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -3779,30 +3779,13 @@ static void opt_output_file(const char *filename)
     if (!strcmp(filename, "-"))
         filename = "pipe:";
 
-    oc = avformat_alloc_context();
+    oc = avformat_alloc_output_context(last_asked_format, NULL, filename);
+    last_asked_format = NULL;
     if (!oc) {
         print_error(filename, AVERROR(ENOMEM));
         ffmpeg_exit(1);
     }
-
-    if (last_asked_format) {
-        file_oformat = av_guess_format(last_asked_format, NULL, NULL);
-        if (!file_oformat) {
-            fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
-            ffmpeg_exit(1);
-        }
-        last_asked_format = NULL;
-    } else {
-        file_oformat = av_guess_format(NULL, filename, NULL);
-        if (!file_oformat) {
-            fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
-                    filename);
-            ffmpeg_exit(1);
-        }
-    }
-
-    oc->oformat = file_oformat;
-    av_strlcpy(oc->filename, filename, sizeof(oc->filename));
+    file_oformat= oc->oformat;
 
     if (!strcmp(file_oformat->name, "ffm") &&
         av_strstart(filename, "http:", NULL)) {
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index c77cbbb..28b0574 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -1048,6 +1048,13 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
 AVFormatContext *avformat_alloc_context(void);
 
 /**
+ * Allocate an AVFormatContext.
+ * avformat_free_context() can be used to free the context and everything
+ * allocated by the framework within it.
+ */
+AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputFormat *oformat, const char *filename);
+
+/**
  * Read packets of a media file to get stream information. This
  * is useful for file formats with no headers such as MPEG. This
  * function also computes the real framerate in case of MPEG-2 repeat
@@ -1295,7 +1302,7 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index,
 /**
  * media file output
  */
-int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap);
+attribute_deprecated int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap);
 
 /**
  * Split a URL string into components.
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 501a411..493c563 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2719,6 +2719,50 @@ int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
     return 0;
 }
 
+AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputFormat *oformat, const char *filename){
+    AVFormatContext *s= avformat_alloc_context();
+    if(!s)
+        goto nomem;
+
+    if(!oformat){
+        if (format) {
+            oformat = av_guess_format(format, NULL, NULL);
+            if (!oformat) {
+                av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
+                goto error;
+            }
+        } else {
+            oformat = av_guess_format(NULL, filename, NULL);
+            if (!oformat) {
+                av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
+                        filename);
+                goto error;
+            }
+        }
+    }
+
+    s->oformat= oformat;
+    if (s->oformat->priv_data_size > 0) {
+        s->priv_data = av_mallocz(s->oformat->priv_data_size);
+        if (!s->priv_data)
+            goto nomem;
+        if (s->oformat->priv_class) {
+            *(const AVClass**)s->priv_data= s->oformat->priv_class;
+            av_opt_set_defaults(s->priv_data);
+        }
+    } else
+        s->priv_data = NULL;
+
+    if(filename)
+        av_strlcpy(s->filename, filename, sizeof(s->filename));
+    return s;
+nomem:
+    av_log(s, AV_LOG_ERROR, "Out of memory\n");
+error:
+    avformat_free_context(s);
+    return NULL;
+}
+
 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
 {
     const AVCodecTag *avctag;



More information about the ffmpeg-cvslog mailing list