diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2016-04-29 09:20:45 +0200 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2016-04-29 09:20:45 +0200 |
commit | ebefcd0c62689579b6c013e5d1b32f58cea23b37 (patch) | |
tree | ad03b2562df9c7d4c12122c64e589e2fd0f6a93a | |
parent | 84284a877734d775b1bc541b2b4264ad5bc1cf14 (diff) |
VideoPlayer: iOS, drop old videotoolbox decoder infaviour of ffmpeg
-rw-r--r-- | Kodi.xcodeproj/project.pbxproj | 43 | ||||
-rw-r--r-- | configure.ac | 53 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/DVDFactoryCodec.cpp | 6 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 6 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp | 1704 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h | 89 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp | 2 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTB.cpp | 3 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp | 4 | ||||
-rw-r--r-- | xbmc/platform/darwin/DarwinUtils.mm | 38 | ||||
-rw-r--r-- | xbmc/settings/SettingConditions.cpp | 7 |
11 files changed, 45 insertions, 1910 deletions
diff --git a/Kodi.xcodeproj/project.pbxproj b/Kodi.xcodeproj/project.pbxproj index 1d43355aeb..0596e0ef1f 100644 --- a/Kodi.xcodeproj/project.pbxproj +++ b/Kodi.xcodeproj/project.pbxproj @@ -678,7 +678,6 @@ 7CCF7FC9106A0DF500992676 /* TimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */; }; 7CD46A141CCDEA7500BF4AD4 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CD46A131CCDEA7500BF4AD4 /* VideoToolbox.framework */; }; 7CD46A161CCDF09500BF4AD4 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CD46A151CCDF09500BF4AD4 /* CoreMedia.framework */; }; - 7CD46A191CCDF21300BF4AD4 /* VTB.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CD46A181CCDF21300BF4AD4 /* VTB.cpp */; }; 7CD4F7EC1C60DBC10015214B /* VideoFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CD4F7EA1C60DBC10015214B /* VideoFileItemListModifier.cpp */; }; 7CD4F7ED1C60DBC10015214B /* VideoFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CD4F7EA1C60DBC10015214B /* VideoFileItemListModifier.cpp */; }; 7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */; }; @@ -687,6 +686,10 @@ 7CE3FB901C9D40EA00366A4C /* ServiceBroker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CE3FB8E1C9D40EA00366A4C /* ServiceBroker.cpp */; }; 7CE3FB911C9D40EA00366A4C /* ServiceBroker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CE3FB8E1C9D40EA00366A4C /* ServiceBroker.cpp */; }; 7CEBD8A80F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */; }; + 7CED59391CD340460093F573 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CED59381CD340460093F573 /* VideoToolbox.framework */; }; + 7CED593A1CD340460093F573 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CED59381CD340460093F573 /* VideoToolbox.framework */; }; + 7CED593D1CD341280093F573 /* VTB.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CED593B1CD341280093F573 /* VTB.cpp */; }; + 7CED593E1CD341280093F573 /* VTB.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CED593B1CD341280093F573 /* VTB.cpp */; }; 7CEE587D1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */; }; 7CEE587E1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */; }; 7CF0504B190A1D7200222135 /* FFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05049190A1D7200222135 /* FFmpeg.cpp */; }; @@ -2151,7 +2154,6 @@ E499158A174E68D800741B6D /* LinuxRendererGLES.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4991588174E68D700741B6D /* LinuxRendererGLES.cpp */; }; E499158B174E68EE00741B6D /* DVDCodecUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15220D25F9F900618676 /* DVDCodecUtils.cpp */; }; E499158C174E68EE00741B6D /* DVDFactoryCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15240D25F9F900618676 /* DVDFactoryCodec.cpp */; }; - E4991591174E6ABE00741B6D /* DVDVideoCodecVideoToolBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E499158F174E6ABD00741B6D /* DVDVideoCodecVideoToolBox.cpp */; }; E4991592174E6B5C00741B6D /* fstrcmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CBEBB8212912BA300431822 /* fstrcmp.c */; }; E4991596174E70BF00741B6D /* yuv2rgb.neon.S in Sources */ = {isa = PBXBuildFile; fileRef = E4991595174E70BF00741B6D /* yuv2rgb.neon.S */; }; E49ACD8C100745C400A86ECD /* ZeroconfDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49ACD8B100745C400A86ECD /* ZeroconfDirectory.cpp */; }; @@ -3387,8 +3389,6 @@ 7CCF7FC8106A0DF500992676 /* TimeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeUtils.h; sourceTree = "<group>"; }; 7CD46A131CCDEA7500BF4AD4 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; 7CD46A151CCDF09500BF4AD4 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7CD46A171CCDF1FD00BF4AD4 /* VTB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VTB.h; sourceTree = "<group>"; }; - 7CD46A181CCDF21300BF4AD4 /* VTB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VTB.cpp; sourceTree = "<group>"; }; 7CD4F7EA1C60DBC10015214B /* VideoFileItemListModifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoFileItemListModifier.cpp; sourceTree = "<group>"; }; 7CD4F7EB1C60DBC10015214B /* VideoFileItemListModifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoFileItemListModifier.h; sourceTree = "<group>"; }; 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDTSCorrection.cpp; sourceTree = "<group>"; }; @@ -3399,6 +3399,9 @@ 7CE3FB8F1C9D40EA00366A4C /* ServiceBroker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceBroker.h; sourceTree = "<group>"; }; 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialProtocolDirectory.cpp; sourceTree = "<group>"; }; 7CEBD8A70F33A0D800CAF6AD /* SpecialProtocolDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpecialProtocolDirectory.h; sourceTree = "<group>"; }; + 7CED59381CD340460093F573 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; + 7CED593B1CD341280093F573 /* VTB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VTB.cpp; sourceTree = "<group>"; }; + 7CED593C1CD341280093F573 /* VTB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VTB.h; sourceTree = "<group>"; }; 7CEE107B1C970BB800E0D426 /* kodi_inputstream_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = kodi_inputstream_dll.h; path = "kodi-addon-dev-kit/include/kodi/kodi_inputstream_dll.h"; sourceTree = "<group>"; }; 7CEE107C1C970BB800E0D426 /* kodi_inputstream_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = kodi_inputstream_types.h; path = "kodi-addon-dev-kit/include/kodi/kodi_inputstream_types.h"; sourceTree = "<group>"; }; 7CEE107D1C970BB800E0D426 /* libKODI_inputstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libKODI_inputstream.h; path = "kodi-addon-dev-kit/include/kodi/libKODI_inputstream.h"; sourceTree = "<group>"; }; @@ -4743,8 +4746,6 @@ E4991573174E661300741B6D /* WinSystemIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WinSystemIOS.mm; path = osx/WinSystemIOS.mm; sourceTree = "<group>"; }; E4991588174E68D700741B6D /* LinuxRendererGLES.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LinuxRendererGLES.cpp; sourceTree = "<group>"; }; E4991589174E68D800741B6D /* LinuxRendererGLES.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinuxRendererGLES.h; sourceTree = "<group>"; }; - E499158F174E6ABD00741B6D /* DVDVideoCodecVideoToolBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDVideoCodecVideoToolBox.cpp; sourceTree = "<group>"; }; - E4991590174E6ABE00741B6D /* DVDVideoCodecVideoToolBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDVideoCodecVideoToolBox.h; sourceTree = "<group>"; }; E4991594174E70BE00741B6D /* yuv2rgb.neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv2rgb.neon.h; sourceTree = "<group>"; }; E4991595174E70BF00741B6D /* yuv2rgb.neon.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = yuv2rgb.neon.S; sourceTree = "<group>"; }; E49ACD8A100745C400A86ECD /* ZeroconfDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZeroconfDirectory.h; sourceTree = "<group>"; }; @@ -5034,6 +5035,7 @@ E33466A60D2E5103005A65EC /* IOKit.framework in Frameworks */, F5364E05155B3CAF0016D00B /* IOSurface.framework in Frameworks */, E38E23980D2626E600618676 /* OpenGL.framework in Frameworks */, + 7CED59391CD340460093F573 /* VideoToolbox.framework in Frameworks */, F59879080FBAA0C3008EF4FB /* QuartzCore.framework in Frameworks */, F52A733D1560BC34005B1A0B /* CoreFoundation.framework in Frameworks */, DFBE805115F7D75700D7D102 /* SystemConfiguration.framework in Frameworks */, @@ -5052,6 +5054,7 @@ E49910E9174E54C300741B6D /* CoreVideo.framework in Frameworks */, E49910E7174E54B400741B6D /* CoreMedia.framework in Frameworks */, E49910E5174E54A100741B6D /* OpenGLES.framework in Frameworks */, + 7CED593A1CD340460093F573 /* VideoToolbox.framework in Frameworks */, E49910E3174E549400741B6D /* QuartzCore.framework in Frameworks */, E499108C174D0D2600741B6D /* UIKit.framework in Frameworks */, E499108E174D0D2600741B6D /* Foundation.framework in Frameworks */, @@ -7974,12 +7977,10 @@ E38E153C0D25F9F900618676 /* DVDVideoCodec.h */, E38E153D0D25F9F900618676 /* DVDVideoCodecFFmpeg.cpp */, E38E153E0D25F9F900618676 /* DVDVideoCodecFFmpeg.h */, - E499158F174E6ABD00741B6D /* DVDVideoCodecVideoToolBox.cpp */, - E4991590174E6ABE00741B6D /* DVDVideoCodecVideoToolBox.h */, E38E15410D25F9F900618676 /* DVDVideoPPFFmpeg.cpp */, E38E15420D25F9F900618676 /* DVDVideoPPFFmpeg.h */, - 7CD46A171CCDF1FD00BF4AD4 /* VTB.h */, - 7CD46A181CCDF21300BF4AD4 /* VTB.cpp */, + 7CED593C1CD341280093F573 /* VTB.h */, + 7CED593B1CD341280093F573 /* VTB.cpp */, ); path = Video; sourceTree = "<group>"; @@ -8866,6 +8867,7 @@ E49910F6174E55D400741B6D /* iOS */ = { isa = PBXGroup; children = ( + 7CED59381CD340460093F573 /* VideoToolbox.framework */, E49910EC174E54D200741B6D /* AudioToolbox.framework */, E49910F2174E54FB00741B6D /* AVFoundation.framework */, E49910F0174E54EC00741B6D /* CFNetwork.framework */, @@ -9385,6 +9387,11 @@ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { + TargetAttributes = { + E4991088174D0D2600741B6D = { + DevelopmentTeam = 4489HXHVBM; + }; + }; }; buildConfigurationList = 1DEB924B08733DCA0010E9CD /* Build configuration list for PBXProject "Kodi" */; compatibilityVersion = "Xcode 3.2"; @@ -10225,7 +10232,6 @@ 433219D812E4C6A500CD7486 /* udf25.cpp in Sources */, 433219D912E4C6A500CD7486 /* UDFDirectory.cpp in Sources */, 7C4705AE12EF584C00369E51 /* AddonInstaller.cpp in Sources */, - 7CD46A191CCDF21300BF4AD4 /* VTB.cpp in Sources */, 18C1D22D13033F6A00CFFE59 /* GLUtils.cpp in Sources */, F56579AF13060D1E0085ED7F /* RenderCapture.cpp in Sources */, 7C84A59E12FA3C1600CD1714 /* SourcesDirectory.cpp in Sources */, @@ -10371,6 +10377,7 @@ C84828D5156CFCD8005A996F /* PVRGUIInfo.cpp in Sources */, C84828D6156CFCD8005A996F /* PVRManager.cpp in Sources */, C84828D8156CFCD8005A996F /* PVRRecording.cpp in Sources */, + 7CED593D1CD341280093F573 /* VTB.cpp in Sources */, C84828D9156CFCD8005A996F /* PVRRecordings.cpp in Sources */, C84828DB156CFCD8005A996F /* PVRTimerInfoTag.cpp in Sources */, C84828DC156CFCD8005A996F /* PVRTimers.cpp in Sources */, @@ -10769,6 +10776,7 @@ 68AE5C1C1C92438E00C4D527 /* GUIControllerButton.cpp in Sources */, E499116A174E5CC300741B6D /* recvol.cpp in Sources */, E499116B174E5CC300741B6D /* resource.cpp in Sources */, + 7CED593E1CD341280093F573 /* VTB.cpp in Sources */, E499116C174E5CC300741B6D /* rijndael.cpp in Sources */, E499116D174E5CC300741B6D /* rs.cpp in Sources */, E499116E174E5CC300741B6D /* savepos.cpp in Sources */, @@ -11646,7 +11654,6 @@ E499158A174E68D800741B6D /* LinuxRendererGLES.cpp in Sources */, E499158B174E68EE00741B6D /* DVDCodecUtils.cpp in Sources */, E499158C174E68EE00741B6D /* DVDFactoryCodec.cpp in Sources */, - E4991591174E6ABE00741B6D /* DVDVideoCodecVideoToolBox.cpp in Sources */, E4991592174E6B5C00741B6D /* fstrcmp.c in Sources */, E4991596174E70BF00741B6D /* yuv2rgb.neon.S in Sources */, 0E3036ED1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */, @@ -12007,8 +12014,8 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -12017,6 +12024,8 @@ GCC_C_LANGUAGE_STANDARD = gnu99; INFOPLIST_FILE = "$(SRCROOT)/xbmc/platform/darwin/ios/Info.plist"; INSTALL_PATH = "$(HOME)/Library/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = org.xbmc.fernet; + PROVISIONING_PROFILE = ""; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; @@ -12032,8 +12041,8 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -12041,6 +12050,8 @@ ); GCC_C_LANGUAGE_STANDARD = gnu99; INFOPLIST_FILE = "$(SRCROOT)/xbmc/platform/darwin/ios/Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = org.xbmc.fernet; + PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; diff --git a/configure.ac b/configure.ac index 39b1c15338..1e0d44a24b 100644 --- a/configure.ac +++ b/configure.ac @@ -84,7 +84,7 @@ AC_DEFUN([XB_FIND_SONAME], for path in $gcc_lib_path $env_lib_path $host_lib_path; do lib=[`ls -- $path/lib$2.dylib 2>/dev/null`] if test x$lib != x; then - # we want the path/name that is embedded in the dylib + # we want the path/name that is embedded in the dylib $1_FILENAME=[`otool -L $lib | grep -v lib$2.dylib | grep lib$2 | awk '{V=1; print $V}'`] $1_SONAME=[`basename $$1_FILENAME`] fi @@ -184,8 +184,6 @@ vdpau_not_found="== Could not find libvdpau. VDPAU support disabled. ==" vdpau_disabled="== VDPAU support manually disabled. ==" vaapi_not_found="== Could not find libva. VAAPI support disabled. ==" vaapi_disabled="== VAAPI support manually disabled. ==" -vtbdecoder_enabled="== VTBDecoder support enabled. ==" -vtbdecoder_disabled="== VTBDecoder support manually disabled. ==" openmax_disabled="== OpenMax support manually disabled. ==" openmax_not_found="== Could not find OpenMax headers. OpenMax support disabled. ==" librtmp_not_found="== Could not find libRTMP. RTMP support disabled. ==" @@ -271,12 +269,6 @@ AC_ARG_ENABLE([vaapi], [use_vaapi=$enableval], [use_vaapi=auto]) -AC_ARG_ENABLE([vtbdecoder], - [AS_HELP_STRING([--enable-vtbdecoder], - [enable VTBDecoder decoding (default is auto)])], - [use_vtbdecoder=$enableval], - [use_vtbdecoder=auto]) - AC_ARG_ENABLE([openmax], [AS_HELP_STRING([--enable-openmax], [enable OpenMax decoding (default is auto, requires OpenGLES)])], @@ -378,7 +370,7 @@ AC_ARG_ENABLE([avahi], [disable Avahi support (default is enabled if libavahi-common and libavahi-client is found)])], [use_avahi=$enableval], [use_avahi=yes]) - + AC_ARG_ENABLE([mdnsembedded], [AS_HELP_STRING([--disable-mdnsembedded], [disable mDNSEmbedded support (default is auto)])], @@ -533,7 +525,7 @@ case $host in use_gles=yes use_optical_drive=no use_x11=no - build_shared_lib=yes + build_shared_lib=yes ;; i*86*-linux-gnu*|i*86*-*-linux-uclibc*) target_platform=target_linux @@ -584,7 +576,6 @@ case $host in CORE_SYSTEM_NAME=ios use_neon=yes use_libcec=no - use_vtbdecoder=yes use_optical_drive=no use_gles=yes use_cpu=cortex-a8 @@ -600,14 +591,12 @@ case $host in ;; *86*-apple-darwin*) CORE_SYSTEM_NAME=osx - use_vtbdecoder=no ARCH="x86-osx" DEPENDS_ROOT_FOR_XCODE=$(echo ${prefix%/*}) AC_SUBST([DEPENDS_ROOT_FOR_XCODE]) ;; powerpc-apple-darwin*) CORE_SYSTEM_NAME=osx - use_vtbdecoder=no ARCH="powerpc-osx" use_arch="ppc" DEPENDS_ROOT_FOR_XCODE=$(echo ${prefix%/*}) @@ -793,7 +782,7 @@ elif test "$use_arch" = "arm"; then CFLAGS="$CFLAGS -mno-apcs-stack-check" CXXFLAGS="$CXXFLAGS -mno-apcs-stack-check" if test "$use_tegra" = "yes"; then - # Compile for ARMv7a architecture, need to test gcc for vfpv3-d16 support + # Compile for ARMv7a architecture, need to test gcc for vfpv3-d16 support SAVE_CFLAGS="$CFLAGS" CFLAGS="-mfpu=vfpv3-d16" AC_COMPILE_IFELSE( @@ -802,10 +791,10 @@ elif test "$use_arch" = "arm"; then CXXFLAGS="$CXXFLAGS -Wno-psabi -Wa,-march=armv7a -mtune=cortex-a9 -mfpu=vfpv3-d16 -mthumb-interwork" use_cpu=cortex-a9], [ CFLAGS="$SAVE_CFLAGS -Wa,-march=armv6 -mtune=cortex-a8 -mthumb-interwork" - CXXFLAGS="$CXXFLAGS -Wa,-march=armv6 -mtune=cortex-a8 -mthumb-interwork" + CXXFLAGS="$CXXFLAGS -Wa,-march=armv6 -mtune=cortex-a8 -mthumb-interwork" use_cpu=cortex-a8]) else - if test "$use_neon" = "yes"; then + if test "$use_neon" = "yes"; then CFLAGS="$CFLAGS -mfpu=neon -mvectorize-with-neon-quad" CXXFLAGS="$CXXFLAGS -mfpu=neon -mvectorize-with-neon-quad" fi @@ -1578,7 +1567,7 @@ fi if test "$FFMPEG_FOUND" != "true"; then PKG_CHECK_MODULES([FFMPEG], [$FFMPEG_LIBNAMES], - [INCLUDES="$INCLUDES $FFMPEG_CFLAGS"; LIBS="$LIBS $FFMPEG_LIBS"; FFMPEG_FOUND="true"], + [INCLUDES="$INCLUDES $FFMPEG_CFLAGS"; LIBS="$LIBS $FFMPEG_LIBS"; FFMPEG_FOUND="true"], [AC_MSG_ERROR("ffmpeg not found")]) fi @@ -1687,24 +1676,6 @@ else USE_VAAPI=0 fi -# VTBDecoder -if test "x$use_vtbdecoder" != "xno"; then - if test "$host_vendor" = "apple" ; then - HAVE_VIDEOTOOLBOXDECODER=1 - AC_DEFINE([HAVE_VIDEOTOOLBOXDECODER], [1], [Define to 1 if you have the 'VTBDecoder' library.]) - AC_MSG_NOTICE($vtbdecoder_enabled) - else - if test "x$use_vtbdecoder" = "xyes"; then - AC_MSG_ERROR([VTB Decoder not supported on this platform]) - else - use_vtbdecoder="no" - AC_MSG_NOTICE($vtbdecoder_disabled) - fi - fi -else - AC_MSG_NOTICE($vtbdecoder_disabled) -fi - # OpenMax if test "$use_gles" = "yes" && test "$use_openmax" = "auto"; then @@ -1886,12 +1857,6 @@ else final_message="$final_message\n VAAPI:\tNo" fi -if test "x$use_vtbdecoder" != "xno"; then - final_message="$final_message\n VTBDecoder:\tYes" -else - final_message="$final_message\n VTBDecoder:\tNo" -fi - if test "$use_openmax" != "no"; then final_message="$final_message\n OpenMax:\tYes" else @@ -2073,7 +2038,7 @@ else fi if test "x$use_airtunes" != "xno"; then - final_message="$final_message\n AirTunes support (libshairplay):\tYes" + final_message="$final_message\n AirTunes support (libshairplay):\tYes" else final_message="$final_message\n AirTunes support:\tNo" fi @@ -2387,7 +2352,7 @@ XB_CONFIG_MODULE([lib/cpluff], [ --host=$host_alias \ --build=$build_alias \ --target=$target_alias CFLAGS="$CFLAGS" CC="$CC" CXX="$CXX" LDFLAGS="$LDFLAGS" LIBS="" - #LDFLAGS="$LDFLAGS -Wl,-read_only_relocs,suppress" + #LDFLAGS="$LDFLAGS -Wl,-read_only_relocs,suppress" ], [0]) XB_CONFIG_MODULE([lib/gtest], [ diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/DVDFactoryCodec.cpp index 355257c8ea..5206cfaf2e 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/DVDFactoryCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/DVDFactoryCodec.cpp @@ -27,10 +27,6 @@ #include "Overlay/DVDOverlayCodec.h" #include "cores/VideoPlayer/DVDCodecs/DVDCodecs.h" -#if defined(HAVE_VIDEOTOOLBOXDECODER) -#include "Video/DVDVideoCodecVideoToolBox.h" -#include "utils/SystemInfo.h" -#endif #include "Video/DVDVideoCodecFFmpeg.h" #include "Video/DVDVideoCodecOpenMax.h" #if defined(HAS_IMXVPU) @@ -150,8 +146,6 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, CProces #if defined(HAS_IMXVPU) pCodec = OpenCodec(new CDVDVideoCodecIMX(processInfo), hint, options); -#elif defined(HAVE_VIDEOTOOLBOXDECODER) - pCodec = OpenCodec(new CDVDVideoCodecVideoToolBox(processInfo), hint, options); #elif defined(TARGET_ANDROID) pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(processInfo), hint, options); #elif defined(HAVE_LIBOPENMAX) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp index 8d2e1fcbca..86f476a5e9 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -57,7 +57,7 @@ #ifdef HAVE_LIBVA #include "VAAPI.h" #endif -#ifdef TARGET_DARWIN_OSX +#ifdef TARGET_DARWIN #include "VTB.h" #endif #ifdef HAS_MMAL @@ -164,7 +164,7 @@ enum AVPixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avct } #endif -#ifdef TARGET_DARWIN_OSX +#ifdef TARGET_DARWIN if (*cur == AV_PIX_FMT_VIDEOTOOLBOX && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVTB)) { VTB::CDecoder* dec = new VTB::CDecoder(); @@ -289,7 +289,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDXVA2)) tryhw = true; #endif -#ifdef TARGET_DARWIN_OSX +#ifdef TARGET_DARWIN if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVTB)) tryhw = true; #endif diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp deleted file mode 100644 index 0bcdb4e6b6..0000000000 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp +++ /dev/null @@ -1,1704 +0,0 @@ -/* - * Copyright (C) 2010-2013 Team XBMC - * http://xbmc.org - * - * This Program 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, or (at your option) - * any later version. - * - * This Program 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 XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#if (defined HAVE_CONFIG_H) && (!defined TARGET_WINDOWS) - #include "config.h" -#endif - -#if defined(HAVE_VIDEOTOOLBOXDECODER) -#include "DVDClock.h" -#include "DVDStreamInfo.h" -#include "DVDCodecs/DVDCodecUtils.h" -#include "DVDVideoCodecVideoToolBox.h" -#include "settings/Settings.h" -#include "settings/AdvancedSettings.h" -#include "utils/log.h" -#include "utils/TimeUtils.h" -#include "utils/SystemInfo.h" -#include "platform/darwin/DarwinUtils.h" - -extern "C" { -#include "libswscale/swscale.h" -#include "libavformat/avformat.h" -} - -#include "DllVideoToolBox.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#pragma pack(push, 4) -//----------------------------------------------------------------------------------- -// /System/Library/Frameworks/CoreMedia.framework -union -{ - void* lpAddress; - // iOS <= 4.2 - OSStatus (*FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom1)( - CFAllocatorRef allocator, UInt32 formatId, UInt32 width, UInt32 height, - UInt32 atomId, const UInt8 *data, CFIndex len, CMFormatDescriptionRef *formatDesc); - // iOS >= 4.3 - OSStatus (*FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom2)( - CFAllocatorRef allocator, UInt32 formatId, UInt32 width, UInt32 height, - UInt32 atomId, const UInt8 *data, CFIndex len, CFDictionaryRef extensions, CMFormatDescriptionRef *formatDesc); -} FigVideoHack; -extern OSStatus FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom( - CFAllocatorRef allocator, UInt32 formatId, UInt32 width, UInt32 height, - UInt32 atomId, const UInt8 *data, CFIndex len, CMFormatDescriptionRef *formatDesc); - -extern CMSampleBufferRef FigSampleBufferRetain(CMSampleBufferRef buf); -//----------------------------------------------------------------------------------- -#pragma pack(pop) - -#if defined(__cplusplus) -} -#endif - -int CheckNP2( unsigned x ) -{ - --x; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - return ++x; -} - -//----------------------------------------------------------------------------------- -//----------------------------------------------------------------------------------- -// helper functions for debuging VTDecompression -#if _DEBUG -char* vtutil_string_to_utf8(CFStringRef s) -{ - char *result; - CFIndex size; - - size = CFStringGetMaximumSizeForEncoding(CFStringGetLength (s), kCFStringEncodingUTF8); - result = (char*)malloc(size + 1); - CFStringGetCString(s, result, size + 1, kCFStringEncodingUTF8); - - return result; -} - -char* vtutil_object_to_string(CFTypeRef obj) -{ - char *result; - CFStringRef s; - - if (obj == NULL) - return strdup ("(null)"); - - s = CFCopyDescription(obj); - result = vtutil_string_to_utf8(s); - CFRelease(s); - - return result; -} - -typedef struct { - VTDecompressionSessionRef session; -} VTDumpDecompressionPropCtx; - -void -vtdec_session_dump_property(CFStringRef prop_name, CFDictionaryRef prop_attrs, VTDumpDecompressionPropCtx *dpc) -{ - char *name_str; - CFTypeRef prop_value; - OSStatus status; - - name_str = vtutil_string_to_utf8(prop_name); - if (true) - { - char *attrs_str; - - attrs_str = vtutil_object_to_string(prop_attrs); - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s = %s\n", name_str, attrs_str); - free(attrs_str); - } - - status = CDVDVideoCodecVideoToolBox::GetDllImpl()->VTDecompressionSessionCopyProperty(dpc->session, prop_name, NULL, &prop_value); - if (status == kVTDecoderNoErr) - { - char *value_str; - - value_str = vtutil_object_to_string(prop_value); - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s = %s\n", name_str, value_str); - free(value_str); - - if (prop_value != NULL) - CFRelease(prop_value); - } - else - { - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s = <failed to query: %d>\n", name_str, (int)status); - } - - free(name_str); -} - -void vtdec_session_dump_properties(VTDecompressionSessionRef session) -{ - VTDumpDecompressionPropCtx dpc = { session }; - CFDictionaryRef dict; - OSStatus status; - - status = CDVDVideoCodecVideoToolBox::GetDllImpl()->VTDecompressionSessionCopySupportedPropertyDictionary(session, &dict); - if (status != kVTDecoderNoErr) - goto error; - CFDictionaryApplyFunction(dict, (CFDictionaryApplierFunction)vtdec_session_dump_property, &dpc); - CFRelease(dict); - - return; - -error: - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "failed to dump properties\n"); -} -#endif -//----------------------------------------------------------------------------------- -//----------------------------------------------------------------------------------- -// helper function that inserts an int32_t into a dictionary -static void -CFDictionarySetSInt32(CFMutableDictionaryRef dictionary, CFStringRef key, SInt32 numberSInt32) -{ - CFNumberRef number; - - number = CFNumberCreate(NULL, kCFNumberSInt32Type, &numberSInt32); - CFDictionarySetValue(dictionary, key, number); - CFRelease(number); -} -// helper function that inserts an double into a dictionary -static void -CFDictionarySetDouble(CFMutableDictionaryRef dictionary, CFStringRef key, double numberDouble) -{ - CFNumberRef number; - - number = CFNumberCreate(NULL, kCFNumberDoubleType, &numberDouble); - CFDictionaryAddValue(dictionary, key, number); - CFRelease(number); -} -// helper function that wraps dts/pts into a dictionary -static CFDictionaryRef -CreateDictionaryWithDisplayTime(double time, double dts, double pts) -{ - CFStringRef key[3] = { - CFSTR("VideoDisplay_TIME"), - CFSTR("VideoDisplay_DTS"), - CFSTR("VideoDisplay_PTS")}; - CFNumberRef value[3]; - CFDictionaryRef display_time; - - value[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &time); - value[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &dts); - value[2] = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &pts); - - display_time = CFDictionaryCreate( - kCFAllocatorDefault, (const void **)&key, (const void **)&value, 3, - &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - - CFRelease(value[0]); - CFRelease(value[1]); - CFRelease(value[2]); - - return display_time; -} -// helper function to extract dts/pts from a dictionary -static void -GetFrameDisplayTimeFromDictionary( - CFDictionaryRef inFrameInfoDictionary, frame_queue *frame) -{ - // default to DVD_NOPTS_VALUE - frame->sort_time = -1.0; - frame->dts = DVD_NOPTS_VALUE; - frame->pts = DVD_NOPTS_VALUE; - if (inFrameInfoDictionary == NULL) - return; - - CFNumberRef value[3]; - // - value[0] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("VideoDisplay_TIME")); - if (value[0]) - CFNumberGetValue(value[0], kCFNumberDoubleType, &frame->sort_time); - value[1] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("VideoDisplay_DTS")); - if (value[1]) - CFNumberGetValue(value[1], kCFNumberDoubleType, &frame->dts); - value[2] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("VideoDisplay_PTS")); - if (value[2]) - CFNumberGetValue(value[2], kCFNumberDoubleType, &frame->pts); - - return; -} -// helper function to create a format descriptor -static CMFormatDescriptionRef -CreateFormatDescription(VTFormatId format_id, int width, int height) -{ - CMFormatDescriptionRef fmt_desc; - OSStatus status; - - status = CMVideoFormatDescriptionCreate( - NULL, // CFAllocatorRef allocator - format_id, - width, - height, - NULL, // CFDictionaryRef extensions - &fmt_desc); - - if (status == kVTDecoderNoErr) - return fmt_desc; - else - return NULL; -} -// helper function to create a avcC atom format descriptor -static CMFormatDescriptionRef -CreateFormatDescriptionFromCodecData(VTFormatId format_id, int width, int height, const uint8_t *extradata, int extradata_size, uint32_t atom) -{ - CMFormatDescriptionRef fmt_desc = NULL; - OSStatus status; - - FigVideoHack.lpAddress = (void*)FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom; - - if (CDarwinUtils::GetIOSVersion() < 4.3) - { - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s - GetIOSVersion says < 4.3", __FUNCTION__); - status = FigVideoHack.FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom1( - NULL, - format_id, - width, - height, - atom, - extradata, - extradata_size, - &fmt_desc); - } - else - { - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s - GetIOSVersion says >= 4.3", __FUNCTION__); - status = FigVideoHack.FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom2( - NULL, - format_id, - width, - height, - atom, - extradata, - extradata_size, - NULL, - &fmt_desc); - } - - if (status == kVTDecoderNoErr) - return fmt_desc; - else - return NULL; -} -// helper function to create a CMSampleBufferRef from demuxer data -static CMSampleBufferRef -CreateSampleBufferFrom(CMFormatDescriptionRef fmt_desc, void *demux_buff, size_t demux_size) -{ - OSStatus status; - CMBlockBufferRef newBBufOut = NULL; - CMSampleBufferRef sBufOut = NULL; - - status = CMBlockBufferCreateWithMemoryBlock( - NULL, // CFAllocatorRef structureAllocator - demux_buff, // void *memoryBlock - demux_size, // size_t blockLengt - kCFAllocatorNull, // CFAllocatorRef blockAllocator - NULL, // const CMBlockBufferCustomBlockSource *customBlockSource - 0, // size_t offsetToData - demux_size, // size_t dataLength - FALSE, // CMBlockBufferFlags flags - &newBBufOut); // CMBlockBufferRef *newBBufOut - - if (!status) - { - status = CMSampleBufferCreate( - NULL, // CFAllocatorRef allocator - newBBufOut, // CMBlockBufferRef dataBuffer - TRUE, // Boolean dataReady - 0, // CMSampleBufferMakeDataReadyCallback makeDataReadyCallback - 0, // void *makeDataReadyRefcon - fmt_desc, // CMFormatDescriptionRef formatDescription - 1, // CMItemCount numSamples - 0, // CMItemCount numSampleTimingEntries - NULL, // const CMSampleTimingInfo *sampleTimingArray - 0, // CMItemCount numSampleSizeEntries - NULL, // const size_t *sampleSizeArray - &sBufOut); // CMSampleBufferRef *sBufOut - } - - CFRelease(newBBufOut); - - /* - CLog::Log(LOGDEBUG, "%s - CreateSampleBufferFrom size %ld demux_buff [0x%08x] sBufOut [0x%08x]", - __FUNCTION__, demux_size, (unsigned int)demux_buff, (unsigned int)sBufOut); - */ - - return sBufOut; -} - -//----------------------------------------------------------------------------------- -//----------------------------------------------------------------------------------- -/* MPEG-4 esds (elementary stream descriptor) */ -typedef struct { - int version; - long flags; - - uint16_t esid; - uint8_t stream_priority; - - uint8_t objectTypeId; - uint8_t streamType; - uint32_t bufferSizeDB; - uint32_t maxBitrate; - uint32_t avgBitrate; - - int decoderConfigLen; - uint8_t* decoderConfig; -} quicktime_esds_t; - -int quicktime_write_mp4_descr_length(AVIOContext *pb, int length, int compact) -{ - int i; - uint8_t b; - int numBytes; - - if (compact) - { - if (length <= 0x7F) - { - numBytes = 1; - } - else if (length <= 0x3FFF) - { - numBytes = 2; - } - else if (length <= 0x1FFFFF) - { - numBytes = 3; - } - else - { - numBytes = 4; - } - } - else - { - numBytes = 4; - } - - for (i = numBytes-1; i >= 0; i--) - { - b = (length >> (i * 7)) & 0x7F; - if (i != 0) - { - b |= 0x80; - } - avio_w8(pb, b); - } - - return numBytes; -} - -void quicktime_write_esds(AVIOContext *pb, quicktime_esds_t *esds) -{ - avio_w8(pb, 0); // Version - avio_wb24(pb, 0); // Flags - - // elementary stream descriptor tag - avio_w8(pb, 0x03); - quicktime_write_mp4_descr_length(pb, - 3 + 5 + (13 + 5 + esds->decoderConfigLen) + 3, false); - // 3 bytes + 5 bytes for tag - avio_wb16(pb, esds->esid); - avio_w8(pb, esds->stream_priority); - - // decoder configuration description tag - avio_w8(pb, 0x04); - quicktime_write_mp4_descr_length(pb, - 13 + 5 + esds->decoderConfigLen, false); - // 13 bytes + 5 bytes for tag - avio_w8(pb, esds->objectTypeId); // objectTypeIndication - avio_w8(pb, esds->streamType); // streamType - avio_wb24(pb, esds->bufferSizeDB); // buffer size - avio_wb32(pb, esds->maxBitrate); // max bitrate - avio_wb32(pb, esds->avgBitrate); // average bitrate - - // decoder specific description tag - avio_w8(pb, 0x05); - quicktime_write_mp4_descr_length(pb, esds->decoderConfigLen, false); - avio_write(pb, esds->decoderConfig, esds->decoderConfigLen); - - // sync layer configuration descriptor tag - avio_w8(pb, 0x06); // tag - avio_w8(pb, 0x01); // length - avio_w8(pb, 0x7F); // no SL - - /* no IPI_DescrPointer */ - /* no IP_IdentificationDataSet */ - /* no IPMP_DescriptorPointer */ - /* no LanguageDescriptor */ - /* no QoS_Descriptor */ - /* no RegistrationDescriptor */ - /* no ExtensionDescriptor */ - -} - -quicktime_esds_t* quicktime_set_esds(const uint8_t * decoderConfig, int decoderConfigLen) -{ - // ffmpeg's codec->avctx->extradata, codec->avctx->extradata_size - // are decoderConfig/decoderConfigLen - quicktime_esds_t *esds; - - esds = (quicktime_esds_t*)malloc(sizeof(quicktime_esds_t)); - memset(esds, 0, sizeof(quicktime_esds_t)); - - esds->version = 0; - esds->flags = 0; - - esds->esid = 0; - esds->stream_priority = 0; // 16 ? 0x1f - - esds->objectTypeId = 32; // 32 = AV_CODEC_ID_MPEG4, 33 = AV_CODEC_ID_H264 - // the following fields is made of 6 bits to identify the streamtype (4 for video, 5 for audio) - // plus 1 bit to indicate upstream and 1 bit set to 1 (reserved) - esds->streamType = 0x11; - esds->bufferSizeDB = 64000; // Hopefully not important :) - - // Maybe correct these later? - esds->maxBitrate = 200000; // 0 for vbr - esds->avgBitrate = 200000; - - esds->decoderConfigLen = decoderConfigLen; - esds->decoderConfig = (uint8_t*)malloc(esds->decoderConfigLen); - memcpy(esds->decoderConfig, decoderConfig, esds->decoderConfigLen); - return esds; -} - -void quicktime_esds_dump(quicktime_esds_t * esds) -{ - int i; - printf("esds: \n"); - printf(" Version: %d\n", esds->version); - printf(" Flags: 0x%06lx\n", esds->flags); - printf(" ES ID: 0x%04x\n", esds->esid); - printf(" Priority: 0x%02x\n", esds->stream_priority); - printf(" objectTypeId: %d\n", esds->objectTypeId); - printf(" streamType: 0x%02x\n", esds->streamType); - printf(" bufferSizeDB: %d\n", esds->bufferSizeDB); - - printf(" maxBitrate: %d\n", esds->maxBitrate); - printf(" avgBitrate: %d\n", esds->avgBitrate); - printf(" decoderConfigLen: %d\n", esds->decoderConfigLen); - printf(" decoderConfig:"); - for(i = 0; i < esds->decoderConfigLen; i++) - { - if(!(i % 16)) - printf("\n "); - printf("%02x ", esds->decoderConfig[i]); - } - printf("\n"); -} - -//----------------------------------------------------------------------------------- -//----------------------------------------------------------------------------------- -// TODO: refactor this so as not to need these ffmpeg routines. -// These are not exposed in ffmpeg's API so we dupe them here. -// AVC helper functions for muxers, -// * Copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@smartjog.com> -// This is part of FFmpeg -// * License as published by the Free Software Foundation; either -// * version 2.1 of the License, or (at your option) any later version. -#define VDA_RB16(x) \ - ((((const uint8_t*)(x))[0] << 8) | \ - ((const uint8_t*)(x)) [1]) - -#define VDA_RB24(x) \ - ((((const uint8_t*)(x))[0] << 16) | \ - (((const uint8_t*)(x))[1] << 8) | \ - ((const uint8_t*)(x))[2]) - -#define VDA_RB32(x) \ - ((((const uint8_t*)(x))[0] << 24) | \ - (((const uint8_t*)(x))[1] << 16) | \ - (((const uint8_t*)(x))[2] << 8) | \ - ((const uint8_t*)(x))[3]) - -static const uint8_t *avc_find_startcode_internal(const uint8_t *p, const uint8_t *end) -{ - const uint8_t *a = p + 4 - ((intptr_t)p & 3); - - for (end -= 3; p < a && p < end; p++) - { - if (p[0] == 0 && p[1] == 0 && p[2] == 1) - return p; - } - - for (end -= 3; p < end; p += 4) - { - uint32_t x = *(const uint32_t*)p; - if ((x - 0x01010101) & (~x) & 0x80808080) // generic - { - if (p[1] == 0) - { - if (p[0] == 0 && p[2] == 1) - return p; - if (p[2] == 0 && p[3] == 1) - return p+1; - } - if (p[3] == 0) - { - if (p[2] == 0 && p[4] == 1) - return p+2; - if (p[4] == 0 && p[5] == 1) - return p+3; - } - } - } - - for (end += 3; p < end; p++) - { - if (p[0] == 0 && p[1] == 0 && p[2] == 1) - return p; - } - - return end + 3; -} - -const uint8_t *avc_find_startcode(const uint8_t *p, const uint8_t *end) -{ - const uint8_t *out= avc_find_startcode_internal(p, end); - if (p<out && out<end && !out[-1]) - out--; - return out; -} - -const int avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) -{ - const uint8_t *p = buf_in; - const uint8_t *end = p + size; - const uint8_t *nal_start, *nal_end; - - size = 0; - nal_start = avc_find_startcode(p, end); - while (nal_start < end) - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); - avio_wb32(pb, nal_end - nal_start); - avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } - return size; -} - -const int avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size) -{ - AVIOContext *pb; - int ret = avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(pb, buf_in, *size); - - av_freep(buf); - *size = avio_close_dyn_buf(pb, buf); - return 0; -} - -/* - * if extradata size is greater than 7, then have a valid quicktime - * avcC atom header. - * - * -: avcC atom header :- - * ----------------------------------- - * 1 byte - version - * 1 byte - h.264 stream profile - * 1 byte - h.264 compatible profiles - * 1 byte - h.264 stream level - * 6 bits - reserved set to 63 - * 2 bits - NAL length - * ( 0 - 1 byte; 1 - 2 bytes; 3 - 4 bytes) - * 3 bit - reserved - * 5 bits - number of SPS - * for (i=0; i < number of SPS; i++) { - * 2 bytes - SPS length - * SPS length bytes - SPS NAL unit - * } - * 1 byte - number of PPS - * for (i=0; i < number of PPS; i++) { - * 2 bytes - PPS length - * PPS length bytes - PPS NAL unit - * } - - how to detect the interlacing used on an existing stream: -- progressive is signalled by setting - frame_mbs_only_flag: 1 in the SPS. -- interlaced is signalled by setting - frame_mbs_only_flag: 0 in the SPS and - field_pic_flag: 1 on all frames. -- paff is signalled by setting - frame_mbs_only_flag: 0 in the SPS and - field_pic_flag: 1 on all frames that get interlaced and - field_pic_flag: 0 on all frames that get progressive. -- mbaff is signalled by setting - frame_mbs_only_flag: 0 in the SPS and - mb_adaptive_frame_field_flag: 1 in the SPS and - field_pic_flag: 0 on the frames, - (field_pic_flag: 1 would indicate a normal interlaced frame). -*/ -const int isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) -{ - // extradata from bytestream h264, convert to avcC atom data for bitstream - if (len > 6) - { - /* check for h264 start code */ - if (VDA_RB32(data) == 0x00000001 || VDA_RB24(data) == 0x000001) - { - uint8_t *buf=NULL, *end, *start; - uint32_t sps_size=0, pps_size=0; - uint8_t *sps=0, *pps=0; - - int ret = avc_parse_nal_units_buf(data, &buf, &len); - if (ret < 0) - return ret; - start = buf; - end = buf + len; - - /* look for sps and pps */ - while (buf < end) - { - unsigned int size; - uint8_t nal_type; - size = VDA_RB32(buf); - nal_type = buf[4] & 0x1f; - if (nal_type == 7) /* SPS */ - { - sps = buf + 4; - sps_size = size; - } - else if (nal_type == 8) /* PPS */ - { - pps = buf + 4; - pps_size = size; - } - buf += size + 4; - } - assert(sps); - - avio_w8(pb, 1); /* version */ - avio_w8(pb, sps[1]); /* profile */ - avio_w8(pb, sps[2]); /* profile compat */ - avio_w8(pb, sps[3]); /* level */ - avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ - avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - - avio_wb16(pb, sps_size); - avio_write(pb, sps, sps_size); - if (pps) - { - avio_w8(pb, 1); /* number of pps */ - avio_wb16(pb, pps_size); - avio_write(pb, pps, pps_size); - } - av_free(start); - } - else - { - avio_write(pb, data, len); - } - } - return 0; -} -//----------------------------------------------------------------------------------- -//----------------------------------------------------------------------------------- -// GStreamer h264 parser -// Copyright (C) 2005 Michal Benes <michal.benes@itonis.tv> -// (C) 2008 Wim Taymans <wim.taymans@gmail.com> -// gsth264parse.c: -// * License as published by the Free Software Foundation; either -// * version 2.1 of the License, or (at your option) any later version. -typedef struct -{ - const uint8_t *data; - const uint8_t *end; - int head; - uint64_t cache; -} nal_bitstream; - -static void -nal_bs_init(nal_bitstream *bs, const uint8_t *data, size_t size) -{ - bs->data = data; - bs->end = data + size; - bs->head = 0; - // fill with something other than 0 to detect - // emulation prevention bytes - bs->cache = 0xffffffff; -} - -static uint32_t -nal_bs_read(nal_bitstream *bs, int n) -{ - uint32_t res = 0; - int shift; - - if (n == 0) - return res; - - // fill up the cache if we need to - while (bs->head < n) - { - uint8_t a_byte; - bool check_three_byte; - - check_three_byte = TRUE; -next_byte: - if (bs->data >= bs->end) - { - // we're at the end, can't produce more than head number of bits - n = bs->head; - break; - } - // get the byte, this can be an emulation_prevention_three_byte that we need - // to ignore. - a_byte = *bs->data++; - if (check_three_byte && a_byte == 0x03 && ((bs->cache & 0xffff) == 0)) - { - // next byte goes unconditionally to the cache, even if it's 0x03 - check_three_byte = FALSE; - goto next_byte; - } - // shift bytes in cache, moving the head bits of the cache left - bs->cache = (bs->cache << 8) | a_byte; - bs->head += 8; - } - - // bring the required bits down and truncate - if ((shift = bs->head - n) > 0) - res = bs->cache >> shift; - else - res = bs->cache; - - // mask out required bits - if (n < 32) - res &= (1 << n) - 1; - - bs->head = shift; - - return res; -} - -static bool -nal_bs_eos(nal_bitstream *bs) -{ - return (bs->data >= bs->end) && (bs->head == 0); -} - -// read unsigned Exp-Golomb code -static int -nal_bs_read_ue(nal_bitstream *bs) -{ - int i = 0; - - while (nal_bs_read(bs, 1) == 0 && !nal_bs_eos(bs) && i < 32) - i++; - - return ((1 << i) - 1 + nal_bs_read(bs, i)); -} - -typedef struct -{ - int profile_idc; - int level_idc; - int sps_id; - - int chroma_format_idc; - int separate_colour_plane_flag; - int bit_depth_luma_minus8; - int bit_depth_chroma_minus8; - int qpprime_y_zero_transform_bypass_flag; - int seq_scaling_matrix_present_flag; - - int log2_max_frame_num_minus4; - int pic_order_cnt_type; - int log2_max_pic_order_cnt_lsb_minus4; - - int max_num_ref_frames; - int gaps_in_frame_num_value_allowed_flag; - int pic_width_in_mbs_minus1; - int pic_height_in_map_units_minus1; - - int frame_mbs_only_flag; - int mb_adaptive_frame_field_flag; - - int direct_8x8_inference_flag; - - int frame_cropping_flag; - int frame_crop_left_offset; - int frame_crop_right_offset; - int frame_crop_top_offset; - int frame_crop_bottom_offset; -} sps_info_struct; - -static void -parseh264_sps(uint8_t *sps, uint32_t sps_size, int *level, int *profile, bool *interlaced, int32_t *max_ref_frames) -{ - nal_bitstream bs; - sps_info_struct sps_info = {0}; - - nal_bs_init(&bs, sps, sps_size); - - sps_info.profile_idc = nal_bs_read(&bs, 8); - nal_bs_read(&bs, 1); // constraint_set0_flag - nal_bs_read(&bs, 1); // constraint_set1_flag - nal_bs_read(&bs, 1); // constraint_set2_flag - nal_bs_read(&bs, 1); // constraint_set3_flag - nal_bs_read(&bs, 4); // reserved - sps_info.level_idc = nal_bs_read(&bs, 8); - sps_info.sps_id = nal_bs_read_ue(&bs); - - if (sps_info.profile_idc == 100 || - sps_info.profile_idc == 110 || - sps_info.profile_idc == 122 || - sps_info.profile_idc == 244 || - sps_info.profile_idc == 44 || - sps_info.profile_idc == 83 || - sps_info.profile_idc == 86) - { - sps_info.chroma_format_idc = nal_bs_read_ue(&bs); - if (sps_info.chroma_format_idc == 3) - sps_info.separate_colour_plane_flag = nal_bs_read(&bs, 1); - sps_info.bit_depth_luma_minus8 = nal_bs_read_ue(&bs); - sps_info.bit_depth_chroma_minus8 = nal_bs_read_ue(&bs); - sps_info.qpprime_y_zero_transform_bypass_flag = nal_bs_read(&bs, 1); - - sps_info.seq_scaling_matrix_present_flag = nal_bs_read (&bs, 1); - if (sps_info.seq_scaling_matrix_present_flag) - { - /* TODO: unfinished */ - } - } - sps_info.log2_max_frame_num_minus4 = nal_bs_read_ue(&bs); - if (sps_info.log2_max_frame_num_minus4 > 12) - { // must be between 0 and 12 - // don't early return here - the bits we are using (profile/level/interlaced/ref frames) - // might still be valid - let the parser go on and pray. - //return; - } - - sps_info.pic_order_cnt_type = nal_bs_read_ue(&bs); - if (sps_info.pic_order_cnt_type == 0) - { - sps_info.log2_max_pic_order_cnt_lsb_minus4 = nal_bs_read_ue(&bs); - } - else if (sps_info.pic_order_cnt_type == 1) - { // TODO: unfinished - /* - delta_pic_order_always_zero_flag = gst_nal_bs_read (bs, 1); - offset_for_non_ref_pic = gst_nal_bs_read_se (bs); - offset_for_top_to_bottom_field = gst_nal_bs_read_se (bs); - - num_ref_frames_in_pic_order_cnt_cycle = gst_nal_bs_read_ue (bs); - for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) - offset_for_ref_frame[i] = gst_nal_bs_read_se (bs); - */ - } - - sps_info.max_num_ref_frames = nal_bs_read_ue(&bs); - sps_info.gaps_in_frame_num_value_allowed_flag = nal_bs_read(&bs, 1); - sps_info.pic_width_in_mbs_minus1 = nal_bs_read_ue(&bs); - sps_info.pic_height_in_map_units_minus1 = nal_bs_read_ue(&bs); - - sps_info.frame_mbs_only_flag = nal_bs_read(&bs, 1); - if (!sps_info.frame_mbs_only_flag) - sps_info.mb_adaptive_frame_field_flag = nal_bs_read(&bs, 1); - - sps_info.direct_8x8_inference_flag = nal_bs_read(&bs, 1); - - sps_info.frame_cropping_flag = nal_bs_read(&bs, 1); - if (sps_info.frame_cropping_flag) - { - sps_info.frame_crop_left_offset = nal_bs_read_ue(&bs); - sps_info.frame_crop_right_offset = nal_bs_read_ue(&bs); - sps_info.frame_crop_top_offset = nal_bs_read_ue(&bs); - sps_info.frame_crop_bottom_offset = nal_bs_read_ue(&bs); - } - - *level = sps_info.level_idc; - *profile = sps_info.profile_idc; - *interlaced = !sps_info.frame_mbs_only_flag; - *max_ref_frames = sps_info.max_num_ref_frames; -} - -bool validate_avcC_spc(uint8_t *extradata, uint32_t extrasize, int32_t *max_ref_frames, int *level, int *profile) -{ - // check the avcC atom's sps for number of reference frames and - // bail if interlaced, VDA does not handle interlaced h264. - bool interlaced = true; - uint8_t *spc = extradata + 6; - uint32_t sps_size = VDA_RB16(spc); - if (sps_size) - parseh264_sps(spc+3, sps_size-1, level, profile, &interlaced, max_ref_frames); - if (interlaced) - return false; - return true; -} - -//----------------------------------------------------------------------------------- -//----------------------------------------------------------------------------------- -DllVideoToolBoxInterface *CDVDVideoCodecVideoToolBox::m_pLibVTB = NULL; - -CDVDVideoCodecVideoToolBox::CDVDVideoCodecVideoToolBox(CProcessInfo &processInfo) : CDVDVideoCodec(processInfo) -{ - m_fmt_desc = NULL; - m_vt_session = NULL; - m_pFormatName = "vtb"; - - m_queue_depth = 0; - m_display_queue = NULL; - m_max_ref_frames = 4; - pthread_mutex_init(&m_queue_mutex, NULL); - - m_convert_bytestream = false; - m_convert_3byteTo4byteNALSize = false; - memset(&m_videobuffer, 0, sizeof(DVDVideoPicture)); - m_DropPictures = false; - m_sort_time_offset = 0.0; - - if (m_pLibVTB == NULL) - { - if (CDarwinUtils::GetIOSVersion() < 6.0) - { - m_pLibVTB = new DllVideoToolBoxPrivate(); - } - else - { - m_pLibVTB = new DllVideoToolBoxPublic();// todo - load the public version - } - } -} - -CDVDVideoCodecVideoToolBox::~CDVDVideoCodecVideoToolBox() -{ - Dispose(); - pthread_mutex_destroy(&m_queue_mutex); - if (m_pLibVTB != NULL) - { - delete m_pLibVTB; - m_pLibVTB = NULL; // its a static! - } -} - -bool CDVDVideoCodecVideoToolBox::HandleDyLoad() -{ - bool ret = true; - if (CDarwinUtils::GetIOSVersion() < 6.0) - { - if(!((DllVideoToolBoxPrivate *)m_pLibVTB)->IsLoaded()) - { - if(!((DllVideoToolBoxPrivate *)m_pLibVTB)->Load()) - { - CLog::Log(LOGERROR,"VideoToolBox: Error loading private VideoToolBox framework (%s).",__FUNCTION__); - ret = false; //fatal - } - } - } - else - { - if(!((DllVideoToolBoxPublic *)m_pLibVTB)->IsLoaded()) - { - if(!((DllVideoToolBoxPublic *)m_pLibVTB)->Load()) - { - CLog::Log(LOGERROR,"VideoToolBox: Error loading public VideoToolBox framework (%s).",__FUNCTION__); - ret = false; //fatal - } - } - } - return ret; -} - - -bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) -{ - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX)) - return false; - if (!g_sysinfo.HasVideoToolBoxDecoder()) - return false; - if (hints.stills) - return false; - if (hints.ptsinvalid) - return false; - if (hints.codec != AV_CODEC_ID_H264) - return false; - - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX) && !hints.software) - { - int width = hints.width; - int height = hints.height; - int level = hints.level; - int profile = hints.profile; - int spsLevel = level; - int spsProfile = profile; - unsigned int extrasize = hints.extrasize; // extra data for codec to use - uint8_t *extradata = (uint8_t*)hints.extradata; // size of extra data - - if (!HandleDyLoad()) - return false; - - switch(profile) - { - case FF_PROFILE_H264_HIGH_10: - case FF_PROFILE_H264_HIGH_10_INTRA: - case FF_PROFILE_H264_HIGH_422: - case FF_PROFILE_H264_HIGH_422_INTRA: - case FF_PROFILE_H264_HIGH_444_PREDICTIVE: - case FF_PROFILE_H264_HIGH_444_INTRA: - case FF_PROFILE_H264_CAVLC_444: - CLog::Log(LOGNOTICE, "%s - unsupported h264 profile(%d)", __FUNCTION__, hints.profile); - return false; - break; - } - - if (width <= 0 || height <= 0) - { - CLog::Log(LOGNOTICE, "%s - bailing with bogus hints, width(%d), height(%d)", - __FUNCTION__, width, height); - return false; - } - - switch (hints.codec) - { - case AV_CODEC_ID_MPEG4: - if (extrasize) - { - AVIOContext *pb; - quicktime_esds_t *esds; - - if (avio_open_dyn_buf(&pb) < 0) - return false; - - esds = quicktime_set_esds(extradata, extrasize); - quicktime_write_esds(pb, esds); - - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the esds atom decoderConfig from extradata - extrasize = avio_close_dyn_buf(pb, &extradata); - free(esds->decoderConfig); - free(esds); - - m_fmt_desc = CreateFormatDescriptionFromCodecData( - kVTFormatMPEG4Video, width, height, extradata, extrasize, 'esds'); - - // done with the converted extradata, we MUST free using av_free - av_free(extradata); - } - else - { - m_fmt_desc = CreateFormatDescription(kVTFormatMPEG4Video, width, height); - } - m_pFormatName = "vtb-mpeg4"; - break; - - case AV_CODEC_ID_MPEG2VIDEO: - m_fmt_desc = CreateFormatDescription(kVTFormatMPEG2Video, width, height); - m_pFormatName = "vtb-mpeg2"; - break; - - case AV_CODEC_ID_H264: - if (extrasize < 7 || extradata == NULL) - { - //m_fmt_desc = CreateFormatDescription(kVTFormatH264, width, height); - CLog::Log(LOGNOTICE, "%s - avcC atom too data small or missing", __FUNCTION__); - return false; - } - - if (extradata[0] == 1) - { - // check for interlaced and get number of ref frames - if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames, &spsLevel, &spsProfile)) - return false; - - // overwrite level and profile from the hints - // if we got something more valid from the extradata - if (level == 0 && spsLevel > 0) - level = spsLevel; - - if (profile == 0 && spsProfile > 0) - profile = spsProfile; - - // we need to check this early, CreateFormatDescriptionFromCodecData will silently fail - // with a bogus m_fmt_desc returned that crashes on CFRelease. - if (profile == FF_PROFILE_H264_MAIN && level == 32 && m_max_ref_frames > 4) - { - // Main@L3.2, VTB cannot handle greater than 4 ref frames (ie. flash video) - CLog::Log(LOGNOTICE, "%s - Main@L3.2 detected, VTB cannot decode with %d ref frames", - __FUNCTION__, m_max_ref_frames); - return false; - } - - if (extradata[4] == 0xFE) - { - // video content is from some silly encoder that think 3 byte NAL sizes - // are valid, setup to convert 3 byte NAL sizes to 4 byte. - extradata[4] = 0xFF; - m_convert_3byteTo4byteNALSize = true; - } - // valid avcC atom data always starts with the value 1 (version) - m_fmt_desc = CreateFormatDescriptionFromCodecData( - kVTFormatH264, width, height, extradata, extrasize, 'avcC'); - - CLog::Log(LOGNOTICE, "%s - using avcC atom of size(%d), ref_frames(%d)", __FUNCTION__, extrasize, m_max_ref_frames); - } - else - { - if ( (extradata[0] == 0 && extradata[1] == 0 && extradata[2] == 0 && extradata[3] == 1) || - (extradata[0] == 0 && extradata[1] == 0 && extradata[2] == 1)) - { - // video content is from x264 or from bytestream h264 (AnnexB format) - // NAL reformating to bitstream format required - - AVIOContext *pb; - if (avio_open_dyn_buf(&pb) < 0) - return false; - - m_convert_bytestream = true; - // create a valid avcC atom data from ffmpeg's extradata - isom_write_avcc(pb, extradata, extrasize); - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata getting size into extrasize - extrasize = avio_close_dyn_buf(pb, &extradata); - - // check for interlaced and get number of ref frames - if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames, &spsLevel, &spsProfile)) - { - av_free(extradata); - return false; - } - - // overwrite level and profile from the hints - // if we got something more valid from the extradata - if (level == 0 && spsLevel > 0) - level = spsLevel; - - if (profile == 0 && spsProfile > 0) - profile = spsProfile; - - // we need to check this early, CreateFormatDescriptionFromCodecData will silently fail - // with a bogus m_fmt_desc returned that crashes on CFRelease. - if (profile == FF_PROFILE_H264_MAIN && level == 32 && m_max_ref_frames > 4) - { - // Main@L3.2, VTB cannot handle greater than 4 ref frames (ie. flash video) - CLog::Log(LOGNOTICE, "%s - Main@L3.2 detected, VTB cannot decode with %d ref frames", - __FUNCTION__, m_max_ref_frames); - av_free(extradata); - return false; - } - - // CFDataCreate makes a copy of extradata contents - m_fmt_desc = CreateFormatDescriptionFromCodecData( - kVTFormatH264, width, height, extradata, extrasize, 'avcC'); - - // done with the new converted extradata, we MUST free using av_free - av_free(extradata); - CLog::Log(LOGNOTICE, "%s - created avcC atom of size(%d)", __FUNCTION__, extrasize); - } - else - { - CLog::Log(LOGNOTICE, "%s - invalid avcC atom data", __FUNCTION__); - return false; - } - } - m_pFormatName = "vtb-h264"; - break; - - default: - return false; - break; - } - - if(m_fmt_desc == NULL) - { - CLog::Log(LOGNOTICE, "%s - created avcC atom of failed", __FUNCTION__); - m_pFormatName = ""; - return false; - } - - if (m_max_ref_frames == 0) - m_max_ref_frames = 2; - - CreateVTSession(width, height, m_fmt_desc); - if (m_vt_session == NULL) - { - if (m_fmt_desc) - { - CFRelease(m_fmt_desc); - m_fmt_desc = NULL; - } - m_pFormatName = ""; - return false; - } - - // setup a DVDVideoPicture buffer. - // first make sure all properties are reset. - memset(&m_videobuffer, 0, sizeof(DVDVideoPicture)); - - m_videobuffer.dts = DVD_NOPTS_VALUE; - m_videobuffer.pts = DVD_NOPTS_VALUE; - m_videobuffer.format = RENDER_FMT_CVBREF; - m_videobuffer.color_range = 0; - m_videobuffer.color_matrix = 4; - m_videobuffer.iFlags = DVP_FLAG_ALLOCATED; - m_videobuffer.iWidth = hints.width; - m_videobuffer.iHeight = hints.height; - m_videobuffer.iDisplayWidth = hints.width; - m_videobuffer.iDisplayHeight = hints.height; - - m_DropPictures = false; - m_max_ref_frames = std::min(m_max_ref_frames, 5); - m_sort_time_offset = (CurrentHostCounter() * 1000.0) / CurrentHostFrequency(); - - return true; - } - - return false; -} - -void CDVDVideoCodecVideoToolBox::Dispose() -{ - DestroyVTSession(); - if (m_fmt_desc) - { - CFRelease(m_fmt_desc); - m_fmt_desc = NULL; - } - - if (m_videobuffer.iFlags & DVP_FLAG_ALLOCATED) - { - // release any previous retained cvbuffer reference - if (m_videobuffer.cvBufferRef) - CVBufferRelease(m_videobuffer.cvBufferRef); - m_videobuffer.cvBufferRef = NULL; - m_videobuffer.iFlags = 0; - } - - while (m_queue_depth) - DisplayQueuePop(); -} - -void CDVDVideoCodecVideoToolBox::SetDropState(bool bDrop) -{ - m_DropPictures = bDrop; -} - -int CDVDVideoCodecVideoToolBox::Decode(uint8_t* pData, int iSize, double dts, double pts) -{ - if (pData) - { - OSStatus status; - double sort_time; - uint32_t decoderFlags = 0; - CFDictionaryRef frameInfo = NULL; - CMSampleBufferRef sampleBuff = NULL; - AVIOContext *pb = NULL; - int demux_size = 0; - uint8_t *demux_buff = NULL; - - if (m_convert_bytestream) - { - // convert demuxer packet from bytestream (AnnexB) to bitstream - if(avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - avc_parse_nal_units(pb, pData, iSize); - demux_size = avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else if (m_convert_3byteTo4byteNALSize) - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte - if (avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; - uint8_t *end = pData + iSize; - uint8_t *nal_start = pData; - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); - avio_wb32(pb, nal_size); - nal_start += 3; - avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - - demux_size = avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else - { - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, pData, iSize); - } - - if (!sampleBuff) - { - if (demux_size) - av_free(demux_buff); - CLog::Log(LOGNOTICE, "%s - CreateSampleBufferFrom failed", __FUNCTION__); - return VC_ERROR; - } - - sort_time = (CurrentHostCounter() * 1000.0) / CurrentHostFrequency(); - frameInfo = CreateDictionaryWithDisplayTime(sort_time - m_sort_time_offset, dts, pts); - - if (m_DropPictures) - { - decoderFlags = kVTDecoderDecodeFlags_DontEmitFrame; - } - - // submit for decoding - status = GetDllImpl()->VTDecompressionSessionDecodeFrame(m_vt_session, sampleBuff, decoderFlags, frameInfo, 0); - if (status != kVTDecoderNoErr) - { - CLog::Log(LOGNOTICE, "%s - VTDecompressionSessionDecodeFrame returned(%d)", - __FUNCTION__, (int)status); - CFRelease(frameInfo); - CFRelease(sampleBuff); - if (demux_size) - av_free(demux_buff); - return VC_ERROR; - // VTDecompressionSessionDecodeFrame returned 8969 (codecBadDataErr) - // VTDecompressionSessionDecodeFrame returned -12350 - // VTDecompressionSessionDecodeFrame returned -12902 - // VTDecompressionSessionDecodeFrame returned -12911 - } - - // wait for decoding to finish - status = GetDllImpl()->VTDecompressionSessionWaitForAsynchronousFrames(m_vt_session); - if (status != kVTDecoderNoErr) - { - CLog::Log(LOGNOTICE, "%s - VTDecompressionSessionWaitForAsynchronousFrames returned(%d)", - __FUNCTION__, (int)status); - CFRelease(frameInfo); - CFRelease(sampleBuff); - if (demux_size) - av_free(demux_buff); - return VC_ERROR; - } - - CFRelease(frameInfo); - CFRelease(sampleBuff); - if (demux_size) - av_free(demux_buff); - } - - // TODO: queue depth is related to the number of reference frames in encoded h.264. - // so we need to buffer until we get N ref frames + 1. - if (m_queue_depth < m_max_ref_frames) - return VC_BUFFER; - - return VC_PICTURE | VC_BUFFER; -} - -void CDVDVideoCodecVideoToolBox::Reset(void) -{ - // flush decoder - GetDllImpl()->VTDecompressionSessionWaitForAsynchronousFrames(m_vt_session); - - while (m_queue_depth) - DisplayQueuePop(); - - m_sort_time_offset = (CurrentHostCounter() * 1000.0) / CurrentHostFrequency(); -} - -bool CDVDVideoCodecVideoToolBox::GetPicture(DVDVideoPicture* pDvdVideoPicture) -{ - // clone the video picture buffer settings. - *pDvdVideoPicture = m_videobuffer; - - // get the top picture frame, we risk getting the wrong frame if the frame queue - // depth is less than the number of encoded reference frames. If queue depth - // is greater than the number of encoded reference frames, then the top frame - // will never change and we can just grab a ref to the top frame. This way - // we don't lockout the vdadecoder while doing color format convert. - pthread_mutex_lock(&m_queue_mutex); - pDvdVideoPicture->dts = m_display_queue->dts; - pDvdVideoPicture->pts = m_display_queue->pts; - pDvdVideoPicture->iWidth = m_display_queue->width; - pDvdVideoPicture->iHeight = m_display_queue->height; - pDvdVideoPicture->iDisplayWidth = m_display_queue->width; - pDvdVideoPicture->iDisplayHeight = m_display_queue->height; - pDvdVideoPicture->cvBufferRef = m_display_queue->pixel_buffer_ref; - m_display_queue->pixel_buffer_ref = NULL; - pthread_mutex_unlock(&m_queue_mutex); - - // now we can pop the top frame - DisplayQueuePop(); - - static double old_pts; - if (g_advancedSettings.CanLogComponent(LOGVIDEO) && pDvdVideoPicture->pts < old_pts) - CLog::Log(LOGDEBUG, "%s - VTBDecoderDecode dts(%f), pts(%f), old_pts(%f)", __FUNCTION__, - pDvdVideoPicture->dts, pDvdVideoPicture->pts, old_pts); - old_pts = pDvdVideoPicture->pts; - -// CLog::Log(LOGDEBUG, "%s - VTBDecoderDecode dts(%f), pts(%f), cvBufferRef(%p)", __FUNCTION__, -// pDvdVideoPicture->dts, pDvdVideoPicture->pts, pDvdVideoPicture->cvBufferRef); - - return VC_PICTURE | VC_BUFFER; -} - -bool CDVDVideoCodecVideoToolBox::ClearPicture(DVDVideoPicture* pDvdVideoPicture) -{ - // release any previous retained image buffer ref that - // has not been passed up to renderer (ie. dropped frames, etc). - if (pDvdVideoPicture->cvBufferRef) - CVBufferRelease(pDvdVideoPicture->cvBufferRef); - - return CDVDVideoCodec::ClearPicture(pDvdVideoPicture); -} - -void CDVDVideoCodecVideoToolBox::DisplayQueuePop(void) -{ - if (!m_display_queue || m_queue_depth == 0) - return; - - // pop the top frame off the queue - pthread_mutex_lock(&m_queue_mutex); - frame_queue *top_frame = m_display_queue; - m_display_queue = m_display_queue->nextframe; - m_queue_depth--; - pthread_mutex_unlock(&m_queue_mutex); - - // and release it - if (top_frame->pixel_buffer_ref) - CVBufferRelease(top_frame->pixel_buffer_ref); - free(top_frame); -} - - -void -CDVDVideoCodecVideoToolBox::CreateVTSession(int width, int height, CMFormatDescriptionRef fmt_desc) -{ - VTDecompressionSessionRef vt_session = NULL; - CFMutableDictionaryRef destinationPixelBufferAttributes; - VTDecompressionOutputCallback outputCallback; - OSStatus status; - - #if defined(TARGET_DARWIN_IOS) - double scale = 0.0; - - // decoding, scaling and rendering above 1920 x 800 runs into - // some bandwidth limit. detect and scale down to reduce - // the bandwidth requirements. - int width_clamp = 1280; - if ((width * height) > (1920 * 800)) - width_clamp = 960; - - // for retina devices it should be safe [tm] to - // loosen the clamp a bit to 1280 pixels width - if (CDarwinUtils::DeviceHasRetina(scale)) - width_clamp = 1280; - - int new_width = CheckNP2(width); - if (width != new_width) - { - // force picture width to power of two and scale up height - // we do this because no GL_UNPACK_ROW_LENGTH in OpenGLES - // and the CVPixelBufferPixel gets created using some - // strange alignment when width is non-standard. - double w_scaler = (double)new_width / width; - width = new_width; - height = height * w_scaler; - } - #if !defined(__LP64__) - // scale output pictures down to 720p size for display - if (width > width_clamp) - { - double w_scaler = (float)width_clamp / width; - width = width_clamp; - height = height * w_scaler; - } - #endif - #endif - destinationPixelBufferAttributes = CFDictionaryCreateMutable( - NULL, // CFAllocatorRef allocator - 0, // CFIndex capacity - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - - // The recommended pixel format choices are - // kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange or kCVPixelFormatType_32BGRA. - // TODO: figure out what we need. - CFDictionarySetSInt32(destinationPixelBufferAttributes, - kCVPixelBufferPixelFormatTypeKey, kCVPixelFormatType_32BGRA); - CFDictionarySetSInt32(destinationPixelBufferAttributes, - kCVPixelBufferWidthKey, width); - CFDictionarySetSInt32(destinationPixelBufferAttributes, - kCVPixelBufferHeightKey, height); - //CFDictionarySetValue(destinationPixelBufferAttributes, - // kCVPixelBufferOpenGLCompatibilityKey, kCFBooleanTrue); - - outputCallback.callback = VTDecoderCallback; - outputCallback.refcon = this; - - status = GetDllImpl()->VTDecompressionSessionCreate( - NULL, // CFAllocatorRef allocator - fmt_desc, - NULL, // CFTypeRef sessionOptions - destinationPixelBufferAttributes, - &outputCallback, - &vt_session); - if (status != noErr) - { - m_vt_session = NULL; - CLog::Log(LOGERROR, "%s - failed with status = (%d)", __FUNCTION__, (int)status); - } - else - { - //vtdec_session_dump_properties(vt_session); - m_vt_session = (void*)vt_session; - } - - CFRelease(destinationPixelBufferAttributes); -} - -void -CDVDVideoCodecVideoToolBox::DestroyVTSession(void) -{ - if (m_vt_session) - { - GetDllImpl()->VTDecompressionSessionInvalidate((VTDecompressionSessionRef)m_vt_session); - CFRelease((VTDecompressionSessionRef)m_vt_session); - m_vt_session = NULL; - } -} - -void -CDVDVideoCodecVideoToolBox::VTDecoderCallback( - void *refcon, - CFDictionaryRef frameInfo, - OSStatus status, - UInt32 infoFlags, - CVBufferRef imageBuffer) -{ - // This is an sync callback due to VTDecompressionSessionWaitForAsynchronousFrames - CDVDVideoCodecVideoToolBox *ctx = (CDVDVideoCodecVideoToolBox*)refcon; - - if (status != kVTDecoderNoErr) - { - //CLog::Log(LOGDEBUG, "%s - status error (%d)", __FUNCTION__, (int)status); - return; - } - if (imageBuffer == NULL) - { - //CLog::Log(LOGDEBUG, "%s - imageBuffer is NULL", __FUNCTION__); - return; - } - OSType format_type = CVPixelBufferGetPixelFormatType(imageBuffer); - if (format_type != kCVPixelFormatType_32BGRA) - { - CLog::Log(LOGERROR, "%s - imageBuffer format is not 'BGRA',is reporting 0x%x", - "VTDecoderCallback", (int)format_type); - return; - } - if (kVTDecodeInfo_FrameDropped & infoFlags) - { - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s - frame dropped", __FUNCTION__); - return; - } - - // allocate a new frame and populate it with some information. - // this pointer to a frame_queue type keeps track of the newest decompressed frame - // and is then inserted into a linked list of frame pointers depending on the display time - // parsed out of the bitstream and stored in the frameInfo dictionary by the client - frame_queue *newFrame = (frame_queue*)calloc(sizeof(frame_queue), 1); - newFrame->nextframe = NULL; - if (CVPixelBufferIsPlanar(imageBuffer) ) - { - newFrame->width = CVPixelBufferGetWidthOfPlane(imageBuffer, 0); - newFrame->height = CVPixelBufferGetHeightOfPlane(imageBuffer, 0); - } - else - { - newFrame->width = CVPixelBufferGetWidth(imageBuffer); - newFrame->height = CVPixelBufferGetHeight(imageBuffer); - } - newFrame->pixel_buffer_format = format_type; - newFrame->pixel_buffer_ref = CVBufferRetain(imageBuffer); - GetFrameDisplayTimeFromDictionary(frameInfo, newFrame); - - // if both dts or pts are good we use those, else use decoder insert time for frame sort - if ((newFrame->pts != DVD_NOPTS_VALUE) || (newFrame->dts != DVD_NOPTS_VALUE)) - { - // if pts is borked (stupid avi's), use dts for frame sort - if (newFrame->pts == DVD_NOPTS_VALUE) - newFrame->sort_time = newFrame->dts; - else - newFrame->sort_time = newFrame->pts; - } - - // since the frames we get may be in decode order rather than presentation order - // our hypothetical callback places them in a queue of frames which will - // hold them in display order for display on another thread - pthread_mutex_lock(&ctx->m_queue_mutex); - // - frame_queue *queueWalker = ctx->m_display_queue; - if (!queueWalker || (newFrame->sort_time < queueWalker->sort_time)) - { - // we have an empty queue, or this frame earlier than the current queue head. - newFrame->nextframe = queueWalker; - ctx->m_display_queue = newFrame; - } - else - { - // walk the queue and insert this frame where it belongs in display order. - bool frameInserted = false; - frame_queue *nextFrame = NULL; - // - while (!frameInserted) - { - nextFrame = queueWalker->nextframe; - if (!nextFrame || (newFrame->sort_time < nextFrame->sort_time)) - { - // if the next frame is the tail of the queue, or our new frame is earlier. - newFrame->nextframe = nextFrame; - queueWalker->nextframe = newFrame; - frameInserted = true; - } - queueWalker = nextFrame; - } - } - ctx->m_queue_depth++; - // - pthread_mutex_unlock(&ctx->m_queue_mutex); -} - -#endif diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h deleted file mode 100644 index a3909c532e..0000000000 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once -/* - * Copyright (C) 2010-2013 Team XBMC - * http://xbmc.org - * - * This Program 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, or (at your option) - * any later version. - * - * This Program 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 XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#if defined(HAVE_VIDEOTOOLBOXDECODER) - -#include <queue> - -#include "DVDVideoCodec.h" -#include <CoreVideo/CoreVideo.h> -#include <CoreMedia/CoreMedia.h> - -class DllVideoToolBoxInterface; - -// tracks a frame in and output queue in display order -typedef struct frame_queue { - double dts; - double pts; - int width; - int height; - double sort_time; - FourCharCode pixel_buffer_format; - CVPixelBufferRef pixel_buffer_ref; - struct frame_queue *nextframe; -} frame_queue; - -class CDVDVideoCodecVideoToolBox : public CDVDVideoCodec -{ -public: - CDVDVideoCodecVideoToolBox(CProcessInfo &processInfo); - virtual ~CDVDVideoCodecVideoToolBox(); - - static DllVideoToolBoxInterface *GetDllImpl() { return m_pLibVTB; } - - // Required overrides - virtual bool Open(CDVDStreamInfo &hints, CDVDCodecOptions &options); - virtual void Dispose(void); - virtual int Decode(uint8_t *pData, int iSize, double dts, double pts); - virtual void Reset(void); - virtual bool GetPicture(DVDVideoPicture *pDvdVideoPicture); - virtual bool ClearPicture(DVDVideoPicture* pDvdVideoPicture); - virtual void SetDropState(bool bDrop); - virtual const char* GetName(void) { return (const char*)m_pFormatName; } - -protected: - bool HandleDyLoad(); - void DisplayQueuePop(void); - void CreateVTSession(int width, int height, CMFormatDescriptionRef fmt_desc); - void DestroyVTSession(void); - static void VTDecoderCallback( - void *refcon, CFDictionaryRef frameInfo, - OSStatus status, UInt32 infoFlags, CVBufferRef imageBuffer); - - void *m_vt_session; // opaque videotoolbox session - CMFormatDescriptionRef m_fmt_desc; - - const char *m_pFormatName; - bool m_DropPictures; - DVDVideoPicture m_videobuffer; - - double m_sort_time_offset; - pthread_mutex_t m_queue_mutex; // mutex protecting queue manipulation - frame_queue *m_display_queue; // display-order queue - next display frame is always at the queue head - int32_t m_queue_depth; // we will try to keep the queue depth at m_max_ref_frames - int32_t m_max_ref_frames; - - bool m_convert_bytestream; - bool m_convert_3byteTo4byteNALSize; - static DllVideoToolBoxInterface *m_pLibVTB;//the framework -}; - -#endif diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp index f985593931..253aefda2c 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp @@ -18,7 +18,7 @@ * */ #include "system.h" -#ifdef TARGET_DARWIN_OSX +#ifdef TARGET_DARWIN #include "platform/darwin/osx/CocoaInterface.h" #include "platform/darwin/DarwinUtils.h" #include "DVDVideoCodec.h" diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTB.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTB.cpp index 1f6e0f5b01..b47426cdf6 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTB.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTB.cpp @@ -22,12 +22,13 @@ #if defined(TARGET_DARWIN_IOS) #include "cores/IPlayer.h" -#include "DVDCodecs/Video/DVDVideoCodecVideoToolBox.h" #include "utils/log.h" #include "utils/GLUtils.h" #include "settings/MediaSettings.h" #include "windowing/WindowingFactory.h" #include "platform/darwin/DarwinUtils.h" +#include <CoreVideo/CVBuffer.h> +#include <CoreVideo/CVPixelBuffer.h> CRendererVTB::CRendererVTB() { diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp index e5322b65b0..0a5fbcc3c9 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp @@ -45,7 +45,7 @@ #if defined(HAS_MMAL) #include "HwDecRender/MMALRenderer.h" #endif -#if defined(HAVE_VIDEOTOOLBOXDECODER) +#if defined(TARGET_DARWIN_IOS) #include "HwDecRender/RendererVTB.h" #endif #if defined(HAS_IMXVPU) @@ -524,7 +524,7 @@ void CRenderManager::CreateRenderer() { #if defined(TARGET_DARWIN_OSX) m_pRenderer = new CRendererVTB; -#elif defined(HAVE_VIDEOTOOLBOXDECODER) +#elif defined(TARGET_DARWIN_IOS) m_pRenderer = new CRendererVTB; #endif } diff --git a/xbmc/platform/darwin/DarwinUtils.mm b/xbmc/platform/darwin/DarwinUtils.mm index 9bbefc009e..11be67a747 100644 --- a/xbmc/platform/darwin/DarwinUtils.mm +++ b/xbmc/platform/darwin/DarwinUtils.mm @@ -480,44 +480,6 @@ bool CDarwinUtils::IsIosSandboxed(void) return ret == 1; } -bool CDarwinUtils::HasVideoToolboxDecoder(void) -{ - static int DecoderAvailable = -1; - - if (DecoderAvailable == -1) - { - { - /* When XBMC is started from a sandbox directory we have to check the sysctl values */ - if (IsIosSandboxed()) - { - uint64_t proc_enforce = 0; - uint64_t vnode_enforce = 0; - size_t size = sizeof(vnode_enforce); - - sysctlbyname("security.mac.proc_enforce", &proc_enforce, &size, NULL, 0); - sysctlbyname("security.mac.vnode_enforce", &vnode_enforce, &size, NULL, 0); - - if (vnode_enforce && proc_enforce) - { - DecoderAvailable = 1; - CLog::Log(LOGINFO, "VideoToolBox decoder not available. Use : sysctl -w security.mac.proc_enforce=0; sysctl -w security.mac.vnode_enforce=0\n"); - } - else - { - DecoderAvailable = 1; - CLog::Log(LOGINFO, "VideoToolBox decoder available\n"); - } - } - else - { - DecoderAvailable = 1; - } - } - } - - return (DecoderAvailable == 1); -} - int CDarwinUtils::BatteryLevel(void) { float batteryLevel = 0; diff --git a/xbmc/settings/SettingConditions.cpp b/xbmc/settings/SettingConditions.cpp index 7174e3a3e3..fede2136eb 100644 --- a/xbmc/settings/SettingConditions.cpp +++ b/xbmc/settings/SettingConditions.cpp @@ -311,12 +311,7 @@ void CSettingConditions::Initialize() #ifdef TARGET_ANDROID m_simpleConditions.insert("has_mediacodec"); #endif -#ifdef HAVE_VIDEOTOOLBOXDECODER - m_simpleConditions.insert("have_videotoolboxdecoder"); - if (g_sysinfo.HasVideoToolBoxDecoder()) - m_simpleConditions.insert("hasvideotoolboxdecoder"); -#endif -#ifdef TARGET_DARWIN_OSX +#ifdef TARGET_DARWIN m_simpleConditions.insert("HasVTB"); #endif #ifdef HAS_LIBAMCODEC |