QTCaptureDecompressedVideoOutput с FireWire - PullRequest
       28

QTCaptureDecompressedVideoOutput с FireWire

0 голосов
/ 17 ноября 2011

Я пытаюсь создать собственный патч для Quartz Composer, который захватывает данные с входа FireWire.Я могу открыть устройство и добавить вход успешно.Я даже отключаю аудио входы в соответствии с документацией QTKit.Я подозреваю, что моя проблема заключается в добавлении вывода (хотя он добавляет без ошибок).Каждый раз, когда запускается фрейм, он падает, когда кажется, что imageBuffer пуст.У него нет размеров или чего-то еще.Я использую стандартную методику captureOutput: didOutputVideoFrame: withSampleBuffer: fromConnection из документации.

   [mCaptureDecompressedVideoOutput release];
    mCaptureDecompressedVideoOutput = [[QTCaptureDecompressedVideoOutput alloc] init];
    NSLog(@"allocated mCaptureDecompressedVideoOutput");
    [mCaptureDecompressedVideoOutput setPixelBufferAttributes:
     [NSDictionary dictionaryWithObjectsAndKeys:
      [NSNumber numberWithBool:YES], kCVPixelBufferOpenGLCompatibilityKey,
      [NSNumber numberWithLong:k32ARGBPixelFormat], kCVPixelBufferPixelFormatTypeKey, nil]];


    [mCaptureDecompressedVideoOutput setDelegate:self];
    success = [mCaptureSession addOutput:mCaptureDecompressedVideoOutput error:&error];

    if (!success) {
        NSLog(@"Failed to add output");
            self.outputImage = nil; 
        if (mCaptureSession) {
            [mCaptureSession release];
            mCaptureSession= nil;
        }
        if (mCaptureDeviceInput) {
            [mCaptureDeviceInput release];
            mCaptureDeviceInput= nil;
        }
        if (mCaptureDecompressedVideoOutput) {
            [mCaptureDecompressedVideoOutput release];
            mCaptureDecompressedVideoOutput= nil;
        }
        return YES;
    }

    [mCaptureSession startRunning]; 
        _currentDevice= self.inputDevice;
    }

    CVImageBufferRef imageBuffer = CVBufferRetain(mCurrentImageBuffer);

if (imageBuffer) {
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    NSLog(@"ColorSpace: %@", CVImageBufferGetColorSpace(imageBuffer));

    id provider= [context outputImageProviderFromBufferWithPixelFormat:QCPlugInPixelFormatARGB8           
                                                            pixelsWide:CVPixelBufferGetWidth(imageBuffer)
                                                            pixelsHigh:CVPixelBufferGetHeight(imageBuffer)
                                                           baseAddress:CVPixelBufferGetBaseAddress(imageBuffer)
                                                           bytesPerRow:CVPixelBufferGetBytesPerRow(imageBuffer)
                                                       releaseCallback:_BufferReleaseCallback
                                                        releaseContext:imageBuffer
                                                            colorSpace:CVImageBufferGetColorSpace(imageBuffer)
                                                      shouldColorMatch:YES];

Что я могу сделать не так?Этот код прекрасно работает только для видеовходов, но не для FireWire (мультиплексированных).

1 Ответ

0 голосов
/ 19 ноября 2011

Мне удалось заставить этот патч работать с входами Video и Muxed, удалив ключ kCVPixelBufferOpenGLCompatibilityKey из mCaptureDecompressedVideoOutput.Хотя это позволяет патчу отлично работать в Quartz Composer, я намереваюсь запустить этот патч в композиции, которая используется внутри CamTwist, которая, по-видимому, не нуждается в поддержке OpenGL.Прямо сейчас, он просто отображает черный экран с входами Video или Muxed, где он раньше работал с видео входами.Итак, я собираюсь преобразовать свой CVImageBufferRef в текстуру OpenGL и посмотреть, смогу ли я заставить его работать с

outputImageProviderFromTextureWithPixelFormat:pixelsWide:pixelsHigh:name:flipped:releaseCallback:releaseContext:colorSpace:shouldColorMatch
...