Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1409ceacf | ||
|
|
44f62ff6f3 | ||
|
|
55c3055784 | ||
|
|
58fbe50d68 | ||
|
|
6a0036ea03 | ||
|
|
2e4fdf01f5 | ||
|
|
a2259b3fd3 | ||
|
|
aeeb7a92f2 | ||
|
|
1e2f3191a7 | ||
|
|
51d030308e | ||
|
|
4cd8aab84f | ||
|
|
3795154155 | ||
|
|
461198e149 | ||
|
|
7b1f12adba | ||
|
|
cf1645aebb | ||
|
|
1b20ec4864 | ||
|
|
ee529da760 | ||
|
|
c9e6e7cc04 | ||
|
|
cb1d1e7a62 | ||
|
|
e6d4ec62ae | ||
|
|
e7e2a6c8f7 | ||
|
|
6643ebaa28 | ||
|
|
98d33db5da |
No files matched your search
+10
-5
@@ -1648,20 +1648,25 @@ OPTIONS
|
||||
file is dumped.
|
||||
|
||||
``--playlist=<filename>``
|
||||
Play files according to a playlist file (ASX, Winamp, SMIL, or
|
||||
one-file-per-line format).
|
||||
Play files according to a playlist file (Supports some common formats.If
|
||||
no format is detected, t will be treated as list of files, separated by
|
||||
newline characters. Note that XML playlist formats are not supported.)
|
||||
|
||||
.. warning::
|
||||
|
||||
The way mpv parses and uses playlist files is not safe against
|
||||
maliciously constructed files. Such files may trigger harmful actions.
|
||||
The way mpv uses playlist files is not safe against maliciously
|
||||
constructed files. Such files may trigger harmful actions.
|
||||
This has been the case for all mpv and MPlayer versions, but
|
||||
unfortunately this fact was not well documented earlier, and some people
|
||||
have even misguidedly recommended use of ``--playlist`` with untrusted
|
||||
sources. Do NOT use ``--playlist`` with random internet sources or files
|
||||
you do not trust!
|
||||
|
||||
FIXME: This needs to be clarified and documented thoroughly.
|
||||
The main problem is that playlists can point to arbitrary network
|
||||
addresses (including local addresses inside of your LAN), and thus
|
||||
can't be considered secure. Playlists also can contain entries using
|
||||
other protocols, such as local files, or (most severely), special
|
||||
protocols like ``avdevice://``, which are inherently unsafe.
|
||||
|
||||
``--priority=<prio>``
|
||||
(Windows only.)
|
||||
|
||||
+11
-9
@@ -98,10 +98,12 @@ Available filters are:
|
||||
:2: Rotate by 90 degrees counterclockwise.
|
||||
:3: Rotate by 90 degrees counterclockwise and flip.
|
||||
|
||||
``scale[=w:h[:interlaced[:chr-drop[:param[:param2[:noup[:arnd]]]]]]]``
|
||||
``scale[=w:h:param:param2:chr-drop:noup:arnd``
|
||||
Scales the image with the software scaler (slow) and performs a YUV<->RGB
|
||||
colorspace conversion (see also ``--sws``).
|
||||
|
||||
All parameters are optional.
|
||||
|
||||
``<w>,<h>``
|
||||
scaled width/height (default: original width/height)
|
||||
|
||||
@@ -114,14 +116,6 @@ Available filters are:
|
||||
:-(n+8): Like -n above, but rounding the dimension to the closest
|
||||
multiple of 16.
|
||||
|
||||
``<chr-drop>``
|
||||
chroma skipping
|
||||
|
||||
:0: Use all available input lines for chroma.
|
||||
:1: Use only every 2. input line for chroma.
|
||||
:2: Use only every 4. input line for chroma.
|
||||
:3: Use only every 8. input line for chroma.
|
||||
|
||||
``<param>[:<param2>]`` (see also ``--sws``)
|
||||
Set some scaling parameters depending on the type of scaler selected
|
||||
with ``--sws``::
|
||||
@@ -137,6 +131,14 @@ Available filters are:
|
||||
|
||||
--sws=9 (lanczos): filter length (1-10)
|
||||
|
||||
``<chr-drop>``
|
||||
chroma skipping
|
||||
|
||||
:0: Use all available input lines for chroma (default).
|
||||
:1: Use only every 2. input line for chroma.
|
||||
:2: Use only every 4. input line for chroma.
|
||||
:3: Use only every 8. input line for chroma.
|
||||
|
||||
``<noup>``
|
||||
Disallow upscaling past the original dimensions.
|
||||
|
||||
|
||||
@@ -82,6 +82,22 @@ Generally, mpv should work with the latest release as well as the git version
|
||||
of both FFmpeg and Libav. But FFmpeg is preferred, and some mpv features work
|
||||
with FFmpeg only. See the [wiki article][ffmpeg_vs_libav] about the issue.
|
||||
|
||||
|
||||
Release cycle
|
||||
-------------
|
||||
|
||||
Every few months, a new release is cut off of the master branch. Currently,
|
||||
these releases are assigned a version number ``0.X.0``. Only the latest release
|
||||
is maintained. As part of the maintenance process, minor releases are made,
|
||||
which are assigned ``0.X.Y`` version numbers. Minor releases contain bug fixes
|
||||
only. They never merge the master branch, and no features are added to it. The
|
||||
goal of releases is to provide stability and an unchanged base for the sake of
|
||||
Linux distributions. If you want the newest features, just use the master
|
||||
branch. (The master branch is stable most of the time, except sometimes, when
|
||||
it's not.)
|
||||
|
||||
Releases other than the latest release are unsupported and unmaintained.
|
||||
|
||||
Bug reports
|
||||
-----------
|
||||
|
||||
@@ -95,8 +111,8 @@ For small changes you can just send us pull requests through GitHub. For bigger
|
||||
changes come and talk to us on IRC before you start working on them. It will
|
||||
make code review easier for both parties later on.
|
||||
|
||||
Contacts
|
||||
--------
|
||||
Contact
|
||||
-------
|
||||
|
||||
These forms of contact are meant to ask questions about mpv usage, give
|
||||
feedback on mpv and discuss it's development.
|
||||
|
||||
+11
-8
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <libavutil/common.h>
|
||||
|
||||
@@ -245,8 +246,9 @@ char *mixer_get_volume_restore_data(struct mixer *mixer)
|
||||
{
|
||||
if (!mixer->driver[0])
|
||||
return NULL;
|
||||
return talloc_asprintf(NULL, "%s:%f:%f:%d", mixer->driver, mixer->vol_l,
|
||||
mixer->vol_r, mixer->muted_by_us);
|
||||
return talloc_asprintf(NULL, "%s:%f:%f:%d:%f", mixer->driver, mixer->vol_l,
|
||||
mixer->vol_r, mixer->muted_by_us,
|
||||
mixer->opts->softvol_max);
|
||||
}
|
||||
|
||||
static void probe_softvol(struct mixer *mixer)
|
||||
@@ -307,19 +309,20 @@ static void restore_volume(struct mixer *mixer)
|
||||
force_mute = opts->mixer_init_mute;
|
||||
|
||||
// Set parameters from playback resume.
|
||||
char *restore_data = mixer->opts->mixer_restore_volume_data;
|
||||
if (restore && restore_data && restore_data[0]) {
|
||||
char *data = mixer->opts->mixer_restore_volume_data;
|
||||
if (restore && data && data[0]) {
|
||||
char drv[40];
|
||||
float v_l, v_r;
|
||||
float v_l, v_r, s;
|
||||
int m;
|
||||
if (sscanf(restore_data, "%39[^:]:%f:%f:%d", drv, &v_l, &v_r, &m) == 4) {
|
||||
if (strcmp(mixer->driver, drv) == 0) {
|
||||
if (sscanf(data, "%39[^:]:%f:%f:%d:%f", drv, &v_l, &v_r, &m, &s) == 5) {
|
||||
float diff = fabs(mixer->opts->softvol_max - s);
|
||||
if (strcmp(mixer->driver, drv) == 0 && diff < 0.01) {
|
||||
force_vol_l = v_l;
|
||||
force_vol_r = v_r;
|
||||
force_mute = !!m;
|
||||
}
|
||||
}
|
||||
talloc_free(restore_data);
|
||||
talloc_free(mixer->opts->mixer_restore_volume_data);
|
||||
mixer->opts->mixer_restore_volume_data = NULL;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -97,8 +97,8 @@ static const struct format_hack format_hacks[] = {
|
||||
// for webradios
|
||||
{"aac", "audio/aacp", 25, 0.5},
|
||||
{"aac", "audio/aac", 25, 0.5},
|
||||
{"mp3", "audio/mpeg", 25, 0.5},
|
||||
// some mp3 files don't detect correctly
|
||||
{"mp3", "audio/mpeg", 24, 0.5},
|
||||
{"mp3", NULL, 24, .max_probe = true},
|
||||
{0}
|
||||
};
|
||||
|
||||
+1
-1
@@ -271,7 +271,7 @@ bool mp_input_is_abort_cmd(struct mp_cmd *cmd)
|
||||
if (cmd->id == MP_CMD_COMMAND_LIST) {
|
||||
for (struct mp_cmd *sub = cmd->args[0].v.p; sub; sub = sub->queue_next)
|
||||
{
|
||||
if (mp_input_is_abort_cmd(cmd))
|
||||
if (mp_input_is_abort_cmd(sub))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -343,6 +343,7 @@ DIRS = . \
|
||||
player/timeline \
|
||||
demux \
|
||||
misc \
|
||||
options \
|
||||
osdep \
|
||||
osdep/ar \
|
||||
player \
|
||||
|
||||
@@ -110,8 +110,8 @@ static void mp_load_per_file_config(struct MPContext *mpctx)
|
||||
const char *file = mpctx->filename;
|
||||
|
||||
if (snprintf(cfg, sizeof(cfg), "%s.conf", file) >= sizeof(cfg)) {
|
||||
MP_WARN(mpctx, "Filename is too long, "
|
||||
"can not load file or directory specific config files\n");
|
||||
MP_VERBOSE(mpctx, "Filename is too long, "
|
||||
"can not load file or directory specific config files\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -138,7 +138,7 @@ void update_window_title(struct MPContext *mpctx, bool force)
|
||||
{
|
||||
if (!mpctx->video_out && !mpctx->ao) {
|
||||
talloc_free(mpctx->last_window_title);
|
||||
mpctx->last_window_title = false;
|
||||
mpctx->last_window_title = NULL;
|
||||
return;
|
||||
}
|
||||
char *title = mp_property_expand_string(mpctx, mpctx->opts->wintitle);
|
||||
|
||||
@@ -201,7 +201,7 @@ static void build_timeline(struct MPContext *mpctx, struct tl_parts *parts)
|
||||
part->filename);
|
||||
}
|
||||
|
||||
// Unkown length => use rest of the file. If duration is unknown, make
|
||||
// Unknown length => use rest of the file. If duration is unknown, make
|
||||
// something up.
|
||||
if (part->length < 0)
|
||||
part->length = (len < 0 ? 1 : len) - part->offset;
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@
|
||||
#define MP_ASS_FONT_PLAYRESY 288
|
||||
|
||||
#define MP_ASS_RGBA(r, g, b, a) \
|
||||
(((r) << 24U) | ((g) << 16) | ((b) << 8) | (0xFF - (a)))
|
||||
(((unsigned)(r) << 24) | ((g) << 16) | ((b) << 8) | (0xFF - (a)))
|
||||
|
||||
// m_color argument
|
||||
#define MP_ASS_COLOR(c) MP_ASS_RGBA((c).r, (c).g, (c).b, (c).a)
|
||||
|
||||
+2
-2
@@ -424,10 +424,10 @@ static void mangle_colors(struct sd *sd, struct sub_bitmaps *parts)
|
||||
int r = (color >> 24u) & 0xff;
|
||||
int g = (color >> 16u) & 0xff;
|
||||
int b = (color >> 8u) & 0xff;
|
||||
int a = color & 0xff;
|
||||
int a = 0xff - (color & 0xff);
|
||||
int c[3] = {r, g, b};
|
||||
mp_map_int_color(vs_rgb2yuv, 8, c);
|
||||
mp_map_int_color(vs2rgb, 8, c);
|
||||
sb->libass.color = (c[0] << 24u) | (c[1] << 16) | (c[2] << 8) | a;
|
||||
sb->libass.color = MP_ASS_RGBA(c[0], c[1], c[2], a);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
/*
|
||||
* This file is part of mpv.
|
||||
*
|
||||
* Parts based on the MPlayer VA-API patch (see vo_vaapi.c).
|
||||
*
|
||||
* mpv is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
|
||||
@@ -301,12 +301,6 @@ static struct mp_image *get_screenshot(struct priv *p)
|
||||
return img;
|
||||
}
|
||||
|
||||
static bool redraw_frame(struct priv *p)
|
||||
{
|
||||
p->output_surface = p->visible_surface;
|
||||
return render_to_screen(p, p->output_surfaces[p->output_surface]);
|
||||
}
|
||||
|
||||
static void free_subpicture(struct priv *p, struct vaapi_osd_image *img)
|
||||
{
|
||||
if (img->image.image_id != VA_INVALID_ID)
|
||||
@@ -528,7 +522,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
|
||||
return get_equalizer(p, eq->name, eq->valueptr);
|
||||
}
|
||||
case VOCTRL_REDRAW_FRAME:
|
||||
redraw_frame(p);
|
||||
p->output_surface = p->visible_surface;
|
||||
return true;
|
||||
case VOCTRL_SCREENSHOT: {
|
||||
struct voctrl_screenshot_args *args = data;
|
||||
|
||||
@@ -655,6 +655,12 @@ static int initialize_vdpau_objects(struct vo *vo)
|
||||
&vc->rgb_surfaces[n]);
|
||||
CHECK_VDP_ERROR(vo, "Allocating RGB surface");
|
||||
}
|
||||
} else {
|
||||
if (create_vdp_mixer(vo, vc->vdp_chroma_type) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (vc->black_pixel == VDP_INVALID_HANDLE) {
|
||||
vdp_st = vdp->output_surface_create(vc->vdp_device, OUTPUT_RGBA_FORMAT,
|
||||
1, 1, &vc->black_pixel);
|
||||
CHECK_VDP_ERROR(vo, "Allocating clearing surface");
|
||||
@@ -663,9 +669,6 @@ static int initialize_vdpau_objects(struct vo *vo)
|
||||
(const void*[]){data},
|
||||
(uint32_t[]){4}, NULL);
|
||||
CHECK_VDP_ERROR(vo, "Initializing clearing surface");
|
||||
} else {
|
||||
if (create_vdp_mixer(vo, vc->vdp_chroma_type) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
forget_frames(vo, false);
|
||||
|
||||
+1
-1
@@ -228,8 +228,8 @@ shmemerror:
|
||||
|
||||
static void freeMyXImage(struct priv *p, int foo)
|
||||
{
|
||||
struct vo *vo = p->vo;
|
||||
#if HAVE_SHM && HAVE_XEXT
|
||||
struct vo *vo = p->vo;
|
||||
if (p->Shmem_Flag) {
|
||||
XShmDetach(vo->x11->display, &p->Shminfo[foo]);
|
||||
XDestroyImage(p->myximage[foo]);
|
||||
|
||||
+14
-14
@@ -54,10 +54,10 @@ static int lookupkey(int key);
|
||||
|
||||
static void hide_cursor(struct vo_wayland_state * wl);
|
||||
static void show_cursor(struct vo_wayland_state * wl);
|
||||
static void shedule_resize(struct vo_wayland_state *wl,
|
||||
uint32_t edges,
|
||||
int32_t width,
|
||||
int32_t height);
|
||||
static void schedule_resize(struct vo_wayland_state *wl,
|
||||
uint32_t edges,
|
||||
int32_t width,
|
||||
int32_t height);
|
||||
|
||||
static void vo_wayland_fullscreen (struct vo *vo);
|
||||
|
||||
@@ -126,7 +126,7 @@ static void ssurface_handle_configure(void *data,
|
||||
int32_t height)
|
||||
{
|
||||
struct vo_wayland_state *wl = data;
|
||||
shedule_resize(wl, edges, width, height);
|
||||
schedule_resize(wl, edges, width, height);
|
||||
}
|
||||
|
||||
static void ssurface_handle_popup_done(void *data,
|
||||
@@ -529,16 +529,16 @@ static void show_cursor (struct vo_wayland_state *wl)
|
||||
wl_surface_commit(wl->cursor.surface);
|
||||
}
|
||||
|
||||
static void shedule_resize(struct vo_wayland_state *wl,
|
||||
uint32_t edges,
|
||||
int32_t width,
|
||||
int32_t height)
|
||||
static void schedule_resize(struct vo_wayland_state *wl,
|
||||
uint32_t edges,
|
||||
int32_t width,
|
||||
int32_t height)
|
||||
{
|
||||
int32_t minimum_size = 150;
|
||||
int32_t x, y;
|
||||
float temp_aspect = width / (float) MPMAX(height, 1);
|
||||
|
||||
MP_DBG(wl, "shedule resize: %dx%d\n", width, height);
|
||||
MP_DBG(wl, "schedule resize: %dx%d\n", width, height);
|
||||
|
||||
if (width < minimum_size)
|
||||
width = minimum_size;
|
||||
@@ -778,7 +778,7 @@ static void vo_wayland_ontop (struct vo *vo)
|
||||
MP_DBG(wl, "going ontop\n");
|
||||
vo->opts->ontop = 1;
|
||||
wl_shell_surface_set_toplevel(wl->window.shell_surface);
|
||||
shedule_resize(wl, 0, wl->window.width, wl->window.height);
|
||||
schedule_resize(wl, 0, wl->window.width, wl->window.height);
|
||||
}
|
||||
|
||||
static void vo_wayland_border (struct vo *vo)
|
||||
@@ -814,7 +814,7 @@ static void vo_wayland_fullscreen (struct vo *vo)
|
||||
MP_DBG(wl, "leaving fullscreen\n");
|
||||
wl->window.is_fullscreen = false;
|
||||
wl_shell_surface_set_toplevel(wl->window.shell_surface);
|
||||
shedule_resize(wl, 0, wl->window.p_width, wl->window.p_height);
|
||||
schedule_resize(wl, 0, wl->window.p_width, wl->window.p_height);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -941,7 +941,7 @@ int vo_wayland_control (struct vo *vo, int *events, int request, void *arg)
|
||||
case VOCTRL_SET_WINDOW_SIZE: {
|
||||
int *s = arg;
|
||||
if (!wl->window.is_fullscreen)
|
||||
shedule_resize(wl, 0, s[0], s[1]);
|
||||
schedule_resize(wl, 0, s[0], s[1]);
|
||||
return VO_TRUE;
|
||||
}
|
||||
case VOCTRL_SET_CURSOR_VISIBILITY:
|
||||
@@ -979,7 +979,7 @@ bool vo_wayland_config (struct vo *vo, uint32_t d_width,
|
||||
|
||||
if (vo->opts->fullscreen) {
|
||||
if (wl->window.is_fullscreen)
|
||||
shedule_resize(wl, 0, wl->window.fs_width, wl->window.fs_height);
|
||||
schedule_resize(wl, 0, wl->window.fs_width, wl->window.fs_height);
|
||||
else
|
||||
vo_wayland_fullscreen(vo);
|
||||
}
|
||||
|
||||
@@ -1054,9 +1054,9 @@ static void vo_x11_set_wm_icon(struct vo_x11_state *x11)
|
||||
for (int n = 0; n < num_icons; n++) {
|
||||
*cur++ = icon_w[n];
|
||||
*cur++ = icon_h[n];
|
||||
uint32_t *src = icon_data[n];
|
||||
for (int i = 0; i < icon_h[n] * icon_w[n]; i++)
|
||||
*cur++ = src[i];
|
||||
uint8_t *s = icon_data[n];
|
||||
for (int i = 0; i < icon_h[n] * icon_w[n]; i++, s += 4)
|
||||
*cur++ = s[0] | (s[1] << 8) | (s[2] << 16) | ((unsigned)s[3] << 24);
|
||||
}
|
||||
|
||||
XChangeProperty(x11->display, x11->window, x11->XA_NET_WM_ICON,
|
||||
|
||||
@@ -3,7 +3,7 @@ __cdrom_devices_map__ = {
|
||||
'cygwin': 'D:',
|
||||
'darwin': '/dev/disk1',
|
||||
'freebsd': '/dev/cd0',
|
||||
'openbsd': '/dev/rcd0r',
|
||||
'openbsd': '/dev/rcd0c',
|
||||
'default': '/dev/cdrom'
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ __dvd_devices_map__ = {
|
||||
'cygwin': 'D:',
|
||||
'darwin': '/dev/rdiskN',
|
||||
'freebsd': '/dev/cd0',
|
||||
'openbsd': '/dev/rcd0r',
|
||||
'openbsd': '/dev/rcd0c',
|
||||
'default': '/dev/dvd'
|
||||
}
|
||||
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
int main(void)
|
||||
{
|
||||
struct v4l2_ext_controls ext;
|
||||
return ext.controls->value;
|
||||
return !!&ext.controls->value;
|
||||
}
|
||||
@@ -716,6 +716,7 @@ radio_and_tv_features = [
|
||||
}, {
|
||||
'name': '--tv-v4l2',
|
||||
'desc': 'Video4Linux2 TV interface',
|
||||
'deps': [ 'tv' ],
|
||||
'func': check_cc(header_name=['sys/time.h', 'linux/videodev2.h'])
|
||||
}, {
|
||||
'name': '--libv4l2',
|
||||
@@ -818,7 +819,7 @@ def configure(ctx):
|
||||
ctx.load('detections.devices')
|
||||
|
||||
if ctx.env.DEST_OS in ('freebsd', 'openbsd'):
|
||||
ctx.env.CFLAGS += ['-I/usr/local/include']
|
||||
ctx.env.CFLAGS += ['-I.', '-I..', '-I/usr/local/include']
|
||||
ctx.env.LINKFLAGS += ['-L/usr/local/lib']
|
||||
|
||||
if ctx.env.DEST_OS == 'netbsd':
|
||||
|
||||
Reference in new issue
Block a user