Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ecd2d90190 | ||
|
|
73e4094770 | ||
|
|
f5572919e4 | ||
|
|
93bf6eba3b | ||
|
|
150aeafdd2 | ||
|
|
1ef0d02245 | ||
|
|
74be07c36d | ||
|
|
54c371a293 | ||
|
|
4788b8323c |
No files matched your search
@@ -1927,6 +1927,12 @@
|
||||
current level. With values below 100 the initial volume (which is 100%)
|
||||
will be above the maximum, which e.g. the OSD cannot display correctly.
|
||||
|
||||
Note: the maximum value of ``--volume`` as well as the ``volume`` property
|
||||
is always 100. Likewise, the volume OSD bar always goes from 0 to 100.
|
||||
This means that with ``--softvol-max=200``, ``--volume=100`` means
|
||||
maximum amplification, i.e. amplify by 200%. The default volume will be
|
||||
``50`` in this case (meaning no amplification).
|
||||
|
||||
``--speed=<0.01-100>``
|
||||
Slow down or speed up playback by the factor given as parameter.
|
||||
|
||||
|
||||
@@ -389,13 +389,15 @@ static int decode_new_packet(struct sh_audio *sh)
|
||||
}
|
||||
int got_frame = 0;
|
||||
int ret = avcodec_decode_audio4(avctx, priv->avframe, &got_frame, &pkt);
|
||||
if (ret > 0) {
|
||||
// At least "shorten" decodes sub-frames, instead of the whole packet.
|
||||
// At least "mpc8" can return 0 and wants the packet again next time.
|
||||
if (ret >= 0) {
|
||||
ret = FFMIN(ret, mpkt->len); // sanity check against decoder overreads
|
||||
mpkt->buffer += ret;
|
||||
mpkt->len -= ret;
|
||||
mpkt->pts = MP_NOPTS_VALUE; // don't reset PTS next time
|
||||
}
|
||||
if (mpkt->len == 0 || ret <= 0) {
|
||||
if (mpkt->len == 0 || ret < 0) {
|
||||
talloc_free(mpkt);
|
||||
priv->packet = NULL;
|
||||
}
|
||||
|
||||
@@ -322,10 +322,10 @@ Optional features:
|
||||
--disable-libass-osd disable OSD rendering with libass [autodetect]
|
||||
--enable-rpath enable runtime linker path for extra libs [disabled]
|
||||
--disable-libpostproc disable postprocess filter (vf_pp) [autodetect]
|
||||
--disable-libavdevice enable libavdevice demuxers [autodetect]
|
||||
--disable-libavfilter enable libavfilter [autodetect]
|
||||
--disable-vf-lavfi enable vf_lavfi libavfilter bridge [audodetect]
|
||||
--disable-af-lavfi enable af_lavfi libavfilter bridge [audodetect]
|
||||
--disable-libavdevice disable libavdevice demuxers [autodetect]
|
||||
--disable-libavfilter disable libavfilter [autodetect]
|
||||
--disable-vf-lavfi disable vf_lavfi libavfilter bridge [audodetect]
|
||||
--disable-af-lavfi disable af_lavfi libavfilter bridge [audodetect]
|
||||
|
||||
Codecs:
|
||||
--enable-mng enable MNG input support [autodetect]
|
||||
|
||||
+23
-4
@@ -863,12 +863,31 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs,
|
||||
// API by default, because there are some major issues.
|
||||
// Set max_ts==ts, so that demuxing starts from an earlier position in
|
||||
// the worst case.
|
||||
int r = avformat_seek_file(priv->avfc, -1, INT64_MIN,
|
||||
priv->last_pts, priv->last_pts, avsflags);
|
||||
// To make this horrible situation even worse, some lavf demuxers have
|
||||
// broken timebase handling (everything that uses
|
||||
// ff_subtitles_queue_seek()), and always uses the stream timebase. So
|
||||
// we use the timebase and stream index of the first enabled stream
|
||||
// (i.e. a stream which can participate in seeking).
|
||||
int stream_index = -1;
|
||||
AVRational time_base = {1, AV_TIME_BASE};
|
||||
for (int n = 0; n < priv->num_streams; n++) {
|
||||
struct sh_stream *stream = priv->streams[n];
|
||||
AVStream *st = priv->avfc->streams[n];
|
||||
if (stream && st->discard != AVDISCARD_ALL) {
|
||||
stream_index = n;
|
||||
time_base = st->time_base;
|
||||
break;
|
||||
}
|
||||
}
|
||||
int64_t pts = priv->last_pts;
|
||||
if (pts != AV_NOPTS_VALUE)
|
||||
pts = pts / (double)AV_TIME_BASE * av_q2d(av_inv_q(time_base));
|
||||
int r = avformat_seek_file(priv->avfc, stream_index, INT64_MIN,
|
||||
pts, pts, avsflags);
|
||||
// Similar issue as in the normal seeking codepath.
|
||||
if (r < 0) {
|
||||
avformat_seek_file(priv->avfc, -1, INT64_MIN,
|
||||
priv->last_pts, INT64_MAX, avsflags);
|
||||
avformat_seek_file(priv->avfc, stream_index, INT64_MIN,
|
||||
pts, INT64_MAX, avsflags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-12
@@ -888,7 +888,7 @@ exit:
|
||||
static void load_playback_resume(m_config_t *conf, const char *file)
|
||||
{
|
||||
char *fname = get_playback_resume_config_filename(file);
|
||||
if (fname) {
|
||||
if (fname && mp_path_exists(fname)) {
|
||||
// Never apply the saved start position to following files
|
||||
m_config_backup_opt(conf, "start");
|
||||
try_load_config(conf, fname, false);
|
||||
@@ -4151,6 +4151,19 @@ static void play_current_file(struct MPContext *mpctx)
|
||||
|
||||
mpctx->add_osd_seek_info &= OSD_SEEK_INFO_EDITION;
|
||||
|
||||
if (opts->reset_options) {
|
||||
for (int n = 0; opts->reset_options[n]; n++) {
|
||||
const char *opt = opts->reset_options[n];
|
||||
if (opt[0]) {
|
||||
if (strcmp(opt, "all") == 0) {
|
||||
m_config_backup_all_opts(mpctx->mconfig);
|
||||
} else {
|
||||
m_config_backup_opt(mpctx->mconfig, opt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
load_per_protocol_config(mpctx->mconfig, mpctx->filename);
|
||||
load_per_extension_config(mpctx->mconfig, mpctx->filename);
|
||||
load_per_file_config(mpctx->mconfig, mpctx->filename, opts->use_filedir_conf);
|
||||
@@ -4168,17 +4181,6 @@ static void play_current_file(struct MPContext *mpctx)
|
||||
load_per_file_options(mpctx->mconfig, mpctx->playlist->current->params,
|
||||
mpctx->playlist->current->num_params);
|
||||
|
||||
if (opts->reset_options) {
|
||||
for (int n = 0; opts->reset_options[n]; n++) {
|
||||
const char *opt = opts->reset_options[n];
|
||||
if (strcmp(opt, "all") == 0) {
|
||||
m_config_backup_all_opts(mpctx->mconfig);
|
||||
} else {
|
||||
m_config_backup_opt(mpctx->mconfig, opt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We must enable getch2 here to be able to interrupt network connection
|
||||
// or cache filling
|
||||
if (opts->consolecontrols && !opts->slave_mode) {
|
||||
|
||||
+1
-1
@@ -550,7 +550,7 @@ const m_option_t mp_opts[] = {
|
||||
{"auto", SOFTVOL_AUTO})),
|
||||
OPT_FLOATRANGE("softvol-max", softvol_max, 0, 10, 10000),
|
||||
OPT_INTRANGE("volstep", volstep, 0, 0, 100),
|
||||
OPT_FLOATRANGE("volume", mixer_init_volume, 0, -1, 10000),
|
||||
OPT_FLOATRANGE("volume", mixer_init_volume, 0, -1, 100),
|
||||
OPT_CHOICE("mute", mixer_init_mute, M_OPT_OPTIONAL_PARAM,
|
||||
({"auto", -1},
|
||||
{"no", 0},
|
||||
|
||||
+6
-2
@@ -729,8 +729,12 @@ static int demux_open_tv(demuxer_t *demuxer, enum demux_check check)
|
||||
/* get IMAGE FORMAT */
|
||||
int fourcc;
|
||||
funcs->control(tvh->priv, TVI_CONTROL_VID_GET_FORMAT, &fourcc);
|
||||
sh_video->gsh->codec = "rawvideo";
|
||||
sh_video->format = fourcc;
|
||||
if (fourcc == MP_FOURCC_MJPEG) {
|
||||
sh_video->gsh->codec = "mjpeg";
|
||||
} else {
|
||||
sh_video->gsh->codec = "rawvideo";
|
||||
sh_video->format = fourcc;
|
||||
}
|
||||
|
||||
/* set FPS and FRAMETIME */
|
||||
|
||||
|
||||
Reference in new issue
Block a user