Mercurial > mplayer.hg
changeset 14854:ebc5136f2a56
some comments and whitespace changes by (Luca Barbato <lu_zero gentoo org>)
author | michael |
---|---|
date | Tue, 01 Mar 2005 00:16:44 +0000 |
parents | 7e2e8e1bab8d |
children | 24d7981dec20 |
files | DOCS/tech/mpcf.txt |
diffstat | 1 files changed, 101 insertions(+), 57 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/tech/mpcf.txt Mon Feb 28 14:08:07 2005 +0000 +++ b/DOCS/tech/mpcf.txt Tue Mar 01 00:16:44 2005 +0000 @@ -37,12 +37,37 @@ Syntax: +Since nut heavly uses variable lenght fields the simplest way to describe it +is using a pseudocode approach. + + Conventions: + +The data tipes have a name, used in the bitstream syntax description, a short +text description and a pseudocode (functional) definition, optional notes may +follow: + +name (text description) + functional definition + [Optional notes] + +The bitream syntax element have a tagname and a functional definition, they are +presented in a bottom up approach, again optional notes may follow and are reproduced in the tag description: + +name: (optional note) + functional definition + [Optional notes] + +The in-depth tag description follows the bitstream syntax. +The functional definition has a C like syntax. + + Type definitions: -f(x) n fixed bits in big-endian order -u(x) unsigned number encoded in x bits in MSB first order -v +f(n) (n fixed bits in big-endian order) +u(n) (unsigned number encoded in n bits in MSB first order) + +v (variable length value, unsigned) value=0 do{ more_data u(1) @@ -50,38 +75,43 @@ value= 128*value + data }while(more_data) -s +s (variable length value, signed) temp v temp++ if(temp&1) value= -(temp>>1) else value= (temp>>1) -b (binary data or string) +b (binary data or string, to be use in vb, see below) for(i=0; i<length; i++){ data[i] u(8) } - Note: strings MUST be encoded in utf8 + [Note: strings MUST be encoded in utf8] -vb +vb (variable lenght binary data or string) length v value b Bitstream syntax: -packet header + + Common elements: + +packet header: forward ptr v -align_byte +align_byte: while(not byte aligned) one f(1) -reserved_bytes +reserved_bytes: for(i=0; i<forward_ptr - length_of_non_reserved; i++) reserved u(8) - a demuxer MUST ignore any reserved bytes + [a demuxer MUST ignore any reserved bytes a muxer MUST NOT write any reserved bytes, as this would make it - inpossible to add new fields at the end of packets in the future in - a compatible way + impossible to add new fields at the end of packets in the future in + a compatible way] + + Headers: main header: main_startcode f(64) @@ -152,8 +182,9 @@ reserved_bytes checksum u(32) + Basic Packets: -frame +frame: frame_code f(8) if(stream_id_plus1[frame_code]==0){ stream_id v @@ -168,7 +199,7 @@ reserved v data -Index: +index: index_startcode f(64) packet header stream_id v @@ -200,11 +231,13 @@ reserved_bytes checksum u(32) -sync_point +sync_point: frame_startcode f(64) global_timestamp v -file + Complete definition: + +file: file_id_string while(!eof && next_code != index_startcode){ main_header @@ -226,9 +259,14 @@ } index + + + Tag description: + forward_ptr size of the packet (exactly the distance from the first byte of the - startcode of the current packet to the first byte of the following packet + startcode of the current packet to the first byte of the following + packet file_id_string "nut/multimedia container\0" @@ -238,13 +276,16 @@ main_startcode 0x7A561F5F04ADULL + (((uint64_t)('N'<<8) + 'M')<<48) + stream_starcode 0x11405BF2F9DBULL + (((uint64_t)('N'<<8) + 'S')<<48) + frame_startcode 0xE4ADEECA4569ULL + (((uint64_t)('N'<<8) + 'K')<<48) + frame_startcodes SHOULD be placed immedeatly before a keyframe if the previous frame of the same stream was a non-keyframe, unless such - non-keyframe - keyframe tansitions are very frequent + non-keyframe - keyframe transitions are very frequent index_startcode 0xDD672F23E64EULL + (((uint64_t)('N'<<8) + 'X')<<48) @@ -252,25 +293,27 @@ 0xAB68B596BA78ULL + (((uint64_t)('N'<<8) + 'I')<<48) version - 2 for now + NUT version, the current values is 2 max_distance max distance of frame_startcodes, the distance may only be larger if - there is only a single frame between the 2 frame_startcodes - this can be used by the demuxer to detect damaged frame headers if the - damage results in a too long chain - SHOULD be set to <=32768 or at least <=65536 unless there is a very good - reason to set it higher otherwise reasonable error recovery will be - impossible + there is only a single frame between the 2 frame_startcodes this can + be used by the demuxer to detect damaged frame headers if the damage + results in a too long chain + + SHOULD be set to <=32768 or at least <=65536 unless there is a very + good reason to set it higher otherwise reasonable error recovery will + be impossible max_index_distance max distance of keyframes which are represented in the index, the distance between consecutive entries A and B may only be larger if there are no keyframes within this stream between A and B - SHOULD be set to <=32768 or at least <=65536 unless there is a very good - reason to set it higher + SHOULD be set to <=32768 or at least <=65536 unless there is a very + good reason to set it higher stream_id[FIXME] + Stream identifier Note: streams with a lower relative class MUST have a lower relative id so a stream with class 0 MUST always have a id which is lower then any stream with class > 0 @@ -281,7 +324,7 @@ 1 audio 2 subtiles 3 metadata - Note the remaining values are reserved and MUST NOT be used + Note: the remaining values are reserved and MUST NOT be used a demuxer MUST ignore streams with reserved classes fourcc @@ -305,8 +348,9 @@ 44100 1 44100 1 44100 64 11025 16 48000 1024 375 8 - Note: the advantage to using a large sample_rate_mul is that the - timestamps need fewer bits + + Note: the advantage to using a large sample_rate_mul is that + the timestamps need fewer bits global_time_base_nom / global_time_base_denom = global_time_base the number of timer ticks per second @@ -316,14 +360,15 @@ global_timestamp timestamp in global_time_base units - when a global_timestamp is encountered the last_timestamp of all streams - is set to the following: + when a global_timestamp is encountered the last_timestamp of all + streams is set to the following: + ln= global_time_base_denom*time_base_nom sn= global_timestamp d1= global_time_base_nom d2= time_base_denom last_timestamp= (ln/d1*sn + ln%d1*sn/d1)/d2 - Note, this calculation MUST be done with unsigned 64 bit integers, and + Note: this calculation MUST be done with unsigned 64 bit integers, and is equivalent to (ln*sn)/(d1*d2) but this would require a 96bit integer msb_timestamp_shift @@ -331,10 +376,10 @@ MUST be <16 decode_delay - maximum time between input and output for a codec, used to generate dts - from pts - is 0 for streams without b frames, and 1 for streams with b frames, may - be larger for future codecs + maximum time between input and output for a codec, used to generate + dts from pts + is set to 0 for streams without b frames, and set to 1 for streams with + b frames, may be larger for future codecs fixed_fps 1 indicates that the fps is fixed @@ -348,17 +393,17 @@ different from the first byte of any startcode flags[frame_code] - the bits of the flags from MSB to LSB are KD + first of the flags from MSB to LSB are called KD if D is 1 then data_size_msb is coded, otherwise data_size_msb is 0 K is the keyframe_type 0-> no keyframe, 1-> keyframe, flags=4 can be used to mark illegal frame_code bytes frame_code=78 must have flags=4 - * frames MUST not depend(1) upon frames prior to the last + Note: frames MUST not depend(1) upon frames prior to the last frame_startcode - depend(1) means dependancy on the container level (NUT) not dependancy - on the codec level + Important: depend(1) means dependancy on the container level (NUT) not + dependancy on the codec level stream_id_plus1[frame_code] must be <250 @@ -377,8 +422,8 @@ data_size= data_size_lsb + data_size_msb*data_size_mul; coded_timestamp - if coded_timestamp < (1<<msb_timestamp_shift) then its a - lsb timestamp, otherwise its a full timestamp + (1<<msb_timestamp_shift) + if coded_timestamp < (1<<msb_timestamp_shift) then its a lsb + timestamp, otherwise its a full timestamp + (1<<msb_timestamp_shift) lsb timestamps are converted to full timesamps by: mask = (1<<msb_timestamp_shift)-1; delta= last_timestamp - mask/2 @@ -387,7 +432,7 @@ available after the last frame_startcode with the current stream_id lsb_timestamp - least significant bits of the timestamp in time_base precission + least significant bits of the timestamp in time_base precision Example: IBBP display order keyframe timestamp=0 -> timestamp=0 frame lsb_timestamp=3 -> timestamp=3 @@ -405,8 +450,8 @@ dts dts are calculated by using a decode_delay+1 sized buffer for each stream, into which the current pts is inserted and the element with - the smallest value is removed, this is then the current dts - this buffer is initalized with decode_delay -1 elements + the smallest value is removed, this is then the current dts this + buffer is initalized with decode_delay -1 elements all frames with dts == timestamp must be monotone, that means a frame which occures later in the stream must have a larger or equal dts then an earlier frame @@ -487,8 +532,7 @@ value of this name/type pair stuffing - 0x80 can be placed infront of any type v entry for stuffing - purposes + 0x80 can be placed in front of any type v entry for stuffing purposes info_table[][2]={ {NULL , NULL }, // end @@ -520,9 +564,9 @@ headers may be repated, but if they are then they MUST all be repeated together and repeated headers MUST be identical -headers MAY only repeated at the closest possible positions after 2^x where x is -an integer and the file end, so the headers may be repeated at 4102 if thats the -closest possition after 2^12=4096 at which the headers can be placed +headers MAY only repeated at the closest possible positions after 2^x where x +is an integer and the file end, so the headers may be repeated at 4102 if that +is the closest possition after 2^12=4096 at which the headers can be placed headers MUST be placed at least at the begin of the file and immedeatly before the index or at the file end if there is no index @@ -544,9 +588,9 @@ each time but only if also the time is different Info packets can be used to describe the file or some part of it (chapters) -info packets, SHOULD be placed at the begin of the file at least -for realtime streaming info packets will normally be transmitted when they apply -for example, the current song title & artist of the currently shown music video +info packets, SHOULD be placed at the begin of the file at least for realtime +streaming info packets will normally be transmitted when they apply for +example, the current song title & artist of the currently shown music video Unknown packets MUST be ignored by the demuxer @@ -554,8 +598,8 @@ demuxer (non-normative) in the absence of valid header at beginning, players SHOULD search for backup -headers starting at offset 2^x for each x players SHOULD end their search from a -particular offset when any startcode is found (including syncpoint) +headers starting at offset 2^x for each x players SHOULD end their search from +a particular offset when any startcode is found (including syncpoint) Sample code (GPL, & untested)