| Index: media/video/capture/mac/video_capture_device_qtkit_mac.mm
|
| diff --git a/media/video/capture/mac/video_capture_device_qtkit_mac.mm b/media/video/capture/mac/video_capture_device_qtkit_mac.mm
|
| index 0b62867811c7f63948482aa4c797746d7b066829..c884c723df5cb0afa5964551163f9ba8480c523a 100644
|
| --- a/media/video/capture/mac/video_capture_device_qtkit_mac.mm
|
| +++ b/media/video/capture/mac/video_capture_device_qtkit_mac.mm
|
| @@ -78,25 +78,31 @@
|
| return NO;
|
| }
|
|
|
| + // TODO(mcasas): Consider using [QTCaptureDevice deviceWithUniqueID] instead
|
| + // of explicitly forcing reenumeration of devices.
|
| NSArray *captureDevices =
|
| [QTCaptureDevice inputDevicesWithMediaType:QTMediaTypeVideo];
|
| NSArray *captureDevicesNames =
|
| [captureDevices valueForKey:@"uniqueID"];
|
| NSUInteger index = [captureDevicesNames indexOfObject:deviceId];
|
| if (index == NSNotFound) {
|
| - DLOG(ERROR) << "Video capture device not found.";
|
| + [self sendErrorString:[NSString
|
| + stringWithUTF8String:"Video capture device not found."]];
|
| return NO;
|
| }
|
| QTCaptureDevice *device = [captureDevices objectAtIndex:index];
|
| if ([[device attributeForKey:QTCaptureDeviceSuspendedAttribute]
|
| boolValue]) {
|
| - DLOG(ERROR) << "Cannot open suspended video capture device.";
|
| + [self sendErrorString:[NSString
|
| + stringWithUTF8String:"Cannot open suspended video capture device."]];
|
| return NO;
|
| }
|
| NSError *error;
|
| if (![device open:&error]) {
|
| - DLOG(ERROR) << "Could not open video capture device."
|
| - << [[error localizedDescription] UTF8String];
|
| + [self sendErrorString:[NSString
|
| + stringWithFormat:@"Could not open video capture device (%@): %@",
|
| + [error localizedDescription],
|
| + [error localizedFailureReason]]];
|
| return NO;
|
| }
|
| captureDeviceInput_ = [[QTCaptureDeviceInput alloc] initWithDevice:device];
|
| @@ -106,8 +112,10 @@
|
| [[[QTCaptureDecompressedVideoOutput alloc] init] autorelease];
|
| [captureDecompressedOutput setDelegate:self];
|
| if (![captureSession_ addOutput:captureDecompressedOutput error:&error]) {
|
| - DLOG(ERROR) << "Could not connect video capture output."
|
| - << [[error localizedDescription] UTF8String];
|
| + [self sendErrorString:[NSString
|
| + stringWithFormat:@"Could not connect video capture output (%@): %@",
|
| + [error localizedDescription],
|
| + [error localizedFailureReason]]];
|
| return NO;
|
| }
|
|
|
| @@ -126,7 +134,8 @@
|
| } else {
|
| // Remove the previously set capture device.
|
| if (!captureDeviceInput_) {
|
| - DLOG(ERROR) << "No video capture device set.";
|
| + [self sendErrorString:[NSString
|
| + stringWithUTF8String:"No video capture device set, on removal."]];
|
| return YES;
|
| }
|
| if ([[captureSession_ inputs] count] > 0) {
|
| @@ -139,15 +148,14 @@
|
| id output = [[captureSession_ outputs] objectAtIndex:0];
|
| [output setDelegate:nil];
|
|
|
| - // TODO(shess): QTKit achieves thread safety by posting messages
|
| - // to the main thread. As part of -addOutput:, it posts a
|
| - // message to the main thread which in turn posts a notification
|
| - // which will run in a future spin after the original method
|
| - // returns. -removeOutput: can post a main-thread message in
|
| - // between while holding a lock which the notification handler
|
| - // will need. Posting either -addOutput: or -removeOutput: to
|
| - // the main thread should fix it, remove is likely safer.
|
| - // http://crbug.com/152757
|
| + // TODO(shess): QTKit achieves thread safety by posting messages to the
|
| + // main thread. As part of -addOutput:, it posts a message to the main
|
| + // thread which in turn posts a notification which will run in a future
|
| + // spin after the original method returns. -removeOutput: can post a
|
| + // main-thread message in between while holding a lock which the
|
| + // notification handler will need. Posting either -addOutput: or
|
| + // -removeOutput: to the main thread should fix it, remove is likely
|
| + // safer. http://crbug.com/152757
|
| [captureSession_ performSelectorOnMainThread:@selector(removeOutput:)
|
| withObject:output
|
| waitUntilDone:YES];
|
| @@ -162,15 +170,17 @@
|
|
|
| - (BOOL)setCaptureHeight:(int)height width:(int)width frameRate:(int)frameRate {
|
| if (!captureDeviceInput_) {
|
| - DLOG(ERROR) << "No video capture device set.";
|
| + [self sendErrorString:[NSString
|
| + stringWithUTF8String:"No video capture device set."]];
|
| return NO;
|
| }
|
| if ([[captureSession_ outputs] count] != 1) {
|
| - DLOG(ERROR) << "Video capture capabilities already set.";
|
| + [self sendErrorString:[NSString
|
| + stringWithUTF8String:"Video capture capabilities already set."]];
|
| return NO;
|
| }
|
| if (frameRate <= 0) {
|
| - DLOG(ERROR) << "Wrong frame rate.";
|
| + [self sendErrorString:[NSString stringWithUTF8String: "Wrong frame rate."]];
|
| return NO;
|
| }
|
|
|
| @@ -196,14 +206,18 @@
|
| - (BOOL)startCapture {
|
| if ([[captureSession_ outputs] count] == 0) {
|
| // Capture properties not set.
|
| - DLOG(ERROR) << "Video capture device not initialized.";
|
| + [self sendErrorString:[NSString
|
| + stringWithUTF8String:"Video capture device not initialized."]];
|
| return NO;
|
| }
|
| if ([[captureSession_ inputs] count] == 0) {
|
| NSError *error;
|
| if (![captureSession_ addInput:captureDeviceInput_ error:&error]) {
|
| - DLOG(ERROR) << "Could not connect video capture device."
|
| - << [[error localizedDescription] UTF8String];
|
| + [self sendErrorString:[NSString
|
| + stringWithFormat:@"Could not connect video capture device (%@): %@",
|
| + [error localizedDescription],
|
| + [error localizedFailureReason]]];
|
| +
|
| return NO;
|
| }
|
| NSNotificationCenter * notificationCenter =
|
| @@ -309,12 +323,18 @@
|
| - (void)handleNotification:(NSNotification*)errorNotification {
|
| NSError * error = (NSError*)[[errorNotification userInfo]
|
| objectForKey:QTCaptureSessionErrorKey];
|
| - NSString* str_error =
|
| - [NSString stringWithFormat:@"%@: %@",
|
| - [error localizedDescription],
|
| - [error localizedFailureReason]];
|
| + [self sendErrorString:[NSString
|
| + stringWithFormat:@"%@: %@",
|
| + [error localizedDescription],
|
| + [error localizedFailureReason]]];
|
| +}
|
|
|
| - frameReceiver_->ReceiveError([str_error UTF8String]);
|
| +- (void)sendErrorString:(NSString*)error {
|
| + DLOG(ERROR) << [error UTF8String];
|
| + [lock_ lock];
|
| + if (frameReceiver_)
|
| + frameReceiver_->ReceiveError([error UTF8String]);
|
| + [lock_ unlock];
|
| }
|
|
|
| @end
|
|
|