mirror of
https://github.com/mpv-player/mpv
synced 2025-02-27 10:50:53 +00:00
core: output --playing-msg message only after at least one frame is shown
This way it's possible to retrieve correct information about video, like actual width/height, which in general are available only after at least one frame has been sent to the video output, such as dwidth/dheight. mpv_identify.sh becomes a bit slower, because we let it decode enough audio and video to fill the audio buffers and to send one frame to the video output. Also, --playing-msg isn't shown anymore with --frames=0 (could be fixed by special-casing it, should this break any use cases). Note that in some corner cases, like when the demuxer for some reason returns lots of audio packets but no video packets at the start, but video actually starts later, the --playing-msg will still be output before video starts.
This commit is contained in:
parent
54e8e0a502
commit
790df511c4
@ -1455,7 +1455,7 @@
|
||||
*WARNING*: works with the deprecated ``mp_http://`` protocol only.
|
||||
|
||||
--playing-msg=<string>
|
||||
Print out a string before starting playback. The string is expanded for
|
||||
Print out a string after starting playback. The string is expanded for
|
||||
properties, e.g. ``--playing-msg=file: ${filename}`` will print the string
|
||||
``file:`` followed by a space and the currently played filename.
|
||||
|
||||
|
@ -100,7 +100,7 @@ for __midentify__key in $__midentify__allprops; do
|
||||
eval unset $__midentify__nextprefix$__midentify__key
|
||||
done
|
||||
|
||||
__midentify__output=`mpv --playing-msg="$__midentify__propstr" --vo=null --ao=null --frames=0 "$@"`
|
||||
__midentify__output=`mpv --playing-msg="$__midentify__propstr" --vo=null --ao=null --frames=1 "$@"`
|
||||
__midentify__fileindex=0
|
||||
__midentify__prefix=
|
||||
while :; do
|
||||
|
@ -255,6 +255,7 @@ typedef struct MPContext {
|
||||
int step_frames;
|
||||
// Counted down each frame, stop playback if 0 is reached. (-1 = disable)
|
||||
int max_frames;
|
||||
bool playing_msg_shown;
|
||||
|
||||
bool paused_for_cache;
|
||||
|
||||
|
@ -3397,6 +3397,13 @@ static void run_playloop(struct MPContext *mpctx)
|
||||
update_subtitles(mpctx, a_pos);
|
||||
}
|
||||
|
||||
if (opts->playing_msg && !mpctx->playing_msg_shown && new_frame_shown) {
|
||||
mpctx->playing_msg_shown = true;
|
||||
char *msg = mp_property_expand_string(mpctx, opts->playing_msg);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "%s\n", msg);
|
||||
talloc_free(msg);
|
||||
}
|
||||
|
||||
/* It's possible for the user to simultaneously switch both audio
|
||||
* and video streams to "disabled" at runtime. Handle this by waiting
|
||||
* rather than immediately stopping playback due to EOF.
|
||||
@ -4013,12 +4020,6 @@ goto_enable_cache: ;
|
||||
goto terminate_playback;
|
||||
}
|
||||
|
||||
if (opts->playing_msg) {
|
||||
char *msg = mp_property_expand_string(mpctx, opts->playing_msg);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "%s\n", msg);
|
||||
talloc_free(msg);
|
||||
}
|
||||
|
||||
// Disable the term OSD in verbose mode
|
||||
if (verbose)
|
||||
opts->term_osd = 0;
|
||||
@ -4079,6 +4080,7 @@ goto_enable_cache: ;
|
||||
mpctx->step_frames = 0;
|
||||
mpctx->total_avsync_change = 0;
|
||||
mpctx->last_chapter_seek = -2;
|
||||
mpctx->playing_msg_shown = false;
|
||||
|
||||
// If there's a timeline force an absolute seek to initialize state
|
||||
double startpos = rel_time_to_abs(mpctx, opts->play_start, -1);
|
||||
|
Loading…
Reference in New Issue
Block a user