summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-04-28 03:19:35 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-04-28 03:19:35 +0000
commit370a21f1d0c7a574d182ac93c99138fafc7b78ff (patch)
treeaa37f49902f662ce5124dd073618bcec6f788ec4
parent791008230d745304364977e658f1b293622993a6 (diff)
downloadmpv-370a21f1d0c7a574d182ac93c99138fafc7b78ff.tar.bz2
mpv-370a21f1d0c7a574d182ac93c99138fafc7b78ff.tar.xz
remove frame types
add decode_delay and dts calculation/description monotonicity requirement samplerate_nom/denom git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12334 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--DOCS/tech/mpcf.txt82
1 files changed, 53 insertions, 29 deletions
diff --git a/DOCS/tech/mpcf.txt b/DOCS/tech/mpcf.txt
index eaf30cc39d..7cbe1b70de 100644
--- a/DOCS/tech/mpcf.txt
+++ b/DOCS/tech/mpcf.txt
@@ -88,7 +88,7 @@ main header:
packet header
version v
stream_count v
- max_type0_size v
+ max_distance v
for(i=0; i<256; ){
tmp_flag v
tmp_stream v
@@ -121,6 +121,7 @@ stream_header:
time_base_denom v
msb_timestamp_shift v
initial_timestamp_predictor v(3)
+ decode_delay v
fixed_fps u(1)
index_flag u(1)
reserved u(6)
@@ -142,15 +143,17 @@ video_stream_header:
audio_stream_header:
stream_header
- samplerate_mul v
+ samplerate_nom v
+ samplerate_denom v
channel_count v
reserved_bytes
checksum u(32)
frame
- if(frame_type == 2){
- frame_type2_startcode f(64)
+ if(next_byte == 'N'){
+ FIXME short startcode
+ frame_startcode f(64)
}
frame_code f(8)
if(stream_id_plus1[frame_code]==0){
@@ -229,7 +232,7 @@ main_startcode
0x7A561F5F04ADULL + (((uint64_t)('N'<<8) + 'M')<<48)
stream_starcode
0x11405BF2F9DBULL + (((uint64_t)('N'<<8) + 'S')<<48)
-frame_type2_startcode
+frame_startcode
0xE4ADEECA4569ULL + (((uint64_t)('N'<<8) + 'K')<<48)
index_startcode
0xDD672F23E64EULL + (((uint64_t)('N'<<8) + 'X')<<48)
@@ -239,10 +242,11 @@ info_startcode
version
2 for now
-max_type0_size
- max cummulative sum of type0 frames between type not 0 frames, this can
- be used by the deocoder to detect damaged type 0 headers if the damage
- results in a too long chain
+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 <=16384 to ensure reasonable error recovery
stream_id
@@ -293,6 +297,12 @@ msb_timestamp_shift
amount of bits in lsb_timestamp
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
+
fixed_fps
1 indicates that the fps is fixed
@@ -330,29 +340,21 @@ flags[frame_code]
timestamp difference, so if the timestamp differences, where
+3,+1,+2,+2,+1 then last difference is +1, second is +2 and
third is +3
- predicted delta timestamps MUST NOT be used in type > 0 frames
- or in type 0 frames if there was no full timestamp in the
- current stream after the last type > 0 frame
+ predicted delta timestamps MUST NOT be used in frames if there
+ was no full timestamp in the current stream after the last
+ frame_startcode
the least recent used delta timestamps are reset to the
initial_timestamp_predictor values from the stream header if a
- packet of type not 0 in encountered
+ frame_startcode is encountered
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=16 can be used to mark illegal frame_code bytes
frame_code=78 must have flags=16
-
-frame_type
- if the first byte of a frame is 'N' then the frame_type is 2 otherwise
- its 0
- there SHOULD not be more then 0.5 seconds or 16kbyte of type 0 frames
- wihout a intervening frame of different frame_type
- * type 2 frames MUST not depend(1) upon any other frames, this means,
- they MUST use a full timestamp
- * type 0 frames MUST not depend(1) upon frames prior to the last type
- 2 frame
+ * 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
@@ -376,9 +378,8 @@ coded_timestamp
mask = (1<<msb_timestamp_shift)-1;
delta= last_timestamp - mask/2
timestamp= ((timestamp_lsb-delta)&mask) + delta
- a full timestamp must be used if the packet_type is not 0 or there is no
- reference timestamp available after the last not 0 frame with the
- current stream_id
+ a full timestamp must be used if there is no reference timestamp
+ available after the last frame_startcode with the current stream_id
lsb_timestamp
least significant bits of the timestamp in time_base precission
@@ -396,6 +397,16 @@ lsb_timestamp
frame lsb_timestamp=3 -> timestamp=259
all timestamps of keyframes of a single stream MUST be monotone
+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
+ 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
+ FIXME rename timestamp* to pts* ?
+
width/height
MUST be set to the coded width/height
@@ -411,9 +422,8 @@ colorspace_type
17 ITU Rec 624 / ITU Rec 601 Y range: 0..255 Cb/Cr range: 0..255
18 ITU Rec 709 Y range: 0..255 Cb/Cr range: 0..255
-samplerate_mul
- the number of samples per second in one time_base unit
- samplerate = time_base*samplerate_mul
+samplerate_nom / samplerate_denom = samplerate
+ the number of samples per second
checksum
adler32 checksum
@@ -585,6 +595,20 @@ static inline int put_v(BufferContext *bc, uint64_t val){
return 0;
}
+static int64_t get_dts(int64_t pts, int64_t *pts_cache, int delay, int reset){
+ if(reset) memset(pts_cache, -1, delay*sizeof(int64_t));
+
+ while(delay--){
+ int64_t t= pts_cache[delay];
+ if(t < pts){
+ pts_cache[delay]= pts;
+ pts= t;
+ }
+ }
+
+ return pts;
+}
+
Authors
Folks from MPlayer Developers Mailinglist (http://www.mplayehrq.hu/).