

WARNING: THIS FILE IS HEAVILY OUTDATED!!!!!


Pre-Rendered Subtitles
----------------------

Specifications by Niels Martin Hansen
Modified and commented by Rodrigo Braz Monteiro


Introduction
------------

Pre-Rendered Subtitles (PRS) is a compact raster data format for subtitles
to be displayed into video files. It is designed to be simple, fast and small.

Compared to hardsubs, PRS has the following advantages:
- Most of the time, it is smaller (hardsubs often require 15 MB in a 24 minutes
  video clip, whereas PRS often requires as little as 3 MB).
- Can be disabled, for the viewers who preffer to watch the original content.
- You can have multiple tracks, for multi-language files.
- PRS subtitles are easier to replace, making the Quality Control process much
  faster.

Compared to softsubs, it has the following advantages:
- Decoding is much faster, which allows you to create every sort of advanced
  effects that can still be displayed in realtime.
- Decoding is much simpler, making it possible to port to a wide range of
  platforms.
- It is harder to "steal" the subtitles.
- Does not require the shipment of font files, which might be illegal.

Other advantages of the PRS format are:
- It allows effects that are not possible with any current subtitle format,
  such as different blending modes.
- It makes the task of hardsubbing a complex karaoke much faster.
- It ensures that the encoder will encode the subtitles exactly as the
  typesetter envisioned them.
- It allows conversion of video into subtitles, e.g. effects done in programs
  such as Adobe After Effects.


Overview
--------

PRS stores either full PNG images, partial PNG images (through a number of
blocks) or instructions to do simple modifications (translation, clearing)
to the current output.

PRS only uses 32 bit RGBA images.

The data format is binary, designed for integration into containers such as
Matroska.

PRS subtitle files can be generated by specialised software (rendering directly
to a PRS file or other container supporting PRS) or by a commandline program
taking a PRS definition file and a number of PNG images as input.
The PRS definition file is a text file describing the images to be displayed.

PRS subtitles are frame-based, that is, a PRS subtitle picture is linked to one
or more frame-numbers in the video.

All integers are 32 bit unsigned Little Endian unless otherwise specified.


PRS stand-alone file format
---------------------------

The file starts with a 32 bit magic number, formed by the ASCII string
"PRS".
The magic is followed by an integer specifying the length in bytes of the
subpicture stream name. The subpicture stream name follows immediately
after the length specifier, and is an UTF-8 encoded freeform string. (It may
contain embedded NUL characters, but this is discouraged. It is encouraged to
terminate the stream name with a NUL character.)

The header is followed by a number of image deifnitions and display commands.
Image definitions and display commands can be mixed in any way, as long as
no display command refers to an undefined image.
If an image identifier is defined twice, the later definition overrides any
earlier ones.

0x00	"PRS" (zero-terminated)
0x04	version number (32 bit unsigned)
0x08	stream name size (32 bit unsigned)
0x012	stream name string (this won't be writen if the size is 0)


Image Definition IMG

This defines an image data block. This image definition starts with the 32 bit
magic "IMG". This is followed by an integer image identifier, an integer
image byte size and the image data, encoded in the apropriate format.

0x00	"IMG" (zero-terminated)
0x04	block length (32 bit unsigned)
0x08	image identifier (32 bit unsigned)
0x0C	image format (32 bit unsigned; 1 = PNG, and the only supported format for now)
0x10	image data length (32 bit unsigned)
0x14	image data


Display Command DSP

This controls when and how images are displayed on the video.
Start and end frame numbers are both inclusive.

0x00	"DSP" (zero-terminated)
0x04	block length (32 bit unsigned)
0x08	start time in miliseconds (32 bit unsigned)
0x0C	end time in miliseconds (32 bit unsigned)
0x10	image identifier (32 bit unsigned)
0x1C	layer (16 bit signed)
0x14	x position (16 bit signed)
0x18	y position (16 bit signed)
0x1A	alpha multiplier (8 bit unsigned)
0x1B	blend mode (8 bit unsigned)

Alpha multiplier:
0x00 is "invisible", 0xFF is "fully visible". This value is multiplied onto
the alpha value of each pixel in the image to get the actual alpha value for
that pixel, that is: finalAlpha = pixelAlpha * globalAlpha / 255;

Blend modes:
  0	none (src*alpha + dest*(1-alpha))
  1	add (src*alpha + dest)
  2	subtract (dest - src*alpha);
  3	inverse subtract (src*alpha - dest) (is this it?)
  4	multiply (src*alpha * dst / 255)
Values are clipped before they are multiplied with alpha.

Layers:
If picture A's layer number is larger than picture B, picture A is displayed
on top of picture B. If two pictures have the same layer number, no order is
defined. (It's recommended to use the ordering of the display commands.)
