summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-01-01 17:45:24 +0100
committerwm4 <wm4@mplayer2.org>2012-01-18 04:25:19 +0100
commit55560d62ee85f6336c2c38b1b112a4395e22bc14 (patch)
treee08230feda237eb0d406f976c0e8c15aca7be291 /libmpdemux
parentf88674509e0a4f90180f26a9b8aa6879df38b056 (diff)
downloadmpv-55560d62ee85f6336c2c38b1b112a4395e22bc14.tar.bz2
mpv-55560d62ee85f6336c2c38b1b112a4395e22bc14.tar.xz
core: add new support for reading .cue files
Playing a .cue file directly will now parse the .cue file, and load and play the file(s) referenced in the cue. If multiple files are referenced, a timeline including all files will be created to create the impression of a single, flat audio file containing all the tracks. For each track, a chapter is created. The chapter navigation commands can be used to jump between tracks. The chapter titles will use the string provided by the track's TITLE cue command. (The -identify command can be used to print all chapters in a not so user friendly way.) Other than the chapter names, there is no attempt at displaying or exposing any other meta data contained in the cue files yet. The handling (or lack of thereof) of gaps (track pregaps and postgaps) is probably not correct yet. In general, mplayer's mapping of tracks to the source audio files can be verified by examining the timeline, which will be printed when passing the -v switch. Note that this has nothing to do with the old cue:// support. The old code isn't touched, and is still only able to play .cue/.bin pairs. Prefixing a .cue file with cue:// will always invoke the old code, while playing a .cue file directly (i.e. "mplayer file.cue") will always use the new code. Playing audio images (.cue/.bin pairs of files) doesn't work yet.
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_cue.c65
-rw-r--r--libmpdemux/demuxer.c2
-rw-r--r--libmpdemux/demuxer.h1
3 files changed, 68 insertions, 0 deletions
diff --git a/libmpdemux/demux_cue.c b/libmpdemux/demux_cue.c
new file mode 100644
index 0000000000..d2fd06ce71
--- /dev/null
+++ b/libmpdemux/demux_cue.c
@@ -0,0 +1,65 @@
+/*
+ * This file is part of MPlayer.
+ *
+ * MPlayer 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.
+ *
+ * MPlayer 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 MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "bstr.h"
+#include "demuxer.h"
+#include "stream/stream.h"
+
+// timeline/tl_cue.c
+bool mp_probe_cue(struct bstr s);
+
+#define PROBE_SIZE 512
+
+static int try_open_file(struct demuxer *demuxer)
+{
+ struct stream *s = demuxer->stream;
+ char buf[PROBE_SIZE];
+ int len = stream_read(s, buf, sizeof(buf));
+ if (len <= 0)
+ return 0;
+ if (!mp_probe_cue((struct bstr) { buf, len }))
+ return 0;
+ stream_seek(s, 0);
+ demuxer->file_contents = stream_read_complete(s, demuxer, 1000000, 0);
+ if (demuxer->file_contents.start == NULL)
+ return 0;
+ if (!mp_probe_cue((struct bstr) { buf, len }))
+ return 0;
+ return DEMUXER_TYPE_CUE;
+}
+
+static int dummy_fill_buffer(struct demuxer *demuxer, struct demux_stream *ds)
+{
+ return 0;
+}
+
+const struct demuxer_desc demuxer_desc_cue = {
+ .info = "CUE file demuxer",
+ .name = "cue",
+ .shortdesc = "CUE",
+ .author = "Uoti Urpala",
+ .comment = "",
+ .type = DEMUXER_TYPE_CUE,
+ .safe_check = true,
+ .check_file = try_open_file, // no separate .open
+ .fill_buffer = dummy_fill_buffer,
+};
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index b3a1998d0c..be4b2bb676 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -52,6 +52,7 @@ static void clear_parser(sh_common_t *sh);
// Demuxer list
extern const struct demuxer_desc demuxer_desc_edl;
+extern const struct demuxer_desc demuxer_desc_cue;
extern const demuxer_desc_t demuxer_desc_rawaudio;
extern const demuxer_desc_t demuxer_desc_rawvideo;
extern const demuxer_desc_t demuxer_desc_tv;
@@ -101,6 +102,7 @@ extern const demuxer_desc_t demuxer_desc_mng;
const demuxer_desc_t *const demuxer_list[] = {
&demuxer_desc_edl,
+ &demuxer_desc_cue,
&demuxer_desc_rawaudio,
&demuxer_desc_rawvideo,
#ifdef CONFIG_TV
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index cdea5baa61..da751852d8 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -89,6 +89,7 @@ enum demuxer_type {
DEMUXER_TYPE_RTP_NEMESI,
DEMUXER_TYPE_MNG,
DEMUXER_TYPE_EDL,
+ DEMUXER_TYPE_CUE,
/* Values after this are for internal use and can not be selected
* as demuxer type by the user (-demuxer option). */