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.)
This commit is contained in:
wm4 2015-03-24 21:29:09 +01:00
parent 9b5a7241e8
commit 1ad4a62336
5 changed files with 66 additions and 26 deletions

View File

@ -54,6 +54,7 @@ extern const demuxer_desc_t demuxer_desc_libass;
extern const demuxer_desc_t demuxer_desc_subreader;
extern const demuxer_desc_t demuxer_desc_playlist;
extern const demuxer_desc_t demuxer_desc_disc;
extern const demuxer_desc_t demuxer_desc_rar;
/* Please do not add any new demuxers here. If you want to implement a new
* demuxer, add it to libavformat, except for wrappers around external
@ -72,6 +73,7 @@ const demuxer_desc_t *const demuxer_list[] = {
&demuxer_desc_libass,
#endif
&demuxer_desc_matroska,
&demuxer_desc_rar,
&demuxer_desc_lavf,
&demuxer_desc_mf,
&demuxer_desc_playlist,

View File

@ -23,7 +23,6 @@
#include "common/playlist.h"
#include "options/path.h"
#include "stream/stream.h"
#include "stream/rar.h"
#include "demux.h"
#define PROBE_SIZE (8 * 1024)
@ -189,30 +188,6 @@ static int parse_pls(struct pl_parser *p)
return 0;
}
static int parse_rar(struct pl_parser *p)
{
if (RarProbe(p->s))
return -1;
if (p->probing)
return 0;
int count;
rar_file_t **files;
if (RarParse(p->s, &count, &files))
return -1;
p->pl->disable_safety = true; // make it load rar://
char *prefix = mp_url_escape(p, p->real_stream->url, "~|");
for (int n = 0; n < count; n++) {
// stream_rar.c does the real work
playlist_add_file(p->pl,
talloc_asprintf(p, "rar://%s|%s", prefix, files[n]->name));
RarFileDelete(files[n]);
}
talloc_free(files);
return 0;
}
static int parse_txt(struct pl_parser *p)
{
if (!p->force)
@ -245,7 +220,6 @@ static const struct pl_format formats[] = {
{"mov", parse_mov_rtsptext},
{"pls", parse_pls,
MIME_TYPES("audio/x-scpls")},
{"rar", parse_rar},
{"txt", parse_txt},
};

62
demux/demux_rar.c Normal file
View File

@ -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,
};

View File

@ -169,6 +169,7 @@ SOURCES = audio/audio.c \
demux/demux_mkv.c \
demux/demux_mkv_timeline.c \
demux/demux_playlist.c \
demux/demux_rar.c \
demux/demux_raw.c \
demux/demux_subreader.c \
demux/ebml.c \

View File

@ -170,6 +170,7 @@ def build(ctx):
( "demux/demux_mkv_timeline.c" ),
( "demux/demux_playlist.c" ),
( "demux/demux_raw.c" ),
( "demux/demux_rar.c" ),
( "demux/demux_subreader.c" ),
( "demux/demux_tv.c", "tv" ),
( "demux/ebml.c" ),