summaryrefslogtreecommitdiffstats
path: root/demux/demux_rar.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-03-24 21:29:09 +0100
committerwm4 <wm4@nowhere>2015-03-24 21:29:09 +0100
commit1ad4a62336c2b6f02bc1968c91b877b6d4951c58 (patch)
tree282d57d000f6dc13a01ccfca3c2340bdd099e96b /demux/demux_rar.c
parent9b5a7241e88f8147a391f1bb79ce01593a02d443 (diff)
downloadmpv-1ad4a62336c2b6f02bc1968c91b877b6d4951c58.tar.bz2
mpv-1ad4a62336c2b6f02bc1968c91b877b6d4951c58.tar.xz
demux: fix rar support for files containing DTS audio tracks
With a recent cleanup, rar support was stuffed into demux_playlist.c (because "opening" rar files pretty much just lists archive contents and adds them to a playlist using a special rar:// protocol, which will actually access the rar file contents). Since demux_playlist.c is probed _after_ demux_lavf.c (and should/must be), libavformat was given the chance to detect DTS streams embedded within the rar file. This is not really what we want, and a regression what happened before rar listing was moved to demux_playlist.c. Fix it by moving the rar listing into its own pseudo-demuxer, and let ir probe before demux_lavf.c. (Yes, this feature still has users.)
Diffstat (limited to 'demux/demux_rar.c')
-rw-r--r--demux/demux_rar.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/demux/demux_rar.c b/demux/demux_rar.c
new file mode 100644
index 0000000000..46311bce65
--- /dev/null
+++ b/demux/demux_rar.c
@@ -0,0 +1,62 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with mpv. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "common/common.h"
+#include "common/playlist.h"
+#include "stream/stream.h"
+#include "stream/rar.h"
+#include "demux.h"
+
+static int open_file(struct demuxer *demuxer, enum demux_check check)
+{
+ if (RarProbe(demuxer->stream))
+ return -1;
+
+ int count;
+ rar_file_t **files;
+ if (RarParse(demuxer->stream, &count, &files))
+ return -1;
+
+ void *tmp = talloc_new(NULL);
+ talloc_steal(tmp, files);
+
+ struct playlist *pl = talloc_zero(demuxer, struct playlist);
+ demuxer->playlist = pl;
+
+ // make it load rar://
+ pl->disable_safety = true;
+
+ char *prefix = mp_url_escape(tmp, demuxer->stream->url, "~|");
+ for (int n = 0; n < count; n++) {
+ // stream_rar.c does the real work
+ playlist_add_file(pl,
+ talloc_asprintf(tmp, "rar://%s|%s", prefix, files[n]->name));
+ RarFileDelete(files[n]);
+ }
+
+ demuxer->filetype = "rar";
+ demuxer->fully_read = true;
+
+ talloc_free(tmp);
+ return 0;
+}
+
+const struct demuxer_desc demuxer_desc_rar = {
+ .name = "rar",
+ .desc = "Rar archive file",
+ .open = open_file,
+};