Merge branch 'master' into osd_changes

Conflicts:
	libvo/vo_xv.c
This commit is contained in:
wm4 2012-10-24 22:38:45 +02:00
commit 0e81d62c53
41 changed files with 1400 additions and 446 deletions

1
.gitignore vendored
View File

@ -8,6 +8,7 @@
/config.mak
/config.log
/mpv
/mpv.app
/version.h
/codecs.conf.h
/input/input_conf.h

View File

@ -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
View 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"))

View 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>

View File

@ -0,0 +1 @@
APPL????

Binary file not shown.

Binary file not shown.

Binary file not shown.

15
TOOLS/osxbundle/version.sh Executable file
View 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
View File

@ -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'

View File

@ -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
View 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

View File

@ -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},

View File

@ -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},

View File

@ -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.

View File

@ -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;

View File

@ -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"\

View File

@ -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--;
}

View File

@ -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 */

View File

@ -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);
}

View File

@ -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

View File

@ -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; }

View File

@ -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 */

View File

@ -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]);

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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"

View File

@ -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)

View File

@ -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;

View File

@ -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++) {

View File

@ -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)

View File

@ -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;