O GStreamer versão 1.20 está disponível desde o início do mês e é o resultado positivo de 17 meses de trabalho de toda a comunidade. Mais de 250 desenvolvedores contribuíram com código para que este lançamento acontecesse. Entre eles, podemos destacar a equipe da Collabora teve mais colaboradores que mobilizou mais pessoal do que qualquer outra organização. Portanto, veja como a Collabora ajuda no desenvolvimento do GStreamer 1.20.
Nosso trabalho se concentrou nas duas áreas em que acreditamos que o GStreamer brilha mais: sistemas embarcados e streaming de rede, em particular WebRTC. Abaixo está um resumo do impacto que nossa equipe de engenheiros teve nesta última versão, diz a equipe.
Como de costume, você também pode saber mais sobre os aprimoramentos feitos pelo resto da comunidade consultando as notas da versão 1.20 do projeto.
Contribuições relacionadas a sistemas embarcados
O GStreamer já é a estrutura de mídia preeminente para sistemas embarcados, e esta é uma área em que o Collabora esteve muito ativo durante o último ciclo de lançamento. Aqui estão algumas das melhorias que fizemos.
Após muitos anos de esforços, finalmente eles conseguiram o suporte para decodificação de subquadros. Isso tornou possível iniciar a decodificação de quadros de vídeo antes que todo o quadro tenha sido recebido da rede, se o decodificador suportar isso. Isso ocorreu para JPEG2000 com OpenJPEG, com H.264 com ffmpeg, bem como em gst-omx ao usar as extensões Allegro presentes nos processadores Xilinx Zynq UltraScale+ MPSoC EV.
Em parceria com a Huawei, também aprimoramos o sistema de compilação do GStreamer para possibilitar a criação de uma biblioteca contendo apenas as partes específicas do GStreamer usadas por um determinado aplicativo ou conjunto de aplicativos. Dê uma olhada neste post do blog para saber mais.
Nicolas adicionou suporte a MPEG2 e VP9 Stateless Linux e contribuiu para aprimorar o analisador VP9. O decodificador H264 Stateless Linux também ganhou suporte para fluxos de vídeo entrelaçados, embora apenas para decodificadores baseados em fatias e não para decodificadores baseados em quadros, pois nenhum driver no kernel Linux principal suporta isso. Nicolas também adicionou suporte para um atraso de renderização que permite que vários quadros sejam enfileirados em um decodificador sem estado e aumenta a taxa de transferência ao custo de maior latência. Ele implementou isso para os decodificadores MPEG 2 Video, VP8 e VP9. Ele também adicionou suporte para decodificação HEVC ao novo plug-in “va” que usa a nova implementação de decodificador comum GStreamer para dar suporte a decodificadores baseados em VA-API.
Nicolas também implementou videocodectestsink: um pequeno elemento que calcula a soma de verificação dos quadros de entrada para compará-los com uma boa referência conhecida. Isso é útil para criar testes que garantem nenhuma regressão em implementações de decodificadores. Ele também adicionou o código necessário no GStreamer para reagir às mudanças de resolução na fonte Video4Linux. Isso é relevante principalmente se a fonte for, por exemplo, uma entrada HDMI.
WebRTC e streaming de rede
Durante grande parte da história do framework, o foco principal do GStreamer tem sido o streaming de mídia em uma rede. Esta é uma área em que também fizemos várias contribuições ao longo deste ciclo.
Eles contribuíram com muitas melhorias relacionadas à pilha WebRTC do GStreamer, que é uma das implementações independentes mais completas e flexíveis dos protocolos WebRTC. Há suporte para notificação explícita do fim de candidatos para que as conexões com falha possam ser reconhecidas mais rapidamente. Eu reformulei a API da biblioteca WebRTC para garantir que ela seja segura para threads, ocultando todas as informações por trás das propriedades. Também adicionaram suporte para a “prioridade” para fluxos de mídia; definir as várias prioridades agora adiciona as marcações DSCP corretas, permitindo que os administradores de rede priorizem o tráfego de acordo.
Collabora ajuda no desenvolvimento do GStreamer 1.20. Veja o que diz a postagem do blog
Jakub implementou uma extensão RTP Header tornando possível enviar informações de espaço de cores por quadro; isso permite que o GStreamer compartilhe conteúdo HDR dinâmico por RTP. A extensão que implementamos é compatível com a proposta da equipe libwebrtc do Google. A especificação básica para enviar Opus sobre RTP suporta apenas mono e estéreo. A equipe do Google libwebrtc criou uma extensão chamada “multiopus”, tornando possível enviar vários fluxos estéreo Opus juntos para servir mais de dois canais. Jakub implementou isso no payloader e no depayloader Opus RTP do GStreamer. Implementamos o RFC 6464, uma extensão de cabeçalho RTP que permite que um cliente envie ao servidor o nível relativo (volume) do áudio no pacote; isso permite que o servidor priorize os clientes que estão falando sobre os outros sem ter que decodificar todo o áudio. Também adicionamos suporte para o codec iSAC; é um codec de áudio legado que foi disponibilizado pelo Google em libwebrtc alguns anos atrás. Adicionamos um plug-in que envolve a implementação de referência do codec e também escrevemos um payloader e um depayloader RTP para permitir que o GStreamer envie e receba áudio codificado com esse codec sobre RTP.
Como parte do projeto Hwangsaeul patrocinado pela SK Telecom, melhoramos o suporte SRT. Raghavendra adicionou suporte para autenticação, enquanto Jakub adicionou uma maneira de o aplicativo ser notificado sobre conexões interrompidas e adicionou mais opções ao URI de forma compatível com o aplicativo de demonstração SRT.
Outras melhorias
Como o GStreamer é um framework multiplataforma incrivelmente flexível, também fizemos várias melhorias que estão fora das duas categorias principais.
Nicolas implementou suporte para decodificação de canais alfa em vídeos WebM. Isso é um pouco especial, pois o canal alfa é transportado como um segundo fluxo de vídeo. Ele também adicionou suporte para decodificar aqueles que usam decodificadores acelerados por hardware, como decodificadores baseados em V4L2.
Aaron adicionou o primeiro elemento especificamente para aprendizado de máquina à coleção principal de plug-ins do GStreamer. Ele usa a biblioteca ONNX para fazer a detecção de objetos; esperamos adicionar mais elementos usando a biblioteca ONNX no futuro.
Aaron também ajudou Rabindra Harlalka, do NICE, a contribuir com elementos upstream que podem criptografar um fluxo usando a criptografia AES. Isso apenas aplica o AES no modo CBC ao fluxo de entrada com a chave fornecida pelo aplicativo.
Xavier novamente fez inúmeras melhorias no sistema de construção do Meson; em particular, ele substituiu o gerador de arquivos pkg-config personalizado do GStreamer por um que ele contribuiu para o próprio Meson. Isso garante que os arquivos pkg-config gerados correspondam às bibliotecas que estão no sistema de compilação.
Adicionei uma propriedade “stats” ao elemento identity; isso facilita a instrumentação do pipeline para obter estatísticas para monitoramento. Adicionei suporte para os novos perfis H.264 “constricted high” e “progressive high” aos vários elementos do GStreamer onde eles são relevantes. Esses perfis são apenas um subconjunto do perfil alto existente.
Jakub melhorou o plug-in d3d11desktopup para capturar a área de trabalho do Windows para texturas DirectX 11. Ele implementou suporte para acompanhar as mudanças dinâmicas de resolução da área de trabalho e também para capturar prompts do Windows User Account Control (UAC).
Aprimorei a classe base GstAudioAggregator usada por elementos como os elementos audiomixer e audiointerleave, agora emite uma mensagem de QoS informando ao aplicativo sempre que descarta os buffers de entrada porque estão atrasados.
Stéphane fixou os demuxers MXF e Matroska para buscar precisamente um quadro; isso torna possível usá-los como fonte para edição de vídeo.
Xavier passou algum tempo ajudando na fusão dos repositórios do GStreamer em um único . Este foi um esforço de toda a comunidade, tornando nosso sistema de CI mais simples e geralmente facilita a vida dos desenvolvedores do GStreamer.
Como de costume, também há um grande número de correções de bugs em geral.
Quem quiser saber mais detalhes, deve acessar este link.