[MPlayer-dev-eng] [PATCH] stream_ffmpeg: add -lavfstreamopts option.

Reimar Döffinger Reimar.Doeffinger at gmx.de
Tue Mar 22 21:46:24 CET 2016


Allows specifying options to ffmpeg-based streams.
---
 DOCS/man/en/mplayer.1  |  4 ++++
 cfg-common.h           |  1 +
 stream/stream.h        |  1 +
 stream/stream_ffmpeg.c | 19 ++++++++++++++++++-
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 2a143cb..d8e9b3b 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -1806,6 +1806,10 @@ Skip the proxy for IPv6 addresses.
 It will still be used for IPv4 connections.
 .
 .TP
+.B \-lavfstreamopts <options>
+Specify extra options for libavformat based streams.
+.
+.TP
 .B \-loadidx <index file>
 The file from which to read the video index data saved by \-saveidx.
 This index will be used for seeking, overriding any index data
diff --git a/cfg-common.h b/cfg-common.h
index 3a422cf..ca4e9c9 100644
--- a/cfg-common.h
+++ b/cfg-common.h
@@ -545,6 +545,7 @@ const m_option_t common_opts[] = {
 #ifdef CONFIG_FFMPEG
     {"lavdopts", lavc_decode_opts_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
     {"lavfdopts",  lavfdopts_conf, CONF_TYPE_SUBCONFIG, CONF_GLOBAL, 0, 0, NULL},
+    {"lavfstreamopts",  &lavfstreamopts, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL},
 #endif
 #ifdef CONFIG_XVID4
     {"xvidopts", xvid_dec_opts, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
diff --git a/stream/stream.h b/stream/stream.h
index 615f579..388c353 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -392,6 +392,7 @@ extern char *dvd_device;
 extern const m_option_t dvbin_opts_conf[];
 
 extern char *rtsp_destination;
+extern char *lavfstreamopts;
 
 typedef struct {
  int id; // 0 - 31 mpeg; 128 - 159 ac3; 160 - 191 pcm
diff --git a/stream/stream_ffmpeg.c b/stream/stream_ffmpeg.c
index 57d45e4..1883af3 100644
--- a/stream/stream_ffmpeg.c
+++ b/stream/stream_ffmpeg.c
@@ -27,6 +27,8 @@
 #include "av_helpers.h"
 #include "libmpdemux/demuxer.h"
 
+char *lavfstreamopts;
+
 static int fill_buffer(stream_t *s, char *buffer, int max_len)
 {
     int r = avio_read(s->priv, buffer, max_len);
@@ -90,6 +92,7 @@ static int open_f(stream_t *stream, int mode, void *opts, int *file_format)
 {
     int flags = 0;
     const char *filename;
+    AVDictionary *avopts = NULL;
     AVIOContext *ctx = NULL;
     int res = STREAM_ERROR;
     int64_t size;
@@ -125,9 +128,23 @@ static int open_f(stream_t *stream, int mode, void *opts, int *file_format)
     dummy = !strncmp(filename, "rtsp:", 5) || !strncmp(filename, "dummy:", 6);
     mp_msg(MSGT_OPEN, MSGL_V, "[ffmpeg] Opening %s\n", filename);
 
-    if (!dummy && avio_open(&ctx, filename, flags) < 0)
+    if (lavfstreamopts && av_dict_parse_string(&avopts, lavfstreamopts, "=", ",", 0) < 0) {
+        mp_msg(MSGT_HEADER,MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", lavfstreamopts);
+        goto out;
+    }
+
+    if (!dummy && avio_open2(&ctx, filename, flags, NULL, &avopts) < 0)
         goto out;
 
+    if (!dummy && av_dict_count(avopts)) {
+        AVDictionaryEntry *e = NULL;
+        while ((e = av_dict_get(avopts, "", e, AV_DICT_IGNORE_SUFFIX))) {
+            mp_msg(MSGT_HEADER,MSGL_ERR,"Unknown option %s\n", e->key);
+        }
+        goto out;
+    }
+    av_dict_free(&avopts);
+
     stream->priv = ctx;
     size = dummy ? 0 : avio_size(ctx);
     if (size >= 0)
-- 
2.7.0



More information about the MPlayer-dev-eng mailing list