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.