sexta-feira, 7 de outubro de 2011

Estátuas para o pessoal do FFmpeg

Vários codecs patenteados possuem decoders open source. O decoder em si é livre, o código é aberto. A restrição é que as patentes da tecnologia impedem livre distribuição de qualquer implementação (mesmo livre) sem pagamento de royalties; do encoder, decoder, ou ambos.

Num Linux hoje, frameworks como o GStreamer (ou aplicativos que usem implementações próprias) passam no final das contas o trabalho para esses caras:

MP3: libmad (GPL); libavcodec (ffmp3)
AAC: faad2 (GPL); libavcodec (ffaac)
AC-3 ("Dolby Digital"): liba52 (GPL); libavcodec (ffac3)
DTS: libdca, antiga libdts (GPL); libavcodec (ffdts)
Theora: libtheora (BSD); libavcodec (fftheora)
VP6: libavcodec (ffvp6)
MPEG-1, MPEG-2, MPEG-4 SP/ASP/AVC: libavcodec
RealVideo: libavcodec
VP8: libvpx (BSB); libavcodec (ffvp8)

Como você pode ver, a libavcodec, parte do FFmpeg, que é licenciado pela GPL ou LGPL -- dependendo de quais partes sejam habilitadas na compilação --, é capaz de decodificar todos os codecs que listei (e muitos outros). Todo código da libavcodec é nativo, que foi feito, quando a especificação do codec é aberta, lendo a sua documentação, ou via engenharia reversa. Além de decodificar fluxos de áudio e vídeo, com a libavcodec, o FFmpeg possui outras bibliotecas com mais funções, como a libavformat, que faz demuxação de variados contaniers (formato do arquivo).

O suporte a Windows Media Video/Windows Media Audio foi um problema tempos atrás. Hoje em dia, a libavcodec/libavformat tem melhorado muito o suporte aos codecs/containers da Microsoft. Os w32codecs, uma gambiarra de algumas dlls do Windows Media Player costuradas com um Wine embutido, são obsoletos, pois existe implementação nativa no FFmpeg. O problma é muitas vezes o uso de versões muito velhas do FFMpeg pelas distribuições. O código do FFmpeg é constantemente desenvolvido, de forma que usar uma versão um ano atrás é deixar de aproveitar várias melhorias feitas em todo esse tempo.

Arquivos de vídeo em Flash (container FLV), idem, a libavcodec/libavformat tira de letra. A libavformat demuxa FLV com pé nas costas e os codecs usados no vídeo (Sorenson Video/Spark, VP6, MPEG-4 AVC) e áudio (MP3/AAC) são suportados pela libavcodec.

A libavcodec suporta também, quando a aplicação pedir, usar aceleração por hardware para decodificar MPEG-2/4, VC-1, (os codecs geralmente suportados no silício) via DXVA (Windows), VA API (Linux).

Sempre pode ser melhorada a eficiência dos decoders, o que vem sendo feito, como o suporte a multithreading, uso de instruções SIMD, melhores algoritmos. No caso específico do suporte a MT, as aplicações precisam ser modificadas para aproveitarem o recurso. No GStreamer, a versão 0.10.12 do gst-ffmpeg que adicionou o suporte. O VLC habilita MT da libavcodec no código em desenvolvimento, que resultará na versão 1.2.0 (no Windows, olhe aqui). Versões recentes do ffdshow também usam MT.

A minha conclusão é que deveríamos levantar estátuas para o pessoal do FFmpeg! E não só com codecs proprietários eles brilham. Vejam que o decoder VP8 da libavcodec (ffvp8, escrito do zero em poucos meses) passou em muito o desempenho da libvpx (a implementação "oficial" do Google): FFMpeg's ffvp8, the Fastest VP8 Decoder

Nenhum comentário:

Postar um comentário