Minicurso Básico III Aquiles Burlamaqui - UERN Igor Rosberg - UFRN Diogo Henrique - UERN Introdução a TV Digital Interativa Ginga-NCL ▪ NCL ▪ Lua ▪ XHTML Túnel do tempo O que muda? Middleware para a TVDI Sistema Americano Sistema Europeu Sistema Japonês Sistema Brasileiro Ginga Ginga-J ▪ JavaTV, HAVI ▪ XletView Mercado de TV Digital Conhecendo a TVDI Tecnologias 19 de fevereiro chegaram as cores na TV do brasileiro Surgimento da TV no Brasil 2 de dezembro inicia-se a transmissão da TVDI no Brasil Fases da História da TV no Brasil Fase Populista Fase Elitista Fase de Expansão Internacional Fase de desenvolvimen to Tecnológico Fase da Convergência e da Qualidade Digital Fase de Globalização e da TV Paga Imagem HDTV Tela no formato 16:9 MPEG-4 Duas vezes melhor do que qualidade de DVD Som Qualidade melhor que CD Surround 5.1 HE-AAC (High Efficiency Advanced Audio Coding) Sucessor do mp3 Utilizado no IPod, Playstation 3, Nintendo wii Analógica Digital MELHOR SOM MELHOR IMAGEM APLICAÇÕES Mobilidade e Portabilidade Multiprogramação Diferentes programas, mesmo canal Interatividade Compras pela TV Votar em enquetes/pesquisas Acesso a serviços ... Hardware Display Set-top-box USB dongle 1-seg PSP e DS 1-seg Celulares 1-Seg Largura 6MHz Analógico Tudo para o vídeo e o áudio em resolução padrão ▪ SDTV (4:3 = 640x480 / 16:9 = 704x480 ) Digital 6 Mhz 29,162 Mbps ▪ LDTV ( 240x320) ▪ HDTV(1920x 1080) Conhecendo a TVDI Organização do Sistema de TV Digital Interativa Sistema Americano Sistema Brasileiro Mais antigo, 1998 ATSC Início das transmissões Sistema Europeu ▪ Foco na transmissão em 2007 de 15 em HDTV Utilizado em mais SBTVD-T Sistema Japonês países Middleware DASE Datando de 1999 DVB ▪ HDTV ISDB ▪ Multiprogramação ▪ Multiprogramação ▪ Baseado no DVB ▪ Interatividade ▪ Interatividade ▪ Mobilidade aliado a ▪ Mobilidade Middleware MHP alta definição Middleware GINGA Middleware ARIB Construindo aplicações para a TVDI Envio e execução de programas de TV Interativos Aplicação ITV Middleware (eg. MHP or DASE) Real-Time Operating System Device Drivers Hardware Áudio Vídeo Dados Datagramas IP Carrossel de Dados MPEG Conditional Access Linguagem declarativa; Não define nenhum objeto de mídia em si; Possui uma linguagem de script (LUA) API NCL APIs XHTML CSS DOM javascript API NCL-LUA API NCL-JAVA Estrutura O que? ▪ Nós de Mídia Onde ? ▪ Região da tela onde irá tocar Como ? ▪ Características como volume, transparência, etc. Quando ? ▪ Em que momento ele irá tocar? MEDIA Nós de Mídias AUDIO IMAGEM VÌDEO TEXTO MEDIA CONTEXTO VÌDEO CONTEXTO receita.html i.jpg O que ? MEDIA REGION i.jpg O que ? MEDIA REGION i.jpg O que ? MEDIA REGION i.jpg O que ? Onde ? MEDIA REGION DESCRIPTOR AUDIO DESCRIPTOR - VOLUME O que ? MEDIA Onde ? REGION DESCRIPTOR Quando ? IMAGEM LINK LINK OnSelect CONNECTOR CONNECTOR Start O que ? MEDIA Onde ? REGION DESCRIPTOR Quando ? IMAGEM LINK LINK OnSelect CONNECTOR CONNECTOR Start Há diversos ambientes de execução para a linguagem NCL Entre os mais usados estão os desenvolvidos pela PUC-Rio, em JAVA e C++ Atualmente várias empresas privadas desenvolvem ambientes de execução, sendo que várias delas situam-se no nordeste Usado para acessar as pastas do SO Fedorafc7-ginga-i386 Através dele são feitas as transferências de arquivos do Sistema Operacional em uso para a máquina virtual do Fedora É um programa amplamente utilizado na realização de conexões remotas Simula um ambiente de terminal de controle Através dele serão executados os comandos necessários Cabeçalho; Uma seção de cabeçalho do programa (head) O corpo do programa (body) Uma porta que indica o ínico do programa Conclusão do documento; <?xml version="1.0" encoding="ISO-8859-1"?> <ncl id="exemplo01"> Inicia com a tag <head> e termina com a tag </head> É na seção HEAD que se definem as regiões, os descritores, os conectores e as regras utilizadas pelo programa; Inicia com a tag <regionBase> e termina com a tag </regionBase > Na base de regiões, são definidas todas as regiões nas quais as mídias serão exibidas <regionBase> <region id=“rgTela” left=“0” top=“0” width=“800” height=“600”> <region id=“rgTopo” left=“10” top=“10” width=“780” height=“30”/> <region id=“rgVideo” left=“10” top=“50” width=“400” height=“250”/> <region id=“rgDir” left=“420” top=“50” width=“150” height=“250”/> </region> </regionBase> OBS: A região não define a associação com cada mídia Essa associação é feita através dos descritores. particular. rgTela: 0,0 (800,600px) rgTopo: 10,10 (780,30px) rgVideo: 10,50 (400,250px) rgDir: 420,50 (150,250px) Inicia com a tag <descriptorBase> e termina com a tag </descriptorBase> É através dos descritores que as mídias são associadas à uma determinada região; Definem também a forma como a mídia será apresentada; EX: Volume, transparência etc. <descriptorBase> <descriptor id=“dVideo” region=“rgVideo”/> </descriptorBase> OBS: Ao se definir um descritor, é necessário definir a região à qual ele estará associado. Toda mídia que utilizar esse descritor estará associada à região corresponde. Inicia com a tag <connectorBase> e termina com a tag </connectorBase> Os conectores definem como os elos são ativados e o que eles disparam. Em NCL existe apenas um tipo de conector: o conector causal. <connectorBase> <causalConnector id="onBeginAbortStart"> <simpleCondition role="onBegin"/> <compoundAction operator="seq"> <simpleAction role="abort" max="unbounded" qualifier="par"/> <simpleAction role="start" max="unbounded" qualifier="par"/> </compoundAction> </causalConnector> <causalConnector id="onBeginStart"> <simpleCondition role="onBegin"/> <simpleAction role="start"/> </causalConnector> </connectorBase > Uma forma de tornar prática a reutilização de conectores é defini-los em um arquivo externo semelhante a um .css agrupando assim dezenas de conectores prontos para o uso. Exemplo: <connectorBase> <importBase alias="connectors" documentURI="connectorBase.ncl"/> </connectorBase> Inicia com a tag <body> e termina com a tag </body> O body é um caso particular de contexto, representando o documento como um todo. Nele são inseridos os nós (mídias), portas, elos, âncoras etc. Uma porta do body define o primeiro nó do documento a ser apresentado. Caso haja mais de uma porta no contexto body (fato não muito comum), os nós mapeados por todas as portas são iniciados em paralelo. Exemplo: <port id=“entryPoint” component=“mainVideo”> As portas também são definidas como ponto de entrada dos contextos aninhados. <?xml version="1.0" encoding="ISO-8859-1"?> <ncl id="nclClicks" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head> <regionBase> <region zIndex="0" left="0" top="0" width="550" height="400" id="rgTela"> <region zIndex="1" left="0" top="70" width="379" height="330" id="rgVideo"/> </region> </regionBase> <descriptorBase> <descriptor id="dVideo" region="rgVideo"/> </descriptorBase> <connectorBase> <causalConnector id="onBeginStart"> <simpleCondition role="onBegin"/> <simpleAction role="start"/> </causalConnector> </connectorBase> </head> <body> <port id="entryPoint" component="video1"/> <media type="video/mpeg" id="video1" src="video1.mpg" descriptor="dVideo1“/> <media type=“image/jpeg" id=“image1" src=“image1.jpeg" descriptor="dImage“/> <link xconnector="onBeginStart"> <bind role="onBegin" component="video1"/> <bind role="start" component="image1"/> </link> </body> </ncl> Os nós são referências para as mídias. O nó funciona semelhante à tag <a> do html. Sendo assim, os nós funcionam como links que, quando ativados, disparam a exibição de uma determinada mídia. Os nós podem ser de dois tipos: Nó de conteúdo (mídia) ou nó de contexto. Os nós de conteúdo são definitos através da tag <media/> Esse tipo de nó é associado a um tipo de mídia (txt, html, jpeg, mpeg etc). Um nó de conteúdo é iniciado através da tag <media>. Os tipos mais comuns são: image/gif, image/jpeg, image/bmp, video/mpeg, text/plain, text/html, audio/mp3 Exemplo: <media type="video/mpeg" id="video1" src="video1.mpg" descriptor="dVideo1“/> <media type=“image/jpeg" id=“image1" src=“image1.jpeg" descriptor="dImage“/> Criação e exibição de um nó de conteúdo Inicia com a tag <context> e termina com a tag </context> Contextos ou nós de composição são utilizados para estruturar um documento hipermídia. Os contextos podem ser aninhados, para refletir a estrutura do documento e ajudar o autor a organizar os segmentos do programa audiovisual interativo. <link id="lSelectBotaoVermelho" xconnector="connectors#onSelection1SetStartStopDelay"> <bind component="botaoVermelho" role="onSelection"> <bindParam name="keyCode" value="RED" /> </bind> <bind component="ctxBasico" interface="pBasico" role="start" /> </link> <context id="ctxBasico"> <port id="pBasico" component="videoPrincipal" /> <!-- nós e elos do contexto ctxBasico --> <media type="video" id="videoPrincipal" src="media/video_principal.mpg" descriptor="dVideo1" /> </context> Através dos elos podemos sincronizar eventos em um programa NCL Um exemplo de sincronização é o início de um determinado nó, imediatamente após o início ou término de outro nó etc. Os elos estão intimamente vinculados aos conectores. Eles definem qual mídia estará associada ao papél condicional de um conector e que mídias sofrerão a ação através dos papéis de ação <link xconnector="connectors#onBegin1StartN" id=“iniciaTitulo"> <bind role="onBegin" component=“inicio"/> <bind role="start" component="titulo"/> </link> Exibição de um nó de conteúdo imediatamente após o término de outro nó de conteúdo. As âncoras são pontos de entrada para os nós de mídia ou contextos. O objetivo de se utilizar âncoras é utilizar segmentos de um nó de mídia ou contexto, seja como origem ou destino de elos. Existem dois tipos de âncoras: A âncora de conteúdo e a âncora de propriedade. Define um segmento da mídia (intervalo de tempo e/ou região no espaço) que poderá ser utilizado como ponto de ativação de elos. Uma âncora de conteúdo é definida como uma tag <area> dentro da tag <media>. Exemplo de âncora de conteúdo <media type="vídeo/mpeg" id="video1" src="video1.mpg" descriptor="dVideo1"> <area id="aVideoLegenda01" begin="5s" end="9s"/> <area id="aVideoLegenda02" begin="10s" end="14s"/> <area id="aVideoLegenda03" begin="15s" end="19s"/> </media> Declaração e utilização de âncoras na sincronização entre legenda e áudio. Uma âncora de propriedade se refere a propriedades de um nó, que podem ser manipulados pelos elos. Uma âncora de atributo é definida através da tag <property> dentro da tag <media> ou <context> Exemplo: <media type="video" id="video1" src="media/video1.mpg" descriptor="dVideo1"> <property id="top" name="top"/> <property id="left" name="left"/> <property id="width" name="width"/> <property id="height" name="height"/> </media> Utilização de âncoras de propriedade na redimensionalisação Lua foi planejada para ser utilizada por qualquer aplicação que necessite de uma linguagem de script leve e poderosa. Lua é implementada como uma biblioteca, escrita em C Por ser uma linguagem de extensão, Lua não possui a noção de um programa principal: ela somente funciona embarcada em um programa cliente anfitrião, chamado de programa hospedeiro ou simplesmente de hospedeiro. As novas bibliotecas são divididas em módulos essenciais onde cada um exporta um conjunto de funções de seu domínio. Dois módulos serão abordados nesse minicurso. event canvas Além dos módulos event e canvas, há também os módulos persistent e settings que não serão abordados nesse tutorial. Uma linguagem de script leve Pequena, portátil, eficiente Uma linguagem tipada dinamicamente O tipo da variável depende do valor armazenado Toda linguagem pode ter erro de “tipos” em tempo de execução Uma linguagem com gerência automática de memória Pré-compilação em bytecodes Pode-se carregar arquivos compilados Sintaxe convencional print(“hello world”) print“hello world” Comentários de 1 linha -- (dois traços) Comentários de blocos --[[ bloco ]] Varáveis globais não precisam de declaração Variáveis locais são declaradas com a palavra chave local 8 tipos básicos nil – tipo do valor nil que é diferente de qualquer outro, é o valor default das variáveis boolean – true, false number – double string – array de caracteres, imutável function – valor de primeira classe, significa que funções podem ser armazenadas em variáveis, passadas como argumentos, retornadas userdata – dados C arbitrários, manipulado através da API C thread – threads independentes de execução table – arrays associativos Consulta do tipo da variável através da função type Aritméticos +, -, *, /, ^ Relacionais <, >, <=, >=, ==, ~= Operadores lógicos and, or, not Avaliação por curto-circuito Concatenação .. a=0 a, b, c = 0, 0, 0 a, b = b, a -- troca de valores a, b, c = 0, 0 -- c recebe nil Resultado da expressão {} Qualquer valor como chave, exceto nil Único mecanismo de estruturação de dados Indexação na forma variável[índice] ou variável.índice, quando o índice é uma string for var = inicio, fim [, passo] do bloco end Numérico for var {, var} in expressão do bloco end Genérico while expressão do bloco end repeat block until expressão break ou return pode ser usado para terminar o laço if expressão then bloco {elseif expressão then bloco} [else bloco] end Retorno foo() ▪ Nenhum valor de retorno x = foo() ▪ Ajustado para 1 valor x, y = foo() ▪ Ajustado para 2 valores {foo()} ▪ Cria uma tabela com todos os valores retornados Basic String Table Math IO OS Oferecem funções básicas print type setmetatable pairs error Funções para manipulação de strings Funções para manipulação de tabelas table.insert table.remove table.sort Funções matemáticas math.sqrt math.sin math.log Funções de entrada e saída io.open io.close io.read io.write Funções associadas ao sistema operacional os.clock os.date os.execute Manual Wiki Lua-Users Lista de Discussão IRC O modelo de execução de um NCLua é todo orientado a eventos. Isto quer dizer que para todos os usos do controle remoto, sincronismos em documentos NCL etc, existem eventos associados e é através deles que toda dinâmica de um NCLua se faz presente. O controle sobre esses eventos ora é feito pelo formatador NCL que aciona o NCLua (que por sua vez recebe o evento e o processa); ora é feito pelo NCLua que posta o evento (sinalizando alguma mudança ao formatador). Durante a inicialização do script, antes de se tornar orientado a eventos, um NCLua deve registrar pelo menos uma função de tratamento de eventos. A partir de então, qualquer ação tomada pela aplicação é somente em resposta a um evento enviado pelo formatador a essa função tratadora. --- example.lua --... -- código de inicialização function handler (evt) ... -- código do tratador end event.register(handler) -- registro do tratador no formatador No módulo event, estão definidas as seguintes classes: ncl, key, tcp, sms, user Serão abordadas as classes ncl e key Em um documento NCL, relacionamentos entre nós de mídia são descritos através de elos, cujas relações de causalidade são baseadas em ações e transições sobre seus eventos. Há três tipos de eventos NCL: apresentação, seleção e atribuição. Apresentação: Eventos de apresentação, conforme o nome diz, controlam a exibição do nó de mídia associado ao NCLua. Eventos de apresentação podem estar associados a áreas (ou âncoras) específicas ou ao nó como um todo. No caso de ações geradas pelo formatador, o campo action indica a ação a ser tomada pelo NCLua. { class='ncl', type='presentation', area='intro', action='start' } Para transições geradas pelo NCLua, o campo transition sinaliza a mudança de estado do seu evento de apresentação. {class='ncl', type='presentation', area='intro', transition='stops' } Atribuição: Atribuições estão sempre associadas a propriedades do nó de mídia ( no documento NCL). Eventos de atribuição sempre devem possuir o campo property com o nome da propriedade em questão. Exemplo: { class='ncl', type='attribution', property='counter', action='st art', value='2' } Seleção: eventos de seleção não são tratados pela classe 'ncl', estando esse suporte na classe de eventos ‘key’. Usos do controle remoto geram eventos desta classe que são recebidos pelo NCLua. Neste caso a comunicação é unidirecional, uma vez que o controle remoto é um dispositivo de entrada, apenas. Exemplo: { class='key', type='press', key='0' } Um NCLua tem a possibilidade de fazer operações gráficas durante a apresentação de uma aplicação. A variável canvas do NCLua deve estar associada à uma região. Exemplos: width, height = canvas:attrSize() canvas:drawLine(0,0, width,height) img = canvas:new('image.png') canvas:compose(100, 100, img) canvas:flush() -- atualiza a região do documento NCL Linguagem procedural baseada em Java APIs para a implementação de aplicativos para a TVDI Pacotes da API Java TV Pacotes DAVIC Pacotes HAVI Pacotes DVB API de controle de tunning API de fluxos de mídia API de canal de retorno API aderentes à especificação ARIB STD-B23 API de integração de dispositivos API de ponte Ginga-NCL Xlets public interface Xlet { public void initXlet(XletContext ctx) throws XletStateChangeException; public void startXlet() throws XletStateChangeException; public void pauseXlet(); public void destroyXlet(boolean unconditional) throws XletStateChangeException; } XletView – Emulador Java TVw , Emulador Java TV API Java TV javax.tv.graphics javax.tv.locator javax.tv.media javax.tv.net javax.tv.service javax.tv.util javax.tv.xlet Momento para ganhar $.... [email protected]