Home | History | Annotate | Download | only in qtkit
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.h"
     12 #import "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_info_objc.h"
     13 #import "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_objc.h"
     14 #include "webrtc/modules/video_capture/video_capture_config.h"
     15 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
     16 #include "webrtc/system_wrappers/include/trace.h"
     17 
     18 namespace webrtc
     19 {
     20 
     21 namespace videocapturemodule
     22 {
     23 
     24 VideoCaptureMacQTKit::VideoCaptureMacQTKit(const int32_t id) :
     25     VideoCaptureImpl(id),
     26     _captureDevice(NULL),
     27     _captureInfo(NULL),
     28     _isCapturing(false),
     29     _id(id),
     30     _captureWidth(QTKIT_DEFAULT_WIDTH),
     31     _captureHeight(QTKIT_DEFAULT_HEIGHT),
     32     _captureFrameRate(QTKIT_DEFAULT_FRAME_RATE),
     33     _frameCount(0)
     34 {
     35 
     36     memset(_currentDeviceNameUTF8, 0, MAX_NAME_LENGTH);
     37     memset(_currentDeviceUniqueIdUTF8, 0, MAX_NAME_LENGTH);
     38     memset(_currentDeviceProductUniqueIDUTF8, 0, MAX_NAME_LENGTH);
     39 }
     40 
     41 VideoCaptureMacQTKit::~VideoCaptureMacQTKit()
     42 {
     43 
     44     WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, _id,
     45                  "~VideoCaptureMacQTKit() called");
     46     if(_captureDevice)
     47     {
     48         [_captureDevice registerOwner:nil];
     49         [_captureDevice stopCapture];
     50         [_captureDevice release];
     51     }
     52 
     53     if(_captureInfo)
     54     {
     55         [_captureInfo release];
     56     }
     57 }
     58 
     59 int32_t VideoCaptureMacQTKit::Init(
     60     const int32_t id, const char* iDeviceUniqueIdUTF8)
     61 {
     62     CriticalSectionScoped cs(&_apiCs);
     63 
     64 
     65     const int32_t nameLength =
     66         (int32_t) strlen((char*)iDeviceUniqueIdUTF8);
     67     if(nameLength>kVideoCaptureUniqueNameLength)
     68         return -1;
     69 
     70     // Store the device name
     71     _deviceUniqueId = new char[nameLength+1];
     72     memcpy(_deviceUniqueId, iDeviceUniqueIdUTF8,nameLength+1);
     73 
     74     _captureDevice = [[VideoCaptureMacQTKitObjC alloc] init];
     75     if(NULL == _captureDevice)
     76     {
     77         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
     78                      "Failed to create an instance of "
     79                      "VideoCaptureMacQTKitObjC");
     80         return -1;
     81     }
     82 
     83     [_captureDevice registerOwner:this];
     84 
     85     if(0 == strcmp((char*)iDeviceUniqueIdUTF8, ""))
     86     {
     87         // the user doesn't want to set a capture device at this time
     88         return 0;
     89     }
     90 
     91     _captureInfo = [[VideoCaptureMacQTKitInfoObjC alloc]init];
     92     if(nil == _captureInfo)
     93     {
     94         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
     95         "Failed to create an instance of VideoCaptureMacQTKitInfoObjC");
     96         return -1;
     97     }
     98 
     99     int captureDeviceCount = [[_captureInfo getCaptureDeviceCount]intValue];
    100     if(captureDeviceCount < 0)
    101     {
    102         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id,
    103                      "No Capture Devices Present");
    104         return -1;
    105     }
    106 
    107     const int NAME_LENGTH = 1024;
    108     char deviceNameUTF8[1024] = "";
    109     char deviceUniqueIdUTF8[1024] = "";
    110     char deviceProductUniqueIDUTF8[1024] = "";
    111 
    112     bool captureDeviceFound = false;
    113     for(int index = 0; index < captureDeviceCount; index++){
    114 
    115         memset(deviceNameUTF8, 0, NAME_LENGTH);
    116         memset(deviceUniqueIdUTF8, 0, NAME_LENGTH);
    117         memset(deviceProductUniqueIDUTF8, 0, NAME_LENGTH);
    118         if(-1 == [[_captureInfo getDeviceNamesFromIndex:index
    119                    DefaultName:deviceNameUTF8 WithLength:NAME_LENGTH
    120                    AndUniqueID:deviceUniqueIdUTF8 WithLength:NAME_LENGTH
    121                    AndProductID:deviceProductUniqueIDUTF8
    122                    WithLength:NAME_LENGTH]intValue])
    123         {
    124             WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
    125                          "GetDeviceName returned -1 for index %d", index);
    126             return -1;
    127         }
    128         if(0 == strcmp((const char*)iDeviceUniqueIdUTF8,
    129                        (char*)deviceUniqueIdUTF8))
    130         {
    131             // we have a match
    132             captureDeviceFound = true;
    133             break;
    134         }
    135     }
    136 
    137     if(false == captureDeviceFound)
    138     {
    139         WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, _id,
    140                      "Failed to find capture device unique ID %s",
    141                      iDeviceUniqueIdUTF8);
    142         return -1;
    143     }
    144 
    145     // at this point we know that the user has passed in a valid camera. Let's
    146     // set it as the current.
    147     if(![_captureDevice setCaptureDeviceById:(char*)deviceUniqueIdUTF8])
    148     {
    149         strcpy((char*)_deviceUniqueId, (char*)deviceUniqueIdUTF8);
    150         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
    151                      "Failed to set capture device %s (unique ID %s) even "
    152                      "though it was a valid return from "
    153                      "VideoCaptureMacQTKitInfo", deviceNameUTF8,
    154                      iDeviceUniqueIdUTF8);
    155         return -1;
    156     }
    157 
    158     WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, _id,
    159                  "successfully Init VideoCaptureMacQTKit" );
    160     return 0;
    161 }
    162 
    163 int32_t VideoCaptureMacQTKit::StartCapture(
    164     const VideoCaptureCapability& capability)
    165 {
    166 
    167     _captureWidth = capability.width;
    168     _captureHeight = capability.height;
    169     _captureFrameRate = capability.maxFPS;
    170     _captureDelay = 120;
    171 
    172     [_captureDevice setCaptureHeight:_captureHeight
    173                                width:_captureWidth
    174                            frameRate:_captureFrameRate];
    175 
    176     [_captureDevice startCapture];
    177     _isCapturing = true;
    178     return 0;
    179 }
    180 
    181 int32_t VideoCaptureMacQTKit::StopCapture()
    182 {
    183     [_captureDevice stopCapture];
    184     _isCapturing = false;
    185     return 0;
    186 }
    187 
    188 bool VideoCaptureMacQTKit::CaptureStarted()
    189 {
    190     return _isCapturing;
    191 }
    192 
    193 int32_t VideoCaptureMacQTKit::CaptureSettings(VideoCaptureCapability& settings)
    194 {
    195     settings.width = _captureWidth;
    196     settings.height = _captureHeight;
    197     settings.maxFPS = _captureFrameRate;
    198     return 0;
    199 }
    200 
    201 
    202 // ********** begin functions inherited from DeviceInfoImpl **********
    203 
    204 struct VideoCaptureCapabilityMacQTKit:public VideoCaptureCapability
    205 {
    206     VideoCaptureCapabilityMacQTKit()
    207     {
    208     }
    209 };
    210 }  // namespace videocapturemodule
    211 }  // namespace webrtc
    212