Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
756d45e414 | ||
|
|
1cfa0a69ac | ||
|
|
dea583410c | ||
|
|
568ab3672a | ||
|
|
0dd66b8b2c | ||
|
|
31a5fe6fa8 | ||
|
|
36fe16cc7e | ||
|
|
c52ca90492 | ||
|
|
939d34e8f1 | ||
|
|
bb2238516b | ||
|
|
ab816f1ab1 | ||
|
|
7b8d360288 | ||
|
|
3394072795 | ||
|
|
4adcbe4d9c | ||
|
|
b3a0557bc8 | ||
|
|
15dd1d1f8d | ||
|
|
94cf61e9b8 | ||
|
|
dc83660175 | ||
|
|
11602fd31a | ||
|
|
7973487a4c | ||
|
|
c2ba42e02d | ||
|
|
1b8affee0e | ||
|
|
0f1a871d65 | ||
|
|
2e5610c23a | ||
|
|
c472782c3e | ||
|
|
601c285d83 | ||
|
|
b950afb6ea | ||
|
|
3ed671e369 | ||
|
|
3959702a1d | ||
|
|
4826eb8daf | ||
|
|
2a79912ef1 | ||
|
|
7dbed3f019 | ||
|
|
ecd2d90190 | ||
|
|
73e4094770 | ||
|
|
f5572919e4 | ||
|
|
93bf6eba3b | ||
|
|
150aeafdd2 | ||
|
|
1ef0d02245 | ||
|
|
74be07c36d | ||
|
|
54c371a293 | ||
|
|
4788b8323c | ||
|
|
df20f8fc06 | ||
|
|
c47bf17c0f | ||
|
|
64faa8c66b | ||
|
|
2f26f0b052 | ||
|
|
4fef2097ce | ||
|
|
669f5d42f0 | ||
|
|
f0d245ce4b | ||
|
|
815ad3f011 | ||
|
|
69d46b1d95 | ||
|
|
0440561c99 | ||
|
|
2a172a98fd | ||
|
|
421eebc8f1 | ||
|
|
ab3bafc750 | ||
|
|
d3f7248ca9 | ||
|
|
463b877ec0 | ||
|
|
72c81aa111 | ||
|
|
9f7c014930 | ||
|
|
97eddff865 | ||
|
|
cf880b9070 | ||
|
|
3478575419 | ||
|
|
88a53309cd | ||
|
|
da76eb9f14 | ||
|
|
df6901b653 | ||
|
|
53e4ba26b5 | ||
|
|
f10a3cac0f | ||
|
|
7370ad2120 | ||
|
|
ed2d819ea5 | ||
|
|
4f728cfb99 |
No files matched your search
+6
-6
@@ -313,12 +313,12 @@ Available filters are:
|
||||
channels 0 and 1 into output channel 2 (which could be sent to a
|
||||
subwoofer for example).
|
||||
|
||||
.. note::
|
||||
.. note::
|
||||
|
||||
If you just want to force remixing to a certain output channel
|
||||
layout, it is easier to use the ``force`` filter. For example,
|
||||
``mpv '--af=force=channels=5.1' '--channels=5.1'`` would always
|
||||
force remixing audio to 5.1 and output it like this.
|
||||
If you just want to force remixing to a certain output channel layout,
|
||||
it is easier to use the ``force`` filter. For example,
|
||||
``mpv '--af=force=channels=5.1' '--channels=5.1'`` would always force
|
||||
remixing audio to 5.1 and output it like this.
|
||||
|
||||
``sub[=fc:ch]``
|
||||
Adds a subwoofer channel to the audio stream. The audio data used for
|
||||
@@ -438,7 +438,7 @@ Available filters are:
|
||||
|
||||
``drc[=method:target]``
|
||||
Applies dynamic range compression. This maximizes the volume by compressing
|
||||
the audio signal's dynamic range.
|
||||
the audio signal's dynamic range. (Formerly called ``volnorm``.)
|
||||
|
||||
``<method>``
|
||||
Sets the used method.
|
||||
|
||||
+7
-3
@@ -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:no-block:device=[hw:0,3]`` Sets noblock-mode and the
|
||||
device-name as first card, fourth device.
|
||||
|
||||
Available audio output drivers are:
|
||||
|
||||
@@ -36,7 +36,7 @@ Available audio output drivers are:
|
||||
Set the name of the mixer element (default: ``Master``). This is for
|
||||
example ``PCM`` or ``Master``.
|
||||
``mixer-index=<number>``
|
||||
Set the index of the mixer channel (default: 0). Consider the output
|
||||
Set the index of the mixer channel (default: 0). Consider the output of
|
||||
"``amixer scontrols``", then the index is the number that follows the
|
||||
name of the element.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+39
-5
@@ -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,8 @@ 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]``
|
||||
``-af volnorm`` ``--af=drc`` (renamed)
|
||||
=========================== ========================================
|
||||
|
||||
.. note::
|
||||
@@ -149,8 +183,8 @@ input.conf and Slave Commands
|
||||
|
||||
This lists only commands that are not always gracefully handled by the
|
||||
internal legacy translation layer. If an input.conf contains any legacy
|
||||
commands, they will be displayed with ``-v`` when it is loaded, and show
|
||||
and the replacement commands.
|
||||
commands, a warning will be printed when starting the player. The warnings
|
||||
also show the replacement commands.
|
||||
|
||||
Properties containing ``_`` to separate words use ``-`` instead.
|
||||
|
||||
@@ -189,7 +223,7 @@ input.conf and Slave Commands
|
||||
+--------------------------------+----------------------------------------+
|
||||
| ``show_chapters`` | ``show_text ${chapter-list}`` |
|
||||
+--------------------------------+----------------------------------------+
|
||||
| ``af_switch``, ``af_add``, ... | ``af [set|add|...]`` |
|
||||
| ``af_switch``, ``af_add``, ... | ``af set|add|...`` |
|
||||
+--------------------------------+----------------------------------------+
|
||||
|
||||
Other
|
||||
|
||||
@@ -35,7 +35,7 @@ Newlines always start a new binding. ``#`` starts a comment (outside of quoted
|
||||
string arguments). To bind commands to the ``#`` key, ``SHARP`` can be used.
|
||||
|
||||
``<key>`` is either the literal character the key produces (ASCII or Unicode
|
||||
character), or a symbol name.
|
||||
character), or a symbolic name (as printed by ``--input-keylist``).
|
||||
|
||||
``<section>`` (braced with ``{`` and ``}``) is the input section for this
|
||||
command.
|
||||
@@ -326,6 +326,9 @@ should be replaced by properties), ``stop`` (questionable use), ``get_property``
|
||||
Input Command Prefixes
|
||||
----------------------
|
||||
|
||||
These prefixes are placed between key name and the actual command. Multiple
|
||||
prefixes can be specified. They are separated by whitespace.
|
||||
|
||||
``osd-auto`` (default)
|
||||
Use the default behavior for this command.
|
||||
``no-osd``
|
||||
@@ -390,7 +393,7 @@ Name W Comment
|
||||
``speed`` x see ``--speed``
|
||||
``filename`` currently played file (path stripped)
|
||||
``path`` currently played file (full path)
|
||||
``media-title`` filename or libquvi ``QUVIPROP_PAGETITLE``
|
||||
``media-title`` filename, title tag, or libquvi ``QUVIPROP_PAGETITLE``
|
||||
``demuxer``
|
||||
``stream-path`` filename (full path) of stream layer filename
|
||||
``stream-pos`` x byte position in source stream
|
||||
@@ -457,7 +460,7 @@ Name W Comment
|
||||
``sub`` x alias for ``sid``
|
||||
``sub-delay`` x see ``--sub-delay``
|
||||
``sub-pos`` x see ``--sub-pos``
|
||||
``sub-visibility`` x whether current subtitle is rendered
|
||||
``sub-visibility`` x see ``--sub-visibility``
|
||||
``sub-forced-only`` x see ``--sub-forced-only``
|
||||
``sub-scale`` x subtitle font size multiplicator
|
||||
``ass-use-margins`` x see ``--ass-use-margins``
|
||||
@@ -471,7 +474,7 @@ Name W Comment
|
||||
``playlist-pos`` current position on playlist
|
||||
``playlist-count`` number of total playlist entries
|
||||
``playlist`` playlist, current entry marked
|
||||
``track-list`` list of audio/video/sub tracks, cur. entr. marked
|
||||
``track-list`` list of audio/video/sub tracks, current entry marked
|
||||
``chapter-list`` list of chapters, current entry marked
|
||||
``quvi-format`` x see ``--quvi-format``
|
||||
``af`` x see ``--af``
|
||||
|
||||
+9
-31
@@ -12,9 +12,7 @@ a movie player
|
||||
##############
|
||||
|
||||
:Author: wm4
|
||||
:Date: 2013-07-08
|
||||
:Copyright: GPLv3
|
||||
:Version: git
|
||||
:Manual section: 1
|
||||
:Manual group: multimedia
|
||||
|
||||
@@ -34,7 +32,7 @@ SYNOPSIS
|
||||
| **mpv** \dvb://[card\_number@]channel [options]
|
||||
| **mpv** \mf://[filemask|\@listfile] [-mf options] [options]
|
||||
| **mpv** cdda://track[-endtrack][:speed][/device] [options]
|
||||
| **mpv** [file|mms[t]|http|httpproxy|rt[s]p|ftp|udp|smb]:// [user:pass\@]URL[:port] [options]
|
||||
| **mpv** [file|mms[t]|http|httpproxy|rt[s]p|ftp|udp|smb]://[user:pass\@]URL[:port] [options]
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
@@ -202,8 +200,7 @@ corresponding adjustment, or the software equalizer (``--vf=eq``).)
|
||||
7 and 8
|
||||
Adjust saturation.
|
||||
|
||||
(The following keys are valid only when using the corevideo video output
|
||||
driver.)
|
||||
(The following keys are valid only on OSX.)
|
||||
|
||||
command + 0
|
||||
Resize movie window to half its original size.
|
||||
@@ -232,7 +229,7 @@ PREVIOUS and NEXT
|
||||
Seek backward/forward 1 minute.
|
||||
|
||||
(The following keys are only valid if you compiled with TV or DVB input
|
||||
support and will take precedence over the keys defined above.)
|
||||
support.)
|
||||
|
||||
h and k
|
||||
Select previous/next channel.
|
||||
@@ -252,24 +249,6 @@ button 3 and button 4
|
||||
button 5 and button 6
|
||||
Decrease/increase volume.
|
||||
|
||||
Joystick Control
|
||||
----------------
|
||||
|
||||
left and right
|
||||
Seek backward/forward 10 seconds.
|
||||
|
||||
up and down
|
||||
Seek forward/backward 1 minute.
|
||||
|
||||
button 1
|
||||
Pause.
|
||||
|
||||
button 2
|
||||
Toggle OSD states: none / seek / seek + timer / seek + timer + total time.
|
||||
|
||||
button 3 and button 4
|
||||
Decrease/increase volume.
|
||||
|
||||
|
||||
USAGE
|
||||
=====
|
||||
@@ -314,6 +293,8 @@ file1.mkv ``--a --b --c``
|
||||
file2.mkv ``--a --b --c``
|
||||
=============== ===========================
|
||||
|
||||
(This is different from MPlayer and mplayer2.)
|
||||
|
||||
Also, if any option is changed at runtime (via input commands), they are not
|
||||
reset when a new file is played.
|
||||
|
||||
@@ -408,7 +389,7 @@ profile name ``default`` to continue with normal options.
|
||||
::
|
||||
|
||||
[vo.vdpau]
|
||||
# Use hardware decoding (this might break playback of some h264 files)
|
||||
# Use hardware decoding (might break playback of some h264 files)
|
||||
hwdec=vdpau
|
||||
|
||||
[protocol.dvd]
|
||||
@@ -498,7 +479,7 @@ behavior of mpv.
|
||||
|
||||
FFmpeg/Libav:
|
||||
This library accesses various environment variables. However, they are not
|
||||
centrally documented, and documenting them is not our job. Therefore, the
|
||||
centrally documented, and documenting them is not our job. Therefore, this
|
||||
list is incomplete.
|
||||
|
||||
Notable environment variables:
|
||||
@@ -601,13 +582,10 @@ FILES
|
||||
EXAMPLES OF MPV USAGE
|
||||
=====================
|
||||
|
||||
Quickstart Blu-ray playing:
|
||||
Blu-ray playback:
|
||||
- ``mpv bd:////path/to/disc``
|
||||
- ``mpv bd:// --bluray-device=/path/to/disc``
|
||||
|
||||
Quickstart DVD playing:
|
||||
``mpv dvd://1``
|
||||
|
||||
Play in Japanese with English subtitles:
|
||||
``mpv dvd://1 --alang=ja --slang=en``
|
||||
|
||||
@@ -643,6 +621,6 @@ mpv is a MPlayer fork based on mplayer2, which in turn is a fork of MPlayer.
|
||||
MPlayer was initially written by Arpad Gereoffy. See the ``AUTHORS`` file for
|
||||
a list of some of the many other contributors.
|
||||
|
||||
MPlayer is (C) 2000-2012 The MPlayer Team
|
||||
MPlayer is (C) 2000-2013 The MPlayer Team
|
||||
|
||||
This man page was written mainly by Gabucino, Jonas Jermann and Diego Biurrun.
|
||||
+67
-57
@@ -69,8 +69,7 @@
|
||||
Specify a priority list of audio languages to use. Different container
|
||||
formats employ different language codes. DVDs use ISO 639-1 two-letter
|
||||
language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter
|
||||
language codes, while OGM uses a free-form identifier. mpv prints the
|
||||
available languages when run in verbose (``-v``) mode. See also ``--aid``.
|
||||
language codes, while OGM uses a free-form identifier. See also ``--aid``.
|
||||
|
||||
.. admonition:: Examples
|
||||
|
||||
@@ -183,7 +182,7 @@
|
||||
offset scale factor, not what the video filter chain or the video output
|
||||
use.
|
||||
|
||||
``--ass-vsfilter-color-compat=<basic|full|force-601|no``
|
||||
``--ass-vsfilter-color-compat=<basic|full|force-601|no>``
|
||||
Mangle colors like (xy-)vsfilter do (default: basic). Historically, VSFilter
|
||||
was not colorspace aware. This was no problem as long as the colorspace
|
||||
used for SD video (BT.601) was used. But when everything switched to HD
|
||||
@@ -249,8 +248,8 @@
|
||||
See ``--geometry`` for details how this is handled with multi-monitor
|
||||
setups.
|
||||
|
||||
Use ``--autofit-larger`` instead if you do not want the window to get
|
||||
larger.
|
||||
Use ``--autofit-larger`` instead if you just want to limit the maximum size
|
||||
of the window, rather than always forcing a window size.
|
||||
|
||||
Use ``--geometry`` if you want to force both window width and height to a
|
||||
specific size.
|
||||
@@ -307,17 +306,6 @@
|
||||
out. This delay in reaction time to sudden A/V offsets should be the only
|
||||
side-effect of turning this option on, for all sound drivers.
|
||||
|
||||
``--bandwidth=<bytes>``
|
||||
Specify the maximum bandwidth for network streaming (for servers that are
|
||||
able to send content in different bitrates). Useful if you want to watch
|
||||
live streamed media behind a slow connection. With Real RTSP streaming, it
|
||||
is also used to set the maximum delivery bandwidth allowing faster cache
|
||||
filling and stream dumping.
|
||||
|
||||
.. note::
|
||||
|
||||
Probably broken/useless.
|
||||
|
||||
``--untimed``
|
||||
Do not sleep when outputting video frames. Useful for benchmarks when used
|
||||
with ``--no-audio.``
|
||||
@@ -331,6 +319,10 @@
|
||||
Specify the Blu-ray disc location. Must be a directory with Blu-ray
|
||||
structure.
|
||||
|
||||
.. admonition:: Example
|
||||
|
||||
``mpv bd:// --bluray-device=/path/to/bd/``
|
||||
|
||||
``--border``, ``--no-border``
|
||||
Play movie with window border and decorations. Since this is on by
|
||||
default, use ``--no-border`` to disable the standard window decorations.
|
||||
@@ -357,7 +349,7 @@
|
||||
|
||||
``--cache-default=<kBytes|no>``
|
||||
Set the size of the cache in kilobytes (default: 320 KB). Using ``no``
|
||||
will not automatically enable the cache e.h. when playing from a network
|
||||
will not automatically enable the cache e.g. when playing from a network
|
||||
stream. Note that using ``--cache`` will always override this option.
|
||||
|
||||
``--cache-pause=<no|percentage>``
|
||||
@@ -433,11 +425,6 @@
|
||||
libavcodec downmixes the audio into the requested number of channels if
|
||||
possible.
|
||||
|
||||
.. note::
|
||||
|
||||
This option is honored by codecs (AC-3 only), filters (surround) and
|
||||
audio output drivers (OSS at least).
|
||||
|
||||
The ``--channels`` option either takes a channel number or an explicit
|
||||
channel layout. Channel numbers refer to default layouts, e.g. 2 channels
|
||||
refer to stereo, 6 refers to 5.1.
|
||||
@@ -446,6 +433,13 @@
|
||||
lists speaker names, which can be used to express arbitrary channel
|
||||
layouts (e.g. ``fl-fr-lfe`` is 2.1).
|
||||
|
||||
.. note::
|
||||
|
||||
Currently, this option is not very useful. The main effect of this
|
||||
option is that automatic stereo downmixing is disabled. It depends
|
||||
mainly on the selected audio output and the associated audio subsystem
|
||||
how playback of files with surround audio will behave.
|
||||
|
||||
``--chapter=<start[-end]>``
|
||||
Specify which chapter to start playing at. Optionally specify which
|
||||
chapter to end playing at. Also see ``--start``.
|
||||
@@ -584,7 +578,7 @@
|
||||
|
||||
This is default in order to reduce latency when opening HTTP streams.
|
||||
|
||||
``--demuxer-lavf-format=<value>``
|
||||
``--demuxer-lavf-format=<name>``
|
||||
Force a specific libavformat demuxer.
|
||||
|
||||
``--demuxer-lavf-genpts-mode=<auto|lavf|builtin|no>``
|
||||
@@ -667,12 +661,14 @@
|
||||
|
||||
.. admonition:: Example
|
||||
|
||||
- ``mpv sample-720x576.yuv --demuxer=rawvideo --demuxer-rawvideo=w=720:h=576``
|
||||
Play a raw YUV sample.
|
||||
Play a raw YUV sample::
|
||||
|
||||
mpv sample-720x576.yuv --demuxer=rawvideo \
|
||||
--demuxer-rawvideo=w=720:h=576
|
||||
|
||||
``--demuxer-rawvideo-format=<value>``
|
||||
Colorspace (fourcc) in hex or string for ``--demuxer=rawvideo``
|
||||
(default: YV12).
|
||||
(default: ``YV12``).
|
||||
|
||||
``--demuxer-rawvideo-mp-format=<value>``
|
||||
Colorspace by internal video format for ``--demuxer=rawvideo``. Use
|
||||
@@ -708,6 +704,10 @@
|
||||
also specify a directory that contains files previously copied directly
|
||||
from a DVD (with e.g. vobcopy).
|
||||
|
||||
.. admonition:: Example
|
||||
|
||||
``mpv dvd:// --dvd-device=/path/to/dvd/``
|
||||
|
||||
``--dvd-speed=<speed>``
|
||||
Try to limit DVD speed (default: 0, no change). DVD base speed is 1385
|
||||
kB/s, so an 8x drive can read at speeds up to 11080 kB/s. Slower speeds
|
||||
@@ -750,7 +750,7 @@
|
||||
|
||||
``--no-fixed-vo``, ``--fixed-vo``
|
||||
``--no-fixed-vo`` enforces closing and reopening the video window for
|
||||
multiple files (one (un)initialization for all files).
|
||||
multiple files (one (un)initialization for each file).
|
||||
|
||||
``--flip``
|
||||
Flip image upside-down.
|
||||
@@ -959,11 +959,7 @@
|
||||
See also ``--autofit`` and ``--autofit-larger`` for fitting the window into
|
||||
a given size without changing aspect ratio.
|
||||
|
||||
``--grabpointer``, ``--no-grabpointer``
|
||||
``--no-grabpointer`` tells the player to not grab the mouse pointer after a
|
||||
video mode change (``--vm``). Useful for multihead setups.
|
||||
|
||||
``--heartbeat-cmd``
|
||||
``--heartbeat-cmd=<command>``
|
||||
Command that is executed every 30 seconds during playback via *system()* -
|
||||
i.e. using the shell. The time between the commands can be customized with
|
||||
the ``--heartbeat-interval`` option.
|
||||
@@ -1027,7 +1023,10 @@
|
||||
|
||||
.. admonition:: Example
|
||||
|
||||
``mpv --http-header-fields='Field1: value1','Field2: value2' http://localhost:1234``
|
||||
::
|
||||
|
||||
mpv --http-header-fields='Field1: value1','Field2: value2' \
|
||||
http://localhost:1234
|
||||
|
||||
Will generate HTTP request::
|
||||
|
||||
@@ -1052,7 +1051,7 @@
|
||||
``<api>`` can be one of the following:
|
||||
|
||||
:no: always use software decoding (default)
|
||||
:vdpau: works with nvidia drivers only, requires ``--vo=vdpau``
|
||||
:vdpau: requires ``--vo=vdpau`` (Linux only)
|
||||
:vda: OSX
|
||||
:crystalhd: Broadcom Crystal HD
|
||||
|
||||
@@ -1307,8 +1306,9 @@
|
||||
``--no-sub``
|
||||
Do not select any subtitle when the file is loaded.
|
||||
|
||||
``--no-sub-visibility``
|
||||
Disable display of subtitles, but still select and decode them.
|
||||
``--sub-visibility``, ``--no-sub-visibility``
|
||||
Can be used to disable display of subtitles, but still select and decode
|
||||
them.
|
||||
|
||||
``--no-video``
|
||||
Do not play video. With some demuxers this may not work. In those cases
|
||||
@@ -1334,13 +1334,15 @@
|
||||
|
||||
``--osd-bar-align-x=<-1-1>``
|
||||
Position of the OSD bar. -1 is far left, 0 is centered, 1 is far right.
|
||||
Fractional values (like 0.5) are allowed.
|
||||
|
||||
``--osd-bar-align-y=<-1-1>``
|
||||
Position of the OSD bar. -1 is top, 0 is centered, 1 is bottom.
|
||||
Fractional values (like 0.5) are allowed.
|
||||
|
||||
``--osd-bar-w=<1-100>``
|
||||
Width of the OSD bar, in percentage of the screen width (default: 75).
|
||||
A value of 0.5 means the bar is half the screen wide.
|
||||
A value of 50 means the bar is half the screen wide.
|
||||
|
||||
``--osd-bar-h=<0.1-50>``
|
||||
Height of the OSD bar, in percentage of the screen height (default: 3.125).
|
||||
@@ -1374,8 +1376,8 @@
|
||||
For example, ``#FF0000`` is red. This is similar to web colors.
|
||||
|
||||
You can specify transparency by specifying an alpha value in the form
|
||||
``#AARRGGBB``. 0 is fully transparent, while ``FF`` is opaque (opaque is
|
||||
default with the shorter color specification).
|
||||
``#AARRGGBB``. ``00`` is fully transparent, while ``FF`` is opaque (opaque
|
||||
is default with the shorter color specification).
|
||||
|
||||
.. admonition:: Examples
|
||||
|
||||
@@ -1480,7 +1482,7 @@
|
||||
|
||||
``--playing-msg=<string>``
|
||||
Print out a string after starting playback. The string is expanded for
|
||||
properties, e.g. ``--playing-msg=file: ${filename}`` will print the string
|
||||
properties, e.g. ``--playing-msg='file: ${filename}'`` will print the string
|
||||
``file:`` followed by a space and the currently played filename.
|
||||
|
||||
See `Property Expansion`_.
|
||||
@@ -1611,6 +1613,8 @@
|
||||
Particularly useful on slow terminals or broken ones which do not properly
|
||||
handle carriage return (i.e. ``\r``).
|
||||
|
||||
Also see ``--really-quiet`` and ``--msglevel``.
|
||||
|
||||
``--quvi-format=<best|default|...>``
|
||||
Video format/quality that is directly passed to libquvi (default: ``best``).
|
||||
This is used when opening links to streaming sites like YouTube. The
|
||||
@@ -1725,10 +1729,6 @@
|
||||
- ``--reset-on-next-file=""``
|
||||
Do not reset pause mode.
|
||||
|
||||
``--reuse-socket``
|
||||
(udp:// only)
|
||||
Allows a socket to be reused by other processes as soon as it is closed.
|
||||
|
||||
``--saturation=<-100-100>``
|
||||
Adjust the saturation of the video signal (default: 0). You can get
|
||||
grayscale output with this option. Not supported by all video output
|
||||
@@ -1752,12 +1752,12 @@
|
||||
multiple displays), this option tells mpv which screen to display the
|
||||
movie on.
|
||||
|
||||
This option does not always work. In these cases, try to use ``--geometry``
|
||||
to position the window explicitly.
|
||||
|
||||
.. admonition:: Note (X11)
|
||||
|
||||
This option does not work properly with all window managers.
|
||||
This option does not work properly with all window managers. In these
|
||||
cases, you can try to use ``--geometry`` to position the window
|
||||
explicitly. It's also possible that the window manager provides native
|
||||
features to control which screens application windows should use.
|
||||
|
||||
See also ``--fs-screen``.
|
||||
|
||||
@@ -1872,8 +1872,7 @@
|
||||
Specify a priority list of subtitle languages to use. Different container
|
||||
formats employ different language codes. DVDs use ISO 639-1 two letter
|
||||
language codes, Matroska uses ISO 639-2 three letter language codes while
|
||||
OGM uses a free-form identifier. mpv prints the available languages
|
||||
when run in verbose (``-v``) mode. See also ``--sid``.
|
||||
OGM uses a free-form identifier. See also ``--sid``.
|
||||
|
||||
.. admonition:: Examples
|
||||
|
||||
@@ -1927,6 +1926,14 @@
|
||||
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.
|
||||
|
||||
.. admonition:: 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`` sets
|
||||
maximum amplification, i.e. amplify by 200%. The default volume (no
|
||||
change in volume) will be ``50`` in this case.
|
||||
|
||||
``--speed=<0.01-100>``
|
||||
Slow down or speed up playback by the factor given as parameter.
|
||||
|
||||
@@ -1985,7 +1992,8 @@
|
||||
|
||||
``--stop-screensaver``, ``--no-stop-screensaver``
|
||||
Turns off the screensaver (or screen blanker and similar mechanisms) at
|
||||
startup and turns it on again on exit (default: yes).
|
||||
startup and turns it on again on exit (default: yes). The screensaver is
|
||||
always reenabled when the player is paused.
|
||||
|
||||
This is not supported on all video outputs or platforms. Sometimes it is
|
||||
implemented, but does not work (happens often on GNOME). You might be able
|
||||
@@ -2032,8 +2040,8 @@
|
||||
- ``--subcp=latin2``
|
||||
- ``--subcp=cp1250``
|
||||
|
||||
If the player was compiled with ENCA support, you can use special syntax
|
||||
to use that::
|
||||
If the player was compiled with ENCA support, you can control it with the
|
||||
following syntax::
|
||||
|
||||
--subcp=enca:<language>:<fallback codepage>
|
||||
|
||||
@@ -2112,10 +2120,10 @@
|
||||
to fix the playback speed for frame-based subtitle formats. Works for
|
||||
external text subtitles only.
|
||||
|
||||
.. admonition:: Examples
|
||||
.. admonition:: Example
|
||||
|
||||
- ``--sub-speed=25/23.976`` plays frame based subtitles which have been
|
||||
loaded assuming a framerate of 23.976 at 25 FPS.
|
||||
`--sub-speed=25/23.976`` plays frame based subtitles which have been
|
||||
loaded assuming a framerate of 23.976 at 25 FPS.
|
||||
|
||||
``--sws=<n>``
|
||||
Specify the software scaler algorithm to be used with ``--vf=scale``. This
|
||||
@@ -2157,7 +2165,9 @@
|
||||
.. warning::
|
||||
|
||||
There is a danger of this causing significant CPU usage, depending on
|
||||
the properties used and the window manager.
|
||||
the properties used and the window manager. Changing the window title
|
||||
is often a slow operation, and if the title changes every frame,
|
||||
playback can be ruined.
|
||||
|
||||
``--tv=<option1:option2:...>``
|
||||
This option tunes various properties of the TV capture module. For
|
||||
|
||||
+5
-7
@@ -22,12 +22,9 @@ in the list. Suboptions are optional and can mostly be omitted.
|
||||
Available video output drivers are:
|
||||
|
||||
``xv`` (X11 only)
|
||||
Uses the XVideo extension to enable hardware-accelerated playback. This is
|
||||
Uses the XVideo extension to enable hardware-accelerated display. This is
|
||||
the most compatible VO on X, but may be low-quality, and has issues with
|
||||
OSD and subtitle display.
|
||||
For information about what colorkey is used and how it is drawn, run
|
||||
mpv with the ``-v`` option and look out for the lines tagged with ``[xv
|
||||
common]`` at the beginning.
|
||||
|
||||
``adaptor=<number>``
|
||||
Select a specific XVideo adaptor (check xvinfo results).
|
||||
@@ -265,7 +262,9 @@ Available video output drivers are:
|
||||
|
||||
|
||||
There are some more filters. For a complete list, pass ``help`` as
|
||||
value, e.g.: ``mpv --vo=opengl:lscale=help``
|
||||
value, e.g.::
|
||||
|
||||
mpv --vo=opengl:lscale=help
|
||||
|
||||
``lparam1=<value>``
|
||||
Set filter parameters. Ignored if the filter is not tunable. These are
|
||||
@@ -609,8 +608,7 @@ Available video output drivers are:
|
||||
The following options are only useful if writing your own fragment programs.
|
||||
|
||||
``customprog=<filename>``
|
||||
Load a custom fragment program from ``<filename>``. See
|
||||
``TOOLS/edgedect.fp`` for an example.
|
||||
Load a custom fragment program from ``<filename>``.
|
||||
``customtex=<filename>``
|
||||
Load a custom "gamma ramp" texture from ``<filename>``. This can be used
|
||||
in combination with ``yuv=4`` or with the ``customprog`` option.
|
||||
|
||||
@@ -44,8 +44,8 @@ SOURCES-$(LIBBS2B) += audio/filter/af_bs2b.c
|
||||
SOURCES-$(LIBPOSTPROC) += video/filter/vf_pp.c
|
||||
SOURCES-$(LIBSMBCLIENT) += stream/stream_smb.c
|
||||
|
||||
SOURCES-$(MACOSX_BUNDLE) += osdep/macosx_bundle.m
|
||||
SOURCES-$(COCOA) += video/out/cocoa_common.m \
|
||||
osdep/macosx_bundle.m \
|
||||
osdep/macosx_application.m \
|
||||
osdep/macosx_events.m \
|
||||
osdep/ar/HIDRemote.m
|
||||
@@ -294,11 +294,12 @@ DIRS = . \
|
||||
audio/decode \
|
||||
audio/filter \
|
||||
audio/out \
|
||||
core \
|
||||
mpvcore \
|
||||
mpvcore/input \
|
||||
mpvcore/timeline \
|
||||
demux \
|
||||
osdep \
|
||||
osdep/ar \
|
||||
stream \
|
||||
sub \
|
||||
video \
|
||||
|
||||
@@ -47,22 +47,26 @@ If you are running Mac OSX and using homebrew we provide [homebrew-mpv][homebrew
|
||||
to date formula that compiles mpv with sensible dependencies and defaults for
|
||||
OSX.
|
||||
|
||||
configure --enable-* parameters
|
||||
-------------------------------
|
||||
### configure `--enable-*` parameters
|
||||
|
||||
The --enable-* parameters unconditionally force options on, completely
|
||||
The `--enable-*` parameters unconditionally force options on, completely
|
||||
skipping autodetection. This behavior is unlike what you may be used to from
|
||||
autoconf-based configure scripts that can decide to override you. This greater
|
||||
level of control comes at a price. You may have to provide the correct compiler
|
||||
and linker flags yourself.
|
||||
|
||||
If you used one of these options and experience a compilation or
|
||||
linking failure, make sure you have passed the necessary compiler/linker flags
|
||||
to configure.
|
||||
|
||||
mpv's configure script is greedy and automatically enables features as a result
|
||||
of autodetection. The cases where you may want to use `--enable-*` are very
|
||||
limited.
|
||||
|
||||
Bug reports
|
||||
-----------
|
||||
|
||||
Please use the [issue tracker][issue tracker] provided by GitHub to send us bug
|
||||
Please use the [issue tracker][issue-tracker] provided by GitHub to send us bug
|
||||
reports or feature requests.
|
||||
|
||||
Contributing
|
||||
@@ -75,9 +79,21 @@ make code review easier for both parties later on.
|
||||
Contacts
|
||||
--------
|
||||
|
||||
You can find us on IRC in `#mpv-player` on `irc.freenode.net`
|
||||
These forms of contact are meant to ask questions about mpv usage, give
|
||||
feedback on mpv and discuss it's development.
|
||||
|
||||
If possible, please avoid posting bugs here and use the [issue tracker][issue-tracker]
|
||||
instead.
|
||||
|
||||
- **Users IRC Channel**: `#mpv-player` on `irc.freenode.net`
|
||||
- **Users Mailing List**: `mpv-users@googlegroups.com` ([Archive / Subscribe][mpv-users]).
|
||||
- **Devel Mailing List**: `mpv-devel@googlegroups.com` ([Archive / Subscribe][mpv-devel])
|
||||
|
||||
To contact the `mpv` team in private write to `mpv-team@googlegroups.com`.
|
||||
|
||||
[changes]: https://github.com/mpv-player/mpv/blob/master/DOCS/man/en/changes.rst
|
||||
[mpv-build]: https://github.com/mpv-player/mpv-build
|
||||
[homebrew-mpv]: https://github.com/mpv-player/homebrew-mpv
|
||||
[issue tracker]: https://github.com/mpv-player/mpv/issues
|
||||
[issue-tracker]: https://github.com/mpv-player/mpv/issues
|
||||
[mpv-users]: https://groups.google.com/forum/?hl=en#!forum/mpv-users
|
||||
[mpv-devel]: https://groups.google.com/forum/?hl=en#!forum/mpv-devel
|
||||
@@ -86,6 +86,7 @@
|
||||
<string>VCD</string>
|
||||
<string>VFW</string>
|
||||
<string>VOB</string>
|
||||
<string>WEBM</string>
|
||||
<string>WMV</string>
|
||||
<string>asf</string>
|
||||
<string>avi</string>
|
||||
@@ -119,6 +120,7 @@
|
||||
<string>vcd</string>
|
||||
<string>vfw</string>
|
||||
<string>vob</string>
|
||||
<string>webm</string>
|
||||
<string>wmv</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -99,6 +99,11 @@ static int control(struct af_instance* af, int cmd, void* arg)
|
||||
for(i = 1; i < af->data->nch; i++)
|
||||
s->buf[i] = (uint8_t *)s->buf[0] + i*s->sz*af->data->bps;
|
||||
|
||||
if (!s->filename) {
|
||||
mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] No filename set.\n");
|
||||
return AF_ERROR;
|
||||
}
|
||||
|
||||
// Init memory mapping
|
||||
s->fd = open(s->filename, O_RDWR | O_CREAT | O_TRUNC, 0640);
|
||||
mp_msg(MSGT_AFILTER, MSGL_INFO, "[export] Exporting to file: %s\n", s->filename);
|
||||
|
||||
+20
-5
@@ -232,6 +232,7 @@ static int init(struct ao *ao)
|
||||
{
|
||||
struct pa_sample_spec ss;
|
||||
struct pa_channel_map map;
|
||||
pa_proplist *proplist = NULL;
|
||||
struct priv *priv = ao->priv;
|
||||
char *host = priv->cfg_host && priv->cfg_host[0] ? priv->cfg_host : NULL;
|
||||
char *sink = priv->cfg_sink && priv->cfg_sink[0] ? priv->cfg_sink : NULL;
|
||||
@@ -298,16 +299,26 @@ static int init(struct ao *ao)
|
||||
|
||||
if (!pa_sample_spec_valid(&ss)) {
|
||||
mp_msg(MSGT_AO, MSGL_ERR, "AO: [pulse] Invalid sample spec\n");
|
||||
goto fail;
|
||||
goto unlock_and_fail;
|
||||
}
|
||||
|
||||
if (!select_chmap(ao, &map))
|
||||
goto fail;
|
||||
|
||||
if (!(priv->stream = pa_stream_new(priv->context, "audio stream", &ss,
|
||||
&map)))
|
||||
goto unlock_and_fail;
|
||||
|
||||
if (!(proplist = pa_proplist_new())) {
|
||||
mp_msg(MSGT_AO, MSGL_ERR, "AO: [pulse] Failed to allocate proplist\n");
|
||||
goto unlock_and_fail;
|
||||
}
|
||||
(void)pa_proplist_sets(proplist, PA_PROP_MEDIA_ROLE, "video");
|
||||
|
||||
if (!(priv->stream = pa_stream_new_with_proplist(priv->context,
|
||||
"audio stream", &ss,
|
||||
&map, proplist)))
|
||||
goto unlock_and_fail;
|
||||
|
||||
pa_proplist_free(proplist);
|
||||
proplist = NULL;
|
||||
|
||||
pa_stream_set_state_callback(priv->stream, stream_state_cb, ao);
|
||||
pa_stream_set_write_callback(priv->stream, stream_request_cb, ao);
|
||||
pa_stream_set_latency_update_callback(priv->stream,
|
||||
@@ -344,6 +355,10 @@ fail:
|
||||
&& ao->probing))
|
||||
GENERIC_ERR_MSG(priv->context, "Init failed");
|
||||
}
|
||||
|
||||
if (proplist)
|
||||
pa_proplist_free(proplist);
|
||||
|
||||
uninit(ao, true);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -316,16 +316,15 @@ Optional features:
|
||||
--disable-bluray disable Blu-ray support [autodetect]
|
||||
--disable-dvdread disable libdvdread [autodetect]
|
||||
--disable-enca disable ENCA charset oracle library [autodetect]
|
||||
--enable-macosx-bundle enable Mac OS X bundle file locations [autodetect]
|
||||
--disable-pthreads disable Posix threads support [autodetect]
|
||||
--disable-libass disable subtitle rendering with libass [autodetect]
|
||||
--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]
|
||||
@@ -474,7 +473,6 @@ _cdda=auto
|
||||
_coreaudio=auto
|
||||
_corevideo=auto
|
||||
_cocoa=auto
|
||||
_macosx_bundle=auto
|
||||
_enca=auto
|
||||
_pthreads=auto
|
||||
_ass=auto
|
||||
@@ -708,8 +706,6 @@ for ac_option do
|
||||
--disable-corevideo) _corevideo=no ;;
|
||||
--enable-cocoa) _cocoa=yes ;;
|
||||
--disable-cocoa) _cocoa=no ;;
|
||||
--enable-macosx-bundle) _macosx_bundle=yes ;;
|
||||
--disable-macosx-bundle) _macosx_bundle=no ;;
|
||||
|
||||
--enable-manpage) _build_man=yes ;;
|
||||
--disable-manpage) _build_man=no ;;
|
||||
@@ -1547,19 +1543,6 @@ fi
|
||||
echores "$_sys_sysinfo"
|
||||
|
||||
|
||||
if darwin; then
|
||||
|
||||
echocheck "Mac OS X Bundle file locations"
|
||||
def_macosx_bundle='#undef CONFIG_MACOSX_BUNDLE'
|
||||
test "$_macosx_bundle" = auto
|
||||
if test "$_macosx_bundle" = yes ; then
|
||||
extra_ldflags="$extra_ldflags -headerpad_max_install_names"
|
||||
def_macosx_bundle='#define CONFIG_MACOSX_BUNDLE 1'
|
||||
fi
|
||||
echores "$_macosx_bundle"
|
||||
|
||||
fi #if darwin
|
||||
|
||||
echocheck "pkg-config"
|
||||
if $($_pkg_config --version > /dev/null 2>&1); then
|
||||
if test "$_ld_static"; then
|
||||
@@ -3079,7 +3062,6 @@ LIBQUVI = $_libquvi4
|
||||
LIBQUVI9 = $_libquvi9
|
||||
LIBGUESS = $_libguess
|
||||
LIRC = $_lirc
|
||||
MACOSX_BUNDLE = $_macosx_bundle
|
||||
MNG = $_mng
|
||||
MPG123 = $_mpg123
|
||||
OPENAL = $_openal
|
||||
@@ -3165,7 +3147,6 @@ $def_termios
|
||||
$def_dl
|
||||
$def_dos_paths
|
||||
$def_iconv
|
||||
$def_macosx_bundle
|
||||
$def_priority
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -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. */
|
||||
@@ -466,7 +466,7 @@ struct demux_packet *demux_read_packet(struct sh_stream *sh)
|
||||
// packets from the queue.
|
||||
double demux_get_next_pts(struct sh_stream *sh)
|
||||
{
|
||||
if (sh) {
|
||||
if (sh && sh->ds->selected) {
|
||||
ds_get_packets(sh);
|
||||
if (sh->ds->head)
|
||||
return sh->ds->head->pts;
|
||||
|
||||
+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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+25
-11
@@ -188,7 +188,7 @@ typedef struct mkv_demuxer {
|
||||
|
||||
uint64_t skip_to_timecode;
|
||||
int v_skip_to_keyframe, a_skip_to_keyframe;
|
||||
bool subtitle_preroll;
|
||||
int subtitle_preroll;
|
||||
} mkv_demuxer_t;
|
||||
|
||||
#define REALHEADER_SIZE 16
|
||||
@@ -196,6 +196,10 @@ typedef struct mkv_demuxer {
|
||||
#define RAPROPERTIES4_SIZE 56
|
||||
#define RAPROPERTIES5_SIZE 70
|
||||
|
||||
// Maximum number of subtitle packets that are accepted for pre-roll.
|
||||
// (Subtitle packets added before first A/V keyframe packet is found with seek.)
|
||||
#define NUM_SUB_PREROLL_PACKETS 500
|
||||
|
||||
/**
|
||||
* \brief ensures there is space for at least one additional element
|
||||
* \param array array to grow
|
||||
@@ -2266,7 +2270,17 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info)
|
||||
if (mkv_d->v_skip_to_keyframe)
|
||||
use_this_block = 0;
|
||||
} else if (track->type == MATROSKA_TRACK_SUBTITLE) {
|
||||
use_this_block |= mkv_d->subtitle_preroll;
|
||||
if (!use_this_block && mkv_d->subtitle_preroll)
|
||||
use_this_block = 1;
|
||||
if (use_this_block) {
|
||||
if (mkv_d->subtitle_preroll) {
|
||||
mkv_d->subtitle_preroll--;
|
||||
} else {
|
||||
// This could overflow the demuxer queue.
|
||||
if (mkv_d->a_skip_to_keyframe || mkv_d->v_skip_to_keyframe)
|
||||
use_this_block = 0;
|
||||
}
|
||||
}
|
||||
if (use_this_block) {
|
||||
if (laces > 1) {
|
||||
mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Subtitles use Matroska "
|
||||
@@ -2313,7 +2327,7 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info)
|
||||
if (stream->type == STREAM_VIDEO) {
|
||||
mkv_d->v_skip_to_keyframe = 0;
|
||||
mkv_d->skip_to_timecode = 0;
|
||||
mkv_d->subtitle_preroll = false;
|
||||
mkv_d->subtitle_preroll = 0;
|
||||
} else if (stream->type == STREAM_AUDIO)
|
||||
mkv_d->a_skip_to_keyframe = 0;
|
||||
|
||||
@@ -2557,7 +2571,7 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
|
||||
|
||||
if (index) { /* We've found an entry. */
|
||||
uint64_t seek_pos = index->filepos;
|
||||
if (mkv_d->subtitle_preroll) {
|
||||
if (flags & SEEK_SUBPREROLL) {
|
||||
uint64_t prev_target = 0;
|
||||
for (int i = 0; i < mkv_d->num_indexes; i++) {
|
||||
if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
|
||||
@@ -2594,7 +2608,9 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
|
||||
a_tnum = track->tnum;
|
||||
}
|
||||
}
|
||||
mkv_d->subtitle_preroll = (flags & SEEK_SUBPREROLL) && st_active[STREAM_SUB];
|
||||
mkv_d->subtitle_preroll = NUM_SUB_PREROLL_PACKETS;
|
||||
if (!st_active[STREAM_SUB] || !st_active[STREAM_VIDEO])
|
||||
flags &= ~SEEK_SUBPREROLL;
|
||||
if (!(flags & (SEEK_BACKWARD | SEEK_FORWARD))) {
|
||||
if (flags & SEEK_ABSOLUTE || rel_seek_secs < 0)
|
||||
flags |= SEEK_BACKWARD;
|
||||
@@ -2623,14 +2639,13 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
|
||||
if (!index)
|
||||
stream_seek(demuxer->stream, old_pos);
|
||||
|
||||
if (st_active[STREAM_VIDEO])
|
||||
mkv_d->v_skip_to_keyframe = 1;
|
||||
mkv_d->v_skip_to_keyframe = st_active[STREAM_VIDEO];
|
||||
mkv_d->a_skip_to_keyframe = st_active[STREAM_AUDIO];
|
||||
if (flags & SEEK_FORWARD)
|
||||
mkv_d->skip_to_timecode = target_timecode;
|
||||
else
|
||||
mkv_d->skip_to_timecode = index ? index->timecode * mkv_d->tc_scale
|
||||
: 0;
|
||||
mkv_d->a_skip_to_keyframe = 1;
|
||||
|
||||
demux_mkv_fill_buffer(demuxer);
|
||||
} else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
|
||||
@@ -2666,10 +2681,9 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
|
||||
mkv_d->cluster_end = 0;
|
||||
stream_seek(s, index->filepos);
|
||||
|
||||
if (st_active[STREAM_VIDEO])
|
||||
mkv_d->v_skip_to_keyframe = 1;
|
||||
mkv_d->v_skip_to_keyframe = st_active[STREAM_VIDEO];
|
||||
mkv_d->a_skip_to_keyframe = st_active[STREAM_AUDIO];
|
||||
mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale;
|
||||
mkv_d->a_skip_to_keyframe = 1;
|
||||
|
||||
demux_mkv_fill_buffer(demuxer);
|
||||
}
|
||||
|
||||
+4
-1
@@ -35,6 +35,7 @@
|
||||
|
||||
struct priv {
|
||||
int frame_size;
|
||||
int read_frames;
|
||||
double frame_rate;
|
||||
};
|
||||
|
||||
@@ -107,6 +108,7 @@ static int demux_rawaudio_open(demuxer_t *demuxer, enum demux_check check)
|
||||
*p = (struct priv) {
|
||||
.frame_size = samplesize * sh_audio->channels.num,
|
||||
.frame_rate = samplerate,
|
||||
.read_frames = samplerate,
|
||||
};
|
||||
|
||||
return 0;
|
||||
@@ -191,6 +193,7 @@ static int demux_rawvideo_open(demuxer_t *demuxer, enum demux_check check)
|
||||
*p = (struct priv) {
|
||||
.frame_size = imgsize,
|
||||
.frame_rate = fps,
|
||||
.read_frames = 1,
|
||||
};
|
||||
|
||||
return 0;
|
||||
@@ -203,7 +206,7 @@ static int raw_fill_buffer(demuxer_t *demuxer)
|
||||
if (demuxer->stream->eof)
|
||||
return 0;
|
||||
|
||||
struct demux_packet *dp = new_demux_packet(p->frame_size);
|
||||
struct demux_packet *dp = new_demux_packet(p->frame_size * p->read_frames);
|
||||
dp->pos = stream_tell(demuxer->stream) - demuxer->movi_start;
|
||||
dp->pts = (dp->pos / p->frame_size) / p->frame_rate;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1269,6 +1269,8 @@ static struct cmd_bind *find_any_bind_for_key(struct input_ctx *ictx,
|
||||
struct active_section *s = &ictx->active_sections[i];
|
||||
struct cmd_bind *bind = find_bind_for_key_section(ictx, s->name, n, keys);
|
||||
if (bind) {
|
||||
if (bind->is_builtin && !ictx->default_bindings)
|
||||
goto skip;
|
||||
struct cmd_bind_section *bs = bind->owner;
|
||||
for (int x = 0; x < n; x++) {
|
||||
if (MP_KEY_DEPENDS_ON_MOUSE_POS(keys[x]) && bs->mouse_area_set &&
|
||||
|
||||
@@ -651,6 +651,7 @@ const m_option_type_t m_option_type_double = {
|
||||
.pretty_print = print_double_f3,
|
||||
.copy = copy_opt,
|
||||
.clamp = clamp_double,
|
||||
.add = add_double,
|
||||
};
|
||||
|
||||
#undef VAL
|
||||
|
||||
+34
-29
@@ -628,9 +628,11 @@ static void mk_config_dir(char *subdir)
|
||||
{
|
||||
void *tmp = talloc_new(NULL);
|
||||
char *confdir = talloc_steal(tmp, mp_find_user_config_file(""));
|
||||
if (subdir)
|
||||
confdir = mp_path_join(tmp, bstr0(confdir), bstr0(subdir));
|
||||
mkdir(confdir, 0777);
|
||||
if (confdir) {
|
||||
if (subdir)
|
||||
confdir = mp_path_join(tmp, bstr0(confdir), bstr0(subdir));
|
||||
mkdir(confdir, 0777);
|
||||
}
|
||||
talloc_free(tmp);
|
||||
}
|
||||
|
||||
@@ -739,12 +741,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 +769,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);
|
||||
}
|
||||
@@ -867,6 +869,8 @@ void mp_write_watch_later_conf(struct MPContext *mpctx)
|
||||
if (!conffile)
|
||||
goto exit;
|
||||
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "Saving state.\n");
|
||||
|
||||
FILE *file = fopen(conffile, "wb");
|
||||
if (!file)
|
||||
goto exit;
|
||||
@@ -888,8 +892,10 @@ exit:
|
||||
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);
|
||||
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);
|
||||
unlink(fname);
|
||||
}
|
||||
talloc_free(fname);
|
||||
@@ -1787,7 +1793,7 @@ static void reset_subtitles(struct MPContext *mpctx)
|
||||
osd_changed(mpctx->osd, OSDTYPE_SUB);
|
||||
}
|
||||
|
||||
static void update_subtitles(struct MPContext *mpctx, double refpts_tl)
|
||||
static void update_subtitles(struct MPContext *mpctx)
|
||||
{
|
||||
struct MPOpts *opts = mpctx->opts;
|
||||
if (!(mpctx->initialized_flags & INITIALIZED_SUB))
|
||||
@@ -1806,7 +1812,7 @@ static void update_subtitles(struct MPContext *mpctx, double refpts_tl)
|
||||
|
||||
mpctx->osd->video_offset = track->under_timeline ? mpctx->video_offset : 0;
|
||||
|
||||
double refpts_s = refpts_tl - mpctx->osd->video_offset;
|
||||
double refpts_s = mpctx->playback_pts - mpctx->osd->video_offset;
|
||||
double curpts_s = refpts_s + opts->sub_delay;
|
||||
|
||||
if (!track->preloaded) {
|
||||
@@ -2788,8 +2794,6 @@ static bool redraw_osd(struct MPContext *mpctx)
|
||||
if (vo_redraw_frame(vo) < 0)
|
||||
return false;
|
||||
|
||||
if (mpctx->sh_video)
|
||||
update_subtitles(mpctx, mpctx->sh_video->pts);
|
||||
draw_osd(mpctx);
|
||||
|
||||
vo_flip_page(vo, 0, -1);
|
||||
@@ -3509,7 +3513,7 @@ static void run_playloop(struct MPContext *mpctx)
|
||||
mpctx->video_pts = sh_video->pts;
|
||||
mpctx->last_vo_pts = mpctx->video_pts;
|
||||
mpctx->playback_pts = mpctx->video_pts;
|
||||
update_subtitles(mpctx, sh_video->pts);
|
||||
update_subtitles(mpctx);
|
||||
update_osd_msg(mpctx);
|
||||
draw_osd(mpctx);
|
||||
|
||||
@@ -3596,11 +3600,10 @@ static void run_playloop(struct MPContext *mpctx)
|
||||
}
|
||||
mpctx->playback_pts = a_pos;
|
||||
print_status(mpctx);
|
||||
|
||||
if (!mpctx->sh_video)
|
||||
update_subtitles(mpctx, a_pos);
|
||||
}
|
||||
|
||||
update_subtitles(mpctx);
|
||||
|
||||
/* 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.
|
||||
@@ -4149,6 +4152,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);
|
||||
@@ -4166,17 +4182,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},
|
||||
|
||||
+26
-7
@@ -40,12 +40,13 @@
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
#include <windows.h>
|
||||
#include <shlobj.h>
|
||||
#elif defined(__CYGWIN__)
|
||||
#include <windows.h>
|
||||
#include <sys/cygwin.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACOSX_BUNDLE
|
||||
#ifdef CONFIG_COCOA
|
||||
#include "osdep/macosx_bundle.h"
|
||||
#endif
|
||||
|
||||
@@ -53,7 +54,7 @@
|
||||
typedef char *(*lookup_fun)(const char *);
|
||||
static const lookup_fun config_lookup_functions[] = {
|
||||
mp_find_user_config_file,
|
||||
#ifdef CONFIG_MACOSX_BUNDLE
|
||||
#ifdef CONFIG_COCOA
|
||||
get_bundled_path,
|
||||
#endif
|
||||
mp_find_global_config_file,
|
||||
@@ -77,10 +78,24 @@ char *mp_find_config_file(const char *filename)
|
||||
char *mp_find_user_config_file(const char *filename)
|
||||
{
|
||||
char *homedir = NULL, *buff = NULL;
|
||||
char *homepath = NULL;
|
||||
#ifdef __MINGW32__
|
||||
static char *config_dir = "mpv";
|
||||
char *config_dir = "mpv";
|
||||
char buf[MAX_PATH];
|
||||
|
||||
if (homepath == NULL) {
|
||||
if (SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE, NULL,
|
||||
SHGFP_TYPE_CURRENT, buf) == S_OK) {
|
||||
|
||||
homepath = buf;
|
||||
}
|
||||
}
|
||||
#else
|
||||
static char *config_dir = ".mpv";
|
||||
char *config_dir = ".mpv";
|
||||
|
||||
if (homepath == NULL) {
|
||||
homepath = getenv("HOME");
|
||||
}
|
||||
#endif
|
||||
#if defined(__MINGW32__) || defined(__CYGWIN__)
|
||||
char *temp = NULL;
|
||||
@@ -88,15 +103,19 @@ char *mp_find_user_config_file(const char *filename)
|
||||
/* Hack to get fonts etc. loaded outside of Cygwin environment. */
|
||||
int i, imax = 0;
|
||||
int len = (int)GetModuleFileNameA(NULL, exedir, 260);
|
||||
for (i = 0; i < len; i++)
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (exedir[i] == '\\') {
|
||||
exedir[i] = '/';
|
||||
imax = i;
|
||||
}
|
||||
}
|
||||
|
||||
exedir[imax] = '\0';
|
||||
|
||||
if (filename)
|
||||
if (filename) {
|
||||
temp = mp_path_join(NULL, bstr0(exedir), bstr0(filename));
|
||||
}
|
||||
|
||||
if (temp && mp_path_exists(temp) && !mp_path_isdir(temp)) {
|
||||
homedir = exedir;
|
||||
@@ -106,7 +125,7 @@ char *mp_find_user_config_file(const char *filename)
|
||||
#endif
|
||||
if ((homedir = getenv("MPV_HOME")) != NULL) {
|
||||
config_dir = "";
|
||||
} else if ((homedir = getenv("HOME")) == NULL) {
|
||||
} else if ((homedir = homepath) == NULL) {
|
||||
#if defined(__MINGW32__) || defined(__CYGWIN__)
|
||||
homedir = exedir;
|
||||
#else
|
||||
|
||||
@@ -432,11 +432,20 @@ static bool psn_matches_current_process(char *psn_arg_to_check)
|
||||
return [real_psn isEqualToString:in_psn];
|
||||
}
|
||||
|
||||
static bool bundle_started_from_finder(int argc, char **argv)
|
||||
{
|
||||
bool bundle_detected = [[NSBundle mainBundle] bundleIdentifier];
|
||||
bool pre_mavericks_args = argc==2 && psn_matches_current_process(argv[1]);
|
||||
bool post_mavericks_args = argc==1;
|
||||
|
||||
return bundle_detected && (pre_mavericks_args || post_mavericks_args);
|
||||
}
|
||||
|
||||
void macosx_finder_args_preinit(int *argc, char ***argv)
|
||||
{
|
||||
Application *app = mpv_shared_app();
|
||||
|
||||
if (*argc==2 && psn_matches_current_process((*argv)[1])) {
|
||||
if (bundle_started_from_finder(*argc, *argv)) {
|
||||
macosx_redirect_output_to_logfile("mpv");
|
||||
macosx_wait_fileopen_events();
|
||||
|
||||
|
||||
@@ -736,6 +736,7 @@ static int stream_enable_cache(stream_t **stream, int64_t size, int64_t min,
|
||||
|
||||
cache->url = talloc_strdup(cache, orig->url);
|
||||
cache->mime_type = talloc_strdup(cache, orig->mime_type);
|
||||
cache->demuxer = talloc_strdup(cache, orig->demuxer);
|
||||
cache->lavf_type = talloc_strdup(cache, orig->lavf_type);
|
||||
cache->opts = orig->opts;
|
||||
cache->start_pos = orig->start_pos;
|
||||
|
||||
@@ -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
|
||||
|
||||
+2
-2
@@ -496,7 +496,7 @@ static int get_chapter_time(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int titl
|
||||
last_cell = pgc->program_map[ptt[i].pgn];
|
||||
else
|
||||
last_cell = 0;
|
||||
do {
|
||||
while (cell < last_cell) {
|
||||
if(!(pgc->cell_playback[cell-1].block_type == BLOCK_TYPE_ANGLE_BLOCK &&
|
||||
pgc->cell_playback[cell-1].block_mode != BLOCK_MODE_FIRST_CELL)
|
||||
) {
|
||||
@@ -508,7 +508,7 @@ static int get_chapter_time(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int titl
|
||||
cur++;
|
||||
}
|
||||
cell++;
|
||||
} while(cell < last_cell);
|
||||
}
|
||||
}
|
||||
return 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 */
|
||||
|
||||
|
||||
+6
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,6 +410,7 @@ static void uninit_avctx(sh_video_t *sh)
|
||||
#if !HAVE_AVUTIL_REFCOUNTING
|
||||
mp_buffer_pool_free(&ctx->dr1_buffer_pool);
|
||||
#endif
|
||||
ctx->last_sample_aspect_ratio = (AVRational){0, 0};
|
||||
}
|
||||
|
||||
static void uninit(sh_video_t *sh)
|
||||
|
||||
+9
-23
@@ -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
@@ -250,7 +250,7 @@ static struct vf_instance *vf_open(struct MPOpts *opts, vf_instance_t *next,
|
||||
goto error;
|
||||
vf->priv = priv;
|
||||
int retcode = vf->info->vf_open(vf, (char *)args);
|
||||
if (retcode < 0)
|
||||
if (retcode < 1)
|
||||
goto error;
|
||||
return vf;
|
||||
|
||||
|
||||
+14
-4
@@ -72,6 +72,8 @@ typedef struct vf_priv_s {
|
||||
unsigned buf_w[3];
|
||||
unsigned buf_h[3];
|
||||
unsigned char *buf[3];
|
||||
|
||||
int gamma_i, contrast_i, brightness_i, saturation_i;
|
||||
} vf_eq2_t;
|
||||
|
||||
|
||||
@@ -381,18 +383,22 @@ int control (vf_instance_t *vf, int request, void *data)
|
||||
|
||||
if (strcmp (eq->item, "gamma") == 0) {
|
||||
set_gamma (vf->priv, exp (log (8.0) * eq->value / 100.0));
|
||||
vf->priv->gamma_i = eq->value;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
else if (strcmp (eq->item, "contrast") == 0) {
|
||||
set_contrast (vf->priv, (1.0 / 100.0) * (eq->value + 100));
|
||||
vf->priv->contrast_i = eq->value;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
else if (strcmp (eq->item, "brightness") == 0) {
|
||||
set_brightness (vf->priv, (1.0 / 100.0) * eq->value);
|
||||
vf->priv->brightness_i = eq->value;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
else if (strcmp (eq->item, "saturation") == 0) {
|
||||
set_saturation (vf->priv, (double) (eq->value + 100) / 100.0);
|
||||
vf->priv->saturation_i = eq->value;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
break;
|
||||
@@ -400,19 +406,19 @@ int control (vf_instance_t *vf, int request, void *data)
|
||||
case VFCTRL_GET_EQUALIZER:
|
||||
eq = (vf_equalizer_t *) data;
|
||||
if (strcmp (eq->item, "gamma") == 0) {
|
||||
eq->value = (int) (100.0 * log (vf->priv->gamma) / log (8.0));
|
||||
eq->value = vf->priv->gamma_i;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
else if (strcmp (eq->item, "contrast") == 0) {
|
||||
eq->value = (int) (100.0 * vf->priv->contrast) - 100;
|
||||
eq->value = vf->priv->contrast_i;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
else if (strcmp (eq->item, "brightness") == 0) {
|
||||
eq->value = (int) (100.0 * vf->priv->brightness);
|
||||
eq->value = vf->priv->brightness_i;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
else if (strcmp (eq->item, "saturation") == 0) {
|
||||
eq->value = (int) (100.0 * vf->priv->saturation) - 100;
|
||||
eq->value = vf->priv->saturation_i;
|
||||
return CONTROL_TRUE;
|
||||
}
|
||||
break;
|
||||
@@ -503,9 +509,13 @@ int vf_open(vf_instance_t *vf, char *args)
|
||||
eq2->gamma_weight = par[7];
|
||||
|
||||
set_gamma (eq2, par[0]);
|
||||
eq2->gamma_i = (int) (100.0 * log (vf->priv->gamma) / log (8.0));
|
||||
set_contrast (eq2, par[1]);
|
||||
eq2->contrast_i = (int) (100.0 * vf->priv->contrast) - 100;
|
||||
set_brightness (eq2, par[2]);
|
||||
eq2->brightness_i = (int) (100.0 * vf->priv->brightness);
|
||||
set_saturation (eq2, par[3]);
|
||||
eq2->saturation_i = (int) (100.0 * vf->priv->saturation) - 100;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
+12
-13
@@ -523,7 +523,7 @@ int vo_cocoa_check_events(struct vo *vo)
|
||||
|
||||
void vo_cocoa_fullscreen(struct vo *vo)
|
||||
{
|
||||
if (![NSThread isMainThread]) {
|
||||
if (![NSThread isMainThread] && resize_callback_registered(vo)) {
|
||||
// This is the secondary thread, unlock since we are going to invoke a
|
||||
// method synchronously on the GUI thread using Cocoa.
|
||||
vo_cocoa_set_current_context(vo, false);
|
||||
@@ -535,7 +535,7 @@ void vo_cocoa_fullscreen(struct vo *vo)
|
||||
waitUntilDone:YES];
|
||||
|
||||
|
||||
if (![NSThread isMainThread]) {
|
||||
if (![NSThread isMainThread] && resize_callback_registered(vo)) {
|
||||
// Now lock again!
|
||||
vo_cocoa_set_current_context(vo, true);
|
||||
}
|
||||
@@ -657,7 +657,11 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
|
||||
NSApplicationPresentationDefault;
|
||||
|
||||
if ([s->fs_screen hasMenubar])
|
||||
popts |= NSApplicationPresentationAutoHideMenuBar;
|
||||
// Cocoa raises an exception when autohiding the menubar but
|
||||
// not the dock. They probably got bored while programming the
|
||||
// multi screen support and took some shortcuts (tested on 10.8).
|
||||
popts |= NSApplicationPresentationAutoHideMenuBar |
|
||||
NSApplicationPresentationAutoHideDock;
|
||||
|
||||
if ([s->fs_screen hasDock])
|
||||
popts |= NSApplicationPresentationAutoHideDock;
|
||||
@@ -762,20 +766,15 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
|
||||
CGFloat dx = (f.size.width - ns.width) / 2;
|
||||
CGFloat dy = (f.size.height - ns.height - [self titleHeight]) / 2;
|
||||
NSRect nf = NSRectFromCGRect(CGRectInset(NSRectToCGRect(f), dx, dy));
|
||||
|
||||
struct vo *vo = self.videoOutput;
|
||||
if (!(vo && !vo->opts->border)) {
|
||||
NSRect s = [[self screen] visibleFrame];
|
||||
if (nf.origin.y + nf.size.height > s.origin.y + s.size.height)
|
||||
nf.origin.y = s.size.height - nf.size.height;
|
||||
}
|
||||
|
||||
[self setFrame:nf display:NO animate:NO];
|
||||
}
|
||||
|
||||
- (NSRect)constrainFrameRect:(NSRect)rect toScreen:(NSScreen *)screen
|
||||
- (NSRect)constrainFrameRect:(NSRect)nf toScreen:(NSScreen *)screen
|
||||
{
|
||||
return rect;
|
||||
NSRect s = [[self screen] visibleFrame];
|
||||
if (nf.origin.y + nf.size.height > s.origin.y + s.size.height)
|
||||
nf.origin.y = s.origin.y + s.size.height - nf.size.height;
|
||||
return nf;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
+10
-4
@@ -433,7 +433,6 @@ static bool fbotex_init(struct gl_video *p, struct fbotex *fbo, int w, int h,
|
||||
GL *gl = p->gl;
|
||||
bool res = true;
|
||||
|
||||
assert(gl->mpgl_caps & MPGL_CAP_FB);
|
||||
assert(!fbo->fbo);
|
||||
assert(!fbo->texture);
|
||||
|
||||
@@ -446,6 +445,9 @@ static bool fbotex_init(struct gl_video *p, struct fbotex *fbo, int w, int h,
|
||||
|
||||
MP_VERBOSE(p, "Create FBO: %dx%d\n", fbo->tex_w, fbo->tex_h);
|
||||
|
||||
if (!(gl->mpgl_caps & MPGL_CAP_FB))
|
||||
return false;
|
||||
|
||||
gl->GenFramebuffers(1, &fbo->fbo);
|
||||
gl->GenTextures(1, &fbo->texture);
|
||||
gl->BindTexture(GL_TEXTURE_2D, fbo->texture);
|
||||
@@ -1499,6 +1501,10 @@ static bool get_image(struct gl_video *p, struct mp_image *mpi)
|
||||
|
||||
struct video_image *vimg = &p->image;
|
||||
|
||||
// See comments in init_video() about odd video sizes.
|
||||
// The normal upload path does this too, but less explicit.
|
||||
mp_image_set_size(mpi, vimg->planes[0].w, vimg->planes[0].h);
|
||||
|
||||
for (int n = 0; n < p->plane_count; n++) {
|
||||
struct texplane *plane = &vimg->planes[n];
|
||||
mpi->stride[n] = mpi->plane_w[n] * p->image_desc.bytes[n];
|
||||
@@ -1709,10 +1715,10 @@ static void check_gl_features(struct gl_video *p)
|
||||
}
|
||||
|
||||
// fruit dithering mode and the 3D lut use this texture format
|
||||
if ((p->opts.dither_depth >= 0 && p->opts.dither_algo == 0) ||
|
||||
p->use_lut_3d)
|
||||
if (have_fbo && ((p->opts.dither_depth >= 0 && p->opts.dither_algo == 0) ||
|
||||
p->use_lut_3d))
|
||||
{
|
||||
// doesn't disalbe anything; it's just for the log
|
||||
// doesn't disable anything; it's just for the log
|
||||
MP_VERBOSE(p, "Testing GL_R16 FBO (dithering/LUT)\n");
|
||||
test_fbo(p, GL_R16);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -569,8 +569,11 @@ static bool create_display (struct vo_wayland_state *wl)
|
||||
{
|
||||
wl->display.display = wl_display_connect(NULL);
|
||||
|
||||
if (!wl->display.display)
|
||||
if (!wl->display.display) {
|
||||
MP_ERR(wl->vo, "failed to connect to a wayland server: "
|
||||
"check if a wayland compositor is running\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
wl_list_init(&wl->display.output_list);
|
||||
wl->display.registry = wl_display_get_registry(wl->display.display);
|
||||
@@ -644,7 +647,7 @@ static bool create_input (struct vo_wayland_state *wl)
|
||||
wl->input.xkb.context = xkb_context_new(0);
|
||||
|
||||
if (!wl->input.xkb.context) {
|
||||
MP_ERR(wl, "failed to initialize input\n");
|
||||
MP_ERR(wl->vo, "failed to initialize input: check xkbcommon\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -680,7 +683,6 @@ int vo_wayland_init (struct vo *vo)
|
||||
|| !create_window(wl)
|
||||
|| !create_cursor(wl))
|
||||
{
|
||||
MP_ERR(wl, "failed to initialize backend\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -766,8 +768,12 @@ static int vo_wayland_check_events (struct vo *vo)
|
||||
* when pausing no input events get queued so we have to check if there
|
||||
* are events to read from the file descriptor through poll */
|
||||
if (poll(&fd, 1, 0) > 0) {
|
||||
if (fd.revents & POLLERR || fd.revents & POLLHUP)
|
||||
MP_ERR(wl, "error occurred on the display fd\n");
|
||||
if (fd.revents & POLLERR || fd.revents & POLLHUP) {
|
||||
MP_FATAL(wl, "error occurred on the display fd: "
|
||||
"closing file descriptor\n");
|
||||
close(wl->display.display_fd);
|
||||
mp_input_put_key(vo->input_ctx, MP_KEY_CLOSE_WIN);
|
||||
}
|
||||
if (fd.revents & POLLIN)
|
||||
wl_display_dispatch(dp);
|
||||
if (fd.revents & POLLOUT)
|
||||
|
||||
+14
-8
@@ -455,6 +455,7 @@ int vo_x11_init(struct vo *vo)
|
||||
if (!x11->display) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR,
|
||||
"vo: couldn't open the X11 display (%s)!\n", dispName);
|
||||
|
||||
talloc_free(x11);
|
||||
vo->x11 = NULL;
|
||||
return 0;
|
||||
@@ -469,6 +470,9 @@ int vo_x11_init(struct vo *vo)
|
||||
}
|
||||
|
||||
x11->xim = XOpenIM(x11->display, NULL, NULL, NULL);
|
||||
if (!x11->xim)
|
||||
mp_msg(MSGT_VO, MSGL_WARN,
|
||||
"x11: XOpenIM() failed. Unicode input will not work.\n");
|
||||
|
||||
init_atoms(vo->x11);
|
||||
|
||||
@@ -982,11 +986,13 @@ static void vo_x11_create_window(struct vo *vo, XVisualInfo *vis, int x, int y,
|
||||
x11->mouse_cursor_hidden = false;
|
||||
vo_set_cursor_hidden(vo, true);
|
||||
}
|
||||
x11->xic = XCreateIC(x11->xim,
|
||||
XNInputStyle, XIMPreeditNone | XIMStatusNone,
|
||||
XNClientWindow, x11->window,
|
||||
XNFocusWindow, x11->window,
|
||||
NULL);
|
||||
if (x11->xim) {
|
||||
x11->xic = XCreateIC(x11->xim,
|
||||
XNInputStyle, XIMPreeditNone | XIMStatusNone,
|
||||
XNClientWindow, x11->window,
|
||||
XNFocusWindow, x11->window,
|
||||
NULL);
|
||||
}
|
||||
|
||||
vo_x11_update_window_title(vo);
|
||||
}
|
||||
@@ -1040,9 +1046,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;
|
||||
@@ -1075,6 +1078,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);
|
||||
|
||||
Reference in new issue
Block a user