[MPlayer-cvslog] CVS: main/DOCS/tech mpcf.txt,1.117,1.118
Michael Niedermayer CVS
syncmail at mplayerhq.hu
Wed Mar 1 15:19:40 CET 2006
CVS change done by Michael Niedermayer CVS
Update of /cvsroot/mplayer/main/DOCS/tech
In directory mail:/var2/tmp/cvs-serv10365
Modified Files:
mpcf.txt
Log Message:
add forward_ptr to syncpoint (+0.006% overhead)
give syncpoint and frameheader their own checksums (worst case overhead increase <0.006%)
fix filestructure so that extendability is restored
move index_ptr to the fileend so that index packets arent a special case with their reserved_bytes position
-> all packets follow the same structure now
remove "optional" word from info packets, they are not more optional then index packets
split index packets
note, this is entirely optional and a muxer which has difficulty with it can always output a single index packet
remove the index MUST be at the file end if anywher rule, its not needed anymore as index_ptr will always be at the end
info frames must be keyframes
last info frame is the most correct
comments, flames?
Index: mpcf.txt
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/tech/mpcf.txt,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -r1.117 -r1.118
--- mpcf.txt 1 Mar 2006 13:37:09 -0000 1.117
+++ mpcf.txt 1 Mar 2006 14:19:37 -0000 1.118
@@ -122,8 +122,6 @@
Headers:
main header:
- main_startcode f(64)
- forward_ptr v
version v
stream_count v
max_distance v
@@ -162,12 +160,8 @@
reserved_count[i]= tmp_res;
}
}
- reserved_bytes
- checksum u(32)
stream_header:
- stream_startcode f(64)
- forward_ptr v
stream_id v
stream_class v
fourcc vb
@@ -190,8 +184,6 @@
samplerate_denom v
channel_count v
}
- reserved_bytes
- checksum u(32)
Basic Packets:
@@ -211,22 +203,21 @@
}
for(i=0; i<reserved_count[frame_code]; i++)
reserved v
- if (after_syncpoint){
- syncpoint_checksum u(32)
+ if(stream_flags&4){
+ checksum u(32)
}
data
index:
- index_startcode f(64)
- forward_ptr v
max_pts v
+ syncpoint_start v
syncpoints v
- for(i=0; i<syncpoints; i++){
+ for(i=syncpoint_start; i<syncpoints; i++){
syncpoint_pos_div8 v
}
for(i=0; i<stream_count; i++){
last_pts= -1
- for(j=0; j<syncpoints; ){
+ for(j=syncpoint_start; j<syncpoints; ){
x v
type= x & 1
x>>=1
@@ -257,11 +248,8 @@
}
}
}
- reserved_bytes
- index_ptr u(64)
- checksum u(32)
-info_frame: (optional)
+info_packet:
stream_id_plus1 v
chapter_id v
chapter_start v
@@ -287,16 +275,12 @@
type= "v"
}
}
- reserved_bytes
- checksum u(32)
-info_packet: (optional)
- info_startcode f(64)
- forward_ptr v
- info_frame
+info_frame:
+ info_packet
+ packet_footer
syncpoint:
- syncpoint_startcode f(64)
coded_pts v
stream = coded_pts % stream_count
global_key_pts = coded_pts/stream_count
@@ -306,23 +290,73 @@
file:
file_id_string
- while(!eof){
- main_header
+ while(bytes_left > 8){
+ if(next_byte == 'N'){
+ startcode f(64)
+ forward_ptr v
+ switch(startcode){
+ case main_startcode: main_header; break;
+ case stream_startcode:stream_header; break;
+ case info_startcode: info_packet; break;
+ case index_startcode: index; break;
+ case syncpoint_startcode: syncpoint; break;
+ }
+ reserved_bytes
+ checksum u(32)
+ }else
+ frame
+ }
+ index_ptr u(64)
+
+the structure of a undamaged file should look like the following, but
+demuxers should be flexible and be able to deal with damaged headers so the
+above is a better loop in practice (not to mention its simpler)
+note, demuxers MUST be able to deal with new and unknown headers
+
+packet_header
+ startcode f(64)
+ forward_ptr v
+
+packet_footer
+ reserved_bytes
+ checksum u(32)
+
+reserved_headers
+ while(next_byte == 'N' && next_code != main_startcode
+ && next_code != stream_startcode
+ && next_code != info_startcode
+ && next_code != index_startcode
+ && next_code != syncpoint_startcode){
+ packet_header
+ packet_footer
+ }
+
+file:
+ file_id_string
+ while(bytes_left > 8){
+ packet_header, main_header, packet_footer
+ reserved_headers
for(i=0; i<stream_count; i++){
- stream_header
+ packet_header, stream_header, packet_footer
+ reserved_headers
}
while(next_code == info_startcode){
- info_packet
+ packet_header, info_packet, packet_footer
+ reserved_headers
}
- if(next_code == index_startcode){
- index
+ while(next_code == index_startcode){
+ packet_header, index_packet, packet_footer
+ reserved_headers
}
- if (!eof) while(next_code != main_startcode){
- if(next_code == syncpoint_startcode)
- syncpoint
+ if (bytes_left > 8) while(next_code != main_startcode){
+ if(next_code == syncpoint_startcode){
+ packet_header, syncpoint, packet_footer
+ }
frame
+ reserved_headers
}
}
+ index_ptr u(64)
Tag description:
@@ -372,8 +406,8 @@
max_pts_distance
max absoloute difference of pts of new frame from last_pts in the
- timebase of the stream, without a syncpoint immediately before the
- frame. Note that last_pts is not necessarily the pts of the last frame
+ timebase of the stream, without a checksum after the frameheader
+ Note that last_pts is not necessarily the pts of the last frame
on the same stream, as it is altered by syncpoint timestamps.
stream_id
@@ -474,12 +508,15 @@
1 is_key if set, frame is keyframe
2 end_of_relevance if set, stream has no relevance on
presentation. (EOR)
+ 4 has_checksum if set then the frame header contains a checksum
EOR frames MUST be zero-length and must be set keyframe.
All streams SHOULD end with EOR, where the pts of the EOR indicates the
end presentation time of the final frame.
An EOR set stream is unset by the first content frames.
EOR can only be unset in streams with zero decode_delay .
+ has_checksum must be set if the frame is larger then 2*max_distance or its
+ pts differs by more then max_pts_distance from the last frame
stream_id_plus1[frame_code]
must be <250
@@ -560,16 +597,12 @@
checksum is calculated for the area pointed to by forward_ptr not
including the checksum itself (from first byte after the
forward_ptr until last byte before the checksum).
- In the case of info frames, covers area from begginning of frame.
+ for frame headers the checksum contains the framecode byte and all
+ following bytes upto the checksum itself
Syncpoint tags:
---------------
-syncpoint_checksum
- crc32 checksum
- checksum covers from first byte after syncpoint startcode until last
- byte before the syncpoint_checksum.
-
back_ptr_div8
back_ptr = back_ptr_div8 * 8 + 7
back_ptr must point to a position within 8 bytes of a syncpoint
@@ -612,11 +645,8 @@
that EOR. EOR is unset by the first keyframe after it.
index_ptr
- Length in bytes of the entire index, from the first byte of the
- startcode until the last byte of the checksum.
- Note: A demuxer can use this to find the index when it is written at
- EOF, as index_ptr will always be 12 bytes before the end of file if
- there is an index at all.
+ absolute location in the file of the first byte of the startcode of the
+ first index packet, or 0 if there is no index
Info tags:
----------
@@ -630,6 +660,8 @@
file. Positive chapter_id's are real chapters and MUST NOT overlap.
Negative chapter_id indicate a sub region of file and not a real
chapter. chapter_id MUST be unique to the region it represents.
+ chapter_id n MUST not be used unless there are at least n chapters in the
+ file
chapter_start
s= chapter_start % stream_count
@@ -724,8 +756,6 @@
Note: with realtime streaming, there is no end, so no index there either
Index MAY only be repeated after main headers.
-If an index is written anywhere in the file, it MUST be written at end of
-file as well.
Info:
@@ -742,6 +772,11 @@
Info SHOULD be stored in global packets instead of info streams/frames if
possible, and the amount of data is not large.
+If 2 info frames have the same chapter_id and stream_id then the earlier
+MUST be ignored (the last info frame is the most correct, this allows
+updating or correcting info)
+
+Info frames MUST be keyframes
demuxer (non-normative):
------------------------
More information about the MPlayer-cvslog
mailing list