Compare commits

..
19 Commits
Author SHA1 Message Date
wm4 463b877ec0 Release 0.1.2 2013-08-19 01:12:43 +02:00
wm4 72c81aa111 vdpau: don't try to match codec profiles
Instead, do what MPlayer did all these years. It worked for them, so
there's probably no reason to change this.

Apparently fixes playback with some files, where the VDPAU decoder does
not formally support a profile, but decoding works with a more powerful
profile anyway.

Though note that MPlayer did this because it couldn't do it in a better
way (no decoder reported profiles available when creating the VDPAU
decoder), so it's not entirely clear whether this is a good idea. An
alterbative implementation might try to map the profiles exactly, and
do some fall backs if the exact profile is not available. But this
hack-solution works too.

Conflicts:
	video/decode/vdpau.c
2013-08-19 01:09:39 +02:00
wm4 9f7c014930 changes: add some things for completeness 2013-08-19 01:07:32 +02:00
wm4 97eddff865 vo_vdpau: fix screenshots if panscan is used
When panscan was used, i.e. the video is cropped to make the video fill
the screen if video and screen aspects don't match, screenshots
contained only the visible region of the source video, stretched to
original video size.
2013-08-18 05:58:33 +02:00
wm4 cf880b9070 mplayer: don't make restored options from quit_watch_later per-file local
Consider:

    mpv file1.mkv file2.mkv

and file1.mkv is restored from an earlier session when quit_watch_later
was used. Then all restored options were reset when file2.mkv is played,
even if the user changed them during playback. This affects for example
the fullscreen setting.

Make it so that after finishing a resumed file, the previously restored
settings are not reset again. (Which means only resuming will forcefully
overwrite the settings.)
2013-08-18 05:58:28 +02:00
wm4 3478575419 manpage: fix incorrect ao_alsa example, extend changes.rst
One example in ao.rst used the old syntax with mangled device names.
Fix it. Mention some shell related caveats. Explicitly mention the
change of device name syntax in changes.rst, because it seems to be
a common issue.
2013-08-15 23:46:18 +02:00
wm4 88a53309cd vdpau: fix compilation on Libav
Libav's <libavcodec/vdpau.h> header uses some libavocdec symbols without
forward-declaring them and without including the headers declaring them.
FFmpeg's header for this is fine.
2013-08-15 23:46:07 +02:00
wm4 da76eb9f14 sub: fix accidental subtitle overlaps
The fix_overlaps_and_gaps() function in dec_sub.c fixes small gaps or
overlaps between subtitle events. However, sometimes it could happen
that the corrected subtitle events could overlap by 1ms due to bad
rounding, making libass shift subtitles to reduce collisions. (The
second subtitle will be shown above the previous one, even if both
subtitles are visible only for 1ms.)

sd_ass.c rounds the timestamps when converting to integers for unknown
reasons. I think it would work fine without that rounding, but since
I have no clue why it rounds, and since it could be needed to ensure
correct timestamps with ASS subtitles demuxed from Matroska, I'd rather
not touch it. So the solution is to use already rounded timestamps to
calculate the new subtitle duration in fix_overlaps_and_gaps().

See github issue #182.
2013-08-15 23:43:36 +02:00
wm4 df6901b653 x11: fix --ontop
Apply it after mapping.
2013-08-15 23:43:33 +02:00
Stefano Pigozzi 53e4ba26b5 changes.rst: document some OSX and windows changes 2013-08-15 23:43:29 +02:00
wm4 f10a3cac0f demux: move demux_mf before demux_subreader
demux_subreader is quite aggressive, and sometimes detects random
strings in EXIF as subtitle text.
2013-08-15 23:43:11 +02:00
wm4 7370ad2120 demux_subreader: report what subtitle format has been found 2013-08-15 23:43:05 +02:00
Noble Huang ed2d819ea5 stream_bluray: fix bd:// url segfault introduced by commit bc1d61 2013-08-15 23:43:00 +02:00
wm4 4f728cfb99 Add VERSION for release
No idea what the correct workflow is for these things. In any case, we
somehow have to make the github release system to include the correct
version in its tarball. I don't think you can provide your own tarballs
either, so it has to be in git.
2013-08-12 00:18:22 +02:00
wm4 cdf4b7d2ee x11_common: get hack for Motif Window Manager out of the way
Disable the hack by default, because it's interfering with some more
modern WMs. MWM (Motif Window Manager) is probably pretty dead, but
we still allow enabling the old hack with "--fstype=mwm_hack".

See github issue #179.
2013-08-11 23:59:18 +02:00
wm4 e978511d63 vo: unref waiting image before destroying VO driver
This is in theory more correct with respect to hardware decoding. With
hardware decoding, the VOs play the role of the video surface allocator,
and nothing is allowed to reference surfaces past the VO lifetime. But
in theory waiting_mpi could be a reference to a HW video surface, so it
should be relased before the VO is uninitialized.
2013-08-11 20:09:06 +02:00
wm4 abe47a4840 core: make sure hw decoding works when playing multiple files
The hw decoding context was set only for the first file (when the VO was
initialized), instead of every file.
2013-08-11 20:08:00 +02:00
wm4 c6db8f6a8b version.sh: add --print option, which prints version to stdout
Might be helpful when creating a tarball.
2013-08-09 10:07:23 +02:00
wm4 b27f65a758 version.sh: integrate the release tag in output
This is basically reconstructed from 46b218c. Since we now have proper
release tags, we want this again.

Add --tags to the git describe call, because the github release system
creates light-weight tags only, and we're too lazy to create annitated
tags (or is that bad practice?).

Add --long, so that the git commit hash is part of the output even if
the tag matches.
2013-08-09 09:44:24 +02:00
13 changed files with 122 additions and 61 deletions

No files matched your search

+6 -2
View File
@@ -17,8 +17,8 @@ in the list. Suboptions are optional and can mostly be omitted.
.. admonition:: Examples
- ``--ao=alsa,oss,`` Try the ALSA driver, then the OSS driver, then others.
- ``--ao=alsa:noblock:device=hw=0.3`` Sets noblock-mode and the device-name
as first card, fourth device.
- ``--ao=alsa:noblock:device=[hw:0,3]`` Sets noblock-mode and the
device-name as first card, fourth device.
Available audio output drivers are:
@@ -48,6 +48,10 @@ Available audio output drivers are:
``--ao=alsa:device=[plug:surround50]``
Note that the ``[`` and ``]`` simply quote the device name. With some
shells (like zsh), you have to quote the option string to prevent the
shell from interpreting the brackets instead of passing them to mpv.
``oss``
OSS audio output driver
+35 -2
View File
@@ -27,7 +27,8 @@ General Changes for MPlayer to mplayer2
* Use libass for subtitle rendering by default (better quality)
* Generally preferring ffmpeg/libav over internal demuxers and decoders
* Improvements when playing multiple files (``--fixed-vo``)
* Screenshot improvements (instant screenshots without 1-frame delay)
* Screenshot improvements (instant screenshots without 1-frame delay, allow
taking screenshots even with hardware decoding)
* Improved support for PulseAudio
* General code cleanups
* Many more changes
@@ -55,6 +56,9 @@ General Changes for mplayer2 to mpv
``screenshot`` video filter is not needed anymore, and should not be put
into the mpv config file)
* Removal of teletext support
* Removal of most builtin demuxers, using libavformat instead
* Removal of builtin network support, using libavformat instead (also,
support https via libavformat)
* Replace image VOs (``--vo=jpeg`` etc.) with ``--vo=image``
* Do not lose settings when playing a new file in the same player instance
* New location for config files, new name for the binary.
@@ -68,7 +72,35 @@ General Changes for mplayer2 to mpv
* Wayland support
* Support for precise scrolling which scales the parameter of commands. If the
input doesn't support precise scrolling the scale factor stays 1.
* General code cleanups
* OSX: Cocoa event loop is independent from mplayer's event loop, so user
actions like accessing menus and live resizing do not block the playback.
* OSX: Apple Remote support.
* OSX: Media Keys support.
* Windows: Added WASAPI audio output.
* New OSD bar with chapter marks and not positioned in the middle of the video
(though this can be customized with the ``--osd-bar-align-y`` option).
* Allow customizing whether a key binding for seeking shows the video time, the
OSD bar, or nothing (see section `Input Command Prefixes`_).
* Display list of chapters and audio/subtitle tracks on OSD (see section
`Properties`_).
* ``--keep-open`` option to stop the player from closing the window and
exiting after playback ends.
* Re-enable screensaver while the player is paused.
* Matroska edition switching at runtime.
* Support for libavfilter (for video->video and audio->audio). This allows
using most of FFmpeg's filters, which improve greatly on the old MPlayer
filters in features, performance, and correctness.
* Improved downmixing and output of surround audio. Instead of using hardcoded
pan filters to do remixing, use libavresample. Channel maps are used to
identify the channel layout, so e.g. ``3.0`` and ``2.1`` audio can be
distinguished.
* Allow resuming playback at a later point with ``Shift+q``, also see
``quit_watch_later`` input command.
* Support mapping multiple commands to one key.
* Allow changing/adjusting video filters at runtime. (This is also used to make
the ``D`` key insert vf_yadif if deinterlacing is not supported otherwise.)
* General bug fixes and removal of long-standing issues
* General code cleanups (including refactoring or rewrites of many parts)
* Many more changes
Detailed Listing of User-visible Changes
@@ -136,6 +168,7 @@ Command Line Switches
``-rawvideo ...`` ``--demuxer-rawvideo-...``
``--mixer`` AO suboptions (``alsa``, ``oss``)
``--mixer-channel`` AO suboptions (``alsa``, ``oss``)
``--ao=alsa:device=hw=0.3`` ``--ao=alsa:device=[hw:0,3]``
=========================== ========================================
.. note::
+1
View File
@@ -0,0 +1 @@
0.1.2
+3 -3
View File
@@ -77,12 +77,12 @@ const demuxer_desc_t *const demuxer_list[] = {
#endif
&demuxer_desc_matroska,
&demuxer_desc_lavf,
&demuxer_desc_subreader,
&demuxer_desc_mf,
#ifdef CONFIG_MNG
&demuxer_desc_mng,
#endif
// auto-probe last, because it checks file-extensions only
&demuxer_desc_mf,
// Pretty aggressive, so should be last.
&demuxer_desc_subreader,
/* Please do not add any new demuxers here. If you want to implement a new
* demuxer, add it to libavformat, except for wrappers around external
* libraries and demuxers requiring binary support. */
+2
View File
@@ -1341,6 +1341,8 @@ static int d_open_file(struct demuxer *demuxer, enum demux_check check)
if (!res)
return -1;
demuxer->filetype = sr.name;
sub_data *sd = sub_read_file(demuxer->stream, &sr);
if (!sd)
return -1;
+13 -11
View File
@@ -739,12 +739,12 @@ static void load_per_output_config(m_config_t *conf, char *cfg, char *out)
* Tries to load a config file (in file local mode)
* @return 0 if file was not found, 1 otherwise
*/
static int try_load_config(m_config_t *conf, const char *file)
static int try_load_config(m_config_t *conf, const char *file, bool local)
{
if (!mp_path_exists(file))
return 0;
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Loading config '%s'\n", file);
m_config_parse_config_file(conf, file, M_SETOPT_BACKUP);
m_config_parse_config_file(conf, file, local ? M_SETOPT_BACKUP : 0);
return 1;
}
@@ -767,14 +767,14 @@ static void load_per_file_config(m_config_t *conf, const char * const file,
char dircfg[MP_PATH_MAX];
strcpy(dircfg, cfg);
strcpy(dircfg + (name - cfg), "mpv.conf");
try_load_config(conf, dircfg);
try_load_config(conf, dircfg, true);
if (try_load_config(conf, cfg))
if (try_load_config(conf, cfg, true))
return;
}
if ((confpath = mp_find_user_config_file(name)) != NULL) {
try_load_config(conf, confpath);
try_load_config(conf, confpath, true);
talloc_free(confpath);
}
@@ -889,7 +889,9 @@ static void load_playback_resume(m_config_t *conf, const char *file)
{
char *fname = get_playback_resume_config_filename(file);
if (fname) {
try_load_config(conf, fname);
// Never apply the saved start position to following files
m_config_backup_opt(conf, "start");
try_load_config(conf, fname, false);
unlink(fname);
}
talloc_free(fname);
@@ -2384,13 +2386,13 @@ int reinit_video_chain(struct MPContext *mpctx)
&(bool){false});
}
mpctx->initialized_flags |= INITIALIZED_VO;
// dynamic allocation only to make stheader.h lighter
talloc_free(sh_video->hwdec_info);
sh_video->hwdec_info = talloc_zero(sh_video, struct mp_hwdec_info);
vo_control(mpctx->video_out, VOCTRL_GET_HWDEC_INFO, sh_video->hwdec_info);
}
// dynamic allocation only to make stheader.h lighter
talloc_free(sh_video->hwdec_info);
sh_video->hwdec_info = talloc_zero(sh_video, struct mp_hwdec_info);
vo_control(mpctx->video_out, VOCTRL_GET_HWDEC_INFO, sh_video->hwdec_info);
vo_update_window_title(mpctx);
if (stream_control(mpctx->sh_video->gsh->demuxer->stream,
+2 -6
View File
@@ -65,12 +65,8 @@ struct bluray_priv_s {
char *cfg_device;
};
static const struct stream_priv_s {
int title;
char *device;
} bluray_stream_priv_dflts = {
BLURAY_DEFAULT_TITLE,
NULL
static struct bluray_priv_s bluray_stream_priv_dflts = {
.cfg_title = BLURAY_DEFAULT_TITLE
};
#define OPT_BASE_STRUCT struct bluray_priv_s
+6 -1
View File
@@ -302,6 +302,8 @@ static void multiply_timings(struct packet_list *subs, double factor)
}
}
#define MS_TS(f_ts) ((int)((f_ts) * 1000 + 0.5))
// Remove overlaps and fill gaps between adjacent subtitle packets. This is done
// by adjusting the duration of the earlier packet. If the gaps or overlap are
// larger than the threshold, or if the durations are close to the threshold,
@@ -322,7 +324,10 @@ static void fix_overlaps_and_gaps(struct packet_list *subs)
if (fabs(next->pts - end) <= threshold && cur->duration >= keep &&
next->duration >= keep)
{
cur->duration = next->pts - cur->pts;
// Conceptually: cur->duration = next->pts - cur->pts;
// But make sure the rounding and conversion to integers in
// sd_ass.c can't produce overlaps.
cur->duration = (MS_TS(next->pts) - MS_TS(cur->pts)) / 1000.0;
}
}
}
+25 -4
View File
@@ -2,20 +2,41 @@
export LC_ALL=C
test "$1" && extra="-$1"
for ac_option do
case "$ac_option" in
--extra=*)
extra="-$option"
;;
--print)
print=yes
;;
*)
echo "Unknown parameter: $option" >&2
exit 1
;;
esac
done
# Extract revision number from file used by daily tarball snapshots
# or from "git describe" output
git_revision=$(cat snapshot_version 2> /dev/null)
test $git_revision || test ! -e .git || git_revision=`git rev-parse --short HEAD`
test $git_revision || test ! -e .git || git_revision=`git describe --match "v[0-9]*" --always --tags --long`
git_revision=$(expr "$git_revision" : v*'\(.*\)')
test $git_revision || git_revision=UNKNOWN
# releases extract the version number from the VERSION file
version=$(cat VERSION 2> /dev/null)
test $version || version=git-$git_revision
test $version || version=$git_revision
NEW_REVISION="#define VERSION \"${version}${extra}\""
VERSION="${version}${extra}"
if test "$print" = yes ; then
echo "$VERSION"
exit 0
fi
NEW_REVISION="#define VERSION \"${VERSION}\""
OLD_REVISION=$(head -n 1 version.h 2> /dev/null)
BUILDDATE="#define BUILDDATE \"$(date)\""
+9 -23
View File
@@ -18,6 +18,7 @@
#include <stddef.h>
#include <assert.h>
#include <libavcodec/avcodec.h>
#include <libavcodec/vdpau.h>
#include <libavutil/common.h>
@@ -41,33 +42,22 @@ struct priv {
struct profile_entry {
enum AVCodecID av_codec;
int ff_profile;
VdpDecoderProfile vdp_profile;
int maxrefs;
};
#define PE(av_codec_id, ff_profile, vdp_dcoder_profile, maxrefs) \
#define PE(av_codec_id, vdp_dcoder_profile, maxrefs) \
{AV_CODEC_ID_ ## av_codec_id, \
FF_PROFILE_ ## ff_profile, \
VDP_DECODER_PROFILE_ ## vdp_dcoder_profile, \
maxrefs}
static const struct profile_entry profiles[] = {
PE(MPEG1VIDEO, UNKNOWN, MPEG1, 2),
PE(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2_SIMPLE, 2),
PE(MPEG2VIDEO, UNKNOWN, MPEG2_MAIN, 2),
PE(H264, H264_BASELINE, H264_BASELINE, 16),
PE(H264, H264_CONSTRAINED_BASELINE, H264_BASELINE, 16),
PE(H264, H264_MAIN, H264_MAIN, 16),
PE(H264, UNKNOWN, H264_HIGH, 16),
PE(WMV3, VC1_SIMPLE, VC1_SIMPLE, 2),
PE(WMV3, VC1_MAIN, VC1_MAIN, 2),
PE(WMV3, UNKNOWN, VC1_ADVANCED, 2),
PE(VC1, VC1_SIMPLE, VC1_SIMPLE, 2),
PE(VC1, VC1_MAIN, VC1_MAIN, 2),
PE(VC1, UNKNOWN, VC1_ADVANCED, 2),
PE(MPEG4, MPEG4_SIMPLE, MPEG4_PART2_SP, 2),
PE(MPEG4, UNKNOWN, MPEG4_PART2_ASP,2),
PE(MPEG1VIDEO, MPEG1, 2),
PE(MPEG2VIDEO, MPEG2_MAIN, 2),
PE(H264, H264_HIGH, 16),
PE(WMV3, VC1_MAIN, 2),
PE(VC1, VC1_ADVANCED, 2),
PE(MPEG4, MPEG4_PART2_ASP,2),
};
// libavcodec absolutely wants a non-NULL render callback
@@ -123,15 +113,11 @@ static bool create_vdp_decoder(struct lavc_ctx *ctx)
const struct profile_entry *pe = NULL;
for (int n = 0; n < MP_ARRAY_SIZE(profiles); n++) {
if (profiles[n].av_codec == ctx->avctx->codec_id &&
(profiles[n].ff_profile == ctx->avctx->profile ||
profiles[n].ff_profile == FF_PROFILE_UNKNOWN))
{
if (profiles[n].av_codec == ctx->avctx->codec_id) {
pe = &profiles[n];
break;
}
}
if (!pe) {
mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Unknown codec!\n");
goto fail;
+1 -1
View File
@@ -289,8 +289,8 @@ void vo_destroy(struct vo *vo)
{
if (vo->registered_fd != -1)
mp_input_rm_key_fd(vo->input_ctx, vo->registered_fd);
mp_image_unrefp(&vo->waiting_mpi);
vo->driver->uninit(vo);
talloc_free(vo->waiting_mpi);
talloc_free(vo);
}
+5 -4
View File
@@ -206,7 +206,8 @@ static uint64_t convert_to_vdptime(struct vo *vo, uint64_t t)
static int render_video_to_output_surface(struct vo *vo,
VdpOutputSurface output_surface,
VdpRect *output_rect)
VdpRect *output_rect,
VdpRect *video_rect)
{
struct vdpctx *vc = vo->priv;
struct vdp_functions *vdp = vc->vdp;
@@ -238,7 +239,7 @@ static int render_video_to_output_surface(struct vo *vo,
vdp_st = vdp->video_mixer_render(vc->video_mixer, VDP_INVALID_HANDLE,
0, field, 2, past_fields,
bv[dp/2].surface, 1, future_fields,
&vc->src_rect_vid, output_surface,
video_rect, output_surface,
NULL, output_rect, 0, NULL);
CHECK_ST_WARNING("Error when calling vdp_video_mixer_render");
return 0;
@@ -250,7 +251,7 @@ static int video_to_output_surface(struct vo *vo)
return render_video_to_output_surface(vo,
vc->output_surfaces[vc->surface_num],
&vc->out_rect_vid);
&vc->out_rect_vid, &vc->src_rect_vid);
}
static int next_deint_queue_pos(struct vo *vo, bool eof)
@@ -1261,7 +1262,7 @@ static struct mp_image *get_screenshot(struct vo *vo)
}
VdpRect rc = { .x1 = vc->vid_width, .y1 = vc->vid_height };
render_video_to_output_surface(vo, vc->screenshot_surface, &rc);
render_video_to_output_surface(vo, vc->screenshot_surface, &rc, &rc);
struct mp_image *image = read_output_surface(vc, vc->screenshot_surface,
vc->vid_width, vc->vid_height);
+14 -4
View File
@@ -74,6 +74,7 @@
#define vo_wm_STAYS_ON_TOP 4
#define vo_wm_ABOVE 8
#define vo_wm_BELOW 16
#define vo_wm_MWM 32
#define vo_wm_NETWM (vo_wm_FULLSCREEN | vo_wm_STAYS_ON_TOP | vo_wm_ABOVE | \
vo_wm_BELOW)
@@ -252,6 +253,8 @@ void fstype_help(void)
"use _NETWM_STATE_FULLSCREEN hint if available");
mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top",
"use _NETWM_STATE_STAYS_ON_TOP hint if available");
mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "mwm_hack",
"enable MWM hack");
mp_msg(MSGT_VO, MSGL_INFO,
"You can also negate the settings with simply putting '-' in the beginning");
mp_msg(MSGT_VO, MSGL_INFO, "\n");
@@ -271,6 +274,8 @@ static void fstype_dump(int fstype)
mp_msg(MSGT_VO, MSGL_V, " ABOVE");
if (fstype & vo_wm_BELOW)
mp_msg(MSGT_VO, MSGL_V, " BELOW");
if (fstype & vo_wm_MWM)
mp_msg(MSGT_VO, MSGL_V, " mwm_hack");
mp_msg(MSGT_VO, MSGL_V, " X atoms\n");
} else {
mp_msg(MSGT_VO, MSGL_V,
@@ -1035,9 +1040,6 @@ void vo_x11_config_vo_window(struct vo *vo, XVisualInfo *vis, int x, int y,
if (flags & VOFLAG_HIDDEN)
return;
if (opts->ontop)
vo_x11_setlayer(vo, x11->window, opts->ontop);
bool reset_size = !(x11->old_dwidth == width && x11->old_dheight == height);
if (x11->window_hidden) {
x11->nofs_x = x;
@@ -1070,6 +1072,9 @@ void vo_x11_config_vo_window(struct vo *vo, XVisualInfo *vis, int x, int y,
}
}
if (opts->ontop)
vo_x11_setlayer(vo, x11->window, opts->ontop);
vo_x11_fullscreen(vo);
XSync(x11->display, False);
@@ -1235,6 +1240,11 @@ static int vo_x11_get_fs_type(struct vo *vo)
type &= ~vo_wm_NETWM;
else
type |= vo_wm_NETWM;
} else if (!strcmp(arg, "mwm_hack")) {
if (neg)
type &= ~vo_wm_MWM;
else
type |= vo_wm_MWM;
} else if (!strcmp(arg, "none"))
type = 0; // clear; keep parsing
}
@@ -1336,7 +1346,7 @@ static void vo_x11_fullscreen(struct vo *vo)
else
x11->old_gravity = x11->vo_hint.win_gravity;
}
if (x11->wm_type == 0 && !(vo->opts->fsmode & 16)) {
if (x11->fs_type & vo_wm_MWM) {
XUnmapWindow(x11->display, x11->window); // required for MWM
XWithdrawWindow(x11->display, x11->window, x11->screen);
x11->fs_flip = 1;