aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2016-04-29 09:20:45 +0200
committerRainer Hochecker <fernetmenta@online.de>2016-04-29 09:20:45 +0200
commitebefcd0c62689579b6c013e5d1b32f58cea23b37 (patch)
treead03b2562df9c7d4c12122c64e589e2fd0f6a93a
parent84284a877734d775b1bc541b2b4264ad5bc1cf14 (diff)
VideoPlayer: iOS, drop old videotoolbox decoder infaviour of ffmpeg
-rw-r--r--Kodi.xcodeproj/project.pbxproj43
-rw-r--r--configure.ac53
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/DVDFactoryCodec.cpp6
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp6
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp1704
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h89
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTB.cpp3
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp4
-rw-r--r--xbmc/platform/darwin/DarwinUtils.mm38
-rw-r--r--xbmc/settings/SettingConditions.cpp7
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