1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  video_capture_mac.cc
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <QuickTime/QuickTime.h>
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1887c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include "webrtc/modules/video_capture/device_info_impl.h"
1987c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include "webrtc/modules/video_capture/video_capture_config.h"
2087c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include "webrtc/modules/video_capture/video_capture_impl.h"
2187c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include "webrtc/system_wrappers/interface/ref_count.h"
2287c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
2387c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 10.4 support must be decided runtime. We will just decide which framework to
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// use at compile time "work" classes. One for QTKit, one for QuickTime
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if __MAC_OS_X_VERSION_MIN_REQUIRED == __MAC_10_4 // QuickTime version
2787c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include <QuickTime/video_capture_quick_time.h>
2887c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include <QuickTime/video_capture_quick_time_info.h>
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
3076a6ffb351ba59a3771ede00c94bc235e42bb3fapbos@webrtc.org#include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.h"
3176a6ffb351ba59a3771ede00c94bc235e42bb3fapbos@webrtc.org#include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_info.h"
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace videocapturemodule
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// static
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool CheckOSVersion()
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Check OSX version
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    OSErr err = noErr;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SInt32 version;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    err = Gestalt(gestaltSystemVersion, &version);
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (err != noErr)
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "Could not get OS version");
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return false;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (version < 0x00001040) // Older version than Mac OSX 10.4
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "OS version too old: 0x%x", version);
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return false;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, 0,
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "OS version compatible: 0x%x", version);
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return true;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// static
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool CheckQTVersion()
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Check OSX version
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    OSErr err = noErr;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SInt32 version;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    err = Gestalt(gestaltQuickTime, &version);
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (err != noErr)
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "Could not get QuickTime version");
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return false;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (version < 0x07000000) // QT v. 7.x or newer (QT 5.0.2 0x05020000)
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "QuickTime version too old: 0x%x", version);
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return false;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, 0,
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "QuickTime version compatible: 0x%x", version);
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return true;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/**************************************************************************
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *    Create/Destroy a VideoCaptureModule
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ***************************************************************************/
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *   Returns version of the module and its components
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *   version                 - buffer to which the version will be written
106f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org *   remainingBufferInBytes  - remaining number of int8_t in the version
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *                             buffer
108f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org *   position                - position of the next empty int8_t in the
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *                             version buffer
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoCaptureModule* VideoCaptureImpl::Create(
113f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org    const int32_t id, const char* deviceUniqueIdUTF8)
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (webrtc::videocapturemodule::CheckOSVersion() == false)
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "OS version is too old. Could not create video capture "
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "module. Returning NULL");
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if __MAC_OS_X_VERSION_MIN_REQUIRED == __MAC_10_4 // QuickTime version
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (webrtc::videocapturemodule::CheckQTVersion() == false)
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "QuickTime version is too old. Could not create video "
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "capture module. Returning NULL");
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "%s line %d. QTKit is not supported on this machine. Using "
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "QuickTime framework to capture video",
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 __FILE__, __LINE__);
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RefCountImpl<videocapturemodule::VideoCaptureMacQuickTime>*
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        newCaptureModule =
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            new RefCountImpl<videocapturemodule::VideoCaptureMacQuickTime>(id);
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!newCaptureModule)
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, id,
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "could not Create for unique device %s, !newCaptureModule",
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     deviceUniqueIdUTF8);
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (newCaptureModule->Init(id, deviceUniqueIdUTF8) != 0)
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, id,
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "could not Create for unique device %s, "
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "newCaptureModule->Init()!=0",
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     deviceUniqueIdUTF8);
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        delete newCaptureModule;
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Successfully created VideoCaptureMacQuicktime. Return it
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "Module created for unique device %s. Will use QuickTime "
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "framework to capture",
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 deviceUniqueIdUTF8);
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return newCaptureModule;
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else // QTKit version
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "Using QTKit framework to capture video", id);
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RefCountImpl<videocapturemodule::VideoCaptureMacQTKit>* newCaptureModule =
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        new RefCountImpl<videocapturemodule::VideoCaptureMacQTKit>(id);
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if(!newCaptureModule)
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, id,
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "could not Create for unique device %s, !newCaptureModule",
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     deviceUniqueIdUTF8);
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if(newCaptureModule->Init(id, deviceUniqueIdUTF8) != 0)
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, id,
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "could not Create for unique device %s, "
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "newCaptureModule->Init()!=0", deviceUniqueIdUTF8);
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        delete newCaptureModule;
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Successfully created VideoCaptureMacQuicktime. Return it
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "Module created for unique device %s, will use QTKit "
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "framework",deviceUniqueIdUTF8);
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return newCaptureModule;
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/**************************************************************************
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *    Create/Destroy a DeviceInfo
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ***************************************************************************/
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoCaptureModule::DeviceInfo*
206f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.orgVideoCaptureImpl::CreateDeviceInfo(const int32_t id)
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (webrtc::videocapturemodule::CheckOSVersion() == false)
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "OS version is too old. Could not create video capture "
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "module. Returning NULL");
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if __MAC_OS_X_VERSION_MIN_REQUIRED == __MAC_10_4 // QuickTime version
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (webrtc::videocapturemodule::CheckQTVersion() == false)
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "QuickTime version is too old. Could not create video "
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "capture module. Returning NULL");
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::videocapturemodule::VideoCaptureMacQuickTimeInfo* newCaptureInfoModule =
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        new webrtc::videocapturemodule::VideoCaptureMacQuickTimeInfo(id);
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!newCaptureInfoModule || newCaptureInfoModule->Init() != 0)
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Destroy(newCaptureInfoModule);
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        newCaptureInfoModule = NULL;
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "Failed to Init newCaptureInfoModule created with id %d "
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "and device \"\" ", id);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VideoCaptureModule created for id", id);
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return newCaptureInfoModule;
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else // QTKit version
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::videocapturemodule::VideoCaptureMacQTKitInfo* newCaptureInfoModule =
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        new webrtc::videocapturemodule::VideoCaptureMacQTKitInfo(id);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if(!newCaptureInfoModule || newCaptureInfoModule->Init() != 0)
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        //Destroy(newCaptureInfoModule);
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        delete newCaptureInfoModule;
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        newCaptureInfoModule = NULL;
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "Failed to Init newCaptureInfoModule created with id %d "
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     "and device \"\" ", id);
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return NULL;
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "VideoCaptureModule created for id", id);
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return newCaptureInfoModule;
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/**************************************************************************
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *    End Create/Destroy VideoCaptureModule
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ***************************************************************************/
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace videocapturemodule
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
272