| Index: webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.mm | 
| diff --git a/webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.mm b/webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.mm | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..ad057b49dbf2efa1d1c4195019900e6d77b82db2 | 
| --- /dev/null | 
| +++ b/webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.mm | 
| @@ -0,0 +1,211 @@ | 
| +/* | 
| + *  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. | 
| + */ | 
| + | 
| +#include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.h" | 
| +#import "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_info_objc.h" | 
| +#import "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_objc.h" | 
| +#include "webrtc/modules/video_capture/video_capture_config.h" | 
| +#include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 
| +#include "webrtc/system_wrappers/include/trace.h" | 
| + | 
| +namespace webrtc | 
| +{ | 
| + | 
| +namespace videocapturemodule | 
| +{ | 
| + | 
| +VideoCaptureMacQTKit::VideoCaptureMacQTKit(const int32_t id) : | 
| +    VideoCaptureImpl(id), | 
| +    _captureDevice(NULL), | 
| +    _captureInfo(NULL), | 
| +    _isCapturing(false), | 
| +    _id(id), | 
| +    _captureWidth(QTKIT_DEFAULT_WIDTH), | 
| +    _captureHeight(QTKIT_DEFAULT_HEIGHT), | 
| +    _captureFrameRate(QTKIT_DEFAULT_FRAME_RATE), | 
| +    _frameCount(0) | 
| +{ | 
| + | 
| +    memset(_currentDeviceNameUTF8, 0, MAX_NAME_LENGTH); | 
| +    memset(_currentDeviceUniqueIdUTF8, 0, MAX_NAME_LENGTH); | 
| +    memset(_currentDeviceProductUniqueIDUTF8, 0, MAX_NAME_LENGTH); | 
| +} | 
| + | 
| +VideoCaptureMacQTKit::~VideoCaptureMacQTKit() | 
| +{ | 
| + | 
| +    WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, _id, | 
| +                 "~VideoCaptureMacQTKit() called"); | 
| +    if(_captureDevice) | 
| +    { | 
| +        [_captureDevice registerOwner:nil]; | 
| +        [_captureDevice stopCapture]; | 
| +        [_captureDevice release]; | 
| +    } | 
| + | 
| +    if(_captureInfo) | 
| +    { | 
| +        [_captureInfo release]; | 
| +    } | 
| +} | 
| + | 
| +int32_t VideoCaptureMacQTKit::Init( | 
| +    const int32_t id, const char* iDeviceUniqueIdUTF8) | 
| +{ | 
| +    CriticalSectionScoped cs(&_apiCs); | 
| + | 
| + | 
| +    const int32_t nameLength = | 
| +        (int32_t) strlen((char*)iDeviceUniqueIdUTF8); | 
| +    if(nameLength>kVideoCaptureUniqueNameLength) | 
| +        return -1; | 
| + | 
| +    // Store the device name | 
| +    _deviceUniqueId = new char[nameLength+1]; | 
| +    memcpy(_deviceUniqueId, iDeviceUniqueIdUTF8,nameLength+1); | 
| + | 
| +    _captureDevice = [[VideoCaptureMacQTKitObjC alloc] init]; | 
| +    if(NULL == _captureDevice) | 
| +    { | 
| +        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id, | 
| +                     "Failed to create an instance of " | 
| +                     "VideoCaptureMacQTKitObjC"); | 
| +        return -1; | 
| +    } | 
| + | 
| +    [_captureDevice registerOwner:this]; | 
| + | 
| +    if(0 == strcmp((char*)iDeviceUniqueIdUTF8, "")) | 
| +    { | 
| +        // the user doesn't want to set a capture device at this time | 
| +        return 0; | 
| +    } | 
| + | 
| +    _captureInfo = [[VideoCaptureMacQTKitInfoObjC alloc]init]; | 
| +    if(nil == _captureInfo) | 
| +    { | 
| +        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id, | 
| +        "Failed to create an instance of VideoCaptureMacQTKitInfoObjC"); | 
| +        return -1; | 
| +    } | 
| + | 
| +    int captureDeviceCount = [[_captureInfo getCaptureDeviceCount]intValue]; | 
| +    if(captureDeviceCount < 0) | 
| +    { | 
| +        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id, | 
| +                     "No Capture Devices Present"); | 
| +        return -1; | 
| +    } | 
| + | 
| +    const int NAME_LENGTH = 1024; | 
| +    char deviceNameUTF8[1024] = ""; | 
| +    char deviceUniqueIdUTF8[1024] = ""; | 
| +    char deviceProductUniqueIDUTF8[1024] = ""; | 
| + | 
| +    bool captureDeviceFound = false; | 
| +    for(int index = 0; index < captureDeviceCount; index++){ | 
| + | 
| +        memset(deviceNameUTF8, 0, NAME_LENGTH); | 
| +        memset(deviceUniqueIdUTF8, 0, NAME_LENGTH); | 
| +        memset(deviceProductUniqueIDUTF8, 0, NAME_LENGTH); | 
| +        if(-1 == [[_captureInfo getDeviceNamesFromIndex:index | 
| +                   DefaultName:deviceNameUTF8 WithLength:NAME_LENGTH | 
| +                   AndUniqueID:deviceUniqueIdUTF8 WithLength:NAME_LENGTH | 
| +                   AndProductID:deviceProductUniqueIDUTF8 | 
| +                   WithLength:NAME_LENGTH]intValue]) | 
| +        { | 
| +            WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, | 
| +                         "GetDeviceName returned -1 for index %d", index); | 
| +            return -1; | 
| +        } | 
| +        if(0 == strcmp((const char*)iDeviceUniqueIdUTF8, | 
| +                       (char*)deviceUniqueIdUTF8)) | 
| +        { | 
| +            // we have a match | 
| +            captureDeviceFound = true; | 
| +            break; | 
| +        } | 
| +    } | 
| + | 
| +    if(false == captureDeviceFound) | 
| +    { | 
| +        WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, _id, | 
| +                     "Failed to find capture device unique ID %s", | 
| +                     iDeviceUniqueIdUTF8); | 
| +        return -1; | 
| +    } | 
| + | 
| +    // at this point we know that the user has passed in a valid camera. Let's | 
| +    // set it as the current. | 
| +    if(![_captureDevice setCaptureDeviceById:(char*)deviceUniqueIdUTF8]) | 
| +    { | 
| +        strcpy((char*)_deviceUniqueId, (char*)deviceUniqueIdUTF8); | 
| +        WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, | 
| +                     "Failed to set capture device %s (unique ID %s) even " | 
| +                     "though it was a valid return from " | 
| +                     "VideoCaptureMacQTKitInfo", deviceNameUTF8, | 
| +                     iDeviceUniqueIdUTF8); | 
| +        return -1; | 
| +    } | 
| + | 
| +    WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, _id, | 
| +                 "successfully Init VideoCaptureMacQTKit" ); | 
| +    return 0; | 
| +} | 
| + | 
| +int32_t VideoCaptureMacQTKit::StartCapture( | 
| +    const VideoCaptureCapability& capability) | 
| +{ | 
| + | 
| +    _captureWidth = capability.width; | 
| +    _captureHeight = capability.height; | 
| +    _captureFrameRate = capability.maxFPS; | 
| +    _captureDelay = 120; | 
| + | 
| +    [_captureDevice setCaptureHeight:_captureHeight | 
| +                               width:_captureWidth | 
| +                           frameRate:_captureFrameRate]; | 
| + | 
| +    [_captureDevice startCapture]; | 
| +    _isCapturing = true; | 
| +    return 0; | 
| +} | 
| + | 
| +int32_t VideoCaptureMacQTKit::StopCapture() | 
| +{ | 
| +    [_captureDevice stopCapture]; | 
| +    _isCapturing = false; | 
| +    return 0; | 
| +} | 
| + | 
| +bool VideoCaptureMacQTKit::CaptureStarted() | 
| +{ | 
| +    return _isCapturing; | 
| +} | 
| + | 
| +int32_t VideoCaptureMacQTKit::CaptureSettings(VideoCaptureCapability& settings) | 
| +{ | 
| +    settings.width = _captureWidth; | 
| +    settings.height = _captureHeight; | 
| +    settings.maxFPS = _captureFrameRate; | 
| +    return 0; | 
| +} | 
| + | 
| + | 
| +// ********** begin functions inherited from DeviceInfoImpl ********** | 
| + | 
| +struct VideoCaptureCapabilityMacQTKit:public VideoCaptureCapability | 
| +{ | 
| +    VideoCaptureCapabilityMacQTKit() | 
| +    { | 
| +    } | 
| +}; | 
| +}  // namespace videocapturemodule | 
| +}  // namespace webrtc | 
|  |