[FFmpeg-devel] [PATCH] lavf: deprecate avformat_alloc_output_context() in favor of avformat_alloc_output_context2()

Stefano Sabatini stefano.sabatini-lala at poste.it
Thu May 19 22:13:20 CEST 2011


The new function accepts a slightly more intuitive order of paramters,
and returns an error code, thus allowing applications to report a
meaningful error message.
---
 ffmpeg.c               |    4 ++--
 libavformat/avformat.h |   26 ++++++++++++++++++++++++--
 libavformat/utils.c    |   24 +++++++++++++++++++++---
 libavformat/version.h  |    3 +++
 4 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 90c7d71..48b5c00 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -3885,10 +3885,10 @@ static void opt_output_file(const char *filename)
     if (!strcmp(filename, "-"))
         filename = "pipe:";
 
-    oc = avformat_alloc_output_context(last_asked_format, NULL, filename);
+    err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
     last_asked_format = NULL;
     if (!oc) {
-        print_error(filename, AVERROR(ENOMEM));
+        print_error(filename, err);
         ffmpeg_exit(1);
     }
     file_oformat= oc->oformat;
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index ec51a57..079c1b5 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -1054,12 +1054,34 @@ int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap);
  */
 AVFormatContext *avformat_alloc_context(void);
 
+#if FF_API_ALLOC_OUTPUT_CONTEXT
 /**
- * Allocate an AVFormatContext.
- * avformat_free_context() can be used to free the context and everything
- * allocated by the framework within it.
+ * @deprecated deprecated in favor of avformat_alloc_output_context2()
  */
+attribute_deprecated
 AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputFormat *oformat, const char *filename);
+#endif
+
+/**
+ * Allocate and initialize an AVFormatContext.
+ * avformat_free_context() can be used to free the context and everything
+ * allocated by the framework within it.
+ *
+ * @param *ctx is set to the created format context, set to NULL in
+ * case of failure
+ * @param oformat format to use for open the file, if NULL format_name
+ * and filename are used to detect which output format to use for
+ * allocating the context
+ * @param format_name the name of output format to open, if NULL
+ * filename is used to guess the output format to use for allocating
+ * the context
+ * @param filename the name of the filename for which to allocate the
+ * context, may be NULL
+ * @return >= in case of success, a negative AVERROR code in case of
+ * failure
+ */
+int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
+                                   const char *format_name, const char *filename);
 
 /**
  * Read packets of a media file to get stream information. This
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 70429a7..c971262 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2747,8 +2747,13 @@ int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
     return 0;
 }
 
-AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputFormat *oformat, const char *filename){
+int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
+                                   const char *format, const char *filename)
+{
     AVFormatContext *s= avformat_alloc_context();
+    int ret = 0;
+
+    *avctx = NULL;
     if(!s)
         goto nomem;
 
@@ -2757,11 +2762,13 @@ AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputForma
             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);
+                ret = AVERROR(EINVAL);
                 goto error;
             }
         } else {
             oformat = av_guess_format(NULL, filename, NULL);
             if (!oformat) {
+                ret = AVERROR(EINVAL);
                 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
                         filename);
                 goto error;
@@ -2783,14 +2790,25 @@ AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputForma
 
     if(filename)
         av_strlcpy(s->filename, filename, sizeof(s->filename));
-    return s;
+    *avctx = s;
+    return 0;
 nomem:
     av_log(s, AV_LOG_ERROR, "Out of memory\n");
+    ret = AVERROR(ENOMEM);
 error:
     avformat_free_context(s);
-    return NULL;
+    return ret;
 }
 
+#if FF_API_ALLOC_OUTPUT_CONTEXT
+AVFormatContext *avformat_alloc_output_context(const char *format, AVOutputFormat *oformat, const char *filename)
+{
+    AVFormatContext *avctx;
+    int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
+    return ret < 0 ? NULL : avctx;
+}
+#endif
+
 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
 {
     const AVCodecTag *avctag;
diff --git a/libavformat/version.h b/libavformat/version.h
index dde8aa9..46a7dca 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -68,5 +68,8 @@
 #ifndef FF_API_SDP_CREATE
 #define FF_API_SDP_CREATE              (LIBAVFORMAT_VERSION_MAJOR < 54)
 #endif
+#ifndef FF_API_ALLOC_OUTPUT_CONTEXT
+#define FF_API_ALLOC_OUTPUT_CONTEXT    (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
 
 #endif //AVFORMAT_VERSION_H
-- 
1.7.2.3



More information about the ffmpeg-devel mailing list