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 | ||
|
|
ca8dc9147b | ||
|
|
df8b99490c | ||
|
|
c78142a973 | ||
|
|
a8e6caf56b | ||
|
|
e6cca1e43b | ||
|
|
d7538d3597 | ||
|
|
f3eb5b143c | ||
|
|
9993fd8888 | ||
|
|
d9c3a51d87 | ||
|
|
619fa761af | ||
|
|
717d729dcb | ||
|
|
4eb5b62e5a | ||
|
|
b9e32d0d3d | ||
|
|
28e2b95f58 | ||
|
|
491f633a20 | ||
|
|
eb5e45855a | ||
|
|
59e55bb0e1 | ||
|
|
9f46be7373 | ||
|
|
3623fb38ee | ||
|
|
1ad9e322e3 | ||
|
|
cad63810c5 | ||
|
|
da17c64c76 | ||
|
|
57f32f7ca8 | ||
|
|
3d85137495 | ||
|
|
4aff0076a0 | ||
|
|
70f8ea228d | ||
|
|
3196f4cdd7 |
No files matched your search
+25
-1
@@ -18,7 +18,12 @@ normal driver parameters.
|
||||
|
||||
.. note::
|
||||
|
||||
See ``--ao=help`` for a list of compiled-in audio output drivers.
|
||||
See ``--ao=help`` for a list of compiled-in audio output drivers. The
|
||||
driver ``--ao=alsa`` is preferred. ``--ao=pulse`` is preferred on systems
|
||||
where PulseAudio is used. On Windows, ``--ao=wasapi`` is preferred,
|
||||
though it might cause trouble sometimes, in which case ``--ao=dsound``
|
||||
should be used. On BSD systems, ``--ao=oss`` or `--ao=sndio`` may work
|
||||
(the latter being experimental). On OSX systems, use ``--ao=coreaudio``.
|
||||
|
||||
.. admonition:: Examples
|
||||
|
||||
@@ -118,6 +123,9 @@ Available audio output drivers are:
|
||||
``openal``
|
||||
Experimental OpenAL audio output driver
|
||||
|
||||
.. note:: This driver is not very useful. Playing multi-channel audio with
|
||||
it is slow.
|
||||
|
||||
``pulse``
|
||||
PulseAudio audio output driver
|
||||
|
||||
@@ -130,6 +138,10 @@ Available audio output drivers are:
|
||||
PortAudio audio output driver. This works on all platforms, and has
|
||||
extensive MS Windows support.
|
||||
|
||||
.. note:: This driver is not very useful. It was added in the hope of
|
||||
providing portable audio API across all platforms, but turned
|
||||
out semi-broken and underfeatured.
|
||||
|
||||
``device``
|
||||
Specify the subdevice to use. Giving ``help`` as device name lists all
|
||||
devices found by PortAudio. Devices can be given as numeric values,
|
||||
@@ -138,6 +150,8 @@ Available audio output drivers are:
|
||||
``dsound`` (Windows only)
|
||||
DirectX DirectSound audio output driver
|
||||
|
||||
.. note:: This driver is for compatibility with old systems.
|
||||
|
||||
``device=<devicenum>``
|
||||
Sets the device number to use. Playing a file with ``-v`` will show a
|
||||
list of available devices.
|
||||
@@ -147,6 +161,10 @@ Available audio output drivers are:
|
||||
1.2, but may require the ``SDL_AUDIODRIVER`` environment variable to be set
|
||||
appropriately for your system.
|
||||
|
||||
.. note:: This driver is for compatibility with extremely foreign
|
||||
environments, such as systems where none of the other drivers
|
||||
are available.
|
||||
|
||||
``buflen=<length>``
|
||||
Sets the audio buffer length in seconds. Is used only as a hint by the
|
||||
sound system. Playing a file with ``-v`` will show the requested and
|
||||
@@ -186,6 +204,10 @@ Available audio output drivers are:
|
||||
``rsound``
|
||||
Audio output to an RSound daemon
|
||||
|
||||
.. note:: Completely useless, unless you intend to run RSound. Not to be
|
||||
confused with RoarAudio, which is something completely
|
||||
different.
|
||||
|
||||
``host=<name/path>``
|
||||
Set the address of the server (default: localhost). Can be either a
|
||||
network hostname for TCP connections or a Unix domain socket path
|
||||
@@ -197,6 +219,8 @@ Available audio output drivers are:
|
||||
``sndio``
|
||||
Audio output to the OpenBSD sndio sound system
|
||||
|
||||
.. note:: Experimental. There are known bugs and issues.
|
||||
|
||||
(Note: only supports mono, stereo, 4.0, 5.1 and 7.1 channel
|
||||
layouts.)
|
||||
|
||||
|
||||
+14
-9
@@ -1558,10 +1558,10 @@ OPTIONS
|
||||
``--osd-level=<0-3>``
|
||||
Specifies which mode the OSD should start in.
|
||||
|
||||
:0: subtitles only
|
||||
:1: volume + seek (default)
|
||||
:2: volume + seek + timer + percentage
|
||||
:3: volume + seek + timer + percentage + total time
|
||||
:0: OSD completely disabled (subtitles only)
|
||||
:1: enabled (shows up only on user interaction)
|
||||
:2: enabled + current time visible by default
|
||||
:3: enabled + ``--osd-status-msg`` (current time and status by default)
|
||||
|
||||
``--osd-margin-x=<size>, --sub-text-margin-x=<size>``
|
||||
Left and right screen margin for the OSD/subs in scaled pixels (see
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ normal driver parameters.
|
||||
|
||||
See ``--vo=help`` for a list of compiled-in video output drivers.
|
||||
|
||||
The recommended output drivers are ``--vo=vdpau`` and ``--vo=opengl-hq``.
|
||||
All other drivers are just for compatibility or special purposes.
|
||||
|
||||
.. admonition:: Example
|
||||
|
||||
``--vo=opengl,xv,``
|
||||
@@ -32,6 +35,8 @@ Available video output drivers are:
|
||||
the most compatible VO on X, but may be low-quality, and has issues with
|
||||
OSD and subtitle display.
|
||||
|
||||
.. note:: This driver is for compatibility with old systems.
|
||||
|
||||
``adaptor=<number>``
|
||||
Select a specific XVideo adaptor (check xvinfo results).
|
||||
``port=<number>``
|
||||
@@ -172,6 +177,9 @@ Available video output drivers are:
|
||||
``direct3d_shaders`` (Windows only)
|
||||
Video output driver that uses the Direct3D interface.
|
||||
|
||||
.. note:: This driver is for compatibility with systems that don't provide
|
||||
proper OpenGL drivers.
|
||||
|
||||
``prefer-stretchrect``
|
||||
Use ``IDirect3DDevice9::StretchRect`` over other methods if possible.
|
||||
|
||||
@@ -228,11 +236,15 @@ Available video output drivers are:
|
||||
Same as ``direct3d_shaders``, but with the options ``disable-textures``
|
||||
and ``disable-shaders`` forced.
|
||||
|
||||
.. note:: This driver is for compatibility with old systems.
|
||||
|
||||
``corevideo`` (Mac OS X 10.6 and later)
|
||||
Mac OS X CoreVideo video output driver. Uses the CoreVideo APIs to fill
|
||||
PixelBuffers and generate OpenGL textures from them (useful as a fallback
|
||||
for ``opengl``).
|
||||
|
||||
.. note:: This driver is for compatibility with old systems.
|
||||
|
||||
``opengl``
|
||||
OpenGL video output driver. It supports extended scaling methods, dithering
|
||||
and color management.
|
||||
@@ -519,6 +531,8 @@ Available video output drivers are:
|
||||
implementation, even if you do not get any error message. Use ``glxinfo``
|
||||
or a similar tool to display the supported OpenGL extensions.
|
||||
|
||||
.. note:: This driver is for compatibility with old systems.
|
||||
|
||||
``(no-)ati-hack``
|
||||
ATI drivers may give a corrupted image when PBOs are used (when using
|
||||
``force-pbo``). This option fixes this, at the expense of using a bit
|
||||
@@ -692,6 +706,9 @@ Available video output drivers are:
|
||||
hardware acceleration. Should work on all platforms supported by SDL 2.0.
|
||||
For tuning, refer to your copy of the file ``SDL_hints.h``.
|
||||
|
||||
.. note:: This driver is for compatibility with systems that don't provide
|
||||
proper graphics drivers, or which support GLES only.
|
||||
|
||||
``sw``
|
||||
Continue even if a software renderer is detected.
|
||||
|
||||
@@ -704,6 +721,9 @@ Available video output drivers are:
|
||||
hardware decoding to save power on laptops, or possibly preventing video
|
||||
tearing with some setups.
|
||||
|
||||
.. note:: This driver is for compatibility with crappy systems. You can
|
||||
use vaapi hardware decoding with ``--vo=opengl`` too.
|
||||
|
||||
``scaling=<algorithm>``
|
||||
default
|
||||
Driver default (mpv default as well).
|
||||
@@ -744,6 +764,8 @@ Available video output drivers are:
|
||||
``caca``
|
||||
Color ASCII art video output driver that works on a text console.
|
||||
|
||||
.. note:: This driver is a joke.
|
||||
|
||||
``image``
|
||||
Output each frame into an image file in the current directory. Each file
|
||||
takes the frame number padded with leading zeros as name.
|
||||
@@ -789,6 +811,9 @@ Available video output drivers are:
|
||||
``wayland`` (Wayland only)
|
||||
Wayland shared memory video output as fallback for ``opengl``.
|
||||
|
||||
.. note:: This driver is for compatibility with systems that don't provide
|
||||
working OpenGL drivers.
|
||||
|
||||
``default-format``
|
||||
Use the default RGB32 format instead of an auto-detected one.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
+35
-6
@@ -23,6 +23,11 @@ Note that you can control the mpv instance by writing to the command fifo:
|
||||
|
||||
echo "cycle fullscreen" > /tmp/umpv-fifo-*
|
||||
|
||||
Note: you can supply custom options with the UMPV_OPTIONS environment variable.
|
||||
The environment variable will be split on whitespace, and each item is
|
||||
passed as option to mpv _if_ the script starts mpv. If mpv is not started
|
||||
by the script (i.e. mpv is already running), the options will be ignored.
|
||||
|
||||
Warning:
|
||||
|
||||
The script attempts to make sure the FIFO is safely created (i.e. not world-
|
||||
@@ -38,13 +43,33 @@ import errno
|
||||
import subprocess
|
||||
import fcntl
|
||||
import stat
|
||||
import string
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("error: needs at least one file as argument.")
|
||||
if len(sys.argv) < 1:
|
||||
sys.exit(1)
|
||||
files = sys.argv[1:]
|
||||
|
||||
# this is about the same method mpv uses to decide this
|
||||
def is_url(filename):
|
||||
parts = filename.split(":", 1)
|
||||
if len(parts) < 2:
|
||||
return False
|
||||
# protocol prefix has no special characters => it's an URL
|
||||
prefix = parts[0]
|
||||
for c in prefix:
|
||||
if string.ascii_letters.find(c) < 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
# make them absolute; also makes them safe against interpretation as options
|
||||
files = [os.path.abspath(f) for f in files]
|
||||
def make_abs(filename):
|
||||
if not is_url(filename):
|
||||
return os.path.abspath(filename)
|
||||
return filename
|
||||
files = [make_abs(f) for f in files]
|
||||
|
||||
opts_env = os.getenv("UMPV_OPTIONS")
|
||||
opts_env = opts_env.split() if opts_env else []
|
||||
|
||||
FIFO = "/tmp/umpv-fifo-" + os.getenv("USER")
|
||||
|
||||
@@ -87,7 +112,11 @@ else:
|
||||
pass
|
||||
else:
|
||||
raise e
|
||||
os.mkfifo(FIFO, 0600)
|
||||
os.mkfifo(FIFO, int("0600", 8))
|
||||
|
||||
subprocess.check_call(["mpv", "--really-quiet", "--force-window",
|
||||
"--input-file=" + FIFO, "--"] + files)
|
||||
opts = ["mpv", "--really-quiet", "--force-window", "--input-file=" + FIFO]
|
||||
opts.extend(opts_env)
|
||||
opts.append("--")
|
||||
opts.extend(files)
|
||||
|
||||
subprocess.check_call(opts)
|
||||
+7
-2
@@ -173,10 +173,15 @@ void mp_audio_realloc(struct mp_audio *mpa, int samples)
|
||||
}
|
||||
|
||||
// Like mp_audio_realloc(), but only reallocate if the audio grows in size.
|
||||
// If the buffer is reallocated, also preallocate.
|
||||
void mp_audio_realloc_min(struct mp_audio *mpa, int samples)
|
||||
{
|
||||
if (samples > mp_audio_get_allocated_size(mpa))
|
||||
mp_audio_realloc(mpa, samples);
|
||||
if (samples > mp_audio_get_allocated_size(mpa)) {
|
||||
size_t alloc = ta_calc_prealloc_elems(samples);
|
||||
if (alloc > INT_MAX)
|
||||
abort(); // oom
|
||||
mp_audio_realloc(mpa, alloc);
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the size allocated for the data, in number of samples. If the allocated
|
||||
|
||||
+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;
|
||||
}
|
||||
|
||||
|
||||
@@ -431,6 +431,32 @@ static bool ca_bitmap_from_ch_tag(struct ao *ao, AudioChannelLayout *layout,
|
||||
}
|
||||
}
|
||||
|
||||
static void ca_log_layout(struct ao *ao, AudioChannelLayout layout)
|
||||
{
|
||||
if (!mp_msg_test(ao->log, MSGL_V))
|
||||
return;
|
||||
|
||||
AudioChannelDescription *descs = layout.mChannelDescriptions;
|
||||
|
||||
MP_VERBOSE(ao, "layout: tag: <%d>, bitmap: <%d>, "
|
||||
"descriptions <%d>\n",
|
||||
layout.mChannelLayoutTag,
|
||||
layout.mChannelBitmap,
|
||||
layout.mNumberChannelDescriptions);
|
||||
|
||||
for (int i = 0; i < layout.mNumberChannelDescriptions; i++) {
|
||||
AudioChannelDescription d = descs[i];
|
||||
MP_VERBOSE(ao, " - description %d: label <%d, %d>, flags: <%u>, "
|
||||
"coords: <%f, %f, %f>\n", i,
|
||||
d.mChannelLabel,
|
||||
ca_label_to_mp_speaker_id(d.mChannelLabel),
|
||||
d.mChannelFlags,
|
||||
d.mCoordinates[0],
|
||||
d.mCoordinates[1],
|
||||
d.mCoordinates[2]);
|
||||
}
|
||||
}
|
||||
|
||||
void ca_bitmaps_from_layouts(struct ao *ao,
|
||||
AudioChannelLayout *layouts, size_t n_layouts,
|
||||
uint32_t **bitmaps, size_t *n_bitmaps)
|
||||
@@ -440,6 +466,7 @@ void ca_bitmaps_from_layouts(struct ao *ao,
|
||||
|
||||
for (int i=0; i < n_layouts; i++) {
|
||||
uint32_t bitmap = 0;
|
||||
ca_log_layout(ao, layouts[i]);
|
||||
|
||||
switch (layouts[i].mChannelLayoutTag) {
|
||||
case kAudioChannelLayoutTag_UseChannelBitmap:
|
||||
|
||||
@@ -522,6 +522,7 @@ static struct demuxer *open_given_type(struct mpv_global *global,
|
||||
.glog = log,
|
||||
.filename = talloc_strdup(demuxer, stream->url),
|
||||
.metadata = talloc_zero(demuxer, struct mp_tags),
|
||||
.initializing = true,
|
||||
};
|
||||
demuxer->params = params; // temporary during open()
|
||||
stream_seek(stream, stream->start_pos);
|
||||
@@ -554,6 +555,7 @@ static struct demuxer *open_given_type(struct mpv_global *global,
|
||||
"File is not seekable, but there's a cache: enabling seeking.\n");
|
||||
demuxer->seekable = true;
|
||||
}
|
||||
demuxer->initializing = false;
|
||||
return demuxer;
|
||||
}
|
||||
|
||||
@@ -724,6 +726,8 @@ int demux_info_add_bstr(demuxer_t *demuxer, struct bstr opt, struct bstr param)
|
||||
if (oldval) {
|
||||
if (bstrcmp0(param, oldval) == 0)
|
||||
return 0;
|
||||
}
|
||||
if (!demuxer->initializing) {
|
||||
MP_INFO(demuxer, "Demuxer info %.*s changed to %.*s\n",
|
||||
BSTR_P(opt), BSTR_P(param));
|
||||
}
|
||||
@@ -740,6 +744,8 @@ int demux_info_print(demuxer_t *demuxer)
|
||||
if (!info || !info->num_keys)
|
||||
return 0;
|
||||
|
||||
demux_info_update(demuxer);
|
||||
|
||||
mp_info(demuxer->glog, "Clip info:\n");
|
||||
for (n = 0; n < info->num_keys; n++) {
|
||||
mp_info(demuxer->glog, " %s: %s\n", info->keys[n], info->values[n]);
|
||||
|
||||
@@ -170,6 +170,7 @@ typedef struct demuxer {
|
||||
// File format allows PTS resets (even if the current file is without)
|
||||
bool ts_resets_possible;
|
||||
bool warned_queue_overflow;
|
||||
bool initializing;
|
||||
|
||||
struct sh_stream **streams;
|
||||
int num_streams;
|
||||
|
||||
+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}
|
||||
};
|
||||
|
||||
+5
-3
@@ -1173,6 +1173,7 @@ typedef struct {
|
||||
char *id;
|
||||
int fourcc;
|
||||
int extradata;
|
||||
bool parse;
|
||||
} videocodec_info_t;
|
||||
|
||||
static const videocodec_info_t vinfo[] = {
|
||||
@@ -1185,11 +1186,11 @@ static const videocodec_info_t vinfo[] = {
|
||||
{MKV_V_MPEG4_AVC, MP_FOURCC('a', 'v', 'c', '1'), 1},
|
||||
{MKV_V_THEORA, MP_FOURCC('t', 'h', 'e', 'o'), 1},
|
||||
{MKV_V_VP8, MP_FOURCC('V', 'P', '8', '0'), 0},
|
||||
{MKV_V_VP9, MP_FOURCC('V', 'P', '9', '0'), 0},
|
||||
{MKV_V_VP9, MP_FOURCC('V', 'P', '9', '0'), 0, true},
|
||||
{MKV_V_DIRAC, MP_FOURCC('d', 'r', 'a', 'c'), 0},
|
||||
{MKV_V_PRORES, MP_FOURCC('p', 'r', '0', '0'), 0},
|
||||
{MKV_V_HEVC, MP_FOURCC('H', 'E', 'V', 'C'), 1},
|
||||
{NULL, 0, 0}
|
||||
{0}
|
||||
};
|
||||
|
||||
static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
|
||||
@@ -1273,6 +1274,7 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
|
||||
extradata = track->private_data;
|
||||
extradata_size = track->private_size;
|
||||
}
|
||||
track->parse = vi->parse;
|
||||
if (!vi->id) {
|
||||
MP_WARN(demuxer, "Unknown/unsupported "
|
||||
"CodecID (%s) or missing/bad CodecPrivate\n"
|
||||
@@ -1336,7 +1338,7 @@ static struct mkv_audio_tag {
|
||||
bool parse;
|
||||
} mkv_audio_tags[] = {
|
||||
{ MKV_A_MP2, 0, 0x0055 },
|
||||
{ MKV_A_MP3, 0, 0x0055 },
|
||||
{ MKV_A_MP3, 0, 0x0055, true },
|
||||
{ MKV_A_AC3, 1, 0x2000 },
|
||||
{ MKV_A_EAC3, 1, MP_FOURCC('E', 'A', 'C', '3') },
|
||||
{ MKV_A_DTS, 0, 0x2001 },
|
||||
|
||||
+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 \
|
||||
|
||||
@@ -518,7 +518,7 @@ static int setsigaction(int signo, void (*handler) (int),
|
||||
else
|
||||
sigemptyset(&sa.sa_mask);
|
||||
|
||||
sa.sa_flags = flags;
|
||||
sa.sa_flags = flags | SA_RESTART;
|
||||
return sigaction(signo, &sa, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -401,8 +401,10 @@ static int mpv_main(int argc, char *argv[])
|
||||
m_config_set_option0(mpctx->mconfig, "vo", "lavc");
|
||||
m_config_set_option0(mpctx->mconfig, "ao", "lavc");
|
||||
m_config_set_option0(mpctx->mconfig, "fixed-vo", "yes");
|
||||
m_config_set_option0(mpctx->mconfig, "keep-open", "no");
|
||||
m_config_set_option0(mpctx->mconfig, "force-window", "no");
|
||||
m_config_set_option0(mpctx->mconfig, "gapless-audio", "yes");
|
||||
m_config_set_option0(mpctx->mconfig, "resume-playback", "no");
|
||||
mp_input_enable_section(mpctx->input, "encode", MP_INPUT_EXCLUSIVE);
|
||||
}
|
||||
#endif
|
||||
|
||||
+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
@@ -514,7 +514,7 @@ static int cache_control(stream_t *cache, int cmd, void *arg)
|
||||
if (r != STREAM_ERROR)
|
||||
goto done;
|
||||
|
||||
MP_VERBOSE(s, "[cache] blocking for STREAM_CTRL %d\n", cmd);
|
||||
MP_VERBOSE(s, "blocking for STREAM_CTRL %d\n", cmd);
|
||||
|
||||
s->control = cmd;
|
||||
s->control_arg = arg;
|
||||
|
||||
+8
-2
@@ -396,16 +396,22 @@ stream_t *open_output_stream(const char *filename, struct mpv_global *global)
|
||||
static int stream_reconnect(stream_t *s)
|
||||
{
|
||||
#define MAX_RECONNECT_RETRIES 5
|
||||
#define RECONNECT_SLEEP_MS 1000
|
||||
#define RECONNECT_SLEEP_MAX_MS 500
|
||||
if (!s->streaming)
|
||||
return 0;
|
||||
if (!(s->flags & MP_STREAM_SEEK_FW))
|
||||
return 0;
|
||||
int64_t pos = s->pos;
|
||||
int sleep_ms = 5;
|
||||
for (int retry = 0; retry < MAX_RECONNECT_RETRIES; retry++) {
|
||||
MP_WARN(s, "Connection lost! Attempting to reconnect (%d)...\n", retry + 1);
|
||||
|
||||
if (stream_check_interrupt(retry ? RECONNECT_SLEEP_MS : 0))
|
||||
if (retry) {
|
||||
mp_sleep_us(sleep_ms * 1000);
|
||||
sleep_ms = MPMIN(sleep_ms * 2, RECONNECT_SLEEP_MAX_MS);
|
||||
}
|
||||
|
||||
if (stream_check_interrupt(0))
|
||||
return 0;
|
||||
|
||||
s->eof = 1;
|
||||
|
||||
+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)
|
||||
|
||||
@@ -52,11 +52,9 @@ struct sub_bitmap {
|
||||
int x, y;
|
||||
int dw, dh;
|
||||
|
||||
union {
|
||||
struct {
|
||||
uint32_t color;
|
||||
} libass;
|
||||
};
|
||||
struct {
|
||||
uint32_t color;
|
||||
} libass;
|
||||
};
|
||||
|
||||
struct sub_bitmaps {
|
||||
|
||||
+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);
|
||||
}
|
||||
}
|
||||
@@ -115,6 +115,8 @@ static const vf_info_t *const filter_list[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static void vf_uninit_filter(vf_instance_t *vf);
|
||||
|
||||
static bool get_desc(struct m_obj_desc *dst, int index)
|
||||
{
|
||||
if (index >= MP_ARRAY_SIZE(filter_list) - 1)
|
||||
@@ -270,6 +272,17 @@ static vf_instance_t *vf_open_filter(struct vf_chain *c, const char *name,
|
||||
return vf_open(c, name, args);
|
||||
}
|
||||
|
||||
void vf_remove_filter(struct vf_chain *c, struct vf_instance *vf)
|
||||
{
|
||||
assert(vf != c->first && vf != c->last); // these are sentinels
|
||||
struct vf_instance *prev = c->first;
|
||||
while (prev && prev->next != vf)
|
||||
prev = prev->next;
|
||||
assert(prev); // not inserted
|
||||
prev->next = vf->next;
|
||||
vf_uninit_filter(vf);
|
||||
}
|
||||
|
||||
struct vf_instance *vf_append_filter(struct vf_chain *c, const char *name,
|
||||
char **args)
|
||||
{
|
||||
@@ -439,6 +452,7 @@ static void update_formats(struct vf_chain *c, struct vf_instance *vf,
|
||||
MP_INFO(c, "Using conversion filter.\n");
|
||||
struct vf_instance *conv = vf_open(c, "scale", NULL);
|
||||
if (conv) {
|
||||
conv->autoinserted = true;
|
||||
conv->next = vf->next;
|
||||
vf->next = conv;
|
||||
update_formats(c, conv, vf->last_outfmts);
|
||||
@@ -492,6 +506,12 @@ int vf_reconfig(struct vf_chain *c, const struct mp_image_params *params)
|
||||
{
|
||||
struct mp_image_params cur = *params;
|
||||
int r = 0;
|
||||
for (struct vf_instance *vf = c->first; vf; ) {
|
||||
struct vf_instance *next = vf->next;
|
||||
if (vf->autoinserted)
|
||||
vf_remove_filter(c, vf);
|
||||
vf = next;
|
||||
}
|
||||
c->first->fmt_in = *params;
|
||||
uint8_t unused[IMGFMT_END - IMGFMT_START];
|
||||
update_formats(c, c->first, unused);
|
||||
|
||||
@@ -75,6 +75,7 @@ typedef struct vf_instance {
|
||||
void (*uninit)(struct vf_instance *vf);
|
||||
|
||||
char *label;
|
||||
bool autoinserted;
|
||||
|
||||
struct mp_image_params fmt_in, fmt_out;
|
||||
|
||||
@@ -134,6 +135,7 @@ struct mp_image *vf_output_queued_frame(struct vf_chain *c);
|
||||
void vf_seek_reset(struct vf_chain *c);
|
||||
struct vf_instance *vf_append_filter(struct vf_chain *c, const char *name,
|
||||
char **args);
|
||||
void vf_remove_filter(struct vf_chain *c, struct vf_instance *vf);
|
||||
int vf_append_filter_list(struct vf_chain *c, struct m_obj_settings *list);
|
||||
struct vf_instance *vf_find_by_label(struct vf_chain *c, const char *label);
|
||||
void vf_print_filter_chain(struct vf_chain *c, int msglevel);
|
||||
|
||||
@@ -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
-53
@@ -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);
|
||||
|
||||
@@ -112,43 +112,6 @@ static const struct mp_keymap keymap[] = {
|
||||
|
||||
/** Wayland listeners **/
|
||||
|
||||
static void display_handle_error(void *data,
|
||||
struct wl_display *display,
|
||||
void *object_id,
|
||||
uint32_t code,
|
||||
const char *message)
|
||||
{
|
||||
struct vo_wayland_state *wl = data;
|
||||
const char * error_type_msg = "";
|
||||
|
||||
switch (code) {
|
||||
case WL_DISPLAY_ERROR_INVALID_OBJECT:
|
||||
error_type_msg = "Invalid object";
|
||||
break;
|
||||
case WL_DISPLAY_ERROR_INVALID_METHOD:
|
||||
error_type_msg = "Invalid method";
|
||||
break;
|
||||
case WL_DISPLAY_ERROR_NO_MEMORY:
|
||||
error_type_msg = "No memory";
|
||||
break;
|
||||
}
|
||||
|
||||
MP_ERR(wl, "%s: %s\n", error_type_msg, message);
|
||||
}
|
||||
|
||||
static void display_handle_delete_id(void *data,
|
||||
struct wl_display *display,
|
||||
uint32_t id)
|
||||
{
|
||||
struct vo_wayland_state *wl = data;
|
||||
MP_DBG(wl, "Object %u deleted\n", id);
|
||||
}
|
||||
|
||||
static const struct wl_display_listener display_listener = {
|
||||
display_handle_error,
|
||||
display_handle_delete_id
|
||||
};
|
||||
|
||||
static void ssurface_handle_ping(void *data,
|
||||
struct wl_shell_surface *shell_surface,
|
||||
uint32_t serial)
|
||||
@@ -163,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,
|
||||
@@ -566,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;
|
||||
@@ -644,8 +607,6 @@ static bool create_display (struct vo_wayland_state *wl)
|
||||
return false;
|
||||
}
|
||||
|
||||
wl_display_add_listener(wl->display.display, &display_listener, wl);
|
||||
|
||||
wl->display.registry = wl_display_get_registry(wl->display.display);
|
||||
wl_registry_add_listener(wl->display.registry, ®istry_listener, wl);
|
||||
|
||||
@@ -817,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)
|
||||
@@ -853,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -980,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:
|
||||
@@ -1018,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,
|
||||
|
||||
@@ -8,7 +8,20 @@ __all__ = ["check_pthreads", "check_iconv", "check_lua", "check_oss_4front",
|
||||
|
||||
pthreads_program = load_fragment('pthreads.c')
|
||||
|
||||
def check_pthread_flag(ctx, dependency_identifier):
|
||||
checks = [
|
||||
check_cc(fragment = pthreads_program, cflags = '-pthread'),
|
||||
check_cc(fragment = pthreads_program, cflags = '-pthread',
|
||||
linkflags = '-pthread') ]
|
||||
|
||||
for fn in checks:
|
||||
if fn(ctx, dependency_identifier):
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_pthreads(ctx, dependency_identifier):
|
||||
if check_pthread_flag(ctx, dependency_identifier):
|
||||
return True
|
||||
platform_cflags = {
|
||||
'linux': '-D_REENTRANT',
|
||||
'freebsd': '-D_THREAD_SAFE',
|
||||
|
||||
@@ -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