[MPlayer-cvslog] CVS: main/DOCS/tech mpcf.txt,1.91,1.92

Oded Shimon CVS syncmail at mplayerhq.hu
Fri Jan 20 20:10:57 CET 2006


CVS change done by Oded Shimon CVS

Update of /cvsroot/mplayer/main/DOCS/tech
In directory mail:/var2/tmp/cvs-serv27665/DOCS/tech

Modified Files:
	mpcf.txt 
Log Message:
change goals slightly..
max_index_distance removed
index changed to combination of syncpoint index and pts for keyframes
back_ptr changed - points to most correct keyframe, not most recent.
max(last_dts) <= syncpoint timestamp <= min(future_pts)


Index: mpcf.txt
===================================================================
RCS file: /cvsroot/mplayer/main/DOCS/tech/mpcf.txt,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- mpcf.txt	20 Jan 2006 19:06:28 -0000	1.91
+++ mpcf.txt	20 Jan 2006 19:10:55 -0000	1.92
@@ -21,7 +21,7 @@
 
 Compact
     ~0.2% overhead, for normal bitrates
-    index is <10kb per hour (1 keyframe every 3sec)
+    index is <100kb per hour
     a usual header for a file is about 100 bytes (audio + video headers together)
     a packet header is about ~1-5 bytes
 
@@ -130,7 +130,6 @@
     version                             v
     stream_count                        v
     max_distance                        v
-    max_index_distance                  v
     tmp_pts=0
     tmp_mul=1
     tmp_stream=0
@@ -224,12 +223,35 @@
 index:
     index_startcode                     f(64)
     packet header
-    stream_id                           v
     max_pts                             v
-    index_length                        v
-    for(i=0; i<index_length; i++){
-        index_pts                       v
-        index_position                  v
+    syncpoints                          v
+    for(i=0; i<syncpoints; i++){
+        syncpoint_pos_div8              v
+    }
+    for(i=0; i<stream_count; i++){
+        for(j=0; j<syncpoint_count; ){
+            x                           v
+            type= x & 1
+            x>>=1
+            if(type){
+                flag= x & 1
+                x>>=1
+                while(x--)
+                    has_keyframe[j++][i]=flag
+                has_keyframe[j++][i]=!flag;
+            }else{
+                while(x != 1){
+                    has_keyframe[j++][i]=x&1;
+                    x>>=1;
+                }
+            }
+        }
+        for(j=0; j<syncpoint_count; j++){
+            if (!has_keyframe[j++][i]) continue
+            A                           v
+            last_pts += A
+            keyframe_pts[j][i] = last_pts
+        }
     }
     reserved_bytes
     checksum                            u(32)
@@ -264,7 +286,7 @@
     coded_pts                           v
     stream = coded_pts % stream_count
     global_key_pts = coded_pts/stream_count
-    back_ptr                            v
+    back_ptr_div8                       v
 
             Complete definition:
 
@@ -290,9 +312,7 @@
         }
     }
     if (next_code == index_startcode){
-        while(!eof){
-            index
-        }
+        index
         index_ptr                       u(64)
     }
 
@@ -304,12 +324,12 @@
     size of the packet data (exactly the distance from the first byte
     after the forward_ptr to the first byte of the next packet)
 
-back_ptr
-    real_back_ptr = back_ptr * 8 + 7
-    real_back_ptr must point to a position such that a syncpoint
-    startcode begins within the next 8 bytes, and such that at least
-    one keyframe for each stream lies between the syncpoint to which
-    real_back_ptr points, and the current syncpoint.
+back_ptr_div8
+    back_ptr = back_ptr_div8 * 8 + 7
+    back_ptr must point to a position within 8 bytes of a syncpoint
+    startcode. This syncpoint MUST be the closest syncpoint such that at
+    least one keyframe with a pts lower or equal to the original syncpoint's
+    global_key_pts for all streams lies between it and the current syncpoint.
 
     A stream where EOR is set is to be ignored for back_ptr.
 
@@ -317,6 +337,9 @@
     After a syncpoint, last_pts of each stream is to be set to:
     last_pts[i] = convert_ts(global_key_pts, timebase[stream], timebase[i])
 
+    global_key_pts MUST be bigger or equal to dts of all past frames across
+    all streams, and smaller or equal to pts of all future frames.
+
 file_id_string
     "nut/multimedia container\0"
 
@@ -355,13 +378,6 @@
     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
-
 stream_id
     Stream identifier
     stream_id MUST be < stream_count
@@ -525,23 +541,27 @@
     forward_ptr until last byte before the checksum).
 
 max_pts
-    The highest pts in the stream.
-
-index_pts
-    value of the pts of a keyframe relative to the last keyframe
-    stored in this index
-
-index_position
-    position in bytes of the first byte of a keyframe, relative to the
-    last keyframe stored in this index
-    there MUST be no keyframe with the same stream_id as this index between
-    two consecutive index entries if they are more than max_index_distance
-    apart
+    s = max_pts % stream_count
+    pts = max_pts / stream_count
+    The highest pts in the entire file in the timebase of stream 's' .
+
+syncpoint_pos_div8
+    offset from begginning of file to up to 7 bytes before the syncpoint
+    referred to in this index entry. Relative to position of last
+    syncpoint.
+
+has_keyframe
+    indicates whether this stream has a keyframe between this syncpoint and
+    the last syncpoint.
+
+keyframe_pts
+    The pts of the first keyframe for this stream in the region between the
+    2 syncpoints, in the stream's timebase.
 
 index_ptr
-    Length in bytes from the first byte of the first index startcode
-    to the first byte of the index_ptr. If there is no index, index_ptr
-    MUST NOT be written.
+    Length in bytes from the first byte of the index startcode to the first
+    byte of the index_ptr. If there is no index, index_ptr MUST NOT be
+    written.
 
 id
     the ID of the type/name pair, so it is more compact




More information about the MPlayer-cvslog mailing list