summaryrefslogtreecommitdiffstats
path: root/stream/stream_lavf.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-12-08 15:41:03 +0100
committerwm4 <wm4@nowhere>2012-12-11 00:37:54 +0100
commiteb787267c845be8f0fdf717c46591b41e86600c8 (patch)
tree0f8e1a9d6244faed593aa74a57818e66d788a7a7 /stream/stream_lavf.c
parent5bf8706d1f6536cd89207b777161ab83195ddb20 (diff)
downloadmpv-eb787267c845be8f0fdf717c46591b41e86600c8.tar.bz2
mpv-eb787267c845be8f0fdf717c46591b41e86600c8.tar.xz
stream: handle mms streaming with ffmpeg
Use ffmpeg (stream_lavf) instead of internal mms support (asf_streaming.c) for mms://, mmsh://, mmst:// URLs. The old implementation is available under mp_mms:// etc. There are some caveats with this: - mms:// now always maps to mmsh://. It won't try mmst://. (I'm not sure if mms:// URLs really can use the mmst protocol, though.) - MMS streams under the http:// prefix are not handled. (ffmpeg ticket #2001.) (Was already broken in mpv since c02f25.) - It downloads all video streams now. MMS streams often have redundant video streams, which encode the main stream at different quality. The client is supposed to select one according to its bandwidth requirements. (Explicit MMS stream selection has been broken in mpv for a while, because MPOpts.vid maps to the stream number, not the demuxer's stream ID - but the old logic doesn't work anyway when using demuxer_lavf as opposed to demux_asf.)
Diffstat (limited to 'stream/stream_lavf.c')
-rw-r--r--stream/stream_lavf.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/stream/stream_lavf.c b/stream/stream_lavf.c
index 4c7e5a7c40..a3268c10ae 100644
--- a/stream/stream_lavf.c
+++ b/stream/stream_lavf.c
@@ -94,9 +94,9 @@ static const char * const prefix[] = { "lavf://", "ffmpeg://" };
static int open_f(stream_t *stream, int mode, void *opts, int *file_format)
{
int flags = 0;
- const char *filename;
AVIOContext *avio = NULL;
int res = STREAM_ERROR;
+ void *temp = talloc_new(NULL);
if (mode == STREAM_READ)
flags = AVIO_FLAG_READ;
@@ -108,9 +108,8 @@ static int open_f(stream_t *stream, int mode, void *opts, int *file_format)
goto out;
}
- if (stream->url)
- filename = stream->url;
- else {
+ const char *filename = stream->url;
+ if (!filename) {
mp_msg(MSGT_OPEN, MSGL_ERR, "[ffmpeg] No URL\n");
goto out;
}
@@ -129,6 +128,14 @@ static int open_f(stream_t *stream, int mode, void *opts, int *file_format)
}
mp_msg(MSGT_OPEN, MSGL_V, "[ffmpeg] Opening %s\n", filename);
+ // Replace "mms://" with "mmsh://", so that most mms:// URLs just work.
+ bstr b_filename = bstr0(filename);
+ if (bstr_eatstart0(&b_filename, "mms://") ||
+ bstr_eatstart0(&b_filename, "mmshttp://"))
+ {
+ filename = talloc_asprintf(temp, "mmsh://%.*s", BSTR_P(b_filename));
+ }
+
if (avio_open(&avio, filename, flags) < 0)
goto out;
@@ -157,6 +164,7 @@ static int open_f(stream_t *stream, int mode, void *opts, int *file_format)
res = STREAM_OK;
out:
+ talloc_free(temp);
return res;
}
@@ -166,7 +174,8 @@ const stream_info_t stream_info_ffmpeg = {
"",
"",
open_f,
- { "lavf", "ffmpeg", "rtmp", "rtsp", "http", "https", NULL },
+ { "lavf", "ffmpeg", "rtmp", "rtsp", "http", "https", "mms", "mmst", "mmsh",
+ "mmshttp", NULL },
NULL,
1 // Urls are an option string
};