mirror of
https://github.com/mpv-player/mpv.git
synced 2024-09-20 12:02:23 +02:00
Merge branch 'master' into osd_changes
Conflicts: libvo/vo_xv.c
This commit is contained in:
commit
0e81d62c53
1
.gitignore
vendored
1
.gitignore
vendored
@ -8,6 +8,7 @@
|
||||
/config.mak
|
||||
/config.log
|
||||
/mpv
|
||||
/mpv.app
|
||||
/version.h
|
||||
/codecs.conf.h
|
||||
/input/input_conf.h
|
||||
|
9
Makefile
9
Makefile
@ -278,7 +278,7 @@ COMMON_LIBS += $(COMMON_LIBS-yes)
|
||||
|
||||
OBJS_COMMON += $(addsuffix .o, $(basename $(SRCS_COMMON)))
|
||||
OBJS_MPLAYER += $(addsuffix .o, $(basename $(SRCS_MPLAYER)))
|
||||
OBJS_MPLAYER-$(PE_EXECUTABLE) += osdep/mplayer-rc.o
|
||||
OBJS_MPLAYER-$(PE_EXECUTABLE) += osdep/mpv-rc.o
|
||||
OBJS_MPLAYER += $(OBJS_MPLAYER-yes)
|
||||
|
||||
MPLAYER_DEPS = $(OBJS_MPLAYER) $(OBJS_COMMON) $(COMMON_LIBS)
|
||||
@ -406,9 +406,9 @@ checkheaders: $(ALLHEADERS:.h=.ho)
|
||||
|
||||
###### dependency declarations / specific CFLAGS ######
|
||||
|
||||
version.c osdep/mplayer-rc.o: version.h
|
||||
version.c osdep/mpv-rc.o: version.h
|
||||
|
||||
osdep/mplayer-rc.o: osdep/mplayer.exe.manifest
|
||||
osdep/mpv-rc.o: osdep/mpv.exe.manifest
|
||||
|
||||
|
||||
###### installation / clean / generic rules #######
|
||||
@ -481,6 +481,9 @@ TAGS:
|
||||
tags:
|
||||
$(RM) $@; find . -name '*.[chS]' -o -name '*.asm' | xargs ctags -a
|
||||
|
||||
osxbundle:
|
||||
@TOOLS/osxbundle.py mpv
|
||||
|
||||
-include $(DEP_FILES)
|
||||
|
||||
.PHONY: all locales *install*
|
||||
|
89
TOOLS/osxbundle.py
Executable file
89
TOOLS/osxbundle.py
Executable file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
def sh(command):
|
||||
return os.popen(command).read()
|
||||
|
||||
def dylib_lst(input_file):
|
||||
return sh("otool -L %s | grep -e '\t' | awk '{ print $1 }'" % input_file)
|
||||
|
||||
sys_re = re.compile("/System")
|
||||
exe_re = re.compile("@executable_path")
|
||||
binary_name = sys.argv[1]
|
||||
|
||||
def is_user_lib(libname, input_file):
|
||||
return not sys_re.match(libname) and \
|
||||
not exe_re.match(libname) and \
|
||||
not "libobjc" in libname and \
|
||||
not "libSystem" in libname and \
|
||||
not "libgcc" in libname and \
|
||||
not os.path.basename(input_file) in libname and \
|
||||
not libname == ''
|
||||
|
||||
def user_dylib_lst(input_file):
|
||||
return [lib for lib in dylib_lst(input_file).split("\n") if
|
||||
is_user_lib(lib, input_file)]
|
||||
|
||||
def bundle_name():
|
||||
return "%s.app" % binary_name
|
||||
|
||||
def target_plist():
|
||||
return os.path.join(bundle_name(), 'Contents', 'Info.plist')
|
||||
|
||||
def target_directory():
|
||||
return os.path.join(bundle_name(), 'Contents', 'MacOS')
|
||||
|
||||
def target_binary():
|
||||
return os.path.join(target_directory(), binary_name)
|
||||
|
||||
def copy_bundle():
|
||||
if os.path.isdir(bundle_name()):
|
||||
shutil.rmtree(bundle_name())
|
||||
shutil.copytree(
|
||||
os.path.join('TOOLS', 'osxbundle', bundle_name()),
|
||||
bundle_name())
|
||||
|
||||
def copy_binary():
|
||||
shutil.copy(binary_name, target_binary())
|
||||
|
||||
def run_install_name_tool(target_file, dylib_path, destination_directory):
|
||||
new_dylib_path = os.path.join("@executable_path", "lib",
|
||||
os.path.basename(dylib_path))
|
||||
|
||||
sh("install_name_tool -change %s %s %s" % \
|
||||
(dylib_path, new_dylib_path, target_file))
|
||||
sh("install_name_tool -id %s %s" % \
|
||||
(new_dylib_path, os.path.join(destination_directory,
|
||||
os.path.basename(dylib_path))))
|
||||
|
||||
def cp_dylibs(target_file, destination_directory):
|
||||
for dylib_path in user_dylib_lst(target_file):
|
||||
dylib_destination_path = os.path.join(destination_directory,
|
||||
os.path.basename(dylib_path))
|
||||
shutil.copy(dylib_path, dylib_destination_path)
|
||||
os.chmod(dylib_destination_path, 0o755)
|
||||
cp_dylibs(dylib_destination_path, destination_directory)
|
||||
|
||||
def fix_dylibs_paths(target_file, destination_directory):
|
||||
for dylib_path in user_dylib_lst(target_file):
|
||||
dylib_destination_path = os.path.join(destination_directory,
|
||||
os.path.basename(dylib_path))
|
||||
run_install_name_tool(target_file, dylib_path, destination_directory)
|
||||
fix_dylibs_paths(dylib_destination_path, destination_directory)
|
||||
|
||||
def apply_plist_template(plist_file, version):
|
||||
sh("sed -i -e 's/{{VERSION}}/%s/g' %s" % (version, plist_file))
|
||||
|
||||
version = sh("TOOLS/osxbundle/version.sh").strip()
|
||||
|
||||
print("Creating Mac OS X application bundle (version: %s)..." % version)
|
||||
|
||||
copy_bundle()
|
||||
copy_binary()
|
||||
apply_plist_template(target_plist(), version)
|
||||
cp_dylibs(sys.argv[1], os.path.join(target_directory(), "lib"))
|
||||
fix_dylibs_paths(target_binary(), os.path.join(target_directory(), "lib"))
|
248
TOOLS/osxbundle/mpv.app/Contents/Info.plist
Normal file
248
TOOLS/osxbundle/mpv.app/Contents/Info.plist
Normal file
@ -0,0 +1,248 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>AAC</string>
|
||||
<string>AC3</string>
|
||||
<string>AIFF</string>
|
||||
<string>M4A</string>
|
||||
<string>MKA</string>
|
||||
<string>MP3</string>
|
||||
<string>OGG</string>
|
||||
<string>PCM</string>
|
||||
<string>VAW</string>
|
||||
<string>WAV</string>
|
||||
<string>WAW</string>
|
||||
<string>WMA</string>
|
||||
<string>aac</string>
|
||||
<string>ac3</string>
|
||||
<string>aiff</string>
|
||||
<string>m4a</string>
|
||||
<string>mka</string>
|
||||
<string>mp3</string>
|
||||
<string>ogg</string>
|
||||
<string>pcm</string>
|
||||
<string>vaw</string>
|
||||
<string>wav</string>
|
||||
<string>waw</string>
|
||||
<string>wma</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>audio.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Audio file</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSTypeIsPackage</key>
|
||||
<false/>
|
||||
<key>NSPersistentStoreTypeKey</key>
|
||||
<string>XML</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>*</string>
|
||||
<string>*</string>
|
||||
<string>3GP</string>
|
||||
<string>3IV</string>
|
||||
<string>3gp</string>
|
||||
<string>3iv</string>
|
||||
<string>ASF</string>
|
||||
<string>AVI</string>
|
||||
<string>CPK</string>
|
||||
<string>DAT</string>
|
||||
<string>DIVX</string>
|
||||
<string>DV</string>
|
||||
<string>FLAC</string>
|
||||
<string>FLI</string>
|
||||
<string>FLV</string>
|
||||
<string>H264</string>
|
||||
<string>I263</string>
|
||||
<string>M2TS</string>
|
||||
<string>M4V</string>
|
||||
<string>MKV</string>
|
||||
<string>MOV</string>
|
||||
<string>MP2</string>
|
||||
<string>MP4</string>
|
||||
<string>MPEG</string>
|
||||
<string>MPG</string>
|
||||
<string>MPG2</string>
|
||||
<string>MPG4</string>
|
||||
<string>NSV</string>
|
||||
<string>NUT</string>
|
||||
<string>NUV</string>
|
||||
<string>OGG</string>
|
||||
<string>OGM</string>
|
||||
<string>QT</string>
|
||||
<string>RM</string>
|
||||
<string>RMVB</string>
|
||||
<string>VCD</string>
|
||||
<string>VFW</string>
|
||||
<string>VOB</string>
|
||||
<string>WMV</string>
|
||||
<string>asf</string>
|
||||
<string>avi</string>
|
||||
<string>cpk</string>
|
||||
<string>dat</string>
|
||||
<string>divx</string>
|
||||
<string>dv</string>
|
||||
<string>flac</string>
|
||||
<string>fli</string>
|
||||
<string>flv</string>
|
||||
<string>h264</string>
|
||||
<string>i263</string>
|
||||
<string>m2ts</string>
|
||||
<string>m4v</string>
|
||||
<string>mkv</string>
|
||||
<string>mov</string>
|
||||
<string>mp2</string>
|
||||
<string>mp4</string>
|
||||
<string>mpeg</string>
|
||||
<string>mpg</string>
|
||||
<string>mpg2</string>
|
||||
<string>mpg4</string>
|
||||
<string>nsv</string>
|
||||
<string>nut</string>
|
||||
<string>nuv</string>
|
||||
<string>ogg</string>
|
||||
<string>ogm</string>
|
||||
<string>qt</string>
|
||||
<string>rm</string>
|
||||
<string>rmvb</string>
|
||||
<string>vcd</string>
|
||||
<string>vfw</string>
|
||||
<string>vob</string>
|
||||
<string>wmv</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>movie.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Movie file</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSTypeIsPackage</key>
|
||||
<false/>
|
||||
<key>NSPersistentStoreTypeKey</key>
|
||||
<string>XML</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>AQT</string>
|
||||
<string>ASS</string>
|
||||
<string>JSS</string>
|
||||
<string>RT</string>
|
||||
<string>SMI</string>
|
||||
<string>SRT</string>
|
||||
<string>SSA</string>
|
||||
<string>SUB</string>
|
||||
<string>TXT</string>
|
||||
<string>UTF</string>
|
||||
<string>aqt</string>
|
||||
<string>ass</string>
|
||||
<string>jss</string>
|
||||
<string>rt</string>
|
||||
<string>smi</string>
|
||||
<string>srt</string>
|
||||
<string>ssa</string>
|
||||
<string>sub</string>
|
||||
<string>txt</string>
|
||||
<string>utf</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>subtitles.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Subtitles file</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSTypeIsPackage</key>
|
||||
<false/>
|
||||
<key>NSPersistentStoreTypeKey</key>
|
||||
<string>XML</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>mpv</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>icon</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.mpv-player.standalone</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>mpv</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>{{VERSION}}</string>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<true/>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>Real Time (Streaming) Protocol</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>rtp</string>
|
||||
<string>rtsp</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>File over HTTP/FTP/UDP</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>icyx</string>
|
||||
<string>udp</string>
|
||||
<string>ftp</string>
|
||||
<string>http_proxy</string>
|
||||
<string>http</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>Microsoft Media Services</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>mms</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>Cuesheet</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>cue</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>CD/DVD Media</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>dvdnav</string>
|
||||
<string>dvd</string>
|
||||
<string>vcd</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
0
TOOLS/osxbundle/mpv.app/Contents/MacOS/.gitkeep
Normal file
0
TOOLS/osxbundle/mpv.app/Contents/MacOS/.gitkeep
Normal file
0
TOOLS/osxbundle/mpv.app/Contents/MacOS/lib/.gitkeep
Normal file
0
TOOLS/osxbundle/mpv.app/Contents/MacOS/lib/.gitkeep
Normal file
1
TOOLS/osxbundle/mpv.app/Contents/PkgInfo
Normal file
1
TOOLS/osxbundle/mpv.app/Contents/PkgInfo
Normal file
@ -0,0 +1 @@
|
||||
APPL????
|
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/audio.icns
Normal file
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/audio.icns
Normal file
Binary file not shown.
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/icon.icns
Normal file
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/icon.icns
Normal file
Binary file not shown.
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/movie.icns
Normal file
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/movie.icns
Normal file
Binary file not shown.
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/subtitles.icns
Normal file
BIN
TOOLS/osxbundle/mpv.app/Contents/Resources/subtitles.icns
Normal file
Binary file not shown.
15
TOOLS/osxbundle/version.sh
Executable file
15
TOOLS/osxbundle/version.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Extract revision number from file used by daily tarball snapshots
|
||||
# or from "git describe" output
|
||||
git_revision=$(cat snapshot_version 2> /dev/null)
|
||||
test $git_revision || test ! -d .git || \
|
||||
git_revision=`git describe --match "v[0-9]*" --always`
|
||||
git_revision=$(expr "$git_revision" : v*'\(.*\)')
|
||||
test $git_revision || git_revision=UNKNOWN
|
||||
|
||||
# releases extract the version number from the VERSION file
|
||||
version=$(cat VERSION 2> /dev/null)
|
||||
test $version || version=$git_revision
|
||||
|
||||
echo $version
|
4
configure
vendored
4
configure
vendored
@ -1980,10 +1980,10 @@ int main(void) {
|
||||
}
|
||||
EOF
|
||||
_cocoa=no
|
||||
cc_check -framework Cocoa -framework OpenGL && _cocoa=yes
|
||||
cc_check -framework IOKit -framework Cocoa -framework OpenGL && _cocoa=yes
|
||||
fi
|
||||
if test "$_cocoa" = yes ; then
|
||||
libs_mplayer="$libs_mplayer -framework Cocoa -framework OpenGL"
|
||||
libs_mplayer="$libs_mplayer -framework IOKit -framework Cocoa -framework OpenGL"
|
||||
def_cocoa='#define CONFIG_COCOA 1'
|
||||
else
|
||||
def_cocoa='#undef CONFIG_COCOA'
|
||||
|
@ -732,6 +732,22 @@ videocodec ffh264crystalhd
|
||||
driver ffmpeg
|
||||
dll h264_crystalhd
|
||||
|
||||
videocodec ffh264vda
|
||||
info "FFmpeg H.264 (VDA)"
|
||||
status working
|
||||
fourcc H264,h264
|
||||
fourcc X264,x264
|
||||
fourcc avc1,AVC1
|
||||
fourcc davc,DAVC
|
||||
fourcc vvvc ; only one sample using this fourcc
|
||||
fourcc ai55,ai15 ; flip4mac avc intra
|
||||
fourcc ai1q,ai5q ; flip4mac avc intra
|
||||
fourcc ai12 ;AVC Intra 100 / 1080
|
||||
format 0x10000005
|
||||
driver ffmpeg
|
||||
dll h264_vda
|
||||
out YUY2,UYVY,YV12,NV12
|
||||
|
||||
videocodec ffsvq3
|
||||
info "FFmpeg Sorenson Video v3 (SVQ3)"
|
||||
status working
|
||||
|
556
etc/mpv-icon-source.svg
Normal file
556
etc/mpv-icon-source.svg
Normal file
@ -0,0 +1,556 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
id="svg2985"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="icon-mplayer3.svg"
|
||||
inkscape:export-filename="/Users/pigoz/Documents/mplayer-icons/compiled/icon-mplayer2.png"
|
||||
inkscape:export-xdpi="85.699997"
|
||||
inkscape:export-ydpi="85.699997"
|
||||
enable-background="new">
|
||||
<defs
|
||||
id="defs2987">
|
||||
<linearGradient
|
||||
id="linearGradient5632">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5634" />
|
||||
<stop
|
||||
style="stop-color:#646464;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5636" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3979">
|
||||
<stop
|
||||
style="stop-color:#d2d2d2;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3981" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3983" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3877">
|
||||
<stop
|
||||
style="stop-color:#3cc8ff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3879" />
|
||||
<stop
|
||||
id="stop3885"
|
||||
offset="1"
|
||||
style="stop-color:#14b4ff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3857"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#03062a;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3859" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3943">
|
||||
<stop
|
||||
id="stop3772"
|
||||
offset="0"
|
||||
style="stop-color:#44c8fd;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#284aef;stop-opacity:1;"
|
||||
offset="0.46829268"
|
||||
id="stop3788" />
|
||||
<stop
|
||||
style="stop-color:#06082a;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3947" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3877"
|
||||
id="radialGradient3929"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="256.71875"
|
||||
cy="256.15625"
|
||||
fx="256.71875"
|
||||
fy="256.15625"
|
||||
r="235"
|
||||
gradientTransform="translate(6.6751888,0)" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3877"
|
||||
id="radialGradient3932"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(6.6751888,0)"
|
||||
cx="256.71875"
|
||||
cy="256.15625"
|
||||
fx="256.71875"
|
||||
fy="256.15625"
|
||||
r="235" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3979"
|
||||
id="linearGradient3924"
|
||||
x1="256.12192"
|
||||
y1="491.25339"
|
||||
x2="256.12192"
|
||||
y2="11.186499"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3943"
|
||||
id="radialGradient3943"
|
||||
cx="227.08333"
|
||||
cy="218.25"
|
||||
fx="227.08333"
|
||||
fy="218.25"
|
||||
r="197.08333"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3877"
|
||||
id="radialGradient3964"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="258.69565"
|
||||
cy="381.56522"
|
||||
fx="258.69565"
|
||||
fy="381.56522"
|
||||
r="169.56522" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3979-0"
|
||||
id="linearGradient3985"
|
||||
x1="259.45453"
|
||||
y1="256.90909"
|
||||
x2="259.45453"
|
||||
y2="38.000004"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(0,2)" />
|
||||
<linearGradient
|
||||
id="linearGradient3979-0">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.01960784;"
|
||||
offset="0"
|
||||
id="stop3981-1" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.86274511;"
|
||||
offset="1"
|
||||
id="stop3983-0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="38.000004"
|
||||
x2="259.45453"
|
||||
y1="256.90909"
|
||||
x1="259.45453"
|
||||
gradientTransform="translate(0,2)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient4907"
|
||||
xlink:href="#linearGradient3979-0"
|
||||
inkscape:collect="always" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5485">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="6.7826086"
|
||||
id="feGaussianBlur5487" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5501">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="3.3913043"
|
||||
id="feGaussianBlur5503" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3943-7"
|
||||
id="radialGradient3943-9"
|
||||
cx="227.08333"
|
||||
cy="218.25"
|
||||
fx="227.08333"
|
||||
fy="218.25"
|
||||
r="197.08333"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient3943-7">
|
||||
<stop
|
||||
id="stop3772-1"
|
||||
offset="0"
|
||||
style="stop-color:#44c8fd;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#284aef;stop-opacity:1;"
|
||||
offset="0.46829268"
|
||||
id="stop3788-5" />
|
||||
<stop
|
||||
style="stop-color:#06082a;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3947-6" />
|
||||
</linearGradient>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath5607">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:#000000;fill-opacity:0.74509804;stroke:none"
|
||||
id="path5609"
|
||||
sodipodi:cx="227.08333"
|
||||
sodipodi:cy="218.25"
|
||||
sodipodi:rx="197.08333"
|
||||
sodipodi:ry="197.08333"
|
||||
d="M 424.16666,218.25 A 197.08333,197.08333 0 1 1 30,218.25 a 197.08333,197.08333 0 1 1 394.16666,0 z"
|
||||
transform="matrix(1.2962957,0,0,1.2962957,-37.866811,203.33677)"
|
||||
mask="none" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath5611">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:#000000;fill-opacity:0.74509804;stroke:none"
|
||||
id="path5613"
|
||||
sodipodi:cx="227.08333"
|
||||
sodipodi:cy="218.25"
|
||||
sodipodi:rx="197.08333"
|
||||
sodipodi:ry="197.08333"
|
||||
d="M 424.16666,218.25 A 197.08333,197.08333 0 1 1 30,218.25 a 197.08333,197.08333 0 1 1 394.16666,0 z"
|
||||
transform="matrix(0.91114848,0,0,0.91114848,50.372646,143.15146)"
|
||||
mask="none" />
|
||||
</clipPath>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5632"
|
||||
id="linearGradient5657"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="280.81955"
|
||||
y1="224.967"
|
||||
x2="280.81955"
|
||||
y2="438.65695"
|
||||
gradientTransform="translate(0,2)" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5667">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.32939063"
|
||||
id="feGaussianBlur5669" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5632-0"
|
||||
id="linearGradient5657-3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="280.81955"
|
||||
y1="224.967"
|
||||
x2="280.81955"
|
||||
y2="438.65695"
|
||||
gradientTransform="translate(0,2)" />
|
||||
<linearGradient
|
||||
id="linearGradient5632-0">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5634-4" />
|
||||
<stop
|
||||
style="stop-color:#646464;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5636-0" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5717">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="4.2775091"
|
||||
id="feGaussianBlur5719" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5729">
|
||||
<feBlend
|
||||
inkscape:collect="always"
|
||||
mode="darken"
|
||||
in2="BackgroundImage"
|
||||
id="feBlend5731" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5737">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="2.9374501"
|
||||
id="feGaussianBlur5739" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3877"
|
||||
id="radialGradient5741"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="258.69565"
|
||||
cy="381.56522"
|
||||
fx="258.69565"
|
||||
fy="381.56522"
|
||||
r="169.56522" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5784">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="10.173913"
|
||||
id="feGaussianBlur5786" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5792">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="8.4782608"
|
||||
id="feGaussianBlur5794" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3877"
|
||||
id="radialGradient5796"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="258.69565"
|
||||
cy="381.56522"
|
||||
fx="258.69565"
|
||||
fy="381.56522"
|
||||
r="169.56522" />
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5845"
|
||||
x="-0.16900845"
|
||||
width="1.3380169"
|
||||
y="-0.20256461"
|
||||
height="1.4051292">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="21.923266"
|
||||
id="feGaussianBlur5847" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.59"
|
||||
inkscape:cx="247.81648"
|
||||
inkscape:cy="251.19615"
|
||||
inkscape:current-layer="layer9"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1629"
|
||||
inkscape:window-height="1006"
|
||||
inkscape:window-x="47"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata2990">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="shadow"
|
||||
id="g4931"
|
||||
inkscape:groupmode="layer"
|
||||
style="filter:url(#filter5729)"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
transform="matrix(1.0008681,0,0,1.0008681,-0.32354214,1.8790597)"
|
||||
d="m 500.88873,255.89879 a 244.78751,244.78751 0 1 1 -489.575009,0 244.78751,244.78751 0 1 1 489.575009,0 z"
|
||||
sodipodi:ry="244.78751"
|
||||
sodipodi:rx="244.78751"
|
||||
sodipodi:cy="255.89879"
|
||||
sodipodi:cx="256.10123"
|
||||
id="path4933"
|
||||
style="fill:#000000;fill-opacity:0.74509804;stroke:none;filter:url(#filter5737)"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="chrome"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:url(#linearGradient3924);fill-opacity:1;stroke:none"
|
||||
id="path3148"
|
||||
sodipodi:cx="256.10123"
|
||||
sodipodi:cy="255.89879"
|
||||
sodipodi:rx="244.78751"
|
||||
sodipodi:ry="244.78751"
|
||||
d="m 500.88873,255.89879 a 244.78751,244.78751 0 1 1 -489.575009,0 244.78751,244.78751 0 1 1 489.575009,0 z"
|
||||
transform="matrix(1.0008681,0,0,1.0008681,-0.32354214,-0.12094033)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="base-glass"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:url(#radialGradient3943);fill-opacity:1;stroke:none"
|
||||
id="path3927"
|
||||
sodipodi:cx="227.08333"
|
||||
sodipodi:cy="218.25"
|
||||
sodipodi:rx="197.08333"
|
||||
sodipodi:ry="197.08333"
|
||||
d="M 424.16666,218.25 A 197.08333,197.08333 0 1 1 30,218.25 a 197.08333,197.08333 0 1 1 394.16666,0 z"
|
||||
transform="matrix(1.1467231,0,0,1.1467231,-4.401693,5.727699)"
|
||||
mask="none" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="glows"
|
||||
sodipodi:insensitive="true"
|
||||
style="display:inline">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:url(#radialGradient5741);fill-opacity:1;stroke:none;filter:url(#filter5501)"
|
||||
id="path3946"
|
||||
sodipodi:cx="258.69565"
|
||||
sodipodi:cy="381.56522"
|
||||
sodipodi:rx="169.56522"
|
||||
sodipodi:ry="169.56522"
|
||||
d="m 428.26086,381.56522 a 169.56522,169.56522 0 1 1 -339.130428,0 169.56522,169.56522 0 1 1 339.130428,0 z"
|
||||
transform="matrix(1.2585469,0,0,1.2585469,-67.79803,-174.43515)"
|
||||
clip-path="url(#clipPath5611)" />
|
||||
<path
|
||||
transform="matrix(0.88461539,0,0,0.88461539,29.095871,-174.14716)"
|
||||
d="m 428.26086,381.56522 a 169.56522,169.56522 0 1 1 -339.130428,0 169.56522,169.56522 0 1 1 339.130428,0 z"
|
||||
sodipodi:ry="169.56522"
|
||||
sodipodi:rx="169.56522"
|
||||
sodipodi:cy="381.56522"
|
||||
sodipodi:cx="258.69565"
|
||||
id="path3962"
|
||||
style="fill:url(#radialGradient3964);fill-opacity:1;stroke:none;filter:url(#filter5485)"
|
||||
sodipodi:type="arc"
|
||||
clip-path="url(#clipPath5607)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:label="glows2"
|
||||
id="g5762"
|
||||
inkscape:groupmode="layer"
|
||||
style="opacity:0.73999999;display:inline"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
clip-path="url(#clipPath5611)"
|
||||
transform="matrix(1.2585469,0,0,1.2585469,-67.79803,-174.43515)"
|
||||
d="m 428.26086,381.56522 a 169.56522,169.56522 0 1 1 -339.130428,0 169.56522,169.56522 0 1 1 339.130428,0 z"
|
||||
sodipodi:ry="169.56522"
|
||||
sodipodi:rx="169.56522"
|
||||
sodipodi:cy="381.56522"
|
||||
sodipodi:cx="258.69565"
|
||||
id="path5764"
|
||||
style="fill:url(#radialGradient5796);fill-opacity:1;stroke:none;filter:url(#filter5792)"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
clip-path="url(#clipPath5607)"
|
||||
sodipodi:type="arc"
|
||||
style="fill:url(#radialGradient3964);fill-opacity:1;stroke:none;filter:url(#filter5784)"
|
||||
id="path5766"
|
||||
sodipodi:cx="258.69565"
|
||||
sodipodi:cy="381.56522"
|
||||
sodipodi:rx="169.56522"
|
||||
sodipodi:ry="169.56522"
|
||||
d="m 428.26086,381.56522 a 169.56522,169.56522 0 1 1 -339.130428,0 169.56522,169.56522 0 1 1 339.130428,0 z"
|
||||
transform="matrix(0.88461539,0,0,0.88461539,29.095871,-174.14716)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer9"
|
||||
inkscape:label="glow3"
|
||||
style="opacity:0.7">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:#23c8ff;fill-opacity:1;stroke:none;filter:url(#filter5845)"
|
||||
id="path5799"
|
||||
sodipodi:cx="260.0629"
|
||||
sodipodi:cy="345.01886"
|
||||
sodipodi:rx="155.66037"
|
||||
sodipodi:ry="129.87421"
|
||||
d="m 415.72327,345.01886 a 155.66037,129.87421 0 1 1 -311.32074,0 155.66037,129.87421 0 1 1 311.32074,0 z"
|
||||
transform="matrix(0.92027607,0,0,0.82232826,17.588582,32.614052)"
|
||||
inkscape:export-filename="/Users/pigoz/Documents/mplayer-icons/compiled/path5799.png"
|
||||
inkscape:export-xdpi="85.699997"
|
||||
inkscape:export-ydpi="85.699997" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer8"
|
||||
inkscape:label="gloss-clipping"
|
||||
sodipodi:insensitive="true" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="play"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter5717)"
|
||||
inkscape:transform-center-x="-31.26597"
|
||||
inkscape:transform-center-y="-0.032805761"
|
||||
d="m 190.37028,382.72523 0,-120.00058 0,-120.0006 93.87484,60.04949 93.87489,60.04951 -93.87489,59.95109 z"
|
||||
id="path3999-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:export-filename="/Users/pigoz/Documents/icon-mplayer.png"
|
||||
inkscape:export-xdpi="85.699997"
|
||||
inkscape:export-ydpi="85.699997" />
|
||||
<path
|
||||
style="fill:url(#linearGradient5657);fill-opacity:1;stroke:#000000;stroke-width:6;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
inkscape:transform-center-x="-29.755544"
|
||||
inkscape:transform-center-y="-0.03121957"
|
||||
d="m 194.68911,375.82668 0,-114.20348 0,-114.2035 89.33985,57.14856 89.33989,57.14858 -89.33989,57.05492 z"
|
||||
id="path3999"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:export-filename="/Users/pigoz/Documents/icon-mplayer.png"
|
||||
inkscape:export-xdpi="85.699997"
|
||||
inkscape:export-ydpi="85.699997" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="white-gloss"
|
||||
style="opacity:0.9137931;display:inline"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:url(#linearGradient4907);fill-opacity:1;stroke:none;display:inline;filter:url(#filter5667)"
|
||||
d="M 256,42.90625 C 142.67988,42.90625 49.723058,129.38336 40.3125,239.5 98.19077,257.96934 164.46733,270.1875 258,270.1875 c 96.86848,0 137.8965,-5.8873 213.8125,-29.4375 C 463.00354,130.03648 369.74992,42.90625 256,42.90625 z"
|
||||
id="path3950"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs"
|
||||
inkscape:export-filename="/Users/pigoz/Documents/icon-mplayer.png"
|
||||
inkscape:export-xdpi="85.699997"
|
||||
inkscape:export-ydpi="85.699997"
|
||||
transform="matrix(0.99524152,0,0,0.99524152,0.95307007,-2.3236889)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 18 KiB |
@ -101,6 +101,8 @@ static const struct {
|
||||
{IMGFMT_444P, PIX_FMT_YUVJ444P},
|
||||
{IMGFMT_440P, PIX_FMT_YUVJ440P},
|
||||
|
||||
{IMGFMT_BGR0, PIX_FMT_BGR0},
|
||||
|
||||
{IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1},
|
||||
{IMGFMT_VDPAU_MPEG2, PIX_FMT_VDPAU_MPEG2},
|
||||
{IMGFMT_VDPAU_H264, PIX_FMT_VDPAU_H264},
|
||||
|
@ -191,10 +191,10 @@ struct mp_imgfmt_entry mp_imgfmt_list[] = {
|
||||
{"argb", IMGFMT_ARGB},
|
||||
{"bgra", IMGFMT_BGRA},
|
||||
{"abgr", IMGFMT_ABGR},
|
||||
{"bgr0", IMGFMT_BGR0},
|
||||
{"gbrp", IMGFMT_GBRP},
|
||||
{"mjpeg", IMGFMT_MJPEG},
|
||||
{"mjpg", IMGFMT_MJPEG},
|
||||
{"mpes", IMGFMT_MPEGPES},
|
||||
{"vdpau_h264", IMGFMT_VDPAU_H264},
|
||||
{"vdpau_mpeg1", IMGFMT_VDPAU_MPEG1},
|
||||
{"vdpau_mpeg2", IMGFMT_VDPAU_MPEG2},
|
||||
|
@ -101,6 +101,8 @@
|
||||
#define IMGFMT_RGB_DEPTH(fmt) ((fmt)&0x3F)
|
||||
#define IMGFMT_BGR_DEPTH(fmt) ((fmt)&0x3F)
|
||||
|
||||
// AV_PIX_FMT_BGR0
|
||||
#define IMGFMT_BGR0 0x1DC70000
|
||||
|
||||
/* Planar YUV Formats */
|
||||
|
||||
@ -196,7 +198,6 @@
|
||||
#define IMGFMT_UYVP 0x50565955 // 10-bit UYVY
|
||||
|
||||
/* Compressed Formats */
|
||||
#define IMGFMT_MPEGPES (('M'<<24)|('P'<<16)|('E'<<8)|('S'))
|
||||
#define IMGFMT_MJPEG (('M')|('J'<<8)|('P'<<16)|('G'<<24))
|
||||
|
||||
// VDPAU specific format.
|
||||
|
@ -120,7 +120,7 @@ void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){
|
||||
mpi->flags&=~(MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV|MP_IMGFLAG_SWAPPED);
|
||||
mpi->imgfmt=out_fmt;
|
||||
// compressed formats
|
||||
if(out_fmt == IMGFMT_MPEGPES || IMGFMT_IS_HWACCEL(out_fmt)){
|
||||
if(IMGFMT_IS_HWACCEL(out_fmt)){
|
||||
mpi->bpp=0;
|
||||
return;
|
||||
}
|
||||
@ -140,6 +140,11 @@ void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){
|
||||
mpi->flags|=MP_IMGFLAG_SWAPPED;
|
||||
return;
|
||||
}
|
||||
switch (out_fmt) {
|
||||
case IMGFMT_BGR0:
|
||||
mpi->bpp = 32;
|
||||
return;
|
||||
}
|
||||
mpi->num_planes=3;
|
||||
if (out_fmt == IMGFMT_GBRP) {
|
||||
mpi->bpp=24;
|
||||
|
@ -60,8 +60,7 @@ int mpcodecs_config_vo2(sh_video_t *sh, int w, int h,
|
||||
unsigned int out_fmt = 0;
|
||||
int screen_size_x = 0;
|
||||
int screen_size_y = 0;
|
||||
vf_instance_t *vf = sh->vfilter, *sc = NULL;
|
||||
int palette = 0;
|
||||
vf_instance_t *vf = sh->vfilter;
|
||||
int vocfg_flags = 0;
|
||||
|
||||
if (w)
|
||||
@ -125,58 +124,14 @@ int mpcodecs_config_vo2(sh_video_t *sh, int w, int h,
|
||||
sh->output_flags = flags;
|
||||
if (flags & VFCAP_CSP_SUPPORTED_BY_HW)
|
||||
break;
|
||||
} else if (!palette
|
||||
&& !(flags &
|
||||
(VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_CSP_SUPPORTED))
|
||||
&& (out_fmt == IMGFMT_RGB8 || out_fmt == IMGFMT_BGR8)) {
|
||||
sh->outfmtidx = j; // pass index to the control() function this way
|
||||
if (sh->vd_driver->control(sh, VDCTRL_QUERY_FORMAT, &out_fmt) !=
|
||||
CONTROL_FALSE)
|
||||
palette = 1;
|
||||
}
|
||||
}
|
||||
if (j < 0) {
|
||||
// TODO: no match - we should use conversion...
|
||||
if (strcmp(vf->info->name, "scale") && palette != -1) {
|
||||
if (strcmp(vf->info->name, "scale")) {
|
||||
mp_tmsg(MSGT_DECVIDEO, MSGL_INFO, "Could not find matching colorspace - retrying with -vf scale...\n");
|
||||
sc = vf = vf_open_filter(opts, vf, "scale", NULL);
|
||||
vf = vf_open_filter(opts, vf, "scale", NULL);
|
||||
goto csp_again;
|
||||
} else if (palette == 1) {
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_V, "vd: Trying -vf palette...\n");
|
||||
palette = -1;
|
||||
vf = vf_open_filter(opts, vf, "palette", NULL);
|
||||
goto csp_again;
|
||||
} else {
|
||||
// sws failed, if the last filter (vf_vo) support MPEGPES try
|
||||
// to append vf_lavc
|
||||
vf_instance_t *vo, *vp = NULL, *ve, *vpp = NULL;
|
||||
// Remove the scale filter if we added it ourselves
|
||||
if (vf == sc) {
|
||||
ve = vf;
|
||||
vf = vf->next;
|
||||
vf_uninit_filter(ve);
|
||||
}
|
||||
// Find the last filter (vf_vo)
|
||||
for (vo = vf; vo->next; vo = vo->next) {
|
||||
vpp = vp;
|
||||
vp = vo;
|
||||
}
|
||||
if (vo->query_format(vo, IMGFMT_MPEGPES)
|
||||
&& (!vp || (vp && strcmp(vp->info->name, "lavc")))) {
|
||||
ve = vf_open_filter(opts, vo, "lavc", NULL);
|
||||
if (vp)
|
||||
vp->next = ve;
|
||||
else
|
||||
vf = ve;
|
||||
goto csp_again;
|
||||
}
|
||||
if (vp && !strcmp(vp->info->name,"lavc")) {
|
||||
if (vpp)
|
||||
vpp->next = vo;
|
||||
else
|
||||
vf = vo;
|
||||
vf_uninit_filter(vp);
|
||||
}
|
||||
}
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_WARN,
|
||||
"The selected video_out device is incompatible with this codec.\n"\
|
||||
|
@ -583,9 +583,6 @@ static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic)
|
||||
}
|
||||
|
||||
if (mpi) {
|
||||
// Palette support: free palette buffer allocated in get_buffer
|
||||
if (mpi->bpp == 8)
|
||||
av_freep(&mpi->planes[1]);
|
||||
// release mpi (in case MPI_IMGTYPE_NUMBERED is used, e.g. for VDPAU)
|
||||
mpi->usage_count--;
|
||||
}
|
||||
|
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* This file is part of MPlayer.
|
||||
*
|
||||
* MPlayer 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
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPLAYER_VD_INTERNAL_H
|
||||
#define MPLAYER_VD_INTERNAL_H
|
||||
|
||||
#include "codec-cfg.h"
|
||||
#include "img_format.h"
|
||||
|
||||
#include "stream/stream.h"
|
||||
#include "libmpdemux/demuxer.h"
|
||||
#include "libmpdemux/stheader.h"
|
||||
|
||||
#include "vd.h"
|
||||
|
||||
extern int divx_quality;
|
||||
|
||||
// prototypes:
|
||||
//static vd_info_t info;
|
||||
static int control(sh_video_t *sh,int cmd,void* arg,...);
|
||||
static int init(sh_video_t *sh);
|
||||
static void uninit(sh_video_t *sh);
|
||||
static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags);
|
||||
|
||||
#define LIBVD_EXTERN(x) const vd_functions_t mpcodecs_vd_##x = {\
|
||||
&info,\
|
||||
init,\
|
||||
uninit,\
|
||||
control,\
|
||||
decode\
|
||||
};
|
||||
|
||||
#endif /* MPLAYER_VD_INTERNAL_H */
|
@ -250,6 +250,8 @@ mp_image_t *vf_get_image(vf_instance_t *vf, unsigned int outfmt,
|
||||
break;
|
||||
}
|
||||
if (mpi) {
|
||||
int missing_palette = !(mpi->flags & MP_IMGFLAG_RGB_PALETTE) &&
|
||||
(mp_imgflag & MP_IMGFLAG_RGB_PALETTE);
|
||||
mpi->type = mp_imgtype;
|
||||
mpi->w = vf->w;
|
||||
mpi->h = vf->h;
|
||||
@ -261,11 +263,15 @@ mp_image_t *vf_get_image(vf_instance_t *vf, unsigned int outfmt,
|
||||
MP_IMGFLAG_DRAW_CALLBACK | MP_IMGFLAG_RGB_PALETTE);
|
||||
if (!vf->draw_slice)
|
||||
mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK;
|
||||
if (mpi->width != w2 || mpi->height != h) {
|
||||
if (mpi->width != w2 || mpi->height != h || missing_palette) {
|
||||
if (mpi->flags & MP_IMGFLAG_ALLOCATED) {
|
||||
if (mpi->width < w2 || mpi->height < h) {
|
||||
if (mpi->width < w2 || mpi->height < h || missing_palette) {
|
||||
// need to re-allocate buffer memory:
|
||||
av_free(mpi->planes[0]);
|
||||
if (mpi->flags & MP_IMGFLAG_RGB_PALETTE)
|
||||
av_free(mpi->planes[1]);
|
||||
for (int n = 0; n < MP_MAX_PLANES; n++)
|
||||
mpi->planes[n] = NULL;
|
||||
mpi->flags &= ~MP_IMGFLAG_ALLOCATED;
|
||||
mp_msg(MSGT_VFILTER, MSGL_V,
|
||||
"vf.c: have to REALLOCATE buffer memory :(\n");
|
||||
@ -355,11 +361,8 @@ mp_image_t *vf_get_image(vf_instance_t *vf, unsigned int outfmt,
|
||||
|
||||
//============================================================================
|
||||
|
||||
// By default vf doesn't accept MPEGPES
|
||||
static int vf_default_query_format(struct vf_instance *vf, unsigned int fmt)
|
||||
{
|
||||
if (fmt == IMGFMT_MPEGPES)
|
||||
return 0;
|
||||
return vf_next_query_format(vf, fmt);
|
||||
}
|
||||
|
||||
|
@ -281,7 +281,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
|
||||
|
||||
static int query_format(struct vf_instance *vf, unsigned int fmt)
|
||||
{
|
||||
if (IMGFMT_IS_HWACCEL(fmt) || fmt == IMGFMT_MJPEG || fmt == IMGFMT_MPEGPES)
|
||||
if (IMGFMT_IS_HWACCEL(fmt))
|
||||
return 0; // these can't really be filtered
|
||||
if (fmt == IMGFMT_RGB8 || fmt == IMGFMT_BGR8)
|
||||
return 0; // we don't have palette support, sorry
|
||||
|
@ -48,7 +48,6 @@ static struct vf_priv_s {
|
||||
int exp_x,exp_y;
|
||||
double aspect;
|
||||
int round;
|
||||
int passthrough;
|
||||
int first_slice;
|
||||
} const vf_priv_dflt = {
|
||||
-1,-1,
|
||||
@ -57,7 +56,6 @@ static struct vf_priv_s {
|
||||
-1,-1,
|
||||
0.,
|
||||
1,
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
@ -69,10 +67,6 @@ static int config(struct vf_instance *vf,
|
||||
{
|
||||
struct MPOpts *opts = vf->opts;
|
||||
mp_image_t test_mpi;
|
||||
if(outfmt == IMGFMT_MPEGPES) {
|
||||
vf->priv->passthrough = 1;
|
||||
return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
|
||||
}
|
||||
mp_image_setfmt(&test_mpi, outfmt);
|
||||
if (outfmt == IMGFMT_IF09 || !test_mpi.bpp) return 0;
|
||||
vf->priv->exp_x = vf->priv->cfg_exp_x;
|
||||
@ -261,13 +255,6 @@ static void clear_borders(struct vf_instance *vf, int w, int h)
|
||||
}
|
||||
|
||||
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
|
||||
if (vf->priv->passthrough) {
|
||||
mp_image_t *dmpi = vf_get_image(vf->next, IMGFMT_MPEGPES,
|
||||
MP_IMGTYPE_EXPORT, 0, mpi->w, mpi->h);
|
||||
dmpi->planes[0]=mpi->planes[0];
|
||||
return vf_next_put_image(vf,dmpi, pts);
|
||||
}
|
||||
|
||||
if(mpi->flags&MP_IMGFLAG_DIRECT || mpi->flags&MP_IMGFLAG_DRAW_CALLBACK){
|
||||
vf->dmpi=mpi->priv;
|
||||
if(!vf->dmpi) { mp_tmsg(MSGT_VFILTER, MSGL_WARN, "Why do we get NULL??\n"); return 0; }
|
||||
|
@ -22,6 +22,8 @@
|
||||
|
||||
#include "video_out.h"
|
||||
|
||||
struct vo_cocoa_state;
|
||||
|
||||
bool vo_cocoa_gui_running(void);
|
||||
void *vo_cocoa_glgetaddr(const char *s);
|
||||
|
||||
@ -35,17 +37,19 @@ int vo_cocoa_create_window(struct vo *vo, uint32_t d_width,
|
||||
uint32_t d_height, uint32_t flags,
|
||||
int gl3profile);
|
||||
|
||||
void vo_cocoa_swap_buffers(void);
|
||||
void vo_cocoa_swap_buffers(struct vo *vo);
|
||||
int vo_cocoa_check_events(struct vo *vo);
|
||||
void vo_cocoa_fullscreen(struct vo *vo);
|
||||
void vo_cocoa_ontop(struct vo *vo);
|
||||
void vo_cocoa_pause(struct vo *vo);
|
||||
void vo_cocoa_resume(struct vo *vo);
|
||||
|
||||
// returns an int to conform to the gl extensions from other platforms
|
||||
int vo_cocoa_swap_interval(int enabled);
|
||||
|
||||
void *vo_cocoa_cgl_context(void);
|
||||
void *vo_cocoa_cgl_pixel_format(void);
|
||||
void *vo_cocoa_cgl_context(struct vo *vo);
|
||||
void *vo_cocoa_cgl_pixel_format(struct vo *vo);
|
||||
|
||||
int vo_cocoa_cgl_color_size(void);
|
||||
int vo_cocoa_cgl_color_size(struct vo *vo);
|
||||
|
||||
#endif /* MPLAYER_COCOA_COMMON_H */
|
||||
|
@ -18,9 +18,8 @@
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <OpenGL/OpenGL.h>
|
||||
#import <QuartzCore/QuartzCore.h>
|
||||
#import <CoreServices/CoreServices.h> // for CGDisplayHideCursor
|
||||
#import <IOKit/pwr_mgt/IOPMLib.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include "cocoa_common.h"
|
||||
@ -62,13 +61,22 @@
|
||||
@end
|
||||
#endif
|
||||
|
||||
@interface GLMPlayerWindow : NSWindow <NSWindowDelegate>
|
||||
- (BOOL) canBecomeKeyWindow;
|
||||
- (BOOL) canBecomeMainWindow;
|
||||
- (void) fullscreen;
|
||||
- (void) mouseEvent:(NSEvent *)theEvent;
|
||||
- (void) mulSize:(float)multiplier;
|
||||
- (void) setContentSize:(NSSize)newSize keepCentered:(BOOL)keepCentered;
|
||||
// add power management assertion not available on OSX versions prior to 10.7
|
||||
#ifndef kIOPMAssertionTypePreventUserIdleDisplaySleep
|
||||
#define kIOPMAssertionTypePreventUserIdleDisplaySleep \
|
||||
CFSTR("PreventUserIdleDisplaySleep")
|
||||
#endif
|
||||
|
||||
@interface GLMPlayerWindow : NSWindow <NSWindowDelegate> {
|
||||
struct vo *_vo;
|
||||
}
|
||||
- (void)setVideoOutput:(struct vo *)vo;
|
||||
- (BOOL)canBecomeKeyWindow;
|
||||
- (BOOL)canBecomeMainWindow;
|
||||
- (void)fullscreen;
|
||||
- (void)mouseEvent:(NSEvent *)theEvent;
|
||||
- (void)mulSize:(float)multiplier;
|
||||
- (void)setContentSize:(NSSize)newSize keepCentered:(BOOL)keepCentered;
|
||||
@end
|
||||
|
||||
@interface GLMPlayerOpenGLView : NSView
|
||||
@ -94,44 +102,39 @@ struct vo_cocoa_state {
|
||||
|
||||
NSString *window_title;
|
||||
|
||||
NSInteger windowed_window_level;
|
||||
NSInteger window_level;
|
||||
NSInteger fullscreen_window_level;
|
||||
|
||||
int last_screensaver_update;
|
||||
|
||||
int display_cursor;
|
||||
int cursor_timer;
|
||||
int cursor_autohide_delay;
|
||||
|
||||
bool did_resize;
|
||||
bool out_fs_resize;
|
||||
|
||||
IOPMAssertionID power_mgmt_assertion;
|
||||
};
|
||||
|
||||
struct vo_cocoa_state *s;
|
||||
static int _instances = 0;
|
||||
|
||||
struct vo *l_vo;
|
||||
static void create_menu(void);
|
||||
|
||||
// local function definitions
|
||||
struct vo_cocoa_state *vo_cocoa_init_state(void);
|
||||
void vo_set_level(int ontop);
|
||||
void update_screen_info(void);
|
||||
void resize_window(struct vo *vo);
|
||||
void vo_cocoa_display_cursor(int requested_state);
|
||||
void create_menu(void);
|
||||
|
||||
struct vo_cocoa_state *vo_cocoa_init_state(void)
|
||||
static struct vo_cocoa_state *vo_cocoa_init_state(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = talloc_ptrtype(NULL, s);
|
||||
struct vo_cocoa_state *s = talloc_ptrtype(vo, s);
|
||||
*s = (struct vo_cocoa_state){
|
||||
.pool = [[NSAutoreleasePool alloc] init],
|
||||
.did_resize = NO,
|
||||
.current_video_size = {0,0},
|
||||
.previous_video_size = {0,0},
|
||||
.windowed_mask = NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask,
|
||||
.windowed_mask = NSTitledWindowMask|NSClosableWindowMask|
|
||||
NSMiniaturizableWindowMask|NSResizableWindowMask,
|
||||
.fullscreen_mask = NSBorderlessWindowMask,
|
||||
.fullscreen_window_level = NSNormalWindowLevel + 1,
|
||||
.windowed_frame = {{0,0},{0,0}},
|
||||
.out_fs_resize = NO,
|
||||
.display_cursor = 1,
|
||||
.cursor_autohide_delay = vo->opts->cursor_autohide_delay,
|
||||
.power_mgmt_assertion = kIOPMNullAssertionID,
|
||||
};
|
||||
return s;
|
||||
}
|
||||
@ -145,7 +148,7 @@ static bool supports_hidpi(NSView *view)
|
||||
|
||||
bool vo_cocoa_gui_running(void)
|
||||
{
|
||||
return !!s;
|
||||
return _instances > 0;
|
||||
}
|
||||
|
||||
void *vo_cocoa_glgetaddr(const char *s)
|
||||
@ -161,21 +164,45 @@ void *vo_cocoa_glgetaddr(const char *s)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void enable_power_management(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
if (!s->power_mgmt_assertion) return;
|
||||
IOPMAssertionRelease(s->power_mgmt_assertion);
|
||||
s->power_mgmt_assertion = kIOPMNullAssertionID;
|
||||
}
|
||||
|
||||
static void disable_power_management(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
if (s->power_mgmt_assertion) return;
|
||||
|
||||
CFStringRef assertion_type = kIOPMAssertionTypeNoDisplaySleep;
|
||||
if (is_osx_version_at_least(10, 7, 0))
|
||||
assertion_type = kIOPMAssertionTypePreventUserIdleDisplaySleep;
|
||||
|
||||
IOPMAssertionCreateWithName(assertion_type, kIOPMAssertionLevelOn,
|
||||
CFSTR("org.mplayer2.power_mgmt"), &s->power_mgmt_assertion);
|
||||
}
|
||||
|
||||
int vo_cocoa_init(struct vo *vo)
|
||||
{
|
||||
s = vo_cocoa_init_state();
|
||||
s->pool = [[NSAutoreleasePool alloc] init];
|
||||
s->cursor_autohide_delay = vo->opts->cursor_autohide_delay;
|
||||
vo->cocoa = vo_cocoa_init_state(vo);
|
||||
_instances++;
|
||||
|
||||
NSApplicationLoad();
|
||||
NSApp = [NSApplication sharedApplication];
|
||||
[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular];
|
||||
disable_power_management(vo);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void vo_cocoa_uninit(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
CGDisplayShowCursor(kCGDirectMainDisplay);
|
||||
enable_power_management(vo);
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationDefault];
|
||||
|
||||
[s->window release];
|
||||
@ -185,22 +212,34 @@ void vo_cocoa_uninit(struct vo *vo)
|
||||
[s->pool release];
|
||||
s->pool = nil;
|
||||
|
||||
talloc_free(s);
|
||||
s = nil;
|
||||
_instances--;
|
||||
}
|
||||
|
||||
static int current_screen_has_dock_or_menubar(void)
|
||||
void vo_cocoa_pause(struct vo *vo)
|
||||
{
|
||||
enable_power_management(vo);
|
||||
}
|
||||
|
||||
void vo_cocoa_resume(struct vo *vo)
|
||||
{
|
||||
disable_power_management(vo);
|
||||
}
|
||||
|
||||
static int current_screen_has_dock_or_menubar(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
NSRect f = s->screen_frame;
|
||||
NSRect vf = [s->screen_handle visibleFrame];
|
||||
return f.size.height > vf.size.height || f.size.width > vf.size.width;
|
||||
}
|
||||
|
||||
void update_screen_info(void)
|
||||
static void update_screen_info(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
s->screen_array = [NSScreen screens];
|
||||
if (xinerama_screen >= (int)[s->screen_array count]) {
|
||||
mp_msg(MSGT_VO, MSGL_INFO, "[cocoa] Device ID %d does not exist, falling back to main device\n", xinerama_screen);
|
||||
mp_msg(MSGT_VO, MSGL_INFO, "[cocoa] Device ID %d does not exist, "
|
||||
"falling back to main device\n", xinerama_screen);
|
||||
xinerama_screen = -1;
|
||||
}
|
||||
|
||||
@ -216,8 +255,10 @@ void update_screen_info(void)
|
||||
|
||||
void vo_cocoa_update_xinerama_info(struct vo *vo)
|
||||
{
|
||||
update_screen_info();
|
||||
aspect_save_screenres(vo, s->screen_frame.size.width, s->screen_frame.size.height);
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
update_screen_info(vo);
|
||||
aspect_save_screenres(vo, s->screen_frame.size.width,
|
||||
s->screen_frame.size.height);
|
||||
}
|
||||
|
||||
int vo_cocoa_change_attributes(struct vo *vo)
|
||||
@ -225,8 +266,9 @@ int vo_cocoa_change_attributes(struct vo *vo)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void resize_window(struct vo *vo)
|
||||
static void resize_window(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
NSView *view = [s->window contentView];
|
||||
NSRect frame;
|
||||
|
||||
@ -241,106 +283,147 @@ void resize_window(struct vo *vo)
|
||||
[s->glContext update];
|
||||
}
|
||||
|
||||
void vo_set_level(int ontop)
|
||||
static void vo_set_level(struct vo *vo, int ontop)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
if (ontop) {
|
||||
s->windowed_window_level = NSNormalWindowLevel + 1;
|
||||
s->window_level = NSNormalWindowLevel + 1;
|
||||
} else {
|
||||
s->windowed_window_level = NSNormalWindowLevel;
|
||||
s->window_level = NSNormalWindowLevel;
|
||||
}
|
||||
|
||||
if (!vo_fs)
|
||||
[s->window setLevel:s->windowed_window_level];
|
||||
[s->window setLevel:s->window_level];
|
||||
}
|
||||
|
||||
void vo_cocoa_ontop(struct vo *vo)
|
||||
{
|
||||
struct MPOpts *opts = vo->opts;
|
||||
opts->vo_ontop = !opts->vo_ontop;
|
||||
vo_set_level(opts->vo_ontop);
|
||||
vo_set_level(vo, opts->vo_ontop);
|
||||
}
|
||||
|
||||
static void update_state_sizes(struct vo_cocoa_state *s,
|
||||
uint32_t d_width, uint32_t d_height)
|
||||
{
|
||||
if (s->current_video_size.width > 0 || s->current_video_size.height > 0)
|
||||
s->previous_video_size = s->current_video_size;
|
||||
s->current_video_size = NSMakeSize(d_width, d_height);
|
||||
}
|
||||
|
||||
static int create_window(struct vo *vo, uint32_t d_width, uint32_t d_height,
|
||||
uint32_t flags, int gl3profile)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
struct MPOpts *opts = vo->opts;
|
||||
|
||||
const NSRect window_rect = NSMakeRect(0, 0, d_width, d_height);
|
||||
const NSRect glview_rect = NSMakeRect(0, 0, 100, 100);
|
||||
|
||||
s->window =
|
||||
[[GLMPlayerWindow alloc] initWithContentRect:window_rect
|
||||
styleMask:s->windowed_mask
|
||||
backing:NSBackingStoreBuffered
|
||||
defer:NO];
|
||||
|
||||
GLMPlayerOpenGLView *glView =
|
||||
[[GLMPlayerOpenGLView alloc] initWithFrame:glview_rect];
|
||||
|
||||
// check for HiDPI support and enable it (available on 10.7 +)
|
||||
if (supports_hidpi(glView))
|
||||
[glView setWantsBestResolutionOpenGLSurface:YES];
|
||||
|
||||
int i = 0;
|
||||
NSOpenGLPixelFormatAttribute attr[32];
|
||||
if (is_osx_version_at_least(10, 7, 0)) {
|
||||
attr[i++] = NSOpenGLPFAOpenGLProfile;
|
||||
if (gl3profile) {
|
||||
attr[i++] = NSOpenGLProfileVersion3_2Core;
|
||||
} else {
|
||||
attr[i++] = NSOpenGLProfileVersionLegacy;
|
||||
}
|
||||
} else if(gl3profile) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR,
|
||||
"[cocoa] Invalid pixel format attribute "
|
||||
"(GL3 is not supported on OSX versions prior to 10.7)\n");
|
||||
return -1;
|
||||
}
|
||||
attr[i++] = NSOpenGLPFADoubleBuffer; // double buffered
|
||||
attr[i] = (NSOpenGLPixelFormatAttribute)0;
|
||||
|
||||
s->pixelFormat =
|
||||
[[[NSOpenGLPixelFormat alloc] initWithAttributes:attr] autorelease];
|
||||
if (!s->pixelFormat) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR,
|
||||
"[cocoa] Invalid pixel format attribute "
|
||||
"(GL3 not supported?)\n");
|
||||
return -1;
|
||||
}
|
||||
s->glContext =
|
||||
[[NSOpenGLContext alloc] initWithFormat:s->pixelFormat
|
||||
shareContext:nil];
|
||||
|
||||
create_menu();
|
||||
|
||||
[s->window setContentView:glView];
|
||||
[glView release];
|
||||
[s->window setAcceptsMouseMovedEvents:YES];
|
||||
[s->glContext setView:glView];
|
||||
[s->glContext makeCurrentContext];
|
||||
|
||||
[NSApp setDelegate:s->window];
|
||||
[s->window setDelegate:s->window];
|
||||
[s->window setContentSize:s->current_video_size];
|
||||
[s->window setContentAspectRatio:s->current_video_size];
|
||||
[s->window center];
|
||||
|
||||
if (flags & VOFLAG_HIDDEN) {
|
||||
[s->window orderOut:nil];
|
||||
} else {
|
||||
[s->window makeKeyAndOrderFront:nil];
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
if (flags & VOFLAG_FULLSCREEN)
|
||||
vo_cocoa_fullscreen(vo);
|
||||
|
||||
vo_set_level(vo, opts->vo_ontop);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void update_window(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
|
||||
if (s->current_video_size.width != s->previous_video_size.width ||
|
||||
s->current_video_size.height != s->previous_video_size.height) {
|
||||
if (vo_fs) {
|
||||
// we will resize as soon as we get out of fullscreen
|
||||
s->out_fs_resize = YES;
|
||||
} else {
|
||||
// only if we are not in fullscreen and the video size did
|
||||
// change we resize the window and set a new aspect ratio
|
||||
[s->window setContentSize:s->current_video_size
|
||||
keepCentered:YES];
|
||||
[s->window setContentAspectRatio:s->current_video_size];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int vo_cocoa_create_window(struct vo *vo, uint32_t d_width,
|
||||
uint32_t d_height, uint32_t flags,
|
||||
int gl3profile)
|
||||
{
|
||||
struct MPOpts *opts = vo->opts;
|
||||
if (s->current_video_size.width > 0 || s->current_video_size.height > 0)
|
||||
s->previous_video_size = s->current_video_size;
|
||||
s->current_video_size = NSMakeSize(d_width, d_height);
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
|
||||
if (!(s->window || s->glContext)) { // keep using the same window
|
||||
s->window = [[GLMPlayerWindow alloc] initWithContentRect:NSMakeRect(0, 0, d_width, d_height)
|
||||
styleMask:s->windowed_mask
|
||||
backing:NSBackingStoreBuffered defer:NO];
|
||||
update_state_sizes(s, d_width, d_height);
|
||||
|
||||
GLMPlayerOpenGLView *glView = [[GLMPlayerOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
|
||||
|
||||
// check for HiDPI support and enable it (available on 10.7 +)
|
||||
if (supports_hidpi(glView))
|
||||
[glView setWantsBestResolutionOpenGLSurface:YES];
|
||||
|
||||
int i = 0;
|
||||
NSOpenGLPixelFormatAttribute attr[32];
|
||||
if (is_osx_version_at_least(10, 7, 0)) {
|
||||
attr[i++] = NSOpenGLPFAOpenGLProfile;
|
||||
attr[i++] = (gl3profile ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy);
|
||||
} else if(gl3profile) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR,
|
||||
"[cocoa] Invalid pixel format attribute "
|
||||
"(GL3 is not supported on OSX versions prior to 10.7)\n");
|
||||
if (!(s->window || s->glContext)) {
|
||||
if (create_window(vo, d_width, d_height, flags, gl3profile) < 0)
|
||||
return -1;
|
||||
}
|
||||
attr[i++] = NSOpenGLPFADoubleBuffer; // double buffered
|
||||
attr[i] = (NSOpenGLPixelFormatAttribute)0;
|
||||
|
||||
s->pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attr] autorelease];
|
||||
if (!s->pixelFormat) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR,
|
||||
"[cocoa] Invalid pixel format attribute "
|
||||
"(GL3 not supported?)\n");
|
||||
return -1;
|
||||
}
|
||||
s->glContext = [[NSOpenGLContext alloc] initWithFormat:s->pixelFormat shareContext:nil];
|
||||
|
||||
create_menu();
|
||||
|
||||
[s->window setContentView:glView];
|
||||
[glView release];
|
||||
[s->window setAcceptsMouseMovedEvents:YES];
|
||||
[s->glContext setView:glView];
|
||||
[s->glContext makeCurrentContext];
|
||||
|
||||
[NSApp setDelegate:s->window];
|
||||
[s->window setDelegate:s->window];
|
||||
[s->window setContentSize:s->current_video_size];
|
||||
[s->window setContentAspectRatio:s->current_video_size];
|
||||
[s->window center];
|
||||
|
||||
if (flags & VOFLAG_HIDDEN) {
|
||||
[s->window orderOut:nil];
|
||||
} else {
|
||||
[s->window makeKeyAndOrderFront:nil];
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
if (flags & VOFLAG_FULLSCREEN)
|
||||
vo_cocoa_fullscreen(vo);
|
||||
|
||||
vo_set_level(opts->vo_ontop);
|
||||
} else {
|
||||
if (s->current_video_size.width != s->previous_video_size.width ||
|
||||
s->current_video_size.height != s->previous_video_size.height) {
|
||||
if (vo_fs) {
|
||||
// we will resize as soon as we get out of fullscreen
|
||||
s->out_fs_resize = YES;
|
||||
} else {
|
||||
// only if we are not in fullscreen and the video size did change
|
||||
// we actually resize the window and set a new aspect ratio
|
||||
[s->window setContentSize:s->current_video_size keepCentered:YES];
|
||||
[s->window setContentAspectRatio:s->current_video_size];
|
||||
}
|
||||
}
|
||||
update_window(vo);
|
||||
}
|
||||
|
||||
resize_window(vo);
|
||||
@ -348,19 +431,22 @@ int vo_cocoa_create_window(struct vo *vo, uint32_t d_width,
|
||||
if (s->window_title)
|
||||
[s->window_title release];
|
||||
|
||||
s->window_title = [[NSString alloc] initWithUTF8String:vo_get_window_title(vo)];
|
||||
s->window_title =
|
||||
[[NSString alloc] initWithUTF8String:vo_get_window_title(vo)];
|
||||
[s->window setTitle: s->window_title];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vo_cocoa_swap_buffers()
|
||||
void vo_cocoa_swap_buffers(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
[s->glContext flushBuffer];
|
||||
}
|
||||
|
||||
void vo_cocoa_display_cursor(int requested_state)
|
||||
static void vo_cocoa_display_cursor(struct vo *vo, int requested_state)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
if (requested_state) {
|
||||
if (!vo_fs || s->cursor_autohide_delay > -2) {
|
||||
s->display_cursor = requested_state;
|
||||
@ -376,30 +462,22 @@ void vo_cocoa_display_cursor(int requested_state)
|
||||
|
||||
int vo_cocoa_check_events(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
NSEvent *event;
|
||||
float curTime = TickCount()/60;
|
||||
int msCurTime = (int) (curTime * 1000);
|
||||
int ms_time = (int) ([[NSProcessInfo processInfo] systemUptime] * 1000);
|
||||
|
||||
// automatically hide mouse cursor
|
||||
if (vo_fs && s->display_cursor &&
|
||||
(msCurTime - s->cursor_timer >= s->cursor_autohide_delay)) {
|
||||
vo_cocoa_display_cursor(0);
|
||||
s->cursor_timer = msCurTime;
|
||||
}
|
||||
|
||||
//update activity every 30 seconds to prevent
|
||||
//screensaver from starting up.
|
||||
if ((int)curTime - s->last_screensaver_update >= 30 || s->last_screensaver_update == 0)
|
||||
{
|
||||
UpdateSystemActivity(UsrActivity);
|
||||
s->last_screensaver_update = (int)curTime;
|
||||
(ms_time - s->cursor_timer >= s->cursor_autohide_delay)) {
|
||||
vo_cocoa_display_cursor(vo, 0);
|
||||
s->cursor_timer = ms_time;
|
||||
}
|
||||
|
||||
event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil
|
||||
inMode:NSEventTrackingRunLoopMode dequeue:YES];
|
||||
if (event == nil)
|
||||
return 0;
|
||||
l_vo = vo;
|
||||
[s->window setVideoOutput:vo];
|
||||
[NSApp sendEvent:event];
|
||||
|
||||
if (s->did_resize) {
|
||||
@ -420,30 +498,33 @@ int vo_cocoa_check_events(struct vo *vo)
|
||||
|
||||
void vo_cocoa_fullscreen(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
[s->window fullscreen];
|
||||
resize_window(vo);
|
||||
}
|
||||
|
||||
int vo_cocoa_swap_interval(int enabled)
|
||||
{
|
||||
[s->glContext setValues:&enabled forParameter:NSOpenGLCPSwapInterval];
|
||||
[[NSOpenGLContext currentContext] setValues:&enabled
|
||||
forParameter:NSOpenGLCPSwapInterval];
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *vo_cocoa_cgl_context(void)
|
||||
void *vo_cocoa_cgl_context(struct vo *vo)
|
||||
{
|
||||
struct vo_cocoa_state *s = vo->cocoa;
|
||||
return [s->glContext CGLContextObj];
|
||||
}
|
||||
|
||||
void *vo_cocoa_cgl_pixel_format(void)
|
||||
void *vo_cocoa_cgl_pixel_format(struct vo *vo)
|
||||
{
|
||||
return CGLGetPixelFormat(vo_cocoa_cgl_context());
|
||||
return CGLGetPixelFormat(vo_cocoa_cgl_context(vo));
|
||||
}
|
||||
|
||||
int vo_cocoa_cgl_color_size(void)
|
||||
int vo_cocoa_cgl_color_size(struct vo *vo)
|
||||
{
|
||||
GLint value;
|
||||
CGLDescribePixelFormat(vo_cocoa_cgl_pixel_format(), 0,
|
||||
CGLDescribePixelFormat(vo_cocoa_cgl_pixel_format(vo), 0,
|
||||
kCGLPFAColorSize, &value);
|
||||
switch (value) {
|
||||
case 32:
|
||||
@ -459,10 +540,9 @@ int vo_cocoa_cgl_color_size(void)
|
||||
static NSMenuItem *new_menu_item(NSMenu *parent_menu, NSString *title,
|
||||
SEL action, NSString *key_equivalent)
|
||||
{
|
||||
NSMenuItem *new_item = [[NSMenuItem alloc]
|
||||
initWithTitle:title
|
||||
action:action
|
||||
keyEquivalent:key_equivalent];
|
||||
NSMenuItem *new_item =
|
||||
[[NSMenuItem alloc] initWithTitle:title action:action
|
||||
keyEquivalent:key_equivalent];
|
||||
[parent_menu addItem:new_item];
|
||||
return [new_item autorelease];
|
||||
}
|
||||
@ -470,10 +550,9 @@ static NSMenuItem *new_menu_item(NSMenu *parent_menu, NSString *title,
|
||||
static NSMenuItem *new_main_menu_item(NSMenu *parent_menu, NSMenu *child_menu,
|
||||
NSString *title)
|
||||
{
|
||||
NSMenuItem *new_item = [[NSMenuItem alloc]
|
||||
initWithTitle:title
|
||||
action:nil
|
||||
keyEquivalent:@""];
|
||||
NSMenuItem *new_item =
|
||||
[[NSMenuItem alloc] initWithTitle:title action:nil
|
||||
keyEquivalent:@""];
|
||||
[new_item setSubmenu:child_menu];
|
||||
[parent_menu addItem:new_item];
|
||||
return [new_item autorelease];
|
||||
@ -506,26 +585,33 @@ void create_menu()
|
||||
}
|
||||
|
||||
@implementation GLMPlayerWindow
|
||||
|
||||
- (void) windowDidResize:(NSNotification *) notification
|
||||
- (void)setVideoOutput:(struct vo *)vo
|
||||
{
|
||||
if (l_vo)
|
||||
s->did_resize = YES;
|
||||
_vo = vo;
|
||||
}
|
||||
|
||||
- (void) fullscreen
|
||||
- (void)windowDidResize:(NSNotification *) notification
|
||||
{
|
||||
if (_vo) {
|
||||
struct vo_cocoa_state *s = _vo->cocoa;
|
||||
s->did_resize = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)fullscreen
|
||||
{
|
||||
struct vo_cocoa_state *s = _vo->cocoa;
|
||||
if (!vo_fs) {
|
||||
update_screen_info();
|
||||
if (current_screen_has_dock_or_menubar())
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationHideDock|NSApplicationPresentationHideMenuBar];
|
||||
update_screen_info(_vo);
|
||||
if (current_screen_has_dock_or_menubar(_vo))
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationHideDock|
|
||||
NSApplicationPresentationHideMenuBar];
|
||||
s->windowed_frame = [self frame];
|
||||
[self setHasShadow:NO];
|
||||
[self setStyleMask:s->fullscreen_mask];
|
||||
[self setFrame:s->screen_frame display:YES animate:NO];
|
||||
[self setLevel:s->fullscreen_window_level];
|
||||
vo_fs = VO_TRUE;
|
||||
vo_cocoa_display_cursor(0);
|
||||
vo_cocoa_display_cursor(_vo, 0);
|
||||
[self setMovableByWindowBackground: NO];
|
||||
} else {
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationDefault];
|
||||
@ -538,42 +624,44 @@ void create_menu()
|
||||
s->out_fs_resize = NO;
|
||||
}
|
||||
[self setContentAspectRatio:s->current_video_size];
|
||||
[self setLevel:s->windowed_window_level];
|
||||
vo_fs = VO_FALSE;
|
||||
vo_cocoa_display_cursor(1);
|
||||
vo_cocoa_display_cursor(_vo, 1);
|
||||
[self setMovableByWindowBackground: YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL) canBecomeMainWindow { return YES; }
|
||||
- (BOOL) canBecomeKeyWindow { return YES; }
|
||||
- (BOOL) acceptsFirstResponder { return YES; }
|
||||
- (BOOL) becomeFirstResponder { return YES; }
|
||||
- (BOOL) resignFirstResponder { return YES; }
|
||||
- (BOOL) windowShouldClose:(id)sender
|
||||
- (BOOL)canBecomeMainWindow { return YES; }
|
||||
- (BOOL)canBecomeKeyWindow { return YES; }
|
||||
- (BOOL)acceptsFirstResponder { return YES; }
|
||||
- (BOOL)becomeFirstResponder { return YES; }
|
||||
- (BOOL)resignFirstResponder { return YES; }
|
||||
- (BOOL)windowShouldClose:(id)sender
|
||||
{
|
||||
mplayer_put_key(l_vo->key_fifo, KEY_CLOSE_WIN);
|
||||
mplayer_put_key(_vo->key_fifo, KEY_CLOSE_WIN);
|
||||
// We have to wait for MPlayer to handle this,
|
||||
// otherwise we are in trouble if the
|
||||
// KEY_CLOSE_WIN handler is disabled
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL) isMovableByWindowBackground
|
||||
- (BOOL)isMovableByWindowBackground
|
||||
{
|
||||
// this is only valid as a starting value. it will be rewritten in the -fullscreen method.
|
||||
// this is only valid as a starting value. it will be rewritten in the
|
||||
// -fullscreen method.
|
||||
return !vo_fs;
|
||||
}
|
||||
|
||||
- (void) handleQuitEvent:(NSAppleEventDescriptor*)e withReplyEvent:(NSAppleEventDescriptor*)r
|
||||
- (void)handleQuitEvent:(NSAppleEventDescriptor*)e
|
||||
withReplyEvent:(NSAppleEventDescriptor*)r
|
||||
{
|
||||
mplayer_put_key(l_vo->key_fifo, KEY_CLOSE_WIN);
|
||||
mplayer_put_key(_vo->key_fifo, KEY_CLOSE_WIN);
|
||||
}
|
||||
|
||||
- (void) keyDown:(NSEvent *)theEvent
|
||||
- (void)keyDown:(NSEvent *)theEvent
|
||||
{
|
||||
unsigned char charcode;
|
||||
if (([theEvent modifierFlags] & NSRightAlternateKeyMask) == NSRightAlternateKeyMask)
|
||||
if (([theEvent modifierFlags] & NSRightAlternateKeyMask) ==
|
||||
NSRightAlternateKeyMask)
|
||||
charcode = *[[theEvent characters] UTF8String];
|
||||
else
|
||||
charcode = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
|
||||
@ -585,64 +673,65 @@ void create_menu()
|
||||
key |= KEY_MODIFIER_SHIFT;
|
||||
if ([theEvent modifierFlags] & NSControlKeyMask)
|
||||
key |= KEY_MODIFIER_CTRL;
|
||||
if (([theEvent modifierFlags] & NSLeftAlternateKeyMask) == NSLeftAlternateKeyMask)
|
||||
if (([theEvent modifierFlags] & NSLeftAlternateKeyMask) ==
|
||||
NSLeftAlternateKeyMask)
|
||||
key |= KEY_MODIFIER_ALT;
|
||||
if ([theEvent modifierFlags] & NSCommandKeyMask)
|
||||
key |= KEY_MODIFIER_META;
|
||||
mplayer_put_key(l_vo->key_fifo, key);
|
||||
mplayer_put_key(_vo->key_fifo, key);
|
||||
}
|
||||
}
|
||||
|
||||
- (void) mouseMoved: (NSEvent *) theEvent
|
||||
- (void)mouseMoved: (NSEvent *) theEvent
|
||||
{
|
||||
if (vo_fs)
|
||||
vo_cocoa_display_cursor(1);
|
||||
vo_cocoa_display_cursor(_vo, 1);
|
||||
}
|
||||
|
||||
- (void) mouseDragged:(NSEvent *)theEvent
|
||||
- (void)mouseDragged:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) mouseDown:(NSEvent *)theEvent
|
||||
- (void)mouseDown:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) mouseUp:(NSEvent *)theEvent
|
||||
- (void)mouseUp:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) rightMouseDown:(NSEvent *)theEvent
|
||||
- (void)rightMouseDown:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) rightMouseUp:(NSEvent *)theEvent
|
||||
- (void)rightMouseUp:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) otherMouseDown:(NSEvent *)theEvent
|
||||
- (void)otherMouseDown:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) otherMouseUp:(NSEvent *)theEvent
|
||||
- (void)otherMouseUp:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseEvent: theEvent];
|
||||
}
|
||||
|
||||
- (void) scrollWheel:(NSEvent *)theEvent
|
||||
- (void)scrollWheel:(NSEvent *)theEvent
|
||||
{
|
||||
if ([theEvent deltaY] > 0)
|
||||
mplayer_put_key(l_vo->key_fifo, MOUSE_BTN3);
|
||||
mplayer_put_key(_vo->key_fifo, MOUSE_BTN3);
|
||||
else
|
||||
mplayer_put_key(l_vo->key_fifo, MOUSE_BTN4);
|
||||
mplayer_put_key(_vo->key_fifo, MOUSE_BTN4);
|
||||
}
|
||||
|
||||
- (void) mouseEvent:(NSEvent *)theEvent
|
||||
- (void)mouseEvent:(NSEvent *)theEvent
|
||||
{
|
||||
if ([theEvent buttonNumber] >= 0 && [theEvent buttonNumber] <= 9) {
|
||||
int buttonNumber = [theEvent buttonNumber];
|
||||
@ -653,43 +742,39 @@ void create_menu()
|
||||
case NSLeftMouseDown:
|
||||
case NSRightMouseDown:
|
||||
case NSOtherMouseDown:
|
||||
mplayer_put_key(l_vo->key_fifo, (MOUSE_BTN0 + buttonNumber) | MP_KEY_DOWN);
|
||||
mplayer_put_key(_vo->key_fifo,
|
||||
(MOUSE_BTN0 + buttonNumber) | MP_KEY_DOWN);
|
||||
// Looks like Cocoa doesn't create MouseUp events when we are
|
||||
// doing the second click in a double click. Put in the key_fifo
|
||||
// the key that would be put from the MouseUp handling code.
|
||||
if([theEvent clickCount] == 2)
|
||||
mplayer_put_key(l_vo->key_fifo, MOUSE_BTN0 + buttonNumber);
|
||||
mplayer_put_key(_vo->key_fifo, MOUSE_BTN0 + buttonNumber);
|
||||
break;
|
||||
case NSLeftMouseUp:
|
||||
case NSRightMouseUp:
|
||||
case NSOtherMouseUp:
|
||||
mplayer_put_key(l_vo->key_fifo, MOUSE_BTN0 + buttonNumber);
|
||||
mplayer_put_key(_vo->key_fifo, MOUSE_BTN0 + buttonNumber);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void) applicationWillBecomeActive:(NSNotification *)aNotification
|
||||
- (void)applicationWillBecomeActive:(NSNotification *)aNotification
|
||||
{
|
||||
if (vo_fs) {
|
||||
[s->window makeKeyAndOrderFront:s->window];
|
||||
[s->window setLevel:s->fullscreen_window_level];
|
||||
if (current_screen_has_dock_or_menubar())
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationHideDock|
|
||||
NSApplicationPresentationHideMenuBar];
|
||||
if (vo_fs && current_screen_has_dock_or_menubar(_vo)) {
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationHideDock|
|
||||
NSApplicationPresentationHideMenuBar];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) applicationWillResignActive:(NSNotification *)aNotification
|
||||
- (void)applicationWillResignActive:(NSNotification *)aNotification
|
||||
{
|
||||
if (vo_fs) {
|
||||
[NSApp setPresentationOptions:NSApplicationPresentationDefault];
|
||||
[s->window setLevel:s->windowed_window_level];
|
||||
[s->window orderBack:s->window];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) applicationDidFinishLaunching:(NSNotification*)notification
|
||||
- (void)applicationDidFinishLaunching:(NSNotification*)notification
|
||||
{
|
||||
// Install an event handler so the Quit menu entry works
|
||||
// The proper way using NSApp setDelegate: and
|
||||
@ -702,19 +787,21 @@ void create_menu()
|
||||
andEventID:kAEQuitApplication];
|
||||
}
|
||||
|
||||
- (void) normalSize
|
||||
- (void)normalSize
|
||||
{
|
||||
struct vo_cocoa_state *s = _vo->cocoa;
|
||||
if (!vo_fs)
|
||||
[self setContentSize:s->current_video_size keepCentered:YES];
|
||||
[self setContentSize:s->current_video_size keepCentered:YES];
|
||||
}
|
||||
|
||||
- (void) halfSize { [self mulSize:0.5f];}
|
||||
- (void)halfSize { [self mulSize:0.5f];}
|
||||
|
||||
- (void) doubleSize { [self mulSize:2.0f];}
|
||||
- (void)doubleSize { [self mulSize:2.0f];}
|
||||
|
||||
- (void) mulSize:(float)multiplier
|
||||
- (void)mulSize:(float)multiplier
|
||||
{
|
||||
if (!vo_fs) {
|
||||
struct vo_cocoa_state *s = _vo->cocoa;
|
||||
NSSize size = [[self contentView] frame].size;
|
||||
size.width = s->current_video_size.width * (multiplier);
|
||||
size.height = s->current_video_size.height * (multiplier);
|
||||
@ -722,33 +809,41 @@ void create_menu()
|
||||
}
|
||||
}
|
||||
|
||||
- (void) setContentSize:(NSSize)ns keepCentered:(BOOL)keepCentered
|
||||
- (void)setCenteredContentSize:(NSSize)ns
|
||||
{
|
||||
NSRect nf = [self frame];
|
||||
NSRect vf = [[self screen] visibleFrame];
|
||||
NSRect cb = [[self contentView] bounds];
|
||||
int title_height = nf.size.height - cb.size.height;
|
||||
double ratio = (double)ns.width / (double)ns.height;
|
||||
|
||||
// clip the new size to the visibleFrame's size if needed
|
||||
if (ns.width > vf.size.width || ns.height + title_height > vf.size.height) {
|
||||
ns = vf.size;
|
||||
ns.height -= title_height; // make space for the title bar
|
||||
|
||||
if (ns.width > ns.height) {
|
||||
ns.height = ((double)ns.width * 1/ratio + 0.5);
|
||||
} else {
|
||||
ns.width = ((double)ns.height * ratio + 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
int dw = nf.size.width - ns.width;
|
||||
int dh = nf.size.height - ns.height - title_height;
|
||||
|
||||
nf.origin.x += dw / 2;
|
||||
nf.origin.y += dh / 2;
|
||||
|
||||
NSRect new_frame =
|
||||
NSMakeRect(nf.origin.x, nf.origin.y, ns.width, ns.height + title_height);
|
||||
[self setFrame:new_frame display:YES animate:NO];
|
||||
}
|
||||
|
||||
- (void)setContentSize:(NSSize)ns keepCentered:(BOOL)keepCentered
|
||||
{
|
||||
if (keepCentered) {
|
||||
NSRect nf = [self frame];
|
||||
NSRect vf = [[self screen] visibleFrame];
|
||||
int title_height = nf.size.height - [[self contentView] bounds].size.height;
|
||||
double ratio = (double)ns.width / (double)ns.height;
|
||||
|
||||
// clip the new size to the visibleFrame's size if needed
|
||||
if (ns.width > vf.size.width || ns.height + title_height > vf.size.height) {
|
||||
ns = vf.size;
|
||||
ns.height -= title_height; // make space for the title bar
|
||||
|
||||
if (ns.width > ns.height) {
|
||||
ns.height = ((double)ns.width * 1/ratio + 0.5);
|
||||
} else {
|
||||
ns.width = ((double)ns.height * ratio + 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
int dw = nf.size.width - ns.width;
|
||||
int dh = nf.size.height - ns.height - title_height;
|
||||
|
||||
nf.origin.x += dw / 2;
|
||||
nf.origin.y += dh / 2;
|
||||
|
||||
[self setFrame: NSMakeRect(nf.origin.x, nf.origin.y, ns.width, ns.height + title_height) display:YES animate:NO];
|
||||
[self setCenteredContentSize:ns];
|
||||
} else {
|
||||
[self setContentSize:ns];
|
||||
}
|
||||
@ -756,7 +851,7 @@ void create_menu()
|
||||
@end
|
||||
|
||||
@implementation GLMPlayerOpenGLView
|
||||
- (void) drawRect: (NSRect)rect
|
||||
- (void)drawRect: (NSRect)rect
|
||||
{
|
||||
[[NSColor clearColor] set];
|
||||
NSRectFill([self bounds]);
|
||||
|
@ -1996,9 +1996,9 @@ static bool create_window_cocoa(struct MPGLContext *ctx, uint32_t d_width,
|
||||
getFunctions(ctx->gl, (void *)vo_cocoa_glgetaddr, NULL, gl3);
|
||||
|
||||
if (gl3) {
|
||||
ctx->depth_r = vo_cocoa_cgl_color_size();
|
||||
ctx->depth_g = vo_cocoa_cgl_color_size();
|
||||
ctx->depth_b = vo_cocoa_cgl_color_size();
|
||||
ctx->depth_r = vo_cocoa_cgl_color_size(ctx->vo);
|
||||
ctx->depth_g = vo_cocoa_cgl_color_size(ctx->vo);
|
||||
ctx->depth_b = vo_cocoa_cgl_color_size(ctx->vo);
|
||||
}
|
||||
|
||||
if (!ctx->gl->SwapInterval)
|
||||
@ -2025,22 +2025,7 @@ static void releaseGlContext_cocoa(MPGLContext *ctx)
|
||||
|
||||
static void swapGlBuffers_cocoa(MPGLContext *ctx)
|
||||
{
|
||||
vo_cocoa_swap_buffers();
|
||||
}
|
||||
|
||||
static int cocoa_check_events(struct vo *vo)
|
||||
{
|
||||
return vo_cocoa_check_events(vo);
|
||||
}
|
||||
|
||||
static void cocoa_update_xinerama_info(struct vo *vo)
|
||||
{
|
||||
vo_cocoa_update_xinerama_info(vo);
|
||||
}
|
||||
|
||||
static void cocoa_fullscreen(struct vo *vo)
|
||||
{
|
||||
vo_cocoa_fullscreen(vo);
|
||||
vo_cocoa_swap_buffers(ctx->vo);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2532,11 +2517,13 @@ MPGLContext *mpgl_init(enum MPGLType type, struct vo *vo)
|
||||
ctx->create_window_gl3 = create_window_cocoa_gl3;
|
||||
ctx->releaseGlContext = releaseGlContext_cocoa;
|
||||
ctx->swapGlBuffers = swapGlBuffers_cocoa;
|
||||
ctx->check_events = cocoa_check_events;
|
||||
ctx->update_xinerama_info = cocoa_update_xinerama_info;
|
||||
ctx->fullscreen = cocoa_fullscreen;
|
||||
ctx->check_events = vo_cocoa_check_events;
|
||||
ctx->update_xinerama_info = vo_cocoa_update_xinerama_info;
|
||||
ctx->fullscreen = vo_cocoa_fullscreen;
|
||||
ctx->ontop = vo_cocoa_ontop;
|
||||
ctx->vo_init = vo_cocoa_init;
|
||||
ctx->pause = vo_cocoa_pause;
|
||||
ctx->resume = vo_cocoa_resume;
|
||||
ctx->vo_uninit = vo_cocoa_uninit;
|
||||
break;
|
||||
#endif
|
||||
|
@ -217,6 +217,8 @@ typedef struct MPGLContext {
|
||||
uint32_t d_height, uint32_t flags);
|
||||
|
||||
// optional
|
||||
void (*pause)(struct vo *vo);
|
||||
void (*resume)(struct vo *vo);
|
||||
void (*ontop)(struct vo *vo);
|
||||
void (*border)(struct vo *vo);
|
||||
void (*update_xinerama_info)(struct vo *vo);
|
||||
|
@ -243,3 +243,15 @@
|
||||
#define GL_FRAMEBUFFER_SRGB 0x8DB9
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// FreeBSD 10.0-CURRENT lacks the GLX_ARB_create_context extension completely
|
||||
#ifndef GLX_CONTEXT_MAJOR_VERSION_ARB
|
||||
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||
#define GLX_CONTEXT_FLAGS_ARB 0x2094
|
||||
#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||
#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001
|
||||
#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
|
||||
#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
|
||||
#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||
#endif
|
||||
|
@ -250,6 +250,7 @@ struct vo {
|
||||
struct MPOpts *opts;
|
||||
struct vo_x11_state *x11;
|
||||
struct vo_w32_state *w32;
|
||||
struct vo_cocoa_state *cocoa;
|
||||
struct mp_fifo *key_fifo;
|
||||
struct encode_lavc_context *encode_lavc_ctx;
|
||||
struct input_ctx *input_ctx;
|
||||
|
@ -226,8 +226,8 @@ static uint32_t draw_image(struct vo *vo, mp_image_t *mpi)
|
||||
CVReturn error;
|
||||
|
||||
if (!p->textureCache || !p->pixelBuffer) {
|
||||
error = CVOpenGLTextureCacheCreate(NULL, 0, vo_cocoa_cgl_context(),
|
||||
vo_cocoa_cgl_pixel_format(), 0, &p->textureCache);
|
||||
error = CVOpenGLTextureCacheCreate(NULL, 0, vo_cocoa_cgl_context(vo),
|
||||
vo_cocoa_cgl_pixel_format(vo), 0, &p->textureCache);
|
||||
if(error != kCVReturnSuccess)
|
||||
mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL"
|
||||
" texture Cache(%d)\n", error);
|
||||
@ -395,6 +395,16 @@ static int control(struct vo *vo, uint32_t request, void *data)
|
||||
case VOCTRL_ONTOP:
|
||||
p->mpglctx->ontop(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_PAUSE:
|
||||
if (!p->mpglctx->pause)
|
||||
break;
|
||||
p->mpglctx->pause(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_RESUME:
|
||||
if (!p->mpglctx->resume)
|
||||
break;
|
||||
p->mpglctx->resume(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_FULLSCREEN:
|
||||
p->mpglctx->fullscreen(vo);
|
||||
resize(vo, vo->dwidth, vo->dheight);
|
||||
|
@ -145,8 +145,6 @@ typedef struct d3d_priv {
|
||||
fullscreen */
|
||||
int src_width; /**< Source (movie) width */
|
||||
int src_height; /**< Source (movie) heigth */
|
||||
int src_d_width; /**< Source (movie) aspect corrected width */
|
||||
int src_d_height; /**< Source (movie) aspect corrected heigth */
|
||||
int border_x; /**< horizontal border value for OSD */
|
||||
int border_y; /**< vertical border value for OSD */
|
||||
int image_format; /**< mplayer image format */
|
||||
@ -1546,9 +1544,6 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
|
||||
return VO_ERROR;
|
||||
}
|
||||
|
||||
priv->src_d_width = d_width;
|
||||
priv->src_d_height = d_height;
|
||||
|
||||
if ((priv->image_format != format)
|
||||
|| (priv->src_width != width)
|
||||
|| (priv->src_height != height))
|
||||
@ -1806,8 +1801,8 @@ static mp_image_t *get_screenshot(d3d_priv *priv)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
image->w = priv->src_d_width;
|
||||
image->h = priv->src_d_height;
|
||||
image->w = priv->vo->aspdat.prew;
|
||||
image->h = priv->vo->aspdat.preh;
|
||||
|
||||
return image;
|
||||
}
|
||||
|
@ -1773,6 +1773,16 @@ static int control(struct vo *vo, uint32_t request, void *data)
|
||||
break;
|
||||
p->glctx->ontop(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_PAUSE:
|
||||
if (!p->glctx->pause)
|
||||
break;
|
||||
p->glctx->pause(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_RESUME:
|
||||
if (!p->glctx->resume)
|
||||
break;
|
||||
p->glctx->resume(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_FULLSCREEN:
|
||||
p->glctx->fullscreen(vo);
|
||||
resize(p);
|
||||
@ -2348,7 +2358,7 @@ static const char help_text[] =
|
||||
" assumed to be in sRGB.\n"
|
||||
" pbo\n"
|
||||
" Enable use of PBOs. This is faster, but can sometimes lead to\n"
|
||||
" sparodic and temporary image corruption.\n"
|
||||
" sporadic and temporary image corruption.\n"
|
||||
" dither-depth=<n>\n"
|
||||
" Positive non-zero values select the target bit depth.\n"
|
||||
" -1: Disable any dithering done by mpv.\n"
|
||||
|
@ -73,8 +73,6 @@ struct gl_priv {
|
||||
uint32_t image_width;
|
||||
uint32_t image_height;
|
||||
uint32_t image_format;
|
||||
uint32_t image_d_width;
|
||||
uint32_t image_d_height;
|
||||
int many_fmts;
|
||||
int have_texture_rg;
|
||||
int ati_hack;
|
||||
@ -497,8 +495,6 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
|
||||
p->image_height = height;
|
||||
p->image_width = width;
|
||||
p->image_format = format;
|
||||
p->image_d_width = d_width;
|
||||
p->image_d_height = d_height;
|
||||
p->is_yuv = mp_get_chroma_shift(p->image_format, &xs, &ys, NULL) > 0;
|
||||
p->is_yuv |= (xs << 8) | (ys << 16);
|
||||
glFindFormat(format, p->have_texture_rg, NULL, &p->texfmt, &p->gl_format,
|
||||
@ -829,8 +825,8 @@ static mp_image_t *get_screenshot(struct vo *vo)
|
||||
image->width = p->image_width;
|
||||
image->height = p->image_height;
|
||||
|
||||
image->w = p->image_d_width;
|
||||
image->h = p->image_d_height;
|
||||
image->w = vo->aspdat.prew;
|
||||
image->h = vo->aspdat.preh;
|
||||
|
||||
return image;
|
||||
}
|
||||
@ -1134,6 +1130,16 @@ static int control(struct vo *vo, uint32_t request, void *data)
|
||||
case VOCTRL_REDRAW_FRAME:
|
||||
do_render(vo);
|
||||
return true;
|
||||
case VOCTRL_PAUSE:
|
||||
if (!p->glctx->pause)
|
||||
break;
|
||||
p->glctx->pause(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_RESUME:
|
||||
if (!p->glctx->resume)
|
||||
break;
|
||||
p->glctx->resume(vo);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_SCREENSHOT: {
|
||||
struct voctrl_screenshot_args *args = data;
|
||||
if (args->full_window)
|
||||
|
@ -106,8 +106,8 @@ struct vdpctx {
|
||||
uint64_t last_vdp_time;
|
||||
unsigned int last_sync_update;
|
||||
|
||||
/* an extra last output surface is used for OSD and screenshots */
|
||||
VdpOutputSurface output_surfaces[MAX_OUTPUT_SURFACES];
|
||||
VdpOutputSurface screenshot_surface;
|
||||
int num_output_surfaces;
|
||||
struct buffered_video_surface {
|
||||
VdpVideoSurface surface;
|
||||
@ -152,7 +152,6 @@ struct vdpctx {
|
||||
bool dropped_frame;
|
||||
uint64_t dropped_time;
|
||||
uint32_t vid_width, vid_height;
|
||||
uint32_t vid_d_width, vid_d_height;
|
||||
uint32_t image_format;
|
||||
VdpChromaType vdp_chroma_type;
|
||||
VdpYCbCrFormat vdp_pixel_format;
|
||||
@ -390,20 +389,17 @@ static void resize(struct vo *vo)
|
||||
int flip_offset_ms = vo_fs ? vc->flip_offset_fs : vc->flip_offset_window;
|
||||
vo->flip_queue_offset = flip_offset_ms / 1000.;
|
||||
|
||||
int min_output_width = FFMAX(vo->dwidth, vc->vid_width);
|
||||
int min_output_height = FFMAX(vo->dheight, vc->vid_height);
|
||||
|
||||
if (vc->output_surface_width < min_output_width
|
||||
|| vc->output_surface_height < min_output_height) {
|
||||
if (vc->output_surface_width < min_output_width) {
|
||||
if (vc->output_surface_width < vo->dwidth
|
||||
|| vc->output_surface_height < vo->dheight) {
|
||||
if (vc->output_surface_width < vo->dwidth) {
|
||||
vc->output_surface_width += vc->output_surface_width >> 1;
|
||||
vc->output_surface_width = FFMAX(vc->output_surface_width,
|
||||
min_output_width);
|
||||
vo->dwidth);
|
||||
}
|
||||
if (vc->output_surface_height < min_output_height) {
|
||||
if (vc->output_surface_height < vo->dheight) {
|
||||
vc->output_surface_height += vc->output_surface_height >> 1;
|
||||
vc->output_surface_height = FFMAX(vc->output_surface_height,
|
||||
min_output_height);
|
||||
vo->dheight);
|
||||
}
|
||||
// Creation of output_surfaces
|
||||
for (int i = 0; i < vc->num_output_surfaces; i++)
|
||||
@ -705,6 +701,12 @@ static void free_video_specific(struct vo *vo)
|
||||
CHECK_ST_WARNING("Error when calling vdp_video_mixer_destroy");
|
||||
}
|
||||
vc->video_mixer = VDP_INVALID_HANDLE;
|
||||
|
||||
if (vc->screenshot_surface != VDP_INVALID_HANDLE) {
|
||||
vdp_st = vdp->output_surface_destroy(vc->screenshot_surface);
|
||||
CHECK_ST_WARNING("Error when calling vdp_output_surface_destroy");
|
||||
}
|
||||
vc->screenshot_surface = VDP_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
static int create_vdp_decoder(struct vo *vo, int max_refs)
|
||||
@ -800,6 +802,7 @@ static void mark_vdpau_objects_uninitialized(struct vo *vo)
|
||||
vc->flip_target = VDP_INVALID_HANDLE;
|
||||
for (int i = 0; i < MAX_OUTPUT_SURFACES; i++)
|
||||
vc->output_surfaces[i] = VDP_INVALID_HANDLE;
|
||||
vc->screenshot_surface = VDP_INVALID_HANDLE;
|
||||
vc->vdp_device = VDP_INVALID_HANDLE;
|
||||
for (int i = 0; i < MAX_OSD_PARTS; i++) {
|
||||
struct osd_bitmap_surface *sfc = &vc->osd_surfaces[i];
|
||||
@ -869,8 +872,6 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
|
||||
vc->image_format = format;
|
||||
vc->vid_width = width;
|
||||
vc->vid_height = height;
|
||||
vc->vid_d_width = d_width;
|
||||
vc->vid_d_height = d_height;
|
||||
|
||||
free_video_specific(vo);
|
||||
if (IMGFMT_IS_VDPAU(vc->image_format) && !create_vdp_decoder(vo, 2))
|
||||
@ -1358,12 +1359,12 @@ static void draw_image(struct vo *vo, mp_image_t *mpi, double pts)
|
||||
// warning: the size and pixel format of surface must match that of the
|
||||
// surfaces in vc->output_surfaces
|
||||
static struct mp_image *read_output_surface(struct vdpctx *vc,
|
||||
VdpOutputSurface surface)
|
||||
VdpOutputSurface surface,
|
||||
int width, int height)
|
||||
{
|
||||
VdpStatus vdp_st;
|
||||
struct vdp_functions *vdp = vc->vdp;
|
||||
struct mp_image *image = alloc_mpi(vc->output_surface_width,
|
||||
vc->output_surface_height, IMGFMT_BGR32);
|
||||
struct mp_image *image = alloc_mpi(width, height, IMGFMT_BGR32);
|
||||
|
||||
void *dst_planes[] = { image->planes[0] };
|
||||
uint32_t dst_pitches[] = { image->stride[0] };
|
||||
@ -1377,19 +1378,27 @@ static struct mp_image *read_output_surface(struct vdpctx *vc,
|
||||
static struct mp_image *get_screenshot(struct vo *vo)
|
||||
{
|
||||
struct vdpctx *vc = vo->priv;
|
||||
VdpStatus vdp_st;
|
||||
struct vdp_functions *vdp = vc->vdp;
|
||||
|
||||
VdpOutputSurface screenshot_surface =
|
||||
vc->output_surfaces[vc->num_output_surfaces];
|
||||
if (vc->screenshot_surface == VDP_INVALID_HANDLE) {
|
||||
vdp_st = vdp->output_surface_create(vc->vdp_device,
|
||||
OUTPUT_RGBA_FORMAT,
|
||||
vc->vid_width, vc->vid_height,
|
||||
&vc->screenshot_surface);
|
||||
CHECK_ST_WARNING("Error when calling vdp_output_surface_create");
|
||||
}
|
||||
|
||||
VdpRect rc = { .x1 = vc->vid_width, .y1 = vc->vid_height };
|
||||
render_video_to_output_surface(vo, screenshot_surface, &rc);
|
||||
render_video_to_output_surface(vo, vc->screenshot_surface, &rc);
|
||||
|
||||
struct mp_image *image = read_output_surface(vc, screenshot_surface);
|
||||
struct mp_image *image = read_output_surface(vc, vc->screenshot_surface,
|
||||
vc->vid_width, vc->vid_height);
|
||||
|
||||
image->width = vc->vid_width;
|
||||
image->height = vc->vid_height;
|
||||
image->w = vc->vid_d_width;
|
||||
image->h = vc->vid_d_height;
|
||||
image->w = vo->aspdat.prew;
|
||||
image->h = vo->aspdat.preh;
|
||||
|
||||
return image;
|
||||
}
|
||||
@ -1399,7 +1408,9 @@ static struct mp_image *get_window_screenshot(struct vo *vo)
|
||||
struct vdpctx *vc = vo->priv;
|
||||
int last_surface = WRAP_ADD(vc->surface_num, -1, vc->num_output_surfaces);
|
||||
VdpOutputSurface screen = vc->output_surfaces[last_surface];
|
||||
struct mp_image *image = read_output_surface(vo->priv, screen);
|
||||
struct mp_image *image = read_output_surface(vo->priv, screen,
|
||||
vc->output_surface_width,
|
||||
vc->output_surface_height);
|
||||
image->width = image->w = vo->dwidth;
|
||||
image->height = image->h = vo->dheight;
|
||||
return image;
|
||||
|
@ -76,8 +76,6 @@ struct xvctx {
|
||||
uint32_t image_width;
|
||||
uint32_t image_height;
|
||||
uint32_t image_format;
|
||||
uint32_t image_d_width;
|
||||
uint32_t image_d_height;
|
||||
int is_paused;
|
||||
struct vo_rect src_rect;
|
||||
struct vo_rect dst_rect;
|
||||
@ -123,8 +121,6 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
|
||||
ctx->image_height = height;
|
||||
ctx->image_width = width;
|
||||
ctx->image_format = format;
|
||||
ctx->image_d_width = d_width;
|
||||
ctx->image_d_height = d_height;
|
||||
|
||||
if ((ctx->max_width != 0 && ctx->max_height != 0)
|
||||
&& (ctx->image_width > ctx->max_width
|
||||
@ -426,8 +422,8 @@ static mp_image_t *get_screenshot(struct vo *vo)
|
||||
// try to get an image without OSD
|
||||
int id = ctx->have_image_copy ? ctx->num_buffers : ctx->visible_buf;
|
||||
struct mp_image img = get_xv_buffer(vo, id);
|
||||
img.w = ctx->image_d_width;
|
||||
img.h = ctx->image_d_height;
|
||||
img.w = vo->aspdat.prew;
|
||||
img.h = vo->aspdat.preh;
|
||||
|
||||
return talloc_memdup(NULL, &img, sizeof(img));
|
||||
}
|
||||
@ -462,7 +458,7 @@ static uint32_t draw_image(struct vo *vo, mp_image_t *mpi)
|
||||
static int query_format(struct xvctx *ctx, uint32_t format)
|
||||
{
|
||||
uint32_t i;
|
||||
int flag = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_OSD | VFCAP_ACCEPT_STRIDE; // FIXME! check for DOWN
|
||||
int flag = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_ACCEPT_STRIDE; // FIXME! check for DOWN
|
||||
|
||||
/* check image formats */
|
||||
for (i = 0; i < ctx->formats; i++) {
|
||||
|
22
mplayer.c
22
mplayer.c
@ -1106,19 +1106,11 @@ static void print_status(struct MPContext *mpctx, double a_pos, bool at_frame)
|
||||
saddf(line, width, ":");
|
||||
|
||||
// Playback position
|
||||
double cur = MP_NOPTS_VALUE;
|
||||
if (mpctx->sh_audio && a_pos != MP_NOPTS_VALUE) {
|
||||
cur = a_pos;
|
||||
} else if (mpctx->sh_video && mpctx->video_pts != MP_NOPTS_VALUE) {
|
||||
cur = mpctx->video_pts;
|
||||
}
|
||||
if (cur != MP_NOPTS_VALUE) {
|
||||
saddf(line, width, " %.1f ", cur);
|
||||
saddf(line, width, "(");
|
||||
sadd_hhmmssff(line, width, cur, mpctx->opts.osd_fractions);
|
||||
saddf(line, width, ")");
|
||||
} else
|
||||
saddf(line, width, " ???");
|
||||
double cur = get_current_time(mpctx);
|
||||
saddf(line, width, " %.1f ", cur);
|
||||
saddf(line, width, "(");
|
||||
sadd_hhmmssff(line, width, cur, mpctx->opts.osd_fractions);
|
||||
saddf(line, width, ")");
|
||||
|
||||
double len = get_time_length(mpctx);
|
||||
if (len >= 0) {
|
||||
@ -2845,7 +2837,9 @@ double get_current_time(struct MPContext *mpctx)
|
||||
double apts = playing_audio_pts(mpctx);
|
||||
if (apts != MP_NOPTS_VALUE)
|
||||
return apts;
|
||||
return mpctx->last_seek_pts;
|
||||
if (mpctx->last_seek_pts != MP_NOPTS_VALUE)
|
||||
return mpctx->last_seek_pts;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_percent_pos(struct MPContext *mpctx)
|
||||
|
@ -125,7 +125,7 @@ static char *mangle_ass(const char *in)
|
||||
char *res = talloc_strdup(NULL, "");
|
||||
while (*in) {
|
||||
// As used by osd_get_function_sym().
|
||||
if (in[0] == '\xFF') {
|
||||
if (in[0] == '\xFF' && in[1]) {
|
||||
res = talloc_strdup_append_buffer(res, ASS_USE_OSD_FONT);
|
||||
res = append_utf8_buffer(res, OSD_CODEPOINTS + in[1]);
|
||||
res = talloc_strdup_append_buffer(res, "{\\r}");
|
||||
@ -137,7 +137,7 @@ static char *mangle_ass(const char *in)
|
||||
res = talloc_strndup_append_buffer(res, in, 1);
|
||||
// Break ASS escapes with U+2060 WORD JOINER
|
||||
if (*in == '\\')
|
||||
append_utf8_buffer(res, 0x2060);
|
||||
res = append_utf8_buffer(res, 0x2060);
|
||||
in++;
|
||||
}
|
||||
return res;
|
||||
|
Loading…
Reference in New Issue
Block a user