]> git.sesse.net Git - ffmpeg/commitdiff
avformat: add url field to AVFormatContext
authorMarton Balint <cus@passwd.hu>
Fri, 29 Dec 2017 00:01:37 +0000 (01:01 +0100)
committerMarton Balint <cus@passwd.hu>
Sun, 28 Jan 2018 22:06:43 +0000 (23:06 +0100)
This will replace the 1024 character limited filename field. Compatiblity for
output contexts are provided by copying filename field to URL if URL is unset
and by providing an internal function for muxers to set both url and filename
at once.

Signed-off-by: Marton Balint <cus@passwd.hu>
doc/APIchanges
libavformat/avformat.h
libavformat/internal.h
libavformat/mux.c
libavformat/utils.c
libavformat/version.h

index 59e3b20c08b88beeb8a6ca36b1a541d8bc31b74b..878429848d050cf1a2274cd4155801154880e4e7 100644 (file)
@@ -15,6 +15,9 @@ libavutil:     2017-10-21
 
 API changes, most recent first:
 
+2018-01-xx - xxxxxxx - lavf 58.7.100 - avformat.h
+  Add url field to AVFormatContext and add ff_format_set_url helper function.
+
 2018-01-xx - xxxxxxx - lavf 58.6.100 - avformat.h
   Add AVFMTCTX_UNSEEKABLE (for HLS demuxer).
 
index 60ab9fbc804e1f83dae261b9d75b61c12fa09bcc..d1bd4902d0a2e16ee8ced7140cb68e164264b347 100644 (file)
@@ -1402,6 +1402,21 @@ typedef struct AVFormatContext {
      */
     char filename[1024];
 
+    /**
+     * input or output URL. Unlike the old filename field, this field has no
+     * length restriction.
+     *
+     * - demuxing: set by avformat_open_input(), initialized to an empty
+     *             string if url parameter was NULL in avformat_open_input().
+     * - muxing: may be set by the caller before calling avformat_write_header()
+     *           (or avformat_init_output() if that is called first) to a string
+     *           which is freeable by av_free(). Set to an empty string if it
+     *           was NULL in avformat_init_output().
+     *
+     * Freed by libavformat in avformat_free_context().
+     */
+    char *url;
+
     /**
      * Position of the first frame of the component, in
      * AV_TIME_BASE fractional seconds. NEVER set this value directly:
index 0cd0556dc799ed50edee70234c189f71277018fd..1e2a3e05a11b1fff08b21c94863a8a58d8c2a90d 100644 (file)
@@ -696,4 +696,11 @@ int ff_interleaved_peek(AVFormatContext *s, int stream,
 int ff_lock_avformat(void);
 int ff_unlock_avformat(void);
 
+/**
+ * Set AVFormatContext url field to the provided pointer. The pointer must
+ * point to a valid string. The existing url field is freed if necessary. Also
+ * set the legacy filename field to the same string which was provided in url.
+ */
+void ff_format_set_url(AVFormatContext *s, char *url);
+
 #endif /* AVFORMAT_INTERNAL_H */
index ea9f13fdf5a90946ef4640c2e6e5ba71f914834b..de63f2ca25326511bc72abb8c6c03ea17e2720ce 100644 (file)
@@ -186,8 +186,12 @@ int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *ofor
     } else
         s->priv_data = NULL;
 
-    if (filename)
+    if (filename) {
         av_strlcpy(s->filename, filename, sizeof(s->filename));
+        if (!(s->url = av_strdup(filename)))
+            goto nomem;
+
+    }
     *avctx = s;
     return 0;
 nomem:
@@ -251,6 +255,11 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options)
         (ret = av_opt_set_dict2(s->priv_data, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0)
         goto fail;
 
+    if (!s->url && !(s->url = av_strdup(s->filename))) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+
 #if FF_API_LAVF_AVCTX
 FF_DISABLE_DEPRECATION_WARNINGS
     if (s->nb_streams && s->streams[0]->codec->flags & AV_CODEC_FLAG_BITEXACT) {
index c15b8cc8181e0d2cf9ce7cb8dc2c7f52e3fd4cb7..74e615f86ec808d165bbc0d14e5cb060037d5f5b 100644 (file)
@@ -555,6 +555,11 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
     if ((ret = av_opt_set_dict(s, &tmp)) < 0)
         goto fail;
 
+    if (!(s->url = av_strdup(filename ? filename : ""))) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+
     av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
     if ((ret = init_input(s, filename, &tmp)) < 0)
         goto fail;
@@ -4371,6 +4376,7 @@ void avformat_free_context(AVFormatContext *s)
     av_freep(&s->streams);
     flush_packet_queue(s);
     av_freep(&s->internal);
+    av_freep(&s->url);
     av_free(s);
 }
 
@@ -5636,3 +5642,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
     return st->internal->avctx->time_base;
 #endif
 }
+
+void ff_format_set_url(AVFormatContext *s, char *url)
+{
+    av_assert0(url);
+    av_freep(&s->url);
+    s->url = url;
+    av_strlcpy(s->filename, url, sizeof(s->filename));
+}
index 5ff8a89ae0864c8614ecb1aa262050719557a42d..c375b0da157295ed376807562c0174552d519800 100644 (file)
@@ -32,7 +32,7 @@
 // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
 // Also please add any ticket numbers that you believe might be affected here
 #define LIBAVFORMAT_VERSION_MAJOR  58
-#define LIBAVFORMAT_VERSION_MINOR   6
+#define LIBAVFORMAT_VERSION_MINOR   7
 #define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \