: : www.mundoj.com.br : : Mário de Sá Vera ([email protected]) é graduado em Ciência da Computação pela Universidade Federal Fluminense e trabalha com Arquitetura de Sistemas utilizando Orientação a Objetos. Acompanhou a evolução da linguagem Java – pela qual é entusiasta, e liderou o desenvolvimento de sistemas nas áreas de Geoprocessamento, Sistemas de Mensageria e Visão Computacional. Atualmente faz parte do grupo de Inovação da M4U Soluções, com foco nas possibilidades de interatividade em convergência entre Telefonia Móvel e TV Digital. David Campêlo ([email protected]) é graduado e mestre em Ciência da Computação pela Universidade Federal do Ceará, onde atuou como pesquisador e líder de projetos nas áreas de ensino a distância e TV Digital Interativa. Em 2005, foi membro efetivo de jornadas de integração em trabalhos coletivos de pesquisa no Projeto SBTVD. Já trabalhou com TV Participativa e atuou como docente de ensino superior. Atualmente, na TOTVS é coordenador técnico da primeira implementação comercial completa do middleware Ginga e sistemas IPTV. Ginga-J: O Java na TV brasileira e no mundo! Os novos avanços rumo à TV Interativa Mesmo em tempos onde netbooks e iTablets têm preços bem atraentes, ninguém discorda que a TV ainda é o eletrodoméstico mais presente na casa dos brasileiros. Hoje, mais de 90% dos lares contam com pelo menos uma TV. E, para os que ainda não sabem, já é possível executar aplicativos Java enquanto assistimos a um programa de televisão. Em paralelo, instituições brasileiras se movimentam para divulgar o padrão baseado no JavaDTV em outros países, dando ao Brasil uma posição de destaque internacional em termos de interatividade na TV. Neste artigo, apresentamos um panorama com o cenário atual da TV Digital Interativa (DTVi), que tem evoluído bastante, e damos ao leitor uma introdução ao Ginga-J indicando ferramentas e possibilidades de desenvolvimentos avançados. 50 a Copa do Mundo da África, algumas emissoras já transmitiram aplicativos interativos desenvolvidos com tecnologia Ginga-J, que consiste no módulo de interatividade do padrão nipo-brasileiro ISDBTb de TV Digital baseado na tecnologia Java. Este ano, a tecnologia se consolidou recebendo, inclusive, aprovação na UIT (União Internacional de Telecomunicações). O mercado começa a dar sinais de vida com diversos fabricantes de dispositivos lançando versões de aparelhos já suportando o Ginga-NCL e Ginga-J e as principais emissoras já realizando testes com aplicativos sendo transmitidos juntamente com sua programação. No decorrer deste artigo descreveremos a arquitetura do Ginga-J e ferramentas de desenvolvimento serão apresentadas para que o leitor se sinta capaz de se iniciar neste promissor mercado de software para dispositivos televisivos no Brasil e no mundo. Padrão Ginga de Interatividade Dentre as normas que definem a arquitetura do padrão brasileiro de TV digital consta a especificação do middleware Ginga, camada de software que tem como objetivo abstrair especificidades de hardware presentes em dispositivos de recepção de conteúdo televisivo digital. O Ginga expõe serviços de modo padronizado para aplicações interativas, escondendo peculiaridades de camadas inferiores, como, por exemplo, a tecnologia usada para compressão, modulação, persistência etc. O padrão Ginga comporta dois motores de execução para aplicações interativas, um para execução de aplicações construídas utilizando a linguagem NCL/Lua (Ginga-NCL) e outro para execução de aplicações utilizando a linguagem Java (Ginga-J). Apesar de serem funcionalmente semelhantes, a adoção da linguagem Java para criação de aplicações interativas permite um controle mais refinado do ambiente de TV digital (em grande parte por conta de suas APIs, as quais serão vistas em detalhes ao longo deste artigo), bem como aproveita a grande massa de desenvolvedores Java já formados e disponíveis no mercado. Vale lembrar que a linguagem NCL/Lua foi criada por pesquisadores brasileiros durante trabalhos realizados ao longo dos últimos anos. O motor de execução Ginga-J tem como base as APIs livres JavaTV versão 1.1 e JavaDTV versão 1.3, ambas especificadas pela Sun Microsystems, empresa criadora da tecnologia Java. Além disso, para que as aplicações Java possam ser executadas pelo Ginga-J, faz-se necessária a presença de uma JVM (Java Virtual Machine) no receptor de TV digital. Segundo a especificação do Ginga-J, a JVM empregada deve ser compatível com a arquitetura para sistemas embarcados CDC/FP (Connected Device Configuration/ Foundation Profile) versão 1.1.2 e perfil PBP (Personal Basis Profile) versão 1.1. Como já é de se esperar, a arquitetura definida pelo Ginga-J assemelha-se às arquiteturas já existentes baseadas em J2ME (representada na figura 1), o que deixa em vantagem os desenvolvedores que já tiveram alguma experiência com aplicativos para celulares, por exemplo. Figura 1. Arquitetura J2ME. JavaDTV Fruto de uma das maiores polêmicas enfrentadas pelo Fórum SBTVD (entidade responsável pela padronização do sistema de TV digital brasileiro), o JavaDTV teve como motivação libertar fabricantes, emissoras e consumidores de um grande problema: o pagamento de royalties. Por basear-se no GEM (Globally Executable MHP – especificação criada no escopo do padrão de TV digital Europeu DVB), a antiga especificação do Ginga-J determinava o pagamento de royalties tanto por unidade de recepção como por quantidade de telespectadores. Os encargos atrelados ao GEM assombraram membros do Fórum SBTVD durante meses, até que, após aliança firmada com a Sun Microsystems em meados de 2008, um time de técnicos foi designado para a criação de uma especificação funcionalmente equivalente à especificação baseada no GEM. Nasceu assim o JavaDTV. Além de definir extensões ao JavaTV, o JavaDTV emprega uma biblioteca já conhecida por muitos desenvolvedores Java para dispositivos móveis. O LWUIT (Light-Weight User Interface Toolkit) é uma biblioteca de widgets gráficos inspirada no SWING e seus componentes são bastante leves e fáceis de usar. O emprego do LWUIT na nova especificação possibilitou ainda uma maior convergência entre os aplicativos desenvolvidos para celulares e para receptores de TV digital interativa. Na prática, aplicações escritas utilizando LWUIT em ambiente J2ME podem ser facilmente adaptadas para o ambiente televisivo. Assim, o JavaDTV é uma especificação de ambiente de execução Java livre de royalties que define extensões para o JavaTV. A tabela 1 lista os principais pacotes do JavaDTV, descrevendo em linhas gerais suas funções. Pacote Descrição com.sun.dtv.application Este pacote fornece meios de controlar o ciclo de vida das várias aplicações disponíveis no receptor. com.sun.dtv.broadcast Este pacote contém mecanismos para monitoramento dos sistemas de arquivos transmitidos, bem como dos eventos de fluxo (stream events) sinalizados. com.sun.dtv.filtering Este pacote fornece mecanismos para uso refinado dos filtros de seção da plataforma para acesso a dados transmitidos na tabelas PSI/SI (Program Specific Information/Service Information). com.sun.dtv.io Este pacote estende o pacote java.io e indica as permissões de acesso para arquivos persistentes. com.sun.dtv.media Este pacote define controles de mídia para uso em cenários de interatividade avançados. com.sun.dtv.net Utilizando as funções deste pacote é possível controlar os dispositivos de canal de interatividade presentes no receptor a partir da classe NetworkDevice. com.sun.dtv.platform Este pacote contém meios para manter propriedades de usuário mantidas na plataforma. com.sun.dtv.resources Este pacote traça diretivas acerca da utilização de recursos escassos do sistema, como eventos de tecla, planos gráficos, sintonizador, filtros de seção etc. com.sun.dtv.security Neste pacote são definidos mecanismos adicionais para segurança (nota: o JavaDTV importa em sua especificação as API JSSE e JCE). com.sun.dtv.smartcard Este pacote define acesso à leitura de smartcards segundo configurações presentes na plataforma. com.sun.dtv.transport Este pacote provê acesso às componentes presentes no fluxo de transporte (transport stream). com.sun.dtv.ui São definidas neste pacote funcionalidades específicas para interação com usuário, bem como renderização nos planos gráficos. com.sun.dtv.lwuit Este pacote importa os componentes do framework gráfico LWUIT, além de introduzir componentes específicos para o ambiente de TV. Tabela 1. Pacotes que compõem a API do Java DTV. 51 : : www.mundoj.com.br : : Listagem 1. Código-fonte do Hello world! import java.awt.Color; import com.sun.dtv.lwuit.Font; import com.sun.dtv.lwuit.Form; import com.sun.dtv.lwuit.Label; import com.sun.dtv.lwuit.geom.Dimension; import com.sun.dtv.lwuit.layouts.CoordinateLayout; import javax.microedition.xlet.Xlet; import javax.microedition.xlet.XletContext; import javax.microedition.xlet.XletStateChangeException; Para ser interpretada como uma aplicação para TV Digital toda aplicação deve ter um ponto de entrada, que consiste em uma classe principal que implementa a interface javax.tv.xlet.Xlet. A partir de chamadas enviadas a esta classe o sistema pode controlar o ciclo de vida da aplicação. E como não podia deixar de ser, a primeira aplicação que mostraremos aqui (apresentada na Listagem 1) é um HelloWorld utilizando a API gráfica LWUIT. O resultado é apresentado na figura 2. Nota: vale lembrar que segundo a especificação Ginga-J são suportados os bytecodes gerados em versões entre 45.3 e 47 (equivalente à versão 1.3 do Java). public class HelloLWUIT implements Xlet { /** * Inicializando a aplicação. Neste método deve ser feita a inicialização * da aplicação. Se algo der errado, então uma XletStateChangeException * será gerada para notificar o sistema que a aplicação não foi inicializada. */ public void initXlet(XletContext ctx) throws XletStateChangeException {} /** * Executando a aplicação. Neste ponto a aplicação pode exibir seus * gráficos na tela * e iniciar a interação com o usuário, ou mesmo realizar qualquer * atividade necessário ao seu funcionamento. */ public void startXlet() throws XletStateChangeException { Form mainForm = new Form(“Hello Form”); Label label = new Label(“Hello world!”); mainForm.getStyle().setBgColor(Color.WHITE); label.getStyle().setBgColor(Color.BLUE); label.getStyle().setFgColor(Color.WHITE); label.getStyle().setFont(Font.createSystemFont( Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE)); mainForm.addComponent(label); mainForm.show(); } /** * Pausar a aplicação. Neste ponto recomenda-se que a aplicação libere * qualquer * recurso escasso, como threads, conexões etc. */ public void pauseXlet() {} /** * Parar a aplicação. O parâmetro boleano diz ao método se o * Xlet tem a opção de continuar em execução por mais um tempo. */ public void destroyXlet(boolean unconditional) throws XletStateChangeException { } } 52 Figura 2. Hello world! do Ginga-J. O ambiente de desenvolvimento Além de conhecimentos de TV digital interativa e das APIs adotadas pelo Ginga-J, desenvolvedores Java necessitam apenas de um emulador para adentrar no mundo das aplicações interativas. Um bom emulador é muito importante para suporte a testes no bom e velho PC antes dos testes em ambiente real. Há opções livres de emuladores disponíveis na Internet. Dentre estas estão o OpenGinga (www.openginga.org) e o MOSTVD (www.middlewareopensource.com), que são livres e podem ser baixados gratuitamente. Outra opção de emulador é o ByYouStudio (www.byyou.com.br/byyoudevnet/), que conta com uma implementação comercial do Ginga para o ambiente Linux PC. Após os testes preliminares no ambiente emulado chega o momento dos testes em ambiente real de produção. Para isso, faz-se necessário um playout para transmissão da aplicação interativa, além do receptor de sinal digital. Já é possível encontrar no mercado televisores dotados de implementações do Ginga-J. No entanto, infelizmente não há implementações de playouts livres compatíveis com o padrão brasileiro de TV digital. Encontram-se como opções comerciais de playouts o ByYou Play (www.tqtvd.com) e o EiTV (www.eitv.com.br). Para Saber Mais Playout é um componente de software ou hardware responsável pela geração do transport stream contendo as componentes de áudio, vídeo e dados, incluindo a aplicação interativa. Além disso, o Playout também é responsável pela transmissão do transport stream gerado que será enviado over the air (OTA) até os receptores de TV Digital. A arquitetura de J2ME prevê diversos profiles para atender às limitações de hardware de um determinado dispositivo. O mesmo vale para os STBs que rodarão os aplicativos sendo transmitidos ou já embarcados de fábrica. A seguir, exploramos um pouco do que pode ser feito com o Ginga-J. O que se pode fazer com o Ginga-J? Nesta seção, são listados alguns casos de uso reais de aplicativos Ginga-J, alguns deles inclusive já transmitidos durante a programação de grandes emissoras de TV do Brasil. Por considerar que o elemento principal da programação televisiva é o vídeo transmitido, é bastante comum que aplicações interativas não sejam exibidas em modo de tela-cheia. É bastante comum também o uso de transparência nas imagens Listagem 2. Código-fonte com o controle de eventos numéricos da aplicação enquete. /** * Este trecho de código utiliza o pattern Observer para registrar no * gerente de eventos * (UserInputEventManager) de interação com o usuário um listener. O * dispositivo que disparará * o evento é a tela (Screen) e o evento a ser tratado será do tipo * KeyEvent – evento de teclado. */ class EventReceiver implements com.sun.dtv.ui.event.UserInputEventListener { public synchronized void reserveKeys() { UserInputEventManager inputManager; KeyEvent event_1; KeyEvent event_2; Enquete A aplicação de enquete é um excelente caso de uso para observar a opinião dos telespectadores sem que para isso seja necessário usar outro dispositivo além da própria TV. Utilizando a API padrão java. net.Socket para efetuar a comunicação com um servidor de votação e uma API de RSS para buscar novas notícias, a aplicação constitui uma excelente alternativa aos programas de Quiz e similares. Vale lembrar que toda a comunicação via TCP/IP ou HTTP já é implementada na própria API de sockets Java padrão, o que facilita o desenvolvimento. Em seguida, temos a enquete rodando na telinha: Screen currentScreen = Screen.getCurrentScreen(); inputManager = UserInputEventManager.getUserInputEventManager( currentScreen); event_1 = new KeyEvent(null, KeyEvent.KEY_PRESSED, 0, 0, KeyEvent.VK_1, ‘0’); event_2 = new KeyEvent(null, KeyEvent.KEY_PRESSED, 0, 0, KeyEvent.VK_2, ‘0’); inputManager.addUserInputEventListener( (UserInputEventListener) this, event_1); inputManager.addUserInputEventListener( (UserInputEventListener) this, event_2); } public void userInputEventReceived(UserInputEvent evt) { // redirects the event MainForm.dispatchEvent(evt); } } Plantão de notícias Figura 3. Aplicação enquete. A enquete pode servir também como uma ferramenta para conhecer melhor o espectador de modo a fazer publicidade direcionada ou apresentação de conteúdo publicitário diferenciado. Durante toda a programação é possível que a emissora deseje lançar notícias na tela de modo preciso e rápido. Assim, esta aplicação utiliza a API de monitoramento de arquivos transmitidos pelo sinal de modo a receber eventos de atualização de suas mídias. Em seguida, temos o Plantão de Notícias rodando na telinha: Nesta aplicação, faz-se uso da API para reserva exclusiva de teclas de modo a capturar os eventos numéricos do controle remoto (por padrão, o teclado numérico é usado para trocas de canal). A Listagem 2 apresenta o trecho de código desta aplicação responsável por essa funcionalidade. Figura 4. Aplicação Plantão de Notícias. 53 : : www.mundoj.com.br : : Este caso de uso é bastante comum em cenários de interatividade nos quais é necessária a atualização intensa do conteúdo veiculado. Casos de uso como este tornam bastante peculiar o ambiente de TV Digital para desenvolvedores Java. Listagem 3. Código-fonte do controle de eventos de notícias da aplicação Plantão de Notícias /** * Neste trecho de código utilizamos, novamente, o pattern Observer * para registrar desta vez * um listener para o conteúdo de um arquivo contendo as novas * notícias as serem apresentadas. */ class BroadcastFileEventReceiver implements com.sun.dtv.broadcast.BroadcastFileListener { public void registerListener(String file) throws javax.tv.locator.MalformedLocatorException, java.io.IOException, javax.tv.locator.InvalidLocatorException { Locator locator = LocatorFactory.getInstance().createLocator(file); com.sun.dtv.broadcast.BroadcastFile bFile = new com.sun.dtv.broadcast.BroadcastFile(locator); bFile.addListener(this); } public void broadcastFileChanged(BroadcastFileEvent event) { System.out.println(“File [“+ event.getBroadcastFile(). getAbsolutePath()+”] has changed!”); MainForm.refreshInterface(event.getBroadcastFile()); } Por lidar com informações sensíveis (dados de senhas e cartões dos usuários), aplicações deste tipo podem beneficiar-se do uso de mecanismos de segurança já previstos no padrão Ginga-J, como transação segura de dados, criptografia, dentre outros. Nota: a norma ABNTNBR-15605 especifica as resoluções de segurança do padrão. Aplicações como essa eventualmente podem precisar redimensionar o vídeo principal transmitido pela emissora, de modo a evitar que seus elementos sobreponham o conteúdo televisivo. Para isso, foi usada a API JMF para modificar as dimensões do vídeo principal. A Listagem 4 apresenta um trecho do código da aplicação correspondente a essa funcionalidade: Listagem 4. Código-fonte em JMF para resize de vídeo na aplicação Top Fun. /** * Neste trecho de código fazemos uso da classe javax.media.Player * criando um objeto a partir da * especificação do protocolo para indicar o vídeo principal (DEVICE 0). * A partir desta instância * criamos um controle AWT específico para a troca do tamanho * original do video (rect). */ public static void resizeVideo(java.awt.Rectangle rect) throws javax.media.NoPlayerException, java.io.IOException { javax.media.Player videoPlayer = javax.media.Manager.createPlayer( new javax.media.MediaLocator(“sbtvd-ts://0”)); public void broadcastFileLost(BroadcastFileEvent event) { System.out.println(“File [“+ event.getBroadcastFile(). getAbsolutePath()+”] is no longer transmitted!”); } if (videoPlayer == null) return; javax.media.Control control = videoPlayer.getControl(“javax.tv.media.AWTVideoSizeControl”); if (!(control instanceof javax.media.AWTVideoSizeControl)) { System.err.println(“No AWTVideoSizeControl available!”); return; } } T-Commerce Fazendo uma analogia com o e-commerce, na TV digital temos o t-commerce que, como o nome sugere, enquadra os aplicativos de comércio eletrônico feito pelo canal de interatividade da TV. Um exemplo é a loja de mídias para celulares (ringtones, wallpapers etc.) criada pela empresa M4 TV e batizada de Top Fun. Em seguida, vemos a aplicação Top Fun rodando na telinha: javax.media.AWTVideoSizeControl awtControl = (javax.media.AWTVideoSizeControl) control; javax.media.AWTVideoSize sizeDefault = awtControl.getDefaultSize(); presentationControl.setSize( new javax.media.AWTVideoSize(sizeDefault.getSource(), rect)); } O momento atual do Ginga As principais vantagens técnicas do ISDB-Tb (padrão nipobrasileiro para TV Digital) são a especificação de interatividade por si (Ginga) e a codificação em H264 que aumenta a banda de transmissão em comparação com os codificadores utilizados em outros padrões. Todas as especificações do Ginga podem ser encontradas na rede e vem sendo disponibilizadas pelo Fórum de TV Digital Brasileiro (SBTVD). Figura 5. Aplicação Top Fun. 54 O governo tem absoluto interesse na TV Digital como ferramenta de inclusão social. Esperamos que através de iniciativas como o PL-29 possamos encontrar o caminho para um modelo de negócios que depende ainda de um incentivo para um ambiente mais propício à produção de STBs suportando o Ginga, que hoje já é adotado em quase todos os países da América do Sul, além de alguns países da África e da América Central. Até o final do ano de 2010, o Fórum SBTVD deverá atingir o objetivo de ter as normas de interatividade apresentadas e aprovadas. Atualmente há apenas pendências nas normas que dizem respeito à segurança no ambiente interativo. São inúmeras as razões pelas quais a tecnologia Java foi escolhida para compor o padrão de interatividade Ginga. Além do grande número de desenvolvedores e do fato de ser uma tecnologia livre, a tecnologia tem emprego expressivo mundo afora*: • 930 milhões de downloads do JRE a cada ano; • 1.4 bilhões de JavaCards sendo produzidos por ano; • 1.1 bilhões de desktops com Java; • 6.5 milhões de desenvolvedores ao redor do mundo. * dados atualmente disponíveis em www.java.com O governo brasileiro já conseguiu o reconhecimento internacional do Ginga-J junto ao ITU (International Telecommunication Union) em conjunto com várias entidades relacionadas ao desenvolvimento da tecnologia. Trata-se de uma grande vitória, pois gera muitas oportunidades para o mercado brasileiro no exterior, em especial para a indústria de software. Considerações finais Enquanto emissoras se movimentam para buscar um novo modelo comercial incluindo a interatividade nas suas grades de programação, fabricantes correm contra o tempo para lançar novos modelos de TV. Com os altos preços dos receptores digitais e televisores de LCD, plasma e LED, o objetivo de incluir a população carente de informação ainda não foi alcançado. No entanto, os benefícios introduzidos pela interatividade na TV já são percebidos nos aplicativos disponibilizados nos grandes centros do país. Sejam aplicações informativas, publicitárias ou mesmo de entretenimento, a interatividade pela TV já mostrou que veio para ficar. O suporte à Java pelo padrão brasileiro de TV Digital será fator importante na disseminação da cultura de desenvolvimento de aplicativos sofisticados a serem transmitidos ou embutidos em receptores (STBs), trazendo assim uma experiência mais produtiva para desenvolvedores e mais prazerosa para os usuários destes produtos. Atualmente, boa parte dos fabricantes de televisores já fornecem seus produtos high end com recursos sofisticados em telas LCD e suportando Ginga-J. Com a crescente oferta destes aparelhos somada à perspectiva de venda de STBs no varejo com preços populares esperamos um cenário propício à formação de um mercado para os desenvolvedores de aplicativos Ginga-J• Referências • Forum SBTVD www.forumsbtvd.org.br • Ginga www.ginga.org.br • JavaTV www.jcp.org/en/jsr/detail?id=927 • JavaDTV www.forumsbtvd.org.br/materias.asp?id=200 • CDC www.jcp.org/en/jsr/detail?id=218 • FP www.jcp.org/en/jsr/detail?id=219 • PBP www.jcp.org/en/jsr/detail?id=217 • J2ME www.mobilegametutorials.blogspot.com/2009/09/j2me-architecture-and-configuration.html 55