[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