Resumo

  • A RFC 9628 expõe dependências VP9 de duas formas: o modo flexível leva até três P_DIFF em cada imagem predita; o modo não flexível declara um Picture Group recorrente nos dados SS.
  • Picture ID, índices de camada, referências e marcas de início ou fim descrevem a estrutura afirmada pelo emissor. Não comprovam a chegada de todos os fragmentos, a presença das referências, o estado interno do codec ou a imagem visível.
  • Um recibo defensável une negociação SDP, época de modo e estrutura, cobertura RTP, fechamento real das referências, validação do bitstream, saída do decoder e playout.

O contador de imagens avançava sem alarme. O relay conseguia justificar cada descarte. A última parcela do quadro chegou com Marker. O relatório concluiu que a entrega havia terminado.

O decoder, porém, não tinha uma referência que o relatório considerava implícita.

Esse desencontro mostra a força e o limite da RFC 9628. Ela transforma parte da estrutura VP9 em metadados utilizáveis por endpoints e middleboxes. A descrição permite montar um grafo. Não transporta junto o estado real do receptor, a integridade de cada frame ou a decisão do aplicativo de pôr uma imagem na tela.

No modo flexível, a referência acompanha a dívida

Com F=1, o Picture ID é obrigatório. Uma imagem predita traz de um a três campos P_DIFF. Cada campo expressa a distância entre o PID atual e uma imagem anterior, calculada no espaço de sete ou quinze bits. Zero é inválido.

O encoder pode alterar sua hierarquia temporal sem esperar por uma nova tabela periódica. Para quem observa, a vantagem é imediata: as referências afirmadas daquela imagem estão no próprio descriptor.

Mas uma referência nomeada não é uma referência disponível. Ela pode ter se perdido antes, sido removida legitimamente pelo SFU ou saído do buffer. O frame atual também pode ter começado em B e terminado em E com um pacote intermediário ausente. Um grafo sintaticamente perfeito pode apontar para memória vazia.

A verificação precisa manter dois inventários: o que o sender declarou e o que o receiver efetivamente conserva. O primeiro não pode preencher o segundo por presunção.

No modo não flexível, a economia depende de memória compartilhada

Com F=0, a estrutura pode repetir um Picture Group. O bloco SS descreve, posição a posição, TID, ponto de subida e diferenças de referência. A imagem-chave ancora a primeira posição; os PIDs seguintes percorrem o grupo módulo N_G.

TL0PICIDX acompanha as imagens da camada temporal zero. Ele avança nessas imagens e, nas camadas superiores, indica a base temporal relevante. Como tem oito bits, também reinicia.

Esse formato reduz overhead, mas aumenta o custo de reconstrução. Um coletor que começa no meio da chamada pode nunca ter visto o SS. Um SFU reiniciado pode retomar pacotes sem recuperar a fase. Uma captura pode guardar a tabela e perder a imagem-chave que define o ponto inicial.

Por isso, a estrutura precisa de vigência: hash do SS, pacote de introdução, PID de âncora, N_G, fase e motivo da mudança. A RFC só permite alterar F no primeiro pacote de uma key picture e restringe a substituição do SS. Tratar essas regras como eventos de época impede que uma tabela antiga interprete tráfego novo.

Picture ID não é identidade eterna nem contador de tela

O PID pode ter sete ou quinze bits, começar em um número aleatório, dar a volta e mudar de largura. A passagem para quinze bits faz extensão com zeros; a volta para sete trunca o valor. O receptor é proibido de presumir largura constante.

Todas as camadas espaciais de uma imagem compartilham PID. Uma imagem VP9 com show_frame=0, usada para alimentar referências e não para aparecer, ainda recebe um PID distinto. Assim, o número segue a unidade codificada, não o quadro que o usuário contou.

Um middlebox também pode descartar imagens quando a estrutura permite. O receptor pode observar saltos perfeitamente legítimos. E uma sequência sem saltos não revela a ausência de um fragmento dentro do frame. Continuidade de PID e integridade RTP são métricas diferentes.

Para servir como evidência, o PID deve vir acompanhado de sessão, SSRC, timestamp, largura, época, camada e ponto de observação. Fora desse conjunto, o wrap transforma a mesma cifra em várias imagens possíveis.

E encerra o frame, mas não repõe o pacote perdido

Um frame VP9 começa com B=1 e termina com E=1. O Marker RTP marca o último pacote do frame da camada espacial mais alta, fechando a picture. Se o SFU remove camadas superiores, ele move o Marker para a camada-alvo que permanece.

Essas marcas resolvem fronteiras. Elas não certificam o intervalo. E pode chegar depois de uma lacuna de sequence number. Marker pode chegar quando a camada inferior exigida por D está incompleta. Uma reescrita de Marker pode estar correta e a dependência temporal anterior estar ausente.

Como o formato não oferece acesso mais fino a uma parte do frame, a conclusão de completude exige cobertura RTP entre B e E, timestamp comum, ordem de SID e Marker coerente após a seleção. Ver a tampa fechar não prova que nada faltou dentro da caixa.

Há estado VP9 fora do grafo de pictures

O codec conserva tabelas de probabilidade para codificação entrópica e árvores. error_resilient_mode reinicia esse estado adicional. Em um stream escalável, o encoder precisa impedir que um frame posterior dependa desse estado quando o frame que o forneceu pode ser removido de forma legítima.

Essa regra é a objeção decisiva a um monitor puramente baseado em headers. P_DIFF, grupo e fase podem estar certos, enquanto o payload ainda precisa de uma tabela perdida. O inverso também ocorre: um decoder tolerante pode produzir saída sem confirmar a fidelidade do descriptor.

A especificação do bitstream VP9 define a carga. O parser de RTP define o envelope. O decoder em execução fornece outro fato. É preciso guardar os três.

Os bits de camada dão permissão estreita

TID e SID situam o frame. D informa dependência da camada espacial imediatamente inferior da mesma picture. U marca um ponto em que futuras camadas temporais superiores deixam de depender de certas imagens anteriores. Z diz que camadas espaciais superiores não dependem do frame atual e podem continuar se ele for descartado.

O alcance de cada afirmação é pequeno. U=1 não confirma a entrega do ponto. Z=1 não diz que o descarte preservou a qualidade contratada. SID=2 não é resolução absoluta. D=0 remove uma dependência espacial, não as referências temporais.

Um relay que decide com esses bits deve registrar a decisão: camada pretendida, regra, pacotes removidos, Marker refeito e pressão de congestionamento. Guardar apenas o campo permissivo é apagar o agente que exerceu a escolha.

RPSI confirma uma referência, não uma experiência

O receiver pode enviar RPSI com o Picture ID de uma golden frame ou altref frame corretamente decodificada. Depois de perda, também pode sugerir uma referência preferida. É uma evidência importante porque nasce após uma tentativa de decode.

Mesmo assim, o objeto continua estreito. O RPSI não declara que todas as camadas da picture ficaram disponíveis, que o playout escolheu o resultado ou que a imagem chegou dentro do prazo. FIR pede refresh total; LRR pede uma transição localizada. O fato de a cadeia de referências poder ser percorrida não transforma a ordem de refresh em recibo visual.

O artigo sobre RFC 9627 separa comando e recuperação. Este separa descrição VP9, presença de referência, decode e tela. As duas fronteiras se tocam, mas não devem ser sobrepostas.

A negociação dá significado ao número do payload

No SDP, VP9 usa clock de 90 kHz e payload type dinâmico. profile-id é uma configuração simétrica entre oferta e resposta; quando ausente, vale Profile 0. max-fr e max-fs descrevem capacidade do receiver, não medição da mídia recebida.

A RFC admite situações em que conteúdo pré-codificado ou relay seletivo não dispõe de uma variante dentro das capacidades. Portanto, aceitar a oferta não prova que cada frame posterior respeitou o limite ou foi decodificado.

O recibo começa no contexto: oferta, resposta, mapping, profile, capacidades, SSRC e renegociação. Um descriptor VP9 interpretado com a época SDP errada pode passar em todos os testes de forma e pertencer a outro contrato.

Fontes