Olá pessoal

Olhe só este cenário. Desenvolvi um software de streaming de vídeo em tempo real para uso próprio. O software hoje é capaz de transmitir o vídeo com os quadros codificados em H264, MPEG2, como sequencias de imagens MJPEG e em formato "raw" YUYV422. O software está usando UDP no canal de dados e TCP no de controle. Ele faz a quebra dos quadros em vários pacotes UDP e a remontagem e reordenação nos clientes. Acontece que venho percebendo que nas situações em que o fluxo de vídeo é alto (gerando então vários pacotes), como em resoluções altas ou quadros MJPEG e YUYV422 a interface de rede está perdendo os pacotes e obviamente eu preciso descartar os quadros incompletos no cliente. Entendi então que eu estava enviando os pacotes antes da interface mandar para a outra ponta e isto estaria forçando a interface a descartar os pacotes. Escrevi então esta rotina:

void waitSocketAvail(int socket)
{
    static int primeiro = 1;
    static fd_set writefds[FD_SETSIZE];
    int desP;

    if(primeiro==1){
        FD_ZERO(writefds);
        primeiro = 0;
    }

    for(;;){
        FD_SET(socket, writefds);
        desP = select(socket+1, NULL, writefds, NULL, NULL);
        if(desP>=0 || errno!=EINTR)
            break;
    }
    FD_CLR(socket, writefds);
}

Que bloqueia o processo até que o socket esteja pronto para receber mais pacotes. Acontece que embora tenha melhorado um pouco, a perda de pacotes ainda existe e do que vi na Internet o problema é que está enchendo os buffers do sistema antes dele poder enviar. A solução que vi sugerida é aumentar o tamanho do buffer do sistema.

Alguém já passou por experiência semelhante ou pode me dizer quais são os parâmetros que devo configurar?

[]'s

-Otacílio

-------------------------
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd

Responder a