*********************************** * Real (Progressive) Media Format * *********************************** - values use big endian (network) byte order - general terms: integer = signed value - general values: byte/char/octet = 8-bit value; short/word = 16-bit value; long = 32-bit value - fixed point values: value made up of an integer for whole numbers and an unsigned value for the decimal - binary values: base-2 long unsigned values (values from 0 and 1) - octal values: base-8 long unsigned values (values from 0 through to 7) - decimal values: base-10 long unsigned values (values from 0 through to 9) - hexadecimal (hex) values: base-16 long unsigned values (values from 0 to 9 and A to F) - object offsets: values relative to objects only and are used to skip to the next object - index/sample data offsets: values relative to the file's data fork FILE INFO Suffixes = ".rmf", ".rm"; Mac OS Type = "PNRA"; Mac OS Creator = "PNst"; MIME="video/" Standard single fork binary file that is primarily designed to stream it's packetized sample data over a UDP or TCP network. Unknown objects can be safely skipped over, all objects can be in any order (with the exception of the identifying header) and this format is completely defined by Progressive/Real Networks therefore no custom objects should be added at all. FILE HEADER Note: the rmf header object must be at the beginning of the file for file identification. The index object(s) are generally at the end after the sample data like the structure of a RIFF AVI file. * 8+ bytes rmf header object = long ASCII text string '.RMF' + long unsigned offset -> 2 bytes object version = short unsigned value (current = 0) -> 4 bytes format version = long unsigned value (current = 1) -> 4 bytes number of objects to follow = long unsigned total * 8+ bytes properties object = long ASCII text string 'PROP' + long unsigned offset -> 2 bytes object version = short unsigned value (current = 0) -> 4 bytes file maximum bit rate = long unsigned value -> 4 bytes file average bit rate = long unsigned value -> 4 bytes file maximum packet size = long unsigned value (in bytes) -> 4 bytes file average packet size = long unsigned value (in bytes) -> 4 bytes file number of packets = long unsigned total -> 4 bytes file duration = long unsigned value (in 1000ths of a second) -> 4 bytes file preroll (amount to buffer) = long unsigned value (in 1000ths of a second) -> 4 bytes location of index object = long unsigned file offset -> 4 bytes location of sample data object = long unsigned file offset - NOTE: above must be updated if anything is added or removed before the sample data. -> 2 bytes number of streams = short unsigned total (of Media Properties objects) -> 5/8 byte reserved = 5 bits set to zero -> 1/8 byte file was live broadcast flag = 1 bit true/false value -> 1/8 byte use perfect play flag = 1 bit true/false value -> 1/8 byte file can be saved flag = 1 bit true/false value * 8+ bytes media properties object(s) = long ASCII text string 'MDPR' + long unsigned offset -> 2 bytes object version = short unsigned value (current = 0) -> 2 bytes stream id = short unsigned value -> 4 bytes stream maximum bit rate = long unsigned value -> 4 bytes stream average bit rate = long unsigned value -> 4 bytes stream maximum packet size = long unsigned value (in bytes) -> 4 bytes stream average packet size = long unsigned value (in bytes) -> 4 bytes stream start time = long unsigned value (in 1000ths of a second) -> 4 bytes stream preroll (amount to buffer) = long unsigned value (in 1000ths of a second) -> 4 bytes stream duration = long unsigned value (in 1000ths of a second) -> 1 byte stream name string length = byte unsigned length (no name = zero length string) -> variable stream name = ASCII string (eg. "Video Stream") -> 1 byte stream MIME string length = byte unsigned length (no MIME = zero length string) -> variable stream MIME type/subtype = ASCII string (eg. "video/x-pn-realvideo") -> 4 byte stream additional info length = long unsigned length (no info = zero length) -> variable stream additional info = data as defined by MIME * 8+ bytes content description object = long ASCII text string 'CONT' + long unsigned offset -> 2 bytes object version = short unsigned value (current = 0) -> 2 byte file title string length = byte unsigned length (no name = zero length string) -> variable file title = ASCII/ISO-8859-1 string (eg. "An Example Movie") -> 2 byte file author string length = byte unsigned length (no name = zero length string) -> variable file author = ASCII/ISO-8859-1 string (eg. "Some Person/Organisation") -> 2 byte file copyright string length = byte unsigned length (no name = zero length string) -> variable file copyright = ASCII/ISO-8859-1 string (eg. "(c) 2000 Blah Blah") -> 2 byte file comment string length = byte unsigned length (no name = zero length string) -> variable file comment = ASCII/ISO-8859-1 string (eg. "Encoder information") * 8+ bytes index chunk (for random access) object = long ASCII text string 'INDX' + long unsigned offset -> 2 bytes object version = short unsigned value (current = 0) -> 4 bytes number of index chunk records = long unsigned total -> 2 bytes stream id = short unsigned value -> 4 bytes next index object = long unsigned offset (set to zero if only one) - NOTE: chunk records appear more than once following the format below. -> 2 bytes chunk version = short unsigned value (current = 0) -> 4 bytes chunk timestamp = long unsigned value (in 1000ths of a second) -> 4 bytes chunk location = long unsigned file offset - NOTE: above must be updated if anything is added or removed before the sample data. -> 4 bytes number of packets in chunk = long unsigned total FILE SAMPLE DATA Note: if any sample data object grows in excess of 2^32 bytes (> 4.2 GB), a another object container must be created and referenced in the last one's header. Files with multiple streams have sample packets interleaved. * 8+ bytes sample data object = long ASCII text string 'DATA' + long unsigned offset -> 2 bytes object version = short unsigned value (current = 0) -> 4 bytes number of packets = long unsigned total -> 4 bytes next sample data object = long unsigned offset (set to zero if only one) - NOTE: packets appear more than once following the format below. -> 2 bytes sample packet version = short unsigned value (current = 0) -> 2 bytes sample packet length = short unsigned value -> 2 bytes sample packet stream id = short unsigned value as defined in Media Properties object -> 4 bytes sample packet timestamp = long unsigned value (in 1000ths of a second) -> 1 byte reserved = byte unsigned value set to zero -> 3/4 byte reserved = 6 bits set to zero -> 1/8 byte packet contains keyframe flag = 1 bit true/false value -> 1/8 byte is packet reliable flag = 1 bit true/false value -> variable sample payload = data as defined in Media Properties object - All compressed sample payload structures are undocumented due to being proprietary.