¿Qué es NAGRAVISION?

El sistema de codificación NAGRAVISION fue inventado por André Kudelski de Nagra Kudelski, una empresa suiza. Se trata de una codificación de las señales de video. La versión actual utiliza un proceso de permutaciones de las líneas de la imagen. Su originalidad reside en la utilización de un búfer de 32 líneas en el que una línea que está en curso de recepción viene a sustituir una línea en curso de visualización.


PROCESO DE CODIFICACIÓN Y DECODIFICACIÓN DE UNA SEÑAL DE VIDEO

Resumiendo

El proceso de codificación según el invento, afecta a cada línea de la imagen (23 a 309) de una trama producida en abierto antes de ser codificada, la dirección B determinada de forma pseudo-aleatoria de la línea de memoria de la memoria de almacenamiento 8 en la cual, esta imagen será almacenada al nivel de recepción, y a determinar el instante (o el orden) de emisión de esa línea de imagen para que, a nivel de recepción, esta línea provoque, por su almacenamiento en la línea de memoria donde se encuentra, el envío al televisor de una línea de imagen almacenada a la misma dirección, en el instante preciso (o en el orden que le corresponde) para decodificar la imagen.
 

PROCESO

Este invento concierne un proceso de codificación y decodificación de una señal de vídeo que consiste, a nivel de emisión, a codificar secuencias de señales de vídeo según una función de codificación determinada, pudiendo ser distinta para cada secuencia, a emitir cada secuencia de señal de vídeo codificada, y, a nivel de recepción, a decodificarla.

El este invento se aplica en los sistemas de televisión de pago, para los cuales es necesario codificar la imagen de video y decodificarla en casa del abonado provisto del decodificador que le permita ver el canal.

Se conocen varios sistemas de codificación de la imagen, lo mismo que el sonido. Se conoce, por ejemplo, un proceso de codificación que permuta un número constante de líneas, según una función de permutación determinada. En este caso, la decodificación consiste en realizar el proceso inverso. Como no es fácil permutar una gran cantidad de líneas, actualmente se limita a las 32 líneas.

Este proceso, a veces llamado proceso de permutación de bloques fijos, presenta el inconveniente de disponer, a nivel de recepción, de una memoria de gran tamaño, porque, en el momento que finaliza el envío al televisor de 32 líneas, debemos tener memorizados las líneas siguientes para poder enviar el resto de la imagen. Este proceso es simple para la emisión, pero presenta problemas de fiabilidad en la recepción, así como de seguridad y coste. Por otra parte, este sistema no es seguro frente a la piratería. Es posible encontrar el orden de permutación de las líneas, incluso si este orden cambia a lo largo de la emisión.

La explicación detallada del funcionamiento de este sistema de codificación queda mejor reflejado en estos ejemplos : figuras 1-4.

Una línea de imagen digitalizada comprende un gran número de muestras, 256 o 512 por ejemplo, pero hemos representado en estas figuras unicamente 8 muestras, "a,b,c,d,e,f,g,h" para simplificar la tarea.

En la figura 1, hemos representado un modo de direccionamiento y de almacenamiento de la líneas de imagen codificadas recibidas a nivel del decodificador del abonado. Se distingue una memoria de almacenamiento 8, llamada búfer, que contiene por ejemplo 32 líneas de memoria, pudiendo cada línea almacenar las informaciones digitalizadas de una línea de imagen completa.

Según el proceso del invento, una línea Z difundida viene a sustituir en el búfer 8 una línea X precedente situada en la misma línea de memoria n del búfer 8. El almacenamiento de la línea de imagen Z en la línea de memoria n del búfer 8 provoca la salida de la línea de imagen precedente X y su envío al televisor, por supuesto tras la puesta en forma o anulación de rotación. Por consiguiente, el orden de emisión de la líneas de imagen está en función de la dirección n de cada una de estas líneas, ya que cada línea Z no será emitida cuando venga a sustituir, en la línea de memoria del búfer correspondiente a su dirección, a una línea precedente X únicamente en el instante en el que la línea precedente deberá ser envíada al televisor.

Observamos que el orden de emisión de las líneas no está permutada arbitrariamente sino que resulta de una combinación con la dirección de cada línea de imagen en el búfer presente en el dispositivo de recepción. La función de codificación por permutación de líneas es relativa y no absoluta.

Según el invento, y remitiéndonos a la figura 2, a nivel de emisión, el proceso de codificación consistiría en:

Un ejemplo de dispositivo para la puesta en marcha del aparato se muestra de manera esquematizada en la figura 3. En esta figura, observamos un microprcesador 14, una memoria RAM 16 y una memoria ROM 15. La ROM contiene un programa de tratamiento lógico que permite poner en marcha las operaciones lógicas que han de funcionar en el microprocesador 14, operaciones lógicas que son las descritas anteriormente. La RAM se utiliza para almacenar las variables a lo largo del desarrollo del programa. Este conjunto produce en la salida, con la ayuda de una RAM dual 17, la sucesión de líneas de imagen (en este ejemplo 23, 28, 305...29) que corresponde a la sucesión de imágenes tales como deben ser difundidas, de manera que en la recepción la imagen se vea decodificada en el decodificador, que recibe al mismo tiempo un código correspondiente a la decodificación.

La figura 4 muestra un modo de realización de otra parte del despositivo para la puesta en marcha del invento. En esta parte, observamos una entrada S1 que proporciona la imagen decodificada. Esta imagen es digitalizada gracias a un dispositivo de conversión analógico-digital 10, y se almacena según la sucesión de líneas (por ejemplo las líneas de la trama 23 a 309) en el búfer 11. Durante este almacenamiento, otro búfer idéntico 12 en el cual se almacena una trama precedente, se descarga según un orden establecido (23 a 309) determinado por el proceso de codificación del invento, y cada línea descargada pasa por el convertidor analógico-digital 13 antes de ser emitido, la emisión codificada porque las líneas no son emitidas en el orden natural (23, 24 ... 309).

Aunque todo este proceso parece un poco complejo, quiero dejar claro que se trata de un supuesto. El texto original lo encontré en una página suiza, y está enfocada a la creación de un decodificador físico. Como todos sabréis, gracias al ordenador, podemos prescindir de todos estos aspectos, pero es interesante conocer como funciona el NAGRAVISION.




Algoritmos de codificación y decodificación Nagravisión en lenguaje C

Digitalización de líneas

Para reconstituir una trama completa, será necesario tomar las 32 últimas líneas de una trama y las 255 líneas de la trama siguiente. Para simplificar la escritura de los programas, el autor no ha conservado los verdaderos números de líneas de las tramas pares o impares (23-309 y 336-622). Es una fuente de error y complicaciones inútiles. El autor ha vuelto a numerar las líneas de 1 a 287, según la tabla siguiente:

Nuevo Número Primera Trama (cod) Segunda Trama (cod) Primera Trama (decod) Segunda Trama (decod)
1 591 278 23 336
2 592 279 24 337
... ... ... ... ...
32 622 309 54 367
33 23 336 55 368
... ... ... ... ...
287 277 590 309 622

 

Las permutaciones

Las secuencias de permutaciones son generadas a partir de una tabla de 256 octetos, que llamaremos tabla primaria. Hasta ahora, dos tablas son las que se utilizan, de nivel 1 y nivel 2.

Cadenas Norma TV Nivel
Canal + France (antes de 09/97) SECAM 1
Canal + France (después de 09/97) SECAM 2
Paris Première SECAM 1
Canal J SECAM 1
Canal Jimmy SECAM 1
MCM SECAM 1
Planète SECAM 1
Eurosport SECAM 1
Cine Cinema 1 SECAM 1
Cine Cinefil SECAM 1
Canal + Horizons PAL 1
Canal + Polska PAL 1
Premiere PAL 1
TeleClub PAL 1
Playboy TV PAL 1
Maxi TV PAL 1
SuperSport PAL 1
Canal + España

PAL

1

Para codificar o decodificar una trama, generaremos una secuencia de permutaciones de 287 líneas. Cada número corresponde al número de línea del tampón de 32 líneas, línea en la cual debemos tomar la línea de imagen que vamos a ver, y en la cual debemos almacenar la línea de imagen recibida (ver ¿QUÉ ES NAGRAVISION?)

Los 255 primeros números son creados partiendo de la tabla primaria. Las 32 últimas líneas deben estar en el orden natural, con el fin de llenar correctamente el búfer con las 32 primeras líneas de la trama siguiente mientras que se visualiza las 32 últimas líneas de la trama actual.

Para producir los 255 primeros números, la tabla primaria es leida 255 veces, empezando por una de las 256 líneas (offset) y recorriéndola circularmente a cierto paso (incremento).

Así, podemos generar numerosas secuencias diferentes, en función del valor del offset y del incremento. El offset puede tomas 256 valores diferentes, de 0 a 255. El incremento debe ser impar, por lo que unicamente puede 128 valores, del 1 al 255. De este modo, el número total de permutaciones posibles es de 128 x 256 = 32768., que son las posibilidades de codificación.

 

Algoritmos

Generación de una secuencia de permutaciones

El programa siguiente, escrito en C, calcula una secuencia de permutaciones partiendo de una tabla primaria, de un offset y de un incremento:

BYTE offset, increment;
BYTE key_table[256];
BYTE permut[287]; 
BYTE j;
short i;
j = offset;
for (i=0;i<255;i++)
{
	permut[i]=key_table[j];
	j+=increment; 					// Note that j is a BYTE 
}
for (i=255;i<287;i++) 
	permut[i]=i-255;

Algoritmo de codificación

El programa siguiente, escrito en C, calcula el orden en el cual la imagen ha de leerse para codificarla, en función de una tabla primaria, de un offset y de un incremento. Se basa directamente en el algoritmo descrito en ¿QUÉ ES NAGRAVISION?, aunque no es el que mejor funciona.

short stack[9][32];
BYTE stack_pointer[32];
short i;

// Stack pointers initialisation
for (i=0;i<32;i++)
stack_pointer[i]=0;

// Stack filling : The line corresponding to the buffer line is pushed into the stack
for (i=286; i>=0; i--)
	stack[stack_pointer[permut[i]]++] [permut[i]]= i;

short order[287]; 									// Array to store the line numbers

// Get the line numbers out of the stack
for (i=0 ; i < 32 ; i++)
{
	order[i] = stack[stack_pointer[i]-1][i]; 			// 32 first lines to send
	for (int j=0 ; j < stack_pointer[i]-1 ; j++) 			// Other lines
		order [stack[j+1][i]+32] = stack[j][i];
}

Este es un algoritmo más eficaz:

short i,j;
short order[287];

for (i = 0; i < 287; i++)
	order[i] = -1; // Initialisation

for (i = 0; i < 287; i++)
{
	j = permut[i];
	while (order[j] != -1)
		j = order[j]+32;
	order[j] = i;
}

Algoritmo de decodificación

Este programa, escrito en C, calcula el orden necesario para leer una imagen y verla correctamente.

short i;
BYTE j;
short buffer[32];
short order[287];

for (i=0;i<32;i++)
	buffer[i]=-1;

j = offset;

for (i=0;i<255;i++)
{
	if (buffer[key_table[j]] == -1)
		order[i]=key_table[j];
	else
		order[i]=buffer[key_table[j]];

	buffer [key_table[j]] = 32+i;
	j += increment; 				// Note that j is a BYTE
}

for (i=0;i<32;i++)
	order[255+i]=buffer[i];