2

Em 2011 um CEO me deu de presente uma licença de 3D. Em 2026 eu devolvi o favor consertando o 3D de todo o mundo.

#Plot: Em fevereiro de 2011 eu era um moleque brasileiro sem dinheiro para comprar um monitor 3D.

Escrevi para o CEO da iZ3D, a empresa que fazia o driver que forçava 3D estereoscópico em jogos que não tinham 3D, propondo que eles entrassem pelo Brasil em vez de brigar por Estados Unidos e Europa.

Argumentei que aqui a propaganda em TV aberta era barata.

Ofereci ajudar a negociar.

O Vadim Asadov me respondeu com a verdade do negócio: que a Ásia era o melhor lugar para fabricar monitor, e que a Samsung tinha gasto entre 10 e 20 milhões de dólares em marketing na Rússia, dinheiro que a iZ3D não tinha.

E aí ele me deu a licença. "iZ3D All Outputs", 2 de fevereiro de 2011. Foi assim que eu zerei Max Payne em 3D anaglifo, de óculos vermelho e azul, num monitor CRT comum.

Fechei aquele e-mail dizendo que sonhava em ver "mentes brasileiras e russas desenvolvendo algo que passasse por cima dos grandes, tipo renderização ou captura estéreo múltipla para chegar num holograma real". Eu tinha uns vinte e poucos anos e nenhuma noção de que aquilo era uma frase que eu ia passar a vida inteira tentando cumprir.

Quinze anos depois, um mês atrás, eu estava olhando duas TVs Sony de 2011 e 2012 na minha sala, com hardware excelente e software morto, e resolvi entender por quê.

O que eu encontrei

Primeiro os números, porque o resto é história:

137 de 168 URLs dos servidores de conteúdo da Sony ainda respondem em 2026. Os arquivos não morreram, o catálogo sim.

8 apps no catálogo de widgets da Europa, 2 no do Brasil. Mesmo servidor, mesma geração de chassis.

798 modelos KDL listados hoje no serviço de fontes GPL da Sony, zero da geração 2010–2012. E um snapshot de 2014 mostra a geração lá, com os meus dois modelos pelo nome.

~US$ 0,12 por mês é o que custaria hospedar o corpus GPL inteiro dessa geração hoje.

9 frentes abertas em projetos upstream, sendo 1 pull request já mergeado no HandBrake.

1. O "Rio de Janeiro" que ninguém no Brasil viu

O app de Relógio Mundial nunca apareceu na minha TV. Nem em nenhuma no Brasil.

Fui atrás do porquê e abri o dicionário de tradução que a Sony publica no servidor dela.

Trinta e uma línguas.

Português completo: dias da semana abreviados, mensagens de erro, e a lista de cidades de fuso horário, com "Rio de Janeiro" lá dentro (dic.txt vivo, snapshot).

Alguém sentou, traduziu, colocou a nossa cidade na lista, e subiu para o servidor.
E o catálogo brasileiro nunca listou o app.

Não foi só esse.

Dos cinco apps que o Brasil não recebeu, quatro não têm texto nenhum dependente de idioma: Calculadora, Alarme, Calendário, Relógio Analógico.

Uma calculadora não tem palavra. Mesmo assim o manifest da Sony carrega o nome localizado em 30 idiomas, e Calculadora está lá (info.xml vivo, snapshot).

Não havia custo de tradução a economizar.
O trabalho estava feito e pago.
O que separou uma TV brasileira de uma calculadora foi uma linha num XML.

Eu apontei a minha TV para um catálogo servido por mim, com os arquivos originais da Sony, baixados do servidor da Sony. Os cinco apps instalaram e rodaram.

As assinaturas criptográficas validam, porque os arquivos são deles, byte a byte. Não tem nada quebrado, nada forjado, nada de DRM.

Catálogo diferente, só isso.

2. O schema que não existe mais em lugar nenhum do mundo

O Relógio Mundial instalou e abriu pedindo configuração.
A tela de ajustes vinha vazia.

Widgets dessa era declaram a tela de ajustes num preference.xml que o engine da TV lê, e o widget não. Esse arquivo não está no manifest assinado e nenhum código do bundle o menciona. Ele é invisível para qualquer scraper que siga referências.
Você só acha pedindo pelo nome.

Para o Alarme, o arquivo ainda estava no servidor da Sony. Baixei, servi, funcionou.

Para o Relógio Mundial, ele não existe mais: nem no servidor vivo, nem no Internet Archive, nem em mirror nenhum que eu tenha achado. O widget sobreviveu; a configuração dele não.

Então li o código do widget, que diz exatamente o que espera:

/******* Get Preference Setting from preference.xml *******/
function checkPreference() {
    var tmp_timezone = getStoredValue("Item1");
    var tmp_dst      = getStoredValue("Item2");
    var tmp_ampm     = getStoredValue("Item3");
    if (tmp_timezone == null) { Error_Message(1); }

Três campos, e o resto do arquivo fixa os domínios. gmt_hour = local_time - timezone - dstArray[0], com testes de sinal if (timezone>0).
É aritmética com sinal, então Item1 é offset de GMT em horas, não índice de cidade. As constantes se nomeiam sozinhas: _DST_OFF=0/_DST_ON=1, _AMPM_OFF=0/_AMPM_ON=1.

Essa distinção não é detalhe.
Ler Item1 como índice de cidade produziria um XML que instala, parseia e entrega um relógio silenciosamente quatro horas errado. O tipo de bug que aparece meses depois e nunca é rastreado.

Escrevi 1.681 bytes de XML à mão. Nenhum arquivo assinado tocado, assinatura original da Sony continua validando. A tela abriu com as três opções e o relógio funcionou.

Foi a primeira coisa do projeto que não foi recuperada, e sim reconstruída: ler no código da máquina o que ela espera, e escrever de volta a metade que faltava.

3. E o erro que eu quase publiquei

O relógio configurava e ainda mostrava ícone de "carregando" no lugar da arte.

Widgets dessa era montam quase todo caminho de imagem por concatenação:

loadImage(node, "./parts/flags/tz_" + (offset + 11) + ".png")
loadImage(node, "./parts/FullScreen/Daylight/Lightmap_" + month + "/" + (i+1) + ".png")

O nome do arquivo não existe como literal em lugar nenhum. grep por .png devolve meia dúzia de fundos e setas, e nenhum dos 22 tiles do mapa-múndi, nenhuma das 23 bandeiras, nenhum dos 288 frames do terminador de luz do dia. Listagem de diretório é negada.
Não dá para descobrir lendo.

A saída é percorrer o template em vez do literal, expandindo sobre o que o código em volta consegue produzir. Recuperou 349 arquivos só nesse widget.

E aí quase escrevi no repositório que "dezembro sumiu do servidor da Sony". Expandi meses de 1 a 12 e vieram onze pastas. Dezembro faltando, certo?

Errado. Date.getMonth() do JavaScript é zero-based. O intervalo real é Lightmap_0..11 e a pasta que eu nunca pedi era janeiro. Lightmap_0 responde 200; Lightmap_12 responde 403.

Um conjunto curto que parece completo é pior que um buraco óbvio. Ficou como regra: sempre sonde um índice fora do intervalo que você assumiu, e deixe o 403 do servidor dizer onde é a borda.

4. O 3D que falha em silêncio, e a volta ao começo

Essas TVs ativam o 3D automático a partir de um sinal só, e só com ele: a SEI frame_packing_arrangement (H.264, payload 45) embutida no elementary stream. Elas ignoram a tag StereoMode do Matroska, a única que os rips padrão carregam.

Todo vídeo 3D servido por DLNA roda flat, sem erro, num hardware que exibe 3D perfeito por outras entradas.

Na minha biblioteca: 43 de 44 títulos tinham só a tag de container. 0 de 44 tinham a SEI.

Ninguém tinha publicado a ligação entre as duas pontas: o hardware lê só a SEI, os rips carregam só a tag. A resposta padrão da comunidade para "por que minha TV não engata 3D" sempre foi "aperta o botão 3D no controle".

Levei diagnóstico e patch para o pipeline inteiro, encode → remux → player:

  • HandBrake: PR #8100 mergeado em 16/09/2026. O encoder agora escreve o sinal, fechando a issue #5826 deles. Entre abrir e mergear foram 81 minutos, o tempo do CI rodar
  • FFmpeg: bug #24530: arquivo com a tag e a SEI faz a CLI abortar com -17 EEXIST, um bug de decode que o tracker deles não tinha. E feature #24531
  • mpv (issue #18489 + PR #18490), x265 (#970), StaxRip (#1873), e o fórum do BD3D2MK3D (thread), onde o próprio autor confirmou o diagnóstico e contou que a Samsung dele faz igual

Não tem DRM em nenhum ponto disso. Era um metadado ausente num arquivo meu, servido por mim, para a TV minha.

E aqui a história fecha um círculo que eu não tinha planejado: em 2011 eu ganhei de presente um driver que forçava 3D em jogos que não tinham. Em 2026 eu escrevi o patch que faz o encoder gravar o 3D que os arquivos não tinham. É a mesma tarefa, quinze anos depois, do outro lado do problema.

5. As fontes GPL, e a conta que fecha o argumento

O "Source Code Distribution Service" da Sony (vivo, snapshot) diz, nas palavras da Sony, que fornece o fonte de produtos "com Linux e outros softwares open source cuja licença exige a provisão do código-fonte", com mídia física "por três anos após o último envio do produto".

Hoje lista 798 modelos KDL, nenhum da geração 2010–2012. Um snapshot de outubro de 2014 mostra a geração listada nominalmente, com KDL-46EX725 e KDL-46HX855. A página de download arquivada de 2015 lista os 23 pacotes: kernel, toolchain MIPS, glibc 2.7, DirectFB, WebCore, JavaScriptCore.
O ambiente de build completo.

Todos dão 404 hoje. O Archive salvou os índices, não os arquivos. O kernel que roda na minha TV existe, hoje, só no meu acervo offline.

A conta: o kernel comprime para ~96 MB, os pacotes são compartilhados entre grupos de modelos, e 83 pacotes distintos cobrem toda a era KDL. O corpus inteiro cabe em poucos gigabytes.
US$ 0,10 a 0,15 por mês em object storage, zero no Internet Archive ou no GitHub Releases.

O prazo de três anos é legítimo e é da Sony. O que eu acho discutível é a proporcionalidade: uma regra desenhada quando distribuir fonte significava prensar e postar mídia física hoje aposenta documentação cujo custo caiu quatro ordens de grandeza, de um aparelho que ainda está ligado na sala das pessoas. E o serviço continua rodando, para 798 outros modelos. A capacidade está lá. Só essa geração saiu.

6. Sim, eu usei IA. Julgue o conteúdo.

Preciso falar disso aqui, porque o TabNews está cansado de texto com cheiro de IA, e com razão.

Eu trabalho com parceiros de IA.

Este projeto inteiro foi feito assim: eu no hardware, dirigindo, verificando na TV; eles lendo código, cruzando spec, montando reprodução. Num dos pull requests upstream a discussão saiu do código e foi para a autoria do texto. Chamaram de slop antes de olhar o patch.

O que aprendi ali virou a regra do projeto, e é uma frase que a gente já tem em português há séculos: não julgue um livro pela capa.
Ou, na versão mais antiga ainda, o hábito não faz o monge.

Slop é propriedade do trabalho, não do autor ou da ferramenta utilizada.

Afirmação não verificável, enchimento, baixa densidade de informação.

Humano faz isso desde sempre, a IA só aprendeu com a gente e repete mais rápido. Slop de IA é slop humano repetido. Naquele mesmo thread, a contribuição mais checável era a assistida por IA, e a menos checável era um meme de 529×95 pixels dizendo "texto demais, não me importo".

Mas a lâmina corta para o meu lado também, e essa parte é a que importa: IA não lava nada. Se eu assino, tem que aguentar o mesmo teste: medido em máquina real, cada afirmação específica o suficiente para estar errada. É por isso que este post inteiro é linkado a documento da própria Sony, com snapshot no Internet Archive, ou a merge de projeto independente. Não estou pedindo confiança. Estou entregando um livro que dá para abrir.

Como o Torvalds disse de um jeito mais curto: talk is cheap, show me the code.

7. Verifique você mesmo

O que eu ainda não sei

  • A remoção dos firmwares (janeiro de 2022) é observação minha, sem fonte independente. Procurei snapshot da página de suporte da época e não achei
  • Não sei quando a geração saiu do serviço de fontes. Estava em 2014, não está hoje, e a cobertura do Archive entre 2016 e 2024 é rala
  • Os pacotes com patch da Sony (sony-target-dev-*) parecem perdidos. Se alguém tiver um mirror, é o buraco que vale preencher

Se você tem uma KDL-EX7xx/HX8xx encostada: o painel e o 3D continuam ótimos, o conserto do 3D já está no HandBrake, e um único manual de serviço da Sony cobre cinco tamanhos de tela do mesmo chassis.
O que vale para a minha TV vale para a geração inteira.

O hardware não envelheceu. O servidor é que parou de responder. E servidor, na sua própria casa, é coisa que dá para ligar de novo.

Carregando publicação patrocinada...