core: re-add -dumpstream as --stream-dump

Apparently useful for dumping DVD. Could also be used to rip streams
with libquvi and such, but for that there are better tools. Actually
I doubt there aren't better tools to dump DVDs, but whatever, this was
a feature request, so I don't need a good reason.
This commit is contained in:
wm4 2013-05-11 22:40:46 +02:00
parent faad40aad9
commit 989b482bd6
5 changed files with 42 additions and 0 deletions

View File

@ -125,6 +125,8 @@ Command line switches
-x W, -y H --geometry=WxH + --no-keepaspect
-xy W --autofit=W
-a52drc level --ad-lavc-ac3drc=level
-dumpstream --stream-dump=<filename>
-capture --stream-capture=<filename>
=================================== ===================================
*NOTE*: ``-opt val`` becomes ``--opt=val``.

View File

@ -1537,6 +1537,10 @@
interrupted. Note that, due to cache latencies, captured data may begin and
end somewhat delayed compared to what you see displayed.
--stream-dump=<filename>
Same as ``--stream-capture``, but don't start playback. Instead, the full
file is dumped.
--playlist=<filename>
Play files according to a playlist file (ASX, Winamp, SMIL, or
one-file-per-line format).

View File

@ -635,6 +635,7 @@ const m_option_t mplayer_opts[]={
OPT_FLAG("untimed", untimed, 0),
OPT_STRING("stream-capture", stream_capture, 0),
OPT_STRING("stream-dump", stream_dump, 0),
#ifdef CONFIG_LIRC
{"lircconf", &lirc_configfile, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL},

View File

@ -4105,6 +4105,35 @@ static void idle_loop(struct MPContext *mpctx)
}
}
static void stream_dump(struct MPContext *mpctx)
{
struct MPOpts *opts = &mpctx->opts;
char *filename = opts->stream_dump;
stream_t *stream = mpctx->stream;
assert(stream && filename);
stream_set_capture_file(stream, filename);
while (mpctx->stop_play == KEEP_PLAYING && !stream->eof) {
if (!opts->quiet && ((stream->pos / (1024 * 1024)) % 2) == 1) {
uint64_t pos = stream->pos - stream->start_pos;
uint64_t end = stream->end_pos - stream->start_pos;
char *line = talloc_asprintf(NULL, "Dumping %lld/%lld...",
(long long int)pos, (long long int)end);
write_status_line(mpctx, line);
talloc_free(line);
}
stream_fill_buffer(stream);
for (;;) {
mp_cmd_t *cmd = mp_input_get_cmd(mpctx->input, 0, false);
if (!cmd)
break;
run_command(mpctx, cmd);
talloc_free(cmd);
}
}
}
// Start playing the current playlist entry.
// Handle initialization and deinitialization.
static void play_current_file(struct MPContext *mpctx)
@ -4221,6 +4250,11 @@ static void play_current_file(struct MPContext *mpctx)
}
mpctx->stream->start_pos += opts->seek_to_byte;
if (opts->stream_dump && opts->stream_dump[0]) {
stream_dump(mpctx);
goto terminate_playback;
}
// CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts)
#ifdef CONFIG_DVBIN
goto_enable_cache: ;

View File

@ -86,6 +86,7 @@ typedef struct MPOpts {
char *vobsub_name;
int untimed;
char *stream_capture;
char *stream_dump;
int loop_times;
int ordered_chapters;
int chapter_merge_threshold;