From 1c43920fb85387aaf7267b4b79dc829896bd610d Mon Sep 17 00:00:00 2001 From: wnoun Date: Sun, 7 Apr 2019 21:10:52 +0800 Subject: demux_cue: auto-detect CUE sheet charset --- DOCS/interface-changes.rst | 1 + DOCS/man/options.rst | 3 +++ demux/demux_cue.c | 31 +++++++++++++++++++++++++++++++ options/options.c | 2 ++ options/options.h | 1 + 5 files changed, 38 insertions(+) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index 366f84d628..ff714f081c 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -90,6 +90,7 @@ Interface changes does not affect --vo=vdpau or --hwdec=vdpau-copy. - remove deprecated --chapter option - deprecate --record-file + - add `--demuxer-cue-codepage` --- mpv 0.29.0 --- - drop --opensles-sample-rate, as --audio-samplerate should be used if desired - drop deprecated --videotoolbox-format, --ff-aid, --ff-vid, --ff-sid, diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index 6f0a597652..91a9416a41 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -3180,6 +3180,9 @@ Demuxer ``--demuxer-rawvideo-size=`` Frame size in bytes when using ``--demuxer=rawvideo``. +``--demuxer-cue-codepage=`` + Specify the CUE sheet codepage. (See ``--sub-codepage`` for details.) + ``--demuxer-max-bytes=`` This controls how much the demuxer is allowed to buffer ahead. The demuxer will normally try to read ahead as much as necessary, or as much is diff --git a/demux/demux_cue.c b/demux/demux_cue.c index 708b742e8f..59628c74b4 100644 --- a/demux/demux_cue.c +++ b/demux/demux_cue.c @@ -28,8 +28,11 @@ #include "mpv_talloc.h" #include "misc/bstr.h" +#include "misc/charset_conv.h" #include "common/msg.h" #include "demux/demux.h" +#include "options/m_config.h" +#include "options/m_option.h" #include "options/path.h" #include "common/common.h" #include "stream/stream.h" @@ -39,8 +42,25 @@ #define PROBE_SIZE 512 +#define OPT_BASE_STRUCT struct demux_cue_opts +struct demux_cue_opts { + char *cue_cp; +}; + +const struct m_sub_options demux_cue_conf = { + .opts = (const m_option_t[]) { + OPT_STRING("codepage", cue_cp, 0), + {0} + }, + .size = sizeof(struct demux_cue_opts), + .defaults = &(const struct demux_cue_opts) { + .cue_cp = "auto" + } +}; + struct priv { struct cue_file *f; + struct demux_cue_opts *opts; }; static void add_source(struct timeline *tl, struct demuxer *d) @@ -252,10 +272,21 @@ static int try_open_file(struct demuxer *demuxer, enum demux_check check) struct priv *p = talloc_zero(demuxer, struct priv); demuxer->priv = p; demuxer->fully_read = true; + p->opts = mp_get_config_group(p, demuxer->global, &demux_cue_conf); + struct demux_cue_opts *cue_opts = p->opts; bstr data = stream_read_complete(s, p, 1000000); if (data.start == NULL) return -1; + const char *charset = mp_charset_guess(p, demuxer->log, data, cue_opts->cue_cp, 0); + if (charset && !mp_charset_is_utf8(charset)) { + MP_INFO(demuxer, "Using CUE charset: %s\n", charset); + bstr utf8 = mp_iconv_to_utf8(demuxer->log, data, charset, MP_ICONV_VERBOSE); + if (utf8.start && utf8.start != data.start) { + ta_steal(data.start, utf8.start); + data = utf8; + } + } p->f = mp_parse_cue(data); talloc_steal(p, p->f); if (!p->f) { diff --git a/options/options.c b/options/options.c index b775c23307..4491ceb2ba 100644 --- a/options/options.c +++ b/options/options.c @@ -65,6 +65,7 @@ extern const struct m_sub_options demux_rawaudio_conf; extern const struct m_sub_options demux_rawvideo_conf; extern const struct m_sub_options demux_lavf_conf; extern const struct m_sub_options demux_mkv_conf; +extern const struct m_sub_options demux_cue_conf; extern const struct m_sub_options vd_lavc_conf; extern const struct m_sub_options ad_lavc_conf; extern const struct m_sub_options input_config; @@ -527,6 +528,7 @@ const m_option_t mp_opts[] = { OPT_SUBSTRUCT("demuxer-rawaudio", demux_rawaudio, demux_rawaudio_conf, 0), OPT_SUBSTRUCT("demuxer-rawvideo", demux_rawvideo, demux_rawvideo_conf, 0), OPT_SUBSTRUCT("demuxer-mkv", demux_mkv, demux_mkv_conf, 0), + OPT_SUBSTRUCT("demuxer-cue", demux_cue, demux_cue_conf, 0), // ------------------------- subtitles options -------------------- diff --git a/options/options.h b/options/options.h index 1f78dd9303..d979f11e19 100644 --- a/options/options.h +++ b/options/options.h @@ -303,6 +303,7 @@ typedef struct MPOpts { struct demux_rawvideo_opts *demux_rawvideo; struct demux_lavf_opts *demux_lavf; struct demux_mkv_opts *demux_mkv; + struct demux_cue_opts *demux_cue; struct demux_opts *demux_opts; struct demux_cache_opts *demux_cache_opts; -- cgit v1.2.3