| Index: webrtc/modules/video_capture/mac/video_capture_mac.mm
|
| diff --git a/webrtc/modules/video_capture/mac/video_capture_mac.mm b/webrtc/modules/video_capture/mac/video_capture_mac.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..08b2aeb39a40cc62b62cb9afcee8995f4dd86452
|
| --- /dev/null
|
| +++ b/webrtc/modules/video_capture/mac/video_capture_mac.mm
|
| @@ -0,0 +1,252 @@
|
| +/*
|
| + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +/*
|
| + * video_capture_mac.cc
|
| + *
|
| + */
|
| +
|
| +#include <QuickTime/QuickTime.h>
|
| +
|
| +#include "webrtc/base/refcount.h"
|
| +#include "webrtc/base/scoped_ref_ptr.h"
|
| +#include "webrtc/modules/video_capture/device_info_impl.h"
|
| +#include "webrtc/modules/video_capture/video_capture_config.h"
|
| +#include "webrtc/modules/video_capture/video_capture_impl.h"
|
| +#include "webrtc/system_wrappers/include/trace.h"
|
| +
|
| +// 10.4 support must be decided runtime. We will just decide which framework to
|
| +// use at compile time "work" classes. One for QTKit, one for QuickTime
|
| +#if __MAC_OS_X_VERSION_MIN_REQUIRED == __MAC_10_4 // QuickTime version
|
| +#include <QuickTime/video_capture_quick_time.h>
|
| +#include <QuickTime/video_capture_quick_time_info.h>
|
| +#else
|
| +#include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.h"
|
| +#include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_info.h"
|
| +#endif
|
| +
|
| +namespace webrtc
|
| +{
|
| +namespace videocapturemodule
|
| +{
|
| +
|
| +// static
|
| +bool CheckOSVersion()
|
| +{
|
| + // Check OSX version
|
| + OSErr err = noErr;
|
| +
|
| + SInt32 version;
|
| +
|
| + err = Gestalt(gestaltSystemVersion, &version);
|
| + if (err != noErr)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
|
| + "Could not get OS version");
|
| + return false;
|
| + }
|
| +
|
| + if (version < 0x00001040) // Older version than Mac OSX 10.4
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
|
| + "OS version too old: 0x%x", version);
|
| + return false;
|
| + }
|
| +
|
| + WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, 0,
|
| + "OS version compatible: 0x%x", version);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +// static
|
| +bool CheckQTVersion()
|
| +{
|
| + // Check OSX version
|
| + OSErr err = noErr;
|
| +
|
| + SInt32 version;
|
| +
|
| + err = Gestalt(gestaltQuickTime, &version);
|
| + if (err != noErr)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
|
| + "Could not get QuickTime version");
|
| + return false;
|
| + }
|
| +
|
| + if (version < 0x07000000) // QT v. 7.x or newer (QT 5.0.2 0x05020000)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0,
|
| + "QuickTime version too old: 0x%x", version);
|
| + return false;
|
| + }
|
| +
|
| + WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, 0,
|
| + "QuickTime version compatible: 0x%x", version);
|
| + return true;
|
| +}
|
| +
|
| +/**************************************************************************
|
| + *
|
| + * Create/Destroy a VideoCaptureModule
|
| + *
|
| + ***************************************************************************/
|
| +
|
| +/*
|
| + * Returns version of the module and its components
|
| + *
|
| + * version - buffer to which the version will be written
|
| + * remainingBufferInBytes - remaining number of int8_t in the version
|
| + * buffer
|
| + * position - position of the next empty int8_t in the
|
| + * version buffer
|
| + */
|
| +
|
| +rtc::scoped_refptr<VideoCaptureModule> VideoCaptureImpl::Create(
|
| + const int32_t id,
|
| + const char* deviceUniqueIdUTF8) {
|
| + if (!CheckOSVersion()) {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
|
| + "OS version is too old. Could not create video capture "
|
| + "module. Returning NULL");
|
| + return nullptr;
|
| + }
|
| +
|
| +#if __MAC_OS_X_VERSION_MIN_REQUIRED == __MAC_10_4 // QuickTime version
|
| + if (!CheckQTVersion())
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
|
| + "QuickTime version is too old. Could not create video "
|
| + "capture module. Returning NULL");
|
| + return nullptr;
|
| + }
|
| +
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "%s line %d. QTKit is not supported on this machine. Using "
|
| + "QuickTime framework to capture video",
|
| + __FILE__, __LINE__);
|
| +
|
| + rtc::scoped_refptr<VideoCaptureMacQuickTime> newCaptureModule(
|
| + new rtc::RefCountedObject<VideoCaptureMacQuickTime>(id));
|
| +
|
| + if (newCaptureModule->Init(id, deviceUniqueIdUTF8) != 0)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, id,
|
| + "could not Create for unique device %s, "
|
| + "newCaptureModule->Init()!=0",
|
| + deviceUniqueIdUTF8);
|
| + return nullptr;
|
| + }
|
| +
|
| + // Successfully created VideoCaptureMacQuicktime. Return it
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "Module created for unique device %s. Will use QuickTime "
|
| + "framework to capture",
|
| + deviceUniqueIdUTF8);
|
| + return newCaptureModule;
|
| +
|
| +#else // QTKit version
|
| +
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "Using QTKit framework to capture video", id);
|
| +
|
| + rtc::scoped_refptr<VideoCaptureMacQTKit> newCaptureModule(
|
| + new rtc::RefCountedObject<VideoCaptureMacQTKit>(id));
|
| +
|
| + if(newCaptureModule->Init(id, deviceUniqueIdUTF8) != 0)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, id,
|
| + "could not Create for unique device %s, "
|
| + "newCaptureModule->Init()!=0", deviceUniqueIdUTF8);
|
| + return nullptr;
|
| + }
|
| +
|
| + // Successfully created VideoCaptureMacQuicktime. Return it
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "Module created for unique device %s, will use QTKit "
|
| + "framework",deviceUniqueIdUTF8);
|
| + return newCaptureModule;
|
| +#endif
|
| +}
|
| +
|
| +/**************************************************************************
|
| + *
|
| + * Create/Destroy a DeviceInfo
|
| + *
|
| + ***************************************************************************/
|
| +
|
| +VideoCaptureModule::DeviceInfo*
|
| +VideoCaptureImpl::CreateDeviceInfo(const int32_t id)
|
| +{
|
| +
|
| +
|
| + if (webrtc::videocapturemodule::CheckOSVersion() == false)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
|
| + "OS version is too old. Could not create video capture "
|
| + "module. Returning NULL");
|
| + return NULL;
|
| + }
|
| +
|
| +#if __MAC_OS_X_VERSION_MIN_REQUIRED == __MAC_10_4 // QuickTime version
|
| + if (webrtc::videocapturemodule::CheckQTVersion() == false)
|
| + {
|
| + WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
|
| + "QuickTime version is too old. Could not create video "
|
| + "capture module. Returning NULL");
|
| + return NULL;
|
| + }
|
| +
|
| + webrtc::videocapturemodule::VideoCaptureMacQuickTimeInfo* newCaptureInfoModule =
|
| + new webrtc::videocapturemodule::VideoCaptureMacQuickTimeInfo(id);
|
| +
|
| + if (!newCaptureInfoModule || newCaptureInfoModule->Init() != 0)
|
| + {
|
| + Destroy(newCaptureInfoModule);
|
| + newCaptureInfoModule = NULL;
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "Failed to Init newCaptureInfoModule created with id %d "
|
| + "and device \"\" ", id);
|
| + return NULL;
|
| + }
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "VideoCaptureModule created for id", id);
|
| + return newCaptureInfoModule;
|
| +
|
| +#else // QTKit version
|
| + webrtc::videocapturemodule::VideoCaptureMacQTKitInfo* newCaptureInfoModule =
|
| + new webrtc::videocapturemodule::VideoCaptureMacQTKitInfo(id);
|
| +
|
| + if(!newCaptureInfoModule || newCaptureInfoModule->Init() != 0)
|
| + {
|
| + //Destroy(newCaptureInfoModule);
|
| + delete newCaptureInfoModule;
|
| + newCaptureInfoModule = NULL;
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "Failed to Init newCaptureInfoModule created with id %d "
|
| + "and device \"\" ", id);
|
| + return NULL;
|
| + }
|
| + WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, id,
|
| + "VideoCaptureModule created for id", id);
|
| + return newCaptureInfoModule;
|
| +
|
| +#endif
|
| +
|
| +}
|
| +
|
| +/**************************************************************************
|
| + *
|
| + * End Create/Destroy VideoCaptureModule
|
| + *
|
| + ***************************************************************************/
|
| +} // namespace videocapturemodule
|
| +} // namespace webrtc
|
|
|