Um dos projetos em que trabalhei recentemente foi em criar um software para o Android que suportasse o Sistema Brasileiro de TV Digital. A tecnologia que adotamos foi o GStreamer.

No entanto, descobri que o suporte à SBTVD no GStreamer ainda precisava de algum trabalho. Aqui, apresento algumas das tarefas realizadas para tentar introduzir esse suporte.

AAC LATM

O padrão SBTVD, infelizmente, adotou alguns padrões de formato de áudio e vídeo criados pelo MPEG. Essas tecnologias estão restringidas por patentes que outro grupo, o MPEGLA, costuma usar para exigir pagamento ou impedir o seu uso.

Um desses padrões é conhecido por Advanced Audio Coding ou AAC. O AAC pode ser empacotado de diversas formas e uma delas, conhecida por LATM, não é suportada pelo Gstreamer, seja através do faad ou através do ffmpeg.

O suporte a LATM no faad está normalmente desabilitado. Já o suporte a LATM no ffmpeg é bem recente. Depois de várias tentativas com o faad e o plugin de faad do GStreamer, pareceu melhor decisão usar o gst-ffmpeg com o novo suporte a LATM no ffmpeg. O resultado foi o que descrevo a seguir.

Patches

Um dos patches necessários (ou pelo menos foi necesssário pra combinação de patches que produzi e experimentei) foi revertido no ffmpeg. Ainda não tive tempo pra rever o patch e o problema que encontraram com ele, pra fazer uma nova versão. A princípio, esse patch é necessário pois não há codec_data nos buffers de AAC LATM extraídos do demuxer. Outra alternativa, portanto, seria adicionar o codec_data a esses buffers em todo e qualquer demuxer que suporte AAC LATM. Ainda prefiro, portanto, a abordagem de omitir esse atributo, por não ser necessário.

Para o gst-ffmpeg, foi necessário um patch para evitar jogar todos os buffers fora por um erro na lógica de verificação de timestamp, pelo menos para os vídeos com que testei. Esse bug já está reportado no bugzilla do GNOME. Apesar de algumas besterias minhas, o patch parece estar em bom estado e só precisando de um pouco de insistência para ser aplicado.

Também para o gst-ffmpeg, é necessário incluir o CODEC_ID_AAC_LATM em dois switch/cases no gstffmpegcodecmap.c. O primeiro na função gst_ff_aud_caps_new, o segundo na função gst_ffmpeg_codecid_to_caps. Eu joguei tudo junto com o CODEC_ID_AAC, sem fazer distinção dos dois. Isso é um problema para auto-plugging. Já que o elemento que decodifica AAC LATM é diferente daquele que decodifica AAC (ADTS e ADIF), os caps devem ser distintos de alguma maneira. No entanto, funciona bem com o pipeline montado na mão.

O quarto patch é no demuxer de mpeg, seja no ffmpeg (já presente no repositório há algum tempinho) ou no mpegtsdemux. É o patch descrito no bug 615681 do gnome. Esse patch tem relação com o anterior, em que a definição de quais caps utilizar para identificar os buffers AAC/LATM permitirão o bom funcionamento do auto-plugging no GStreamer.

Descritores MPEG

O MPEG Transport Stream é o formato utilizado para as transmissões do SBTVD. Vários pacotes especiais contém descritores em formatos documentados no padrão MPEG-2, e extendido nas normas do SBTVD.

O suporte a esses descritores deve ser implementado no demuxer. No caso do GStreamer, no elemento mpegtsdemux. Uma dessas extensões permite obter a informação do canal virtual utilizado por aquela transmissora de TV. Esse canal virtual é o canal utilizado na rede analógica e seu propósito é permitir que o telespectador possa utilizar os números de canais com o qual já está habituado, já que os canais físicos alocados para a transmissão de TV digital são diferentes. Comecei a escrever um patch para esse suporte, mas ainda é necessário corrigí-lo para iterar nos descritores, ao invés de utilizar apenas o primeiro descritor encontrado.

Outras extensões podem ser interessantes para aplicações que suportem o SBTVD. Espero que esse trabalho iniciado possa ser complementado por outros. Já troquei mensagens com outras pessoas interessadas nesse trabalho, e acredito que possamos oferecer um suporte ao padrão brasileiro de TV digital, utilizando software livre de qualidade.