Discovered On2 Codec Headers by Alex Beregszaszi November 25, 2003 Contents -------- * Duck / TrueMotion (1) * TrueMotion 2 * VP3.0 * VP3.0b and up (3.1 and 3.2) * VP4 and VP5 * VP6 * Theora <3.3.0 * Theora >=3.3.0 Duck / TrueMotion (1) --------------------- byte 0: size of the header byte 1: compression type (?) byte 2: delta table indicator byte 3: table (?) bytes 4-5: height bytes 6-7: width The header is scrambled, here's a pseudo code for decoding: real_header_size = ((header_size >> 5) || (header_size << 3)) & 0x7f for (0 < i < real_header_size) header[i-1] = inbuf[i] ^ inbuf[i+1] bytes 8-9: checksum byte 10: version byte 11: header type Header types: 1: as above 2: 1 byte: frameinfo 1 byte: control TrueMotion 2 ------------ bytes 0-3: type (two known types: 0x000000100 (~type1) and 0x000000101 (~type2)) bytes 4-7: format size (?) If type1 stream, additional headers look like: bytes 8-11: data size bytes 12-13: height bytes 14-15: width bytes 16-19: compression flags byte 20: unknown (it's in relation to height) byte 21: unknown (it's in relation to width) If type2 stream, additional headers look like: bytes 8-11: header size (?) bytes 12-15: data size bytes 16-19: height bytes 20-23: width bytes 24-27: compression flags bytes 28-31: unknown (it's in relation to height) bytes 32-35: unknown (it's in relation to width) Bit zero of compression flags indicates a file encoded with a shareware encoder, so displaying the On2 logo is forced :) VP3.0 ----- bit 7: 0 = intra frame, 1 = inter frame bit 6: unused bits 5-0: Quality index (0..63) Additional headers come if frame is intra-coded: bits 7-4: width code bits 4-0: height code VP3.0b and up (3.1 and 3.2) --------------------------- bit 7: 0 = intra frame, 1 = inter frame bit 6: unused bits 5-0: Quality index (0..63) Additional headers come if frame is intra-codec: byte 0: bits 7-4: width code (always zero) bits 4-0: height code (always zero) byte 1: bits 7-3: version number (1 for vp3.1, 2 for vp3.2 (?)) bit 2: keyframe coding method (0 = dct) bits 1-0: unused VP4 and VP5 ----------- The same as VP3.0b. Version codes: 3: VP4.0 4: ? (maybe VP4.1) 5: VP5.0 VP6 --- Header structure isn't discovered yet, but it might be based on some H.264 draft. Theora <3.3.0 ------------- 1 bit: frame indicator 1 bit: 0 = intra frame, 1 = inter frame 6 bits: Quality index (0..63) Additional headers come if frame is intra-codec: 1 bit: keyframe coding method (0 = dct) 2 bits: unused Theora >=3.3.0 -------------- 1 bit: frame indicator 1 bit: 0 = intra frame, 1 = inter frame 6 bits: Quality index (0..63) 1 bit: unused Additional headers come if frame is intra-codec: 1 bit: keyframe coding method (0 = dct) 2 bits: unused In case of zero frame indicator, additional headers follow: 7 bit: header type Header types: 0: main header 1: comments 2: tables Mean header: 8 bits: version major 8 bits: version minor 8 bits: version micro 16 bits: encoded width / 4 16 bits: encoded height / 4 24 bits: decoded width 24 bits: decoded height 8 bits: offset x (?) 8 bits: offset y (?) 32 bits: fps numerator 32 bits: fps denumerator 24 bits: aspect numerator 24 bits: aspect denumerator If Theora <3.3.0: 5 bits: keyframe frequency force 8 bits: colorspace 24 bits: bitrate 6 bits: last (?) quality index If Theora >=3.3.0: 5 bits: keyframe frequency force 5 bits: unused Colorspaces: 0: unspecified 1: ITU 601 2: CIE 709 Comments: 32 bits: vendor len data: vendor_len bytes string without trailing zero 32 bits: number of comments comment entries: 32 bits: string len data: string_len bytes string without trailing zero Tables: 64*16 bits: quality threshold 64*16 bits: dc scale factor 64*8 bits: intraframe luma dequantizers 64*8 bits: intraframe chroma dequatizers 64*8 bits: interframe dequantizers References ---------- FFmpeg sources: http://www.ffmpeg.org/ Theora sources: http://www.theora.org/