Nessa série de artigos temos analisado os fundamentos do MPEG assim como seus protocolos. No artigo anterior TEL140 tratamos da compressão de áudio e dos protocolos com que o MPEG trabalha. Continuamos essa série agora analisando as correntes de dados ou “streams”. As correntes são responsáveis pelo transporte da informação digital possuindo uma estrutura muito bem definida que será analisada aqui, é uma versão compacta obtida de documentação da Tektronix (A Guide to MPEG Fundamentals and Protocol Analysis). Os leitores que dominam o inglês também podem acessar a versão original em www.tektronix.com/video_audio.

 

Este artigo é de 2006 quando ainda não estava definido o padrão de TV digital a ser usado em nosso país.

Esta série é formada pelos artigos TEL138 a TEL143

 

Correntes Elementares em Pacotes

Para efeitos práticos, as correntes elementares contínuas que carregam tanto vídeo como áudio de compressores, precisam ser divididas em pacotes.

Esses pacotes são identificados por cabeçários que contém informações de tempo para sincronizar os pacotes PES ou Packetized Elementary Streams ou Correntes Elementares em Pacotes.

Os PES podem ser usados para criar Correntes de Programas ou Correntes de Transportes.

 

Os Pacotes PES

Num PES, uma corrente elementar sem fim é dividida em pacotes de um tamanho conveniente para a aplicação.

Cada pacote é precedido por um pacote cabeçário PES. Na figura 1 mostramos o conteúdo de um cabeçário.

 

   Figura 1 – Cabeçário PES
Figura 1 – Cabeçário PES

 

O pacote começa com um prefixo de código de partida de 24 bits e uma corrente ID que identifica o conteúdo do pacote como vídeo ou áudio e, além disso, especifica o tipo de codificação de áudio.

É importante não confundir o pacote num PES com um pacote muito menor usado nas correntes de transporte que, infelizmente, dividem o mesmo nome.

Como MPEG define somente o pacote de transporte, não o encoder, um projetista deve escolher a versão para construir um multiplexer que converta de correntes elementares para a corrente de transporte em um passo.

Nesse caso, os pacotes PES não devem nunca existir na sua forma identificável, mas em lugar disso, eles estarão logicamente presentes na corrente de transporte do pacote.

 

Selos de Tempo

Depois da compressão, as imagens são enviadas fora de seqüência, dada a codificação bidirecional.

Elas exigem uma quantidade de dados variável e estão sujeitas a retardos variáveis devido a multiplexação e transmissão.

De modo a manter o áudio e o vídeo juntos, selos ou etiquetas de tempo devem ser incorporados periodicamente em cada imagem.

Um selo de tempo é um número de 33 bits obtido de um contador operando com um clock de 90 kHz.

Como os tempos de apresentação são sempre espaçados, não é essencial incluir um selo de tempo em cada unidade apresentada.

Em lugar disso, selos de tempo podem ser interpolados pelo decodificador.

Os selos de tempo indicam onde uma unidade particular de acesso pertence no tempo.

O sincronismo dos lábios é obtido incorporando selos de tempo nos cabeçários tanto de pacotes PES de áudio como vídeo.

Quando um decodificador recebe um pacote PES selecionado, ele decodifica cada unidade de acesso e a coloca na RAM.

Quando a contagem de linhas alcança o valor do selo de tempo, a RAM é lida.

 

PTS/DTS

Quando codificação bidirecional é usada, uma imagem pode precisar ser decodificada algum tempo antes de ser apresentada, de tal forma que ela deve agir como a fonte de dados de uma imagem B.

Por exemplo, imagens podem ser apresentadas na ordem IBBP, e serem transmitidas na ordem IPBB.

Consequentemente, dois tipos de selos de tempo estarão presentes.

O selo de tempo do decodificador (DTS) que indica o instante em que a imagem precisa ser decodificada, e também o selo do tempo de decodificação (PTS) que indica quando a imagem deve ser apresentada na saída do decodificador.

As imagens tipo B são decodificadas e apresentadas simultaneamente, de tal forma que elas contem apenas PTS.

Quando uma seqüência IPBB é recebida, tanto as imagens I como P devem ser decodificadas antes da primeira imagem B.

Um decodificador somente pode decodificar uma imagem de cada vez, o que significa que a imagem I é decodificada em primeiro lugar e armazenada.

Enquanto a imagem P está sendo decodificada, a imagem I é levada a saída, de tal forma que ela possa ser seguida das imagens B.

A figura 2 mostra que, quando a unidade de acesso contendo uma imagem I é recebida, ela tem tanto selos DTS como PTS no cabeçário e esses selos de tempo devem ser separados por um período de imagem.

 

   Figura 2 – Protocolos de uma imagem
Figura 2 – Protocolos de uma imagem

 

 Se codificação bidirecional está sendo usada, uma imagem P deve seguir e essa imagem também deve ter um selo de tempo DTS e um PTS, mas a separação entre os dois selos de tempo será três períodos de imagem, de modo a permitir a presença das imagens B.

Assim, se uma seqüência IBBP é recebida, a imagem I será atrasada de um período de imagem, as duas imagens B não serão tratadas e a seqüência de apresentação será IBBP.

Veja que a estrutura do GOP é mudada de tal forma que se existirem mais imagens B entre imagens I e P, a diferença entre os DTS e PTS nas imagens P será maior.

Os avisos PTS e DTS no cabeçário do pacote são colocados para indicar a presença de PTS sozinho ou tanto selos de tempo PTS como DTS. Os pacotes de áudio podem conter diversas unidades de acesso e o cabeçário do pacote conter um PTS.

Devido ao fato de que pacotes de áudio não são nunca transmitidos fora de seqüência, não existe DTS num pacote de áudio.

 

Correntes de Programa (Program Streams)

As correntes de programa consistem num meio de se combinar diversas correntes de pacotes PES sendo vantajosas para aplicações de gravação como no caso do DVD.

 

Gravação versus Transmissão

Para uma determinada qualidade de imagem, a taxa de dados do vídeo comprimido pode variar de acordo com o conteúdo.

Na transmissão, os canais práticos são fixados e a taxa de bits média é mantida constante pelo uso de dados sem significado (enchimento).

Num DVD, o uso de material de “enchimento” ocupa espaço precioso de armazenamento.

Entretanto, um meio de armazenamento pode ter ser retardado ou acelerado, tanto fisicamente como, no caso de um disk drive, pela mudança da taxa de dados transferida.

Essa abordagem permite que um canal com taxa de dados variável seja obtido sem afetar a capacidade de armazenamento.

Quando um meio é reproduzido, a velocidade pode ser ajustada de modo a manter os dados enviados em metade da capacidade.

Se o decodificador lê do buffer numa velocidade aumentada, ele tende a encher o buffer.

Nesse caso o sistema de drive simplesmente aumenta a velocidade de acesso de modo a equilibrar o rearmazenamento.

Essa técnica apenas funciona se o áudio e o vídeo forem codificados a partir do mesmo clock. De outra forma, os dois podem se desviar ao longo da gravação.

Para satisfazer essas exigências conflitantes, as correntes de programa e transporte foram vistas como alternativas.

Uma corrente de programa trabalha bem com um único programa que tenha uma taxa variável de bits num ambiente de gravação.

Já, uma corrente de transporte trabalha bem em programas múltiplos numa taxa fixa de bits num ambiente de transmissão.

O problema de acoplar isso a uma fonte não ocorre num DVD player.

O player determina a base de tempo do vídeo com um gerador local de pulso de sincronização (interno ou externo) e simplesmente obtém dados do disco para fornecê-los à imagem naquela base de tempo.

Na transmissão, o decodificador tem de recriar a base de tempo no encoder ou ele passará a ter problemas de overflow e underflow.

Assim, uma corrente de transporte usa um clock de programa de referência (PCR), enquanto que uma corrente de programa não precisa do clock de programa.

 

Introdução às Correntes de Programas

Uma corrente de programa é um pacote PES multiplexado que carrega diversas correntes elementares que são codificadas usando o mesmo clock mestre ou um clock de tempo do sistema (STC).

Essa corrente pode ser uma corrente de vídeo e suas correntes de áudio associadas, ou ainda num programa apenas de áudio multi-canal.

A corrente elementar de vídeo é dividida em unidades de acesso (AU), cada qual contendo dados comprimidos descrevendo uma imagem.

Essas imagens são identificadas como I, P ou B e cada uma carrega um número AU que indica a seqüência correta em que ela deve ser apresentada.

Um AU de vídeo torna-se um pacote de corrente de programa.

Em vídeo, esses pacotes variam em tamanho.

Por exemplo, um pacote de uma imagem I deve ser muito maior do que um pacote de uma imagem B.

As unidades de acesso digital são geralmente do mesmo tamanho e são montadas num pacote de corrente de programa.

Esses pacotes não devem ser confundidos com os pacotes da corrente de transporte que são menores e de tamanho fixo.

 

Correntes de Transporte

Uma corrente de transporte é mais do que um multiplex de muitos pacotes PES.

Nas correntes de programa, selos de tempo são suficientes para recriar o eixo de tempo porque áudio e vídeo estão ligados a um clock comum.

Para a transmissão através de uma rede de dados à distância, existe uma exigência adicional para recriar o clock de cada programa no decodificador.

Isso exige uma camada adicional de sintaxe para proporcional sinais PCR.

 

A Tarefa de uma Corrente de Transporte

A corrente de transporte carrega diversos programas e cada um pode usar um fator de compressão diferente além de uma taxa de bits que muda dinamicamente mesmo quando a média da taxa de bits de mantém constante.

Esse comportamento é chamado de multiplexação estatística e permite a um programa que esteja manuseando um material difícil emprestar faixa passante de um programa que esteja manuseando um material mais leve.

Cada PES de vídeo pode ter um número diferente de PES de áudio e vídeo associados.

Além dessa flexibilidade, um decodificador pode ser capaz de mudar de um programa para o seguinte e corretamente selecionar os canais apropriados de dados e áudio.

Alguns programas podem ser protegidos por taxas de assinaturas pagas.

A corrente de transporte deve conter informação PA para administrar essa proteção. A corrente de transporte contém PSI para administrar essas tarefas.

A camada de transporte converte os dados PES em pequenos pacotes de tamanho constante (adicionando enchimento se necessário) que sejam auto-contidos.

Quando esses pacotes chegam ao decodificador, pode ocorrer deslocamento na temporização.

O uso de “time division multiplexiing” também causa um retardo, mas esse fator não é fixo porque a proporção da corrente de bits alocada para cada programa não precisa ser fixa.

A operação do equipamento de produção de vídeo digital é altamente independente da distribuição de um clock de sistema estável para sincronização.

Na produção de vídeo, o atrelamento é usado, mas somente para longas distâncias, a distribuição de um clock separado não é prática.

Na corrente de transporte, os diferentes programas podem ter diferentes origens e não são necessariamente sincronizados.

Como resultado, a corrente de transporte deve fornecer um meio separado de sincronizar cada programa.

O método adicional de sincronização é chamado PCR e ele recria um clock estável de referência que pode ser dividido para criar uma linha de tempo no decodificador, de tal forma que os selos de tempo das correntes elementares em cada programa se tornem úteis.

 

Pacotes

A figura 3 mostra a estrutura de um pacote de uma corrente de transporte.

 

Figura 3 – Estrutura de uma corrente de transporte
Figura 3 – Estrutura de uma corrente de transporte

 

O tamanho é constante, 188 bytes, e é somente dividido num cabeçário e um cerne.

A figura 3(a) mostra o cabeçário mínimo de 4 bytes. Nesse cabeçário, a informação mais importante é:

O Byte sinc. Esse byte é conhecido pelo decodificador de tal forma que o cabeçário e o conteúdo possam ser desserializados.

O indicador de erro de transporte. Esse indicador é colocado se a camada de correção de erros acima da camada de transporte verificar um erro na taxa de bits (BER) que seja muito alto para ser corrigido. Ele indica que o pacote pode conter erros.

A identificação de pacote (PID). Esse código de treze bits é usado para distinguir entre os diversos tipos de pacotes.

O contador de continuidade. Esse valor de quatro bits é incrementado pelo multiplexador a cada novo pacote tendo o mesmo PID que seja enviado. Ele é usado para determinar se qualquer pacote é perdidido, repetido ou fora de seqüência.

 Em alguns casos, mais informações de cabeçário são necessárias caso em que bits de controle de adaptação de campo são enviados para indicar que o cabeçário é maior que o normal.

A figura 3(b) mostra que, quando isso acontece, o comprimento extra de cabeçário é descrito pelo código de capo de adaptação.

 

Clock de Referência de Programa (PCR)

O encoder usado para um programa determinado deve ter um clock de programa de 27 MHz.

No caso de uma entrada SDI (Serial Digital Interface), o clock deve ser dividido por 10 para produzir o clock de programa do encoder.

Onde diversos programas originam a mesma possibilidade de produção é possível que eles tenham o mesmo clock.

No caso de uma entrada de vídeo analógico, o período de sincronismo H será necessário para ser multiplicado por uma constante num PLL para produzir 27 MHz.

O campo de adaptação no cabeçário do pacote é usado periodicamente para incluir um código PCR que permite a geração de um clock travado no decodificador.

Se o encoder ou multiplexador tiver que comutar fontes, o PCR deve ter uma descontinuidade.

A contagem de continuidade pode também ser perturbada.

Esse evento é manuseado pelo indicador de descontinuidade, que informa ao decodificador que ele deve esperar uma perturbação. De outra forma, uma descontinuidade é uma condição de erro.

A figura 4 mostra como o PCR é usado pelo decodificador para recriar uma versão remota do sinal de clock de 27 MHz para cada programa.

 

Figura 4 – PCR usado para recriar uma imagem
Figura 4 – PCR usado para recriar uma imagem

 

 

O PCR é um número de 42 bits que é representado por uma base PCR de 33 bits mais uma extensão PCR de 9 bits de modo a proporcionar uma resolução mais alta.

Os pacotes gerados por cada encoder são dados por um PID diferente.

O decoder reconhece que os pacotes com o PID de correção para que o programa selecionado ignore os demais.

No decoder, um oscilador controlado por tensão (VCO) gera um clock nominal de 27 MHz, e ele controla o contador PCR local.

O PCR local é comparado com o cabeçário do pacote e a diferença é o erro de fase PCR.

Esse erro é filtrado para controlar o VCO que eventualmente vai atuar sobre o contador do PCR local de modo a fazer a correção.

 

Identificação de Pacote (PID)

Um campo de 13 bits no cabeçário do pacote de transporte contém o código de identificação de pacote (PID). O PID é usado para demultiplexador para distinguir os pacotes que contém diferentes tipos de informações.

A taxa de bits da corrente de transporte deve ser constante, mesmo levando em conta que a soma das taxas de todos as diferentes correntes variem.

Essa exigência é manuseada pelo uso de pacotes nulos. Se a taxa de um pacote real de conteúdo falha, mais pacotes de nulo são inseridos.

Os pacotes de nulo sempre tem o mesmo PID, que é 8191 (treze uns em representação binária).

Numa dada corrente de transporte, todos os pacotes pertencendo a uma determinada corrente elementar devem ter o mesmo PID.

O demultiplexador pode facilmente selecionar todos os dados para uma determinada corrente elementar simplesmente aceitando apenas os pacotes com o PID correto.

Dados para um programa inteiro podem ser selecionados usando o PID para correntes de áudio, vídeo e dados como subtítulos ou teletexto.

 

Informação Específica de Programa (PSI)

A PSI é transportada em pacotes tendo um único PID, alguns dos quais são padronizados e alguns dos quais são especificados pela tabela de associação de programa (PAT), tabela de acesso condicional (CAT) e tabela de descrição da corrente de transporte (TSDT). Esses pacotes devem ser incluídos periodicamente em cada corrente de transporte.

O PAT sempre tem um PID de 0. O CAT sempre tem um PID de 1, e o TSDT sempre tem um PID de 2.

Esses valores e o pacote de PID nulo de 8191 são os únicos PIDs fixados pelo padrão MPEG.

O demultiplexador deve determinar todos os outros PIDs acessando as tabelas apropriadas.

No entanto existem algumas restrições no uso de PIDs em ATSC ou DVB.

Em relação a isso (e alguns outros), MPEG e DVB/ATSC não são completamente intercambiáveis.

Todas as correntes de transporte DVB e ATSC devem estar de acordo com o MPGE-2 (ISO/IEC 1318-1), mas nem todas as correntes de transporte MPEG-2 devem ser compatíveis com os padrões ATSC (A/65A) ou DVB (EM 300 468).

Os programas que estão presentes na corrente de transporte são listados em pacotes (PID=0) na tabela de associação de programa (PAT) que carrega o PID de cada pacote PMT.

A primeira entrada no programa PAT, programa 0, é reservada para os dados de rede e contém o PID da rede, pacotes da tabela de informações (NIT). O uso do NIT é opcional em MPEG-2, mas obrigatório em DVB.

Os PIDs das mensagens de controle de titulamento (ECM) e mensagens de controle de titulamento (EMM) são listados na tabela de acesso condicional (CAT) pacotes (PID=1).

Como a figura 5 mostra, os PIDs de vídeo, áudio e correntes elementares de dados que pertençam ao mesmo programa são listadas nos pacotes da Tabela de Mapeamento de Programa (PMT).

 

Figura 5 – Tabela de Mapeamento de programa
Figura 5 – Tabela de Mapeamento de programa

 

 Cada pacote PMT normalmente tem seu próprio PID, mas o MPEG-2 não obriga isso. O numero de programa dentro de cada PMT vai definir unicamente cada PMT.

Uma determinada tabela de informação de rede (NIT) contém detalhes mais do que simplesmente a corrente de transporte que a carrega.

Também incluídos estão detalhes de outras correntes de transporte que podem estar disponíveis no mesmo decodificador, por exemplo, pela sintonia de um canal de RF diferente ou ainda de uma parabólica que sintonize outro satélite.

O NIT pode listar um certo número de outras correntes de transporte e cada uma pode ter um descritor que especifica a freqüência, a posição orbital e assim por diante.

Em DVB metadados adicionais, conhecidos como DVB-SI podem ser incluídos e o NIT será considerado como parte do DVB-SI.

Além de primeiramente receber uma corrente de transporte, o demultiplexador deve travar para PIDs 0 e 1, no pacote de cabeçários.

Todos os pacotes PID 0 contém o PAT e o todos os PID 1 contém dados CAT.

Lento o PAT, o demultiplexador pode encontrar os PIDs do NIT e a tabela de mapas de cada programa (PMT). Encontrando os PMTs, o demultiplexador pode encontrar os PIDs de cada corrente elementar.

Consequentemente, se a decodificação de um determinado programa se torna necessária, referência ao PAT e então ao PMT é tudo que se necessita para se encontrar os PIDs de todos as correntes elementares no programa.

Se o programa for encriptado, acesso ao CAT também será necessário.

Como a demultiplexação é impossível sem um PAT, a velocidade de atracamento é função da rapidez como os pacotes PAT são enviados.

 

 

Índice

Introdução à TV Digital (CUR9000)

TV DIGITAL - parte 1: Introdução ao MPEG (TEL138) (CUR9001)

TV DIGITAL - parte 2: Fundamentos e Protocolos do MPEG (TEL139) (CUR9002)

TV DIGITAL - parte 3: A compressão de áudio (TEL140) (CUR9003)

TV DIGITAL - parte 4: Correntes de dados (TEL141)  (CUR9004)

TV DIGITAL - parte 5: Modulação Digital (TEL142) (CUR9005)

TV DIGITAL - parte 6: Introdução ao DVB e ATSC (TEL143) (CUR9006)