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