Mercurial > mplayer.hg
changeset 12084:68baf8877c07
reversing the change to the forw/backw pointers, its somewhat simpler to update it if the forward pointer is first
much more efficient encoding of the frame_code table
stream_id -> stream_id_plus1, that way 0 is the special case instead of stream_count and we can be sure the table needs only 8bit per entry
replace timestamp_msb by timestamp (and obviously dont code the lsb if the whole is coded) thats simpler and more compact
add a msb_timestamp flag to the frame_code[].flags
author | michael |
---|---|
date | Wed, 31 Mar 2004 01:44:57 +0000 |
parents | 9aabf1beeb4f |
children | 58d39d0656b4 |
files | DOCS/tech/mpcf.txt |
diffstat | 1 files changed, 39 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/tech/mpcf.txt Tue Mar 30 10:58:41 2004 +0000 +++ b/DOCS/tech/mpcf.txt Wed Mar 31 01:44:57 2004 +0000 @@ -67,8 +67,8 @@ Bitstream syntax: packet header + forward ptr v backward ptr v - forward ptr v align_byte while(not byte aligned) @@ -88,12 +88,21 @@ version v stream_count v checksum_threshold v - for(i=0; i<256; i++){ - flags[i] v - if(flags&64){ - stream_id[i] v - lsb_size[i] v - data_size_mul[i] v + for(i=0; i<256; ){ + tmp_flag v + tmp_stream v + tmp_mul v + tmp_size v + count v + for(j=0; j<count; j++, i++){ + flags[i]= tmp_flag; + stream_id_plus1[i]= tmp_stream; + data_size_mul[i]= tmp_mul; + data_size_lsb[i]= tmp_size; + if(++tmp_size >= tmp_mul){ + tmp_size=0; + tmp_stream++; + } } } reserved_bytes @@ -110,7 +119,7 @@ time_base_nom v time_base_denom v msb_timestamp_shift v - inital_timestamp_predictor v(3) + initial_timestamp_predictor v(3) initial_data_size_predictor v(2) fixed_fps u(1) index_flag u(1) @@ -148,14 +157,15 @@ if(flags[frame_code]&1){ packet header } - if(stream_id[frame_code]==stream_count){ + if(stream_id_plus1[frame_code]==0){ stream_id v } - if(frame_type == 2){ - msb_timestamp v - } - if((flags[frame_code]&12) == 12){ - lsb_timestamp v + if(flags[frame_code]&16){ + if(flags[frame_code]&4){ + timestamp v + }else{ + lsb_timestamp v + } } if(flags[frame_code]&2){ data_size_msb v @@ -302,30 +312,29 @@ different from the first byte of any startcode flags[frame_code] - the bits of the flags from MSB to LSB are CKKTTDP + the bits of the flags from MSB to LSB are KKTTTDP P is 1 for type 1 and 2 packets, 0 for type 0 packets - TT is the timestamp_code 00,01,10 use the last timestamp + the first, - second and third last unique timestamp difference, so if the - timestamp differences, are +3,+1,+2,+2,+1 then last diff is + TTT is the timestamp_code, 000,001,010 use the last timestamp + the + first, second and third last unique timestamp difference, so if + the timestamp differences, are +3,+1,+2,+2,+1 then last diff is +1, second is +2 and third is +3 - if TT is 11, then the timestamp is calculated by + 100,101 mean that the lsb or full timestamp is coded + if TTT is 100, then the timestamp is calculated by mask = (1<<msb_timestamp_shift)-1; delta= last_timestamp - mask/2 timestamp= ((timestamp_lsb-delta)&mask) + delta - TT must be 11 if packet_type is not 0 + TTT must be 100 or 101 if the packet_type is not 0 the last timestamp differences are reset to the default values from the stream header if a packet of type not 0 in encountered - if D is 1 then the data_size_msb is coded otherwise data_size_msb is 0 + if D is 1 then data_size_msb is coded, otherwise its 0 KK is the keyframe_type 00-> no keyframe, 01-> keyframe, 10-> equal to last of the same stream, 11-> opposite from last of the same stream KK must be 00 or 01 if the packet_type is not 0 - if C is 1 then stream_id, data_size_mul and data_size_lsb are not - stored, but predicted from the last ones - the value 1000001 (65) is used to mark illegal frame_code bytes, at - least flags[78] must be 65 + flags=1 can be used to mark illegal frame_code bytes + frame_code=78 must have flags=1 frame_type 0 is indicated by (flags[frame_code]&1)==0 @@ -334,22 +343,17 @@ there SHOULD not be more then 0.5 seconds or 16kbyte of type 0 frames wihout a intervening frame of different frame_type -stream_id[frame_code] - if its not coded in the main_header then its equal to the last one - from the main header +stream_id_plus1[frame_code] must be <250 + if its 0 then the stream_id is coded in the frame data_size_mul[frame_code] - if its not coded in the main_header then its equal to the last one - from the main header must be <250 data_size_lsb[frame_code] - if its not coded in the main_header then its equal to the last one - from the main header + 1 must be <250 -data_size +data_size if(data_size_lsb == data_size_mul) data_size= last; else if(data_size_lsb == data_size_mul+1) @@ -360,18 +364,15 @@ last and next last are reset to the values stored in the stream header if an frame with type > 0 is encountered -msb_timestamp - most significant bits of the timestamp, SHOULD be 0 for the first frame - lsb_timestamp least significant bits of the timestamp in time_base precission Example: IBBP display order - keyframe msb_timestamp=0 lsb_timestamp=0 -> timestamp=0 + keyframe timestamp=0 -> timestamp=0 frame lsb_timestamp=3 -> timestamp=3 frame lsb_timestamp=1 -> timestamp=1 frame lsb_timestamp=2 -> timestamp=2 ... - keyframe msb_timestamp=1 lsb_timestamp=1 -> timestamp=257 + keyframe msb_timestamp=257 -> timestamp=257 frame lsb_timestamp=255->timestamp=255 frame lsb_timestamp=0 -> timestamp=256 frame lsb_timestamp=4 -> timestamp=260