makedll.m
上传用户:limilano
上传日期:2013-07-02
资源大小:19k
文件大小:4k
源码类别:

视频捕捉/采集

开发平台:

Matlab

  1. function makedll
  2. % function makedll
  3. % makedll makes the mexDDGrab dll which is used by mmread.
  4. % makedll requires Microsoft Visual Studio.  It may work with other
  5. % compilers, but this is the only one that is supported.  It also requires
  6. % the DirectX SDK to be installed as well as the DirectShow extensions to
  7. % DirectX.  Currently the DirectShow extensions are included in the Extras for 
  8. % the DirectX SDK (a separate download).
  9. %
  10. % Go to http://msdn.microsoft.com/directx/directxdownloads/default.aspx
  11. % Download and install the SDK.
  12. % Download the Extras and expand it.  Take the contents (DirectShow and DirectSound)
  13. %  out of the Extras directory and move them to the SamplesC++ directory
  14. %  under the DirectX SDK.
  15. % Build the baseclasses.vcproj under the DirectX SDK+Extras in
  16. %  SamplesC++DirectShowSamplesC++DirectShowBaseClasses
  17. %  this will make strmbase.lib and quartz.lib.  Make sure to build the
  18. %  Release version.
  19. % Configure mex to use Visual Studio as its compiler.  Type mex -setup at 
  20. %  the matlab prompt to do this if needed.
  21. % Run makedll.  It will search for the required .h and .lib files.  If it
  22. % can't find them it will ask you for the directory (or root directory to
  23. % search under).
  24. DirectX_SDK_Include_dir = 'C:Program Files'; %Microsoft DirectX 9.0 SDK (June 2005)
  25. VisualStudio_Include_dir = 'C:Program Files'; %Microsoft Visual Studio .NET
  26. DirectX_SDK_Include_dir = getpath('DirectX_SDK_Include_dir', DirectX_SDK_Include_dir, 'ddraw.h');
  27. disp(['Using ' DirectX_SDK_Include_dir]);
  28. DirectX_SDK_DirectShow_Include_dir = fileparts(DirectX_SDK_Include_dir);
  29. DirectX_SDK_DirectShow_Include_dir = getpath('DirectX_SDK_DirectShow_Include_dir', DirectX_SDK_DirectShow_Include_dir, 'dshow.h');
  30. disp(['Using ' DirectX_SDK_DirectShow_Include_dir]);
  31. Quartz_Lib_dir = fileparts(DirectX_SDK_DirectShow_Include_dir);
  32. Quartz_Lib_dir = getpath('Quartz_Lib_dir', Quartz_Lib_dir, 'Quartz.lib');
  33. disp(['Using ' Quartz_Lib_dir]);
  34. Strmbase_Lib_dir = fileparts(DirectX_SDK_DirectShow_Include_dir);
  35. Strmbase_Lib_dir = getpath('Strmbase_Lib_dir', Strmbase_Lib_dir, 'STRMBASE.lib');
  36. disp(['Using ' Strmbase_Lib_dir]);
  37. VisualStudio_Include_dir = getpath('VisualStudio_Include_dir', VisualStudio_Include_dir, 'atlbase.h');
  38. disp(['Using ' VisualStudio_Include_dir]);
  39. VisualStudio_Lib_dir = fileparts(VisualStudio_Include_dir);
  40. VisualStudio_Lib_dir = getpath('VisualStudio_Lib_dir', VisualStudio_Lib_dir, 'atl.lib');
  41. disp(['Using ' VisualStudio_Lib_dir]);
  42. mexCmd = ['mex -I''' DirectX_SDK_Include_dir ''' -I''' DirectX_SDK_DirectShow_Include_dir ...
  43.         ''' -I''' VisualStudio_Include_dir ''' mexDDGrab.cpp DDGrab.cpp ''' ...
  44.         Strmbase_Lib_dir 'Strmbase.lib'' ''' ...
  45.         Quartz_Lib_dir 'Quartz.lib'''];
  46.         
  47. % if atls.lib exists it will be in the same directory as atl.lib
  48. if (exist([VisualStudio_Lib_dir 'atls.lib'],'file'))
  49.     mexCmd = [mexCmd ' ''' VisualStudio_Lib_dir 'atls.lib'''];
  50. end
  51. disp(['Running: ' mexCmd]);
  52. eval(mexCmd);
  53. function path = getpath(pathname, default, testfile)
  54. path = findpath(default, testfile);
  55. while isempty(path)
  56.     path = findpath(input([pathname ' does not contain the file ''' testfile ''', enter new path to search under: '],'s'),testfile);
  57. end
  58. path = path{choose(pathname,path)};
  59. function path = findpath(startdir, filename)
  60. files = dir(startdir);
  61. files = files(~ismember({files.name},{'.','..'})); % remove . and .. from the list
  62. path = {};
  63. if (any(strcmpi(filename,{files.name})))
  64.     path{1} = startdir;
  65. end
  66. for i=1:length(files)
  67.     if (files(i).isdir)
  68.         tmppath = findpath([startdir filesep files(i).name],filename);
  69.         path = {path{:}, tmppath{:}};
  70.     end
  71. end
  72. function opt = choose(pathname,options)
  73. if (length(options) > 1)
  74.     disp(['There are multiple options for ' pathname ' please choose one of the following:']);
  75.     for i=1:length(options)
  76.         disp([num2str(i) '   ' options{i}]);
  77.     end
  78.     opt = 0;
  79.     while opt < 1 || opt > length(options)
  80.         opt = str2double(input('','s'));
  81.         if opt < 1 || opt > length(options)
  82.             disp(['Invalid response, must enter a number between 1 and ' num2str(length(options))]);
  83.         end
  84.     end
  85. else
  86.     opt = 1;
  87. end