Совместное использование кадровых буферов между потоками - PullRequest
1 голос
/ 24 ноября 2011

У меня есть видео приложение, которое выполняет как предварительный просмотр в реальном времени, так и захват неподвижных изображений во время предварительного просмотра.Я использую 4 текстуры, которые предварительно генерируются при загрузке приложения.Я обращаюсь к текстурам в трех потоках.

Чтобы заставить работать предварительный просмотр в реальном времени, мне пришлось создать Sharegroup (см. Ниже), чтобы метод captureOutput мог сохранять результат в кадровом буфере с именем FBO_OUT.Затем для отображения на экране мне нужно было набрать FBO_OUT для звонка на presentRenderbuffer.Если я не использовал Sharegroup, я только что получил кучу бреда.

CAEAGLLayer* eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
                                kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
                                nil];
oglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
offscreenContext = [[EAGLContext alloc] initWithAPI:[oglContext API] sharegroup:oglContext.sharegroup];
if (!oglContext || ![EAGLContext setCurrentContext:oglContext]) {
    NSLog(@"Problem with OpenGL context.");
    [self release];

    return nil;
}

Периодически, внутри captureOutput мне нужно вызвать этот код:

#define SHAREGROUP_CONTEXT [[[appDelegate mainViewController] oglView] offscreenContext]

 if ([EAGLContext currentContext] != SHAREGROUP_CONTEXT) {
     NSLog(@"setting context");
     glFlush();
     [EAGLContext setCurrentContext:SHAREGROUP_CONTEXT];
 }

 @synchronized(SHAREGROUP_CONTEXT)
 {
    /* process pixels */
 }

 glFlush();  // at end of method

Thisработает нормально, проблема в том, что я сейчас пытаюсь сделать то же самое после получения неподвижного изображения (пока предварительный просмотр все еще выполняется) через блок captureStillImageAsynchronouslyFromConnection, однако я снова получаю тарабарщину, хотя я пытался сделатьthis:

AVCaptureConnection *sic = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];

[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:sic
                                                     completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
 {

     @synchronized(SHAREGROUP_CONTEXT)
     {

         /* generate new textures to process the imageDataSampleBuffer and cry */
     }

Кажется, это проблема с контекстами и многопоточностью.

1 Ответ

1 голос
/ 25 ноября 2011

Я нашел ответ.Вы должны убедиться, что блок @synchronized находится в обоих методах.Мне понадобилось так много времени, чтобы найти, потому что что-то очень странное происходило с моими шейдерами.Одно из имен файлов было строчным на диске, когда XCode решил, что все они прописными.Это заставило шейдер работать в режиме предварительного просмотра, но в части захвата неподвижного изображения я получил белый экран.Понятия не имею, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...