Que vergonha… não criei sincronismo ao capturar o frame do buffer na biblioteca libhaircapture  (derivado da correria para entreta de um projeto, mas não justifica… ). Ao capturar a imagem, a falta de sincronimo pode gera um quadro com  metade do frame atual e a outra metade do frame anterior.

O erro foi constatado graças ao Stage (o Luiz Fernando) que trabalha na NETi, pois os seus testes exaustivos acabou demonstrando esta falha (foi mal…). Poderia implementar a técnica de semáforo, mas um simples mutex é o suficiente para sincronizar e resolver o problema. Para quem deseja fazer uma prova de conceito, abaixo um código básico.

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t r3_mutex=PTHREAD_MUTEX_INITIALIZER;

void* print(void )
{
   pthread_mutex_lock(&r3_mutex);
   printf("Aguarando 10 segundos dentro thread. 2\n");
   sleep(10);
   pthread_mutex_unlock(&r3_mutex);
   printf("Thread finalizada.\n");
   pthread_exit(NULL);
}

int main (int argc, char** argv)
{
   pthread_t threads;

   pthread_create(&threads, NULL, (void *(*)(void *))print, NULL);
   printf("Aguarando 2 segundos (sleep fora da thread). \n");
   sleep(2);
   printf("Aguarando 10 segundos restante (sleep dentro da thread). \n");
   pthread_mutex_lock(&r3_mutex);
   printf("Realmente constatada, thread finalizada.\n");
   printf("Processando algo... \n");
   pthread_mutex_unlock(&r3_mutex);
   printf("Process main finalizado\n");

   return 0;
}