# Universal Subtitle Format

El Universal Subtitle Format (USF) en español "Formato Universal de Subtítulos", es un proyecto ambicioso creado para proporcionar un formato de subtítulos limpio, documentado, potente y fácil de usar. El formato está basado en XML por muchas razones: flexibilidad, legibilidad humana, portabilidad, soporte de unicode, sistema de jerarquía y fácil administración.

## Introducción

La meta del Universal Subtitle Format es crear un nuevo formato tomando lo mejor que existe en formatos de subtítulos actualmente.
El formato debe ser lo suficientemente flexible para ser usado en el subtitulado de cada día, así como en proyectos de subtitulado más avanzados. La clave del proyecto es de proveer una serie de herramientas y especificaciones para mejorar la calidad de los videos subtitulados previniendo el proceso de codificar los subtítulos junto con el vídeo ya que crea una gran pérdida de calidad debido al contraste de los subtítulos. También el formato se ha diseñado para que el usuario pueda cambiar el estilo predeterminado tal como el tamaño de fuente, el color, etc. en la reproducción.

## Características y ventajas

* Basado en XML para mejor flexibilidad e interoperación.
* Sintaxis fácil de aprender, cercana al HTML.
* Basado en tiempo para evitar problemas con la conversión del frame rate del video.
* 4 tipos de elementos:
** texto
** imagen
** karaoke
** forma (rectángulo,...)
* Poderoso sistema de posicionamiento de elementos.
** 9 tipos de alineación (TopLeft,..., MiddleCenter,..., BottomRight).
** Relativo a la ventana o al video.
** Margen horizontal & vertical en píxel o porcentaje del vídeo/ventana.
* Atributos de texto usable en una base por letra.
** color
** cursiva, negrita, subrayado
** tamaño
** fuente
* Estilo definible para modificaciones globales más rápidas.
* Información meta para incrementar facilidades de almacenamiento/búsqueda.
** title (título)
** author (autor)
** language (lenguaje) (ISO 639-2 más uno definido por el usuario)
** date (fecha)
** comment (comentario)

## La sintaxis del formato

Un fichero XML puede ser visto como un árbol, con una raíz, ramas y nodos.
La raíz del árbol USF es llamado "USFSubtitles".
Entre los paréntesis el número posible de elementos. (1: requerido, 0..1: opcional, 1..N: por lo menos uno, 0..N). @ es la marca para un atributo.
El atributo de la versión es utilizada por el reproductor para identificar que características son usadas en el archivo actual. La versión será incrementada en el futuro si nuevas características son necesarias.

### Metadato

El nodo de metadato es bastante auto explicativo.
El atributo del código de lenguaje (language code) es normalizado (ISO 639-2), ver Codes for the Representation of Names of Languages para un listado completo. Otros ejemplos:
La extensión de lenguaje (languageext) debe estar definida en esta lista: Normal, HearingImpaired, DirectorComments, Forced, Children.
La fecha usa el estándar internacional de fechas (ISO 8601).
Se puede usar etiquetas básicas (i, b, u, font, br) en el elemento comentario (comment), estas se usan para dar formato al texto como cursiva, negrita, subrayado, etc.

### Estilos

Definir estilos es opcional, pero hará que los subtítulos sean más estructurados y fáciles de mantener.
Los estilos son usados para definir configuraciones aplicables a un grupo de subtítulos de texto. Un estilo tiene un atributo nombre (name) requerido, es el nombre que se usará de referencia luego. Todos los demás atributos son opcionales.
Si se cambia el estilo llamado "MiNombreDeEstilo" se tendrá que cambiar ambas líneas.
En el reproductor un estilo predeterminado (default) es definido, es usado si no se provee un estilo. Por otra parte se puede eliminar este estilo predeterminado usando el nombre "Default":
Todo el estilo es heredado del estilo predeterminado (el del reproductor o el que se ha redefinido).
Ésta es la jerarqía usada:
* Estilo de fuente (fontstyle)
El atributo familia (family) especifica una lista priorizada de nombres de familias de fuente o nombres genéricos de familias. Éstos son algunos ejemplos:
Como usted ve se recomienda que uno debe especificar una familia genérica de la fuente después de cualquier fuente nombrada como retraso a una familia preferida de los tipos de fuente; una de serif, sans-serif, monospace, cursive o fantasy. (Generic font families)
Los colores son definidos como en HTML, con 3 componentes, rojo, verde y azul en el rango 0.255 codificado en hexadecimal. Así que rojo puro es #FF0000, verde puro #00FF00 y azul puro #0000FF.
El color puede ser extendido por un 4.º componente, un componente alpha especificando la transparencia del color. Un valor de un componente alpha de 255 especifica que el color es transparente, y un valor alpha de 0 especifica que el color es opaco. Valores del componente alpha desde 1 a 254 especifican el grado a cual se mezcla el color con el fondo. Cuando se escribe #FF0000 de hecho es #00FF0000 un color rojo opaco. Para hacer un color rojo transparente hay que escribir, por ejemplo #7FFF0000.
El atributo alpha puede ser usado para escalar el componente alpha de todos los colores por ejemplo color="#40FFFFFF" y alpha="50" traduciría a color="#A0FFFFFF".
"color" es el color del primer plano del texto, o el color destacado en modo karaoke. "backcolor" es el color usado en karaoke cuando el texto no está destacado.
El peso de la fuente (font weight) se debe definir en esta gama:
* Posición
El atributo "alignment" (alineación) tiene 9 valores posibles:
El atributo "relative-to" (relativo-a) tiene dos valores posibles: "Window" o "Video".
Los márgenes están definidos en píxeles o en porcentaje de ventana o video dependiendo que se ha elegido en el atributo relativo-a.
La rotación está definida en grados. Se puede usar diferentes ejes de rotación para crear un tipo de efecto 3D.
La rotación común usada en 2D es el eje Z. Por ejemplo, para escribir un texto en diagonal desde la esquina-inferior-izquierda a la esquina-superior-derecha se puede usar:

### Efectos

Los efectos todavía se consideran incompletos o en desarrollo. Ésta es una idea, se define algunos cuadros-clave y el reproductor interpola el cuadro requerido para hacer la animación. Ejemplo:
Se sustituye $inicio, $fin por la posición de los cuadro-clave.
Atributos que pueden ser "animados":

### Subtítulos

Es la parte esencial del fichero, la parte donde se pone el contenido de los subtítulos.
Un subtítulo tiene 2 atributos de grupos-de-hora/tiempo (timestamps): start (inicio) y stop (detener). Los timestamps usan el formato siguiente:
En vez de usar un timestamps de detener se puede usar el atributo duración. También es permitido usar un timestamp corto: ss[.mmm]
El contenido de un subtítulo puede estar compuesto de diferentes elementos: texto, imagen o karaoke en cualquier número.
Todos los elementos pueden ser ubicados independientemente con los mismos atributos de posición que los estilos: "alignment", "horizontal-margin", "vertical-margin" and "relative-to".
* Texto
Los elementos de texto son definidos por un subconjunto de XHTML. Todas las etiquetas disponibles son usadas en el ejemplo anterior. Una nota especial para los usuarios de HTML, XHTML es un poco más estricto que HTML.
* Imagen
El elemento "image" añade soporte para incluir imágenes en el video, tal y como si fueran subtítulos, normalmente o mejor dicho únicamente está soportado el Bitmap.
La imagen debe estar en el mismo directorio, o en un sub-directorio del fichero de subtítulo.
El atributo "colorkey" es el color que se hará transparente en la imagen, por lo que un valor de #FFFFFF hará transparente todas las partes blancas de la imagen.
* Karaoke
El elemento karaoke es muy similar al elemento texto. La principal diferencia es que se usa una etiqueta especial <k t="duración_en_ms"/>.
Así que en el ejemplo abajo el texto "canción" tiene una duración de 400 ms, "cool" tiene una duración de 300ms...
La suma de todas las duraciones debe ser igual a la duración del subtítulo. Aquí 100 + 400 + 200 + 300 = 1000 ms = 1s
* Forma (Sharpe)
El elemento "sharpe" se considera incompleto o en desarrollo (e incluso abandonado).
Un ejemplo básico de como podría usarse es:
En las últimas propuestas no oficiales el elemento "sharpe" ha sido desechado en favor de USFxSVG, para usar gráficos vectoriales SVG de manera apropiada pero limitada en comparación a este. (Ver USFxSVG proposal 4)