1# - Find Microsoft DirectShow sample files, library, and headers. 2# 3# DIRECTSHOW_INCLUDE_DIRS - where to find needed include file 4# DIRECTSHOW_BASECLASS_DIR- Directory containing the DirectShow baseclass sample code. 5# DIRECTSHOW_FOUND - True if DirectShow found. 6# 7# Requires these CMake modules: 8# FindPackageHandleStandardArgs (known included with CMake >=2.6.2) 9# 10# Initially in VRPN - Distributed under the Boost Software License, Version 1.0. 11# 12# Almost entirely re-written by: 13# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> 14# http://academic.cleardefinition.com 15# Iowa State University HCI Graduate Program/VRAC 16# 17# Copyright Iowa State University 2012. 18# Distributed under the Boost Software License, Version 1.0. 19# (See accompanying file LICENSE_1_0.txt or copy at 20# http://www.boost.org/LICENSE_1_0.txt) 21 22# Look for one of the sample files. 23 24set(_ds_quiet) 25if(DirectShow_FIND_QUIETLY) 26 set(_ds_quiet QUIET) 27endif() 28find_package(WindowsSDK ${_ds_quiet}) 29find_package(DirectX ${_ds_quiet}) 30 31set(DIRECTSHOW_WINDOWSSDK_ROOT 32 "${DIRECTSHOW_WINDOWSSDK_ROOT}" 33 CACHE 34 PATH 35 "A specific Windows SDK to use for DirectShow.") 36 37if(MSVC AND CMAKE_CL_64) 38 set(DIRECTSHOW_LIB_SUBDIR /x64) 39else() 40 set(DIRECTSHOW_LIB_SUBDIR) 41endif() 42 43set(_acceptable_winsdk) 44if(WINDOWSSDK_FOUND) 45 foreach(_sdkdir ${WINDOWSSDK_DIRS}) 46 if(EXISTS "${_sdkdir}/Samples/Multimedia/DirectShow/BaseClasses/streams.h" 47 AND EXISTS "${_sdkdir}/Lib${DIRECTSHOW_LIB_SUBDIR}/strmiids.lib" 48 AND EXISTS "${_sdkdir}/Include/DShow.h") 49 list(APPEND _acceptable_winsdk "${_sdkdir}") 50 endif() 51 endforeach() 52endif() 53 54find_path(DIRECTSHOW_BASECLASS_DIR 55 NAMES 56 streams.h 57 HINTS 58 "${DIRECTSHOW_WINDOWSSDK_ROOT}" 59 PATHS 60 ${_acceptable_winsdk} 61 PATH_SUFFIXES 62 "Samples/Multimedia/DirectShow/BaseClasses") 63 64find_path(DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR 65 NAMES 66 DShow.h 67 HINTS 68 "${DIRECTSHOW_WINDOWSSDK_ROOT}" 69 PATHS 70 ${_acceptable_winsdk} 71 PATH_SUFFIXES 72 "Include") 73 74### 75# Begin code dedicated to finding a proper qedit.h file... 76### 77 78# Checks to see if a directory has qedit.h and if that file contains ISampleGrabber. 79function(_directshow_check_qedit _dir _var) 80 set(fn "${_dir}/qedit.h") 81 if(NOT EXISTS "${fn}") 82 set(${_var} FALSE PARENT_SCOPE) 83 return() 84 endif() 85 file(STRINGS "${fn}" samplegrabber REGEX ISampleGrabber) 86 if(NOT samplegrabber) 87 set(${_var} FALSE PARENT_SCOPE) 88 return() 89 endif() 90 set(${_var} TRUE PARENT_SCOPE) 91endfunction() 92 93function(_directshow_check_current_qedit) 94 if(DIRECTSHOW_QEDIT_INCLUDE_DIR) 95 _directshow_check_qedit("${DIRECTSHOW_QEDIT_INCLUDE_DIR}" _ds_ok) 96 if(NOT _ds_ok) 97 message(STATUS "FindDirectShow: qedit.h in ${DIRECTSHOW_QEDIT_INCLUDE_DIR} lacks ISampleGrabber, unsetting DIRECTSHOW_QEDIT_INCLUDE_DIR") 98 set(DIRECTSHOW_QEDIT_INCLUDE_DIR "" CACHE PATH "" FORCE) 99 endif() 100 endif() 101endfunction() 102 103# Check before deciding if we should make our list of possible locations. 104_directshow_check_current_qedit() 105 106# Compose a list of possible directories that might hold a qedit.h file. 107set(DIRECTSHOW_QEDIT_SEARCH) 108if(WINDOWSSDK_FOUND AND NOT DIRECTSHOW_QEDIT_INCLUDE_DIR) 109 foreach(_sdk ${WINDOWSSDK_DIRS}) 110 windowssdk_build_lookup("${_sdk}" _build) 111 if(_build AND ("${_build}" VERSION_LESS 6.2)) 112 get_windowssdk_include_dirs("${_sdk}" _dirs) 113 if(_dirs) 114 list(APPEND DIRECTSHOW_QEDIT_SEARCH ${_dirs}) 115 endif() 116 endif() 117 endforeach() 118endif() 119 120# This one we can grab from another SDK version. 121find_path(DIRECTSHOW_QEDIT_INCLUDE_DIR 122 NAMES 123 qedit.h 124 HINTS 125 "${DIRECTSHOW_WINDOWSSDK_ROOT}" 126 PATHS 127 ${DIRECTSHOW_QEDIT_SEARCH} 128 PATH_SUFFIXES 129 "Include") 130 131# Check if the directory is OK after the search. 132_directshow_check_current_qedit() 133 134# If we didn't find a proper qedit, manually look through the possibilities. 135if(NOT DIRECTSHOW_QEDIT_INCLUDE_DIR) 136 foreach(_dir "${DIRECTSHOW_WINDOWSSDK_ROOT}/Include" ${DIRECTSHOW_QEDIT_SEARCH}) 137 if(NOT DIRECTSHOW_QEDIT_INCLUDE_DIR) 138 _directshow_check_qedit("${_dir}" _ds_ok) 139 if(_ds_ok) 140 set(DIRECTSHOW_QEDIT_INCLUDE_DIR "${_dir}" CACHE PATH "" FORCE) 141 endif() 142 endif() 143 endforeach() 144endif() 145 146### 147# End qedit.h section. 148### 149 150set(DIRECTSHOW_STRMIIDS_SEARCH) 151if(WINDOWSSDK_FOUND AND NOT DIRECTSHOW_STRMIIDS_LIBRARY) 152 foreach(_sdk ${WINDOWSSDK_DIRS}) 153 get_windowssdk_library_dirs("${_sdk}" _dirs) 154 message(STATUS "- ${_dirs}") 155 if(_dirs) 156 list(APPEND DIRECTSHOW_STRMIIDS_SEARCH ${_dirs}) 157 endif() 158 endforeach() 159endif() 160find_library(DIRECTSHOW_STRMIIDS_LIBRARY 161 NAMES 162 strmiids 163 HINTS 164 "${DIRECTSHOW_WINDOWSSDK_ROOT}" 165 PATHS 166 ${DIRECTSHOW_STRMIIDS_SEARCH} 167 PATH_SUFFIXES 168 "Lib${DIRECTSHOW_LIB_SUBDIR}") 169 170include(FindPackageHandleStandardArgs) 171find_package_handle_standard_args(DirectShow 172 DEFAULT_MSG 173 DIRECTSHOW_BASECLASS_DIR 174 DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR 175 DIRECTSHOW_QEDIT_INCLUDE_DIR 176 DIRECTX_INCLUDE_DIR 177 DIRECTSHOW_STRMIIDS_LIBRARY) 178 179if(DIRECTSHOW_FOUND) 180 set(DIRECTSHOW_INCLUDE_DIRS 181 # Baseclass must be before SDK so it gets the correct refclock.h 182 "${DIRECTSHOW_BASECLASS_DIR}" 183 "${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}" 184 "${DIRECTX_INCLUDE_DIR}" 185 ) 186 if(EXISTS "${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}/atl/atlbase.h") 187 list(APPEND 188 DIRECTSHOW_INCLUDE_DIRS 189 "${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}/atl") 190 endif() 191 if(NOT "${DIRECTSHOW_QEDIT_INCLUDE_DIR}" STREQUAL "${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}") 192 # QEdit include dir might be an older SDK, so put it last. 193 list(APPEND DIRECTSHOW_INCLUDE_DIRS "${DIRECTSHOW_QEDIT_INCLUDE_DIR}") 194 endif() 195 196 set(DIRECTSHOW_LIBRARIES "${DIRECTSHOW_STRMIIDS_LIBRARY}") 197 198 mark_as_advanced(DIRECTSHOW_WINDOWSSDK_ROOT) 199endif() 200 201mark_as_advanced(DIRECTSHOW_BASECLASS_DIR 202 DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR 203 DIRECTSHOW_QEDIT_INCLUDE_DIR 204 DIRECTSHOW_STRMIIDS_LIBRARY) 205