



Definido na série de normas SBTVD ABNT 15606. Presente em receptores de TV Digital certificados no Brasil e América Latina (>60M telespectadores).
Ausência de ambiente portátil e "zero-install": de fácil acesso, completo e aberto.
Podemos comparar o Mozilla (https://developer.mozilla.org/) e a Ginga-VM (2010)


Um fator é a escolha da Engine Gráfica (e.g., DirectFrameBuffer, FFmpeg, GStreamer, Browsers)
Outro fator é a complexidade de certos componentes do Ginga: NCLua (C-based lua engine), Ginga-HTML5 (chromium, webkit) e Ginga-CC-Webservices (HTTP server).

1998 — PUC-Rio (Netscape)
[Rodrigues et al. 1998]

Plugin para navegador Netscape no início da WWW.
browser-only · sem Lua
2001 — PUC-Rio (Java AWT)
[Rodrigues et al. 2001]

Ferramentas de exibição hipermídia sobre Java AWT.
desktop-only · sem Lua
2010 — PUC-Rio (C++ & FFmpeg)
[Soares et al. 2010]

Middleware declarativo com backend FFmpeg para IPTV/DTV.
desktop-only
2012 — UFSCar (WebNCL)
[Melo et al. 2013]

Apresentador web puramente em JavaScript.
browser-only · sem Lua
2018 — PUC-Rio (C++ & GStreamer)
[PUC-Rio / Telemídia]

Reimplementação C++ com tick() e GStreamer.
desktop-only · sem CCWS
2018–2020 — Sidia NuGinga (NodeJS)
[Braga et al. 2018; Nogueira et al. 2020]

Middleware JS/Android e ferramenta web Playcode.
browser-only · sem CCWS
PUC-Rio (Java AWT)
PUC-Rio (C++, FFmpeg)
PUC-Rio (C++, GStreamer)
PUC-Rio (Netscape)
UFSCar (WebNCL)
Sidia NuGinga (NodeJS)
Native

Browser

As principais decisões de design são:
1. Engine Gráfica Multiplataforma
Código único em Dart/Flutter para execução consistente na Web, Desktop e Mobile.
2. UI e Modelos Desacoplados
Lógica (NCLDocument) independente e isolada de rendering.
3. Relógio Virtual
Avanço temporal determinístico orquestrado via tick(), eliminando condições de corrida.
4. NCLua e CCWS Portáveis
Runtime Lua puro em Dart e virtualização de rede sem dependências nativas.
PUC-Rio (Java AWT)
PUC-Rio (C++, FFmpeg)
PUC-Rio (C++, GStreamer)
gingaf (ours)
Ginga-NCL + Ginga-HTML5
PUC-Rio (Netscape)
UFSCar (WebNCL)
Sidia NuGinga (NodeJS)
Native

Browser


Windows

Chrome

Android

CLI
Camada de Lógica (Dart Puro)
NCLDocument (Parser, runtime NCLua) e CCWS. Compila para JavaScript e WebAssembly.
Camada de Apresentação (Flutter)
NCLWidget e HTMLWidget (webview, js-interop). Renderização com precisão de pixels na Web, desktop e mobile.

Acoplamento Temporal
Tempo atrelado ao relógio e threads do SO.
Bloqueio por Renderização
Máquina de estados bloqueada por chamadas draw().
Eventos Nativos
Transições disparadas via onEvent() nativo.

Coordenação por tick()
O NCLWidget avança o relógio virtual por pulsos explícitos.
Desacoplamento de UI
Sem referência direta entre NCLDocument e widgets da UI.
Sincronização Determinística
Estados de Media atualizados na ordem do documento, e a UI obtém propriedades via syncProperties() sem condições de corrida.

Motor Lua em Dart Puro
lua_dardo (Lua 5.3) na Web sem dependências C ou Wasm.
Abstração de Comandos e Corrotinas
Chamadas canvas despachadas para o CustomPainter do Flutter, e corrotinas mapeadas para async/await sem bloquear o tick().
Paridade Multiplataforma
Saída visual idêntica na Web (WebGL), Desktop e Mobile.


Nativo (a)
Aplicação HTML executa em WebView nativa, enquanto HTTPServer local embutido (porta 44642) atende requisições HTTP.
Navegador com Sandbox (b)
Aplicação HTML executa em iframe com sandbox, com shim injetado que intercepta window.fetch() e XMLHttpRequest.


NCL com links básicos (video.ncl)

NCL com grade de vídeos (video_grid.ncl)

NCL embutido em NCL (emb_ncl.ncl)

NCL com navegação de foco e seleção (focus_nav.ncl)

NCL com desenho em tela Lua e teclas (lua_canvas.ncl)

HTML com CCWS /current-service/ (current_service.html)

NCL com documento HTML embutido (emb_html.ncl)

NCL com troca de perfil multiusuário (multiuser_profile/main.ncl)

Suporte a Desktop, Web e Android, pronto para dispositivos futuros (ex.: TVs com suporte a Flutter).

Decisões de Arquitetura
1. Engine Gráfica
Dart/Flutter unificado
2. UI Desacoplada
Lógica headless em memória
3. Relógio Virtual
Avanço via tick()
4. NCLua & CCWS
Lua e CCWS virtualizados
Modo headless em memória, avanço por tick() orquestrado e 64 testes unitários em CI.

Decisões de Arquitetura
1. Engine Gráfica
Dart/Flutter unificado
2. UI Desacoplada
Lógica headless em memória
3. Relógio Virtual
Avanço via tick()
4. NCLua & CCWS
Lua e CCWS virtualizados
Extensão ginga-code para VS Code com inspeção passo a passo (step) sem necessidade de hardware STB.

Decisões de Arquitetura
1. Engine Gráfica
Dart/Flutter unificado
2. UI Desacoplada
Lógica headless em memória
3. Relógio Virtual
Avanço via tick()
4. NCLua & CCWS
Lua e CCWS virtualizados
Repositório: https://github.com/ginga-org-br/gingaf
Playground: https://ginga.org.br/gingaf/playground/
Contato: a.guedes@reading.ac.uk | danielmoraes@telemidia.puc-rio.br
