00001
00002 #ifndef vidl2_dshow_h_
00003 #define vidl2_dshow_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <vidl2/vidl2_exception.h>
00019
00020 #include <vcl_string.h>
00021 #include <vcl_vector.h>
00022 #include <vcl_iostream.h>
00023
00024 #include <atlbase.h>
00025 #include <dshow.h>
00026 #include <qedit.h>
00027
00028 enum vidl2_pixel_format;
00029
00030 struct vidl2_dshow
00031 {
00032
00033 static void initialize_com();
00034
00035
00036 static vcl_string get_error_text(const char* file, int line, HRESULT hr);
00037
00038
00039 static void register_in_rot(IUnknown* unknown, DWORD& reg);
00040
00041
00042 static void remove_from_rot(DWORD reg);
00043
00044
00045 static void save_graph_to_file(const CComPtr<IFilterGraph2>& filter_graph,
00046 const vcl_string& filename);
00047
00048
00049 static void load_graph_from_file(const CComPtr<IFilterGraph2>& filter_graph,
00050 const vcl_wstring& filename);
00051
00052
00053 static vcl_string get_guid_name(const GUID& guid);
00054
00055
00056 static GUID get_guid_from_fourcc(const vcl_string& fourcc);
00057
00058
00059 static void get_media_info(const AM_MEDIA_TYPE& amt,
00060 unsigned int& width,
00061 unsigned int& height,
00062 vidl2_pixel_format& pixel_format);
00063
00064
00065 static void delete_media_type(AM_MEDIA_TYPE& amt);
00066
00067
00068 static void print_capture_device_names();
00069
00070
00071 static vcl_vector<vcl_string> get_capture_device_names();
00072
00073
00074 static CComPtr<IMoniker> get_capture_device_moniker(const vcl_string& name);
00075
00076 #if 0
00077 static void build_filter_graph(
00078 CComPtr<IFilterGraph2>& filter_graph,
00079 CComPtr<IMoniker>& moniker,
00080 CComPtr<ISampleGrabber>& sample_grabber);
00081 #endif
00082
00083 static void connect_filters(CComPtr<IFilterGraph2>& filter_graph,
00084 CComPtr<IBaseFilter>& source,
00085 CComPtr<IBaseFilter>& target);
00086 };
00087
00088
00089 #define DSHOW_GET_ERROR_TEXT(hr) \
00090 vidl2_dshow::get_error_text(__FILE__,__LINE__,(hr))
00091
00092 #define DSHOW_WARN_IF_FAILED(stm) { \
00093 HRESULT hr = (stm); \
00094 if FAILED(hr) { \
00095 vcl_cerr << vidl2_dshow_exception( \
00096 vidl2_dshow::get_error_text(__FILE__,__LINE__,hr)).what() \
00097 << vcl_endl; \
00098 }}
00099
00100 #define DSHOW_ERROR_IF_FAILED(stm) { \
00101 HRESULT hr = (stm); \
00102 if FAILED(hr) { \
00103 vidl2_exception_error(vidl2_dshow_exception( \
00104 vidl2_dshow::get_error_text(__FILE__,__LINE__,hr))); \
00105 }}
00106
00107 #endif // vidl2_dshow_h_