dsm.txt
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  *  Copyright (C) 2005 Gabest
  3.  *  http://www.gabest.org
  4.  *
  5.  *  This file format is free to use as long as its specification is not 
  6.  *  modified or extended without the permission of Gabest. Suggestions
  7.  *  can be sent in email or posted to the forum at sf.net/projects/guliverkli.
  8.  *
  9.  */
  10. -----------------------
  11. The .dsm file structure
  12. -----------------------
  13. FileInfo + Header Packets + Samples + Footer Packets
  14. Header & Footer Packets:
  15. - Required: MediaType
  16. - Optional: StreamInfo, Chapters, SyncPoints, Resource
  17. Notes: 
  18. - SyncPoints is optional because seeking can be performed simply by searching for packet syncpoints and their timestamps.
  19. - This layout is fine for streaming. On connection send everything up to Sample packets, build the graph at the other end, then the rest when playing. (TODO: introduce NewSegment packet, to support seeking over network)
  20. - The resolution of timestamp and duration is 100ns.
  21. - Strings are zero terminated utf-8 strings.
  22. - Date format string: "%Y-%m-%d %H:%M:%S". (GMT)
  23. - Byte order is big-endian
  24. Definitions
  25. -----------
  26. DSMF_VERSION = 0x01
  27. DSMSW = 44534D53 ("DSMS")
  28. DSMSW_SIZE = 4
  29. DSMP_FILEINFO = 0
  30. DSMP_STREAMINFO = 1
  31. DSMP_MEDIATYPE = 2
  32. DSMP_CHAPTERS = 3
  33. DSMP_SAMPLE = 4
  34. DSMP_SYNCPOINTS = 5
  35. DSMP_RESOURCE = 6
  36. Packet
  37. ------
  38. DSMSW (DSMSW_SIZE bytes) (DirectShow Media SyncWord)
  39. DSMP_* (5 bits)
  40. data size length (3 bits -> 1-8 bytes)
  41. data size (1-8 bytes)
  42. [... data ...]
  43. FileInfo : extends Packet (DSMP_FILEINFO)
  44. -----------------------------------------
  45. version (1 byte, DSMF_VERSION)
  46. ... repeated n times ...
  47. id (4 bytes, alphanum)
  48. string
  49. ... repeated n times ...
  50. Notes:
  51. - Parsers should not open files with higher "version" than they were compiled for.
  52. - Suggested values of "id": 
  53. "TITL": Title
  54. "AUTH": Author
  55. "RTNG": Rating
  56. "CPYR": Copyright
  57. "DESC": Description
  58. "APPL": Application
  59. "MUXR": Muxer
  60. "DATE": Encoding date
  61. ... more to be defined ...
  62. MediaType : extends Packet (DSMP_MEDIATYPE)
  63. -------------------------------------------
  64. stream id (1 byte)
  65. majortype (sizeof(GUID))
  66. subtype (sizeof(GUID))
  67. bFixedSizeSamples (1 bit)
  68. bTemporalCompression (1 bit)
  69. lSampleSize (30 bit)
  70. formattype (sizeof(GUID))
  71. [... format data ...]
  72. Notes:
  73. - Multiple MediaTypes per stream is NOT allowed
  74. - bFixedSizeSamples, bTemporalCompression, lSampleSize are only there to preserve compatibility with dshow's media type structure, they aren't playing a role in anything really.
  75. StreamInfo : extends Packet (DSMP_STREAMINFO)
  76. ---------------------------------------------
  77. stream id (1 byte)
  78. ... repeated n times ...
  79. id (4 bytes, alphanum)
  80. string
  81. ... repeated n times ...
  82. Notes:
  83. - Suggested values of "id": 
  84. "NAME": Stream name
  85. "SGRP": Stream group (groupped streams can be useful if the splitter is able to group and switch between them, but it's not a strict requirement towards dsm splitters)
  86. "LANG": Language code (ISO 639-2)
  87. "DESC": Description
  88. ... more to be defined ...
  89. Chapters : extends Packet (DSMP_CHAPTERS)
  90. -----------------------------------------
  91. ... repeated n times ...
  92. timestamp delta sign (1 bit, <0?)
  93. timestamp delta length (3 bits -> 0-7 bytes)
  94. reserved (4 bits)
  95. timestamp delta (0-7 bytes)
  96. string
  97. ... repeated n times ...
  98. Notes: 
  99. - "timestamp delta" holds the difference to the previous value, starts at 0.
  100. Sample : extends Packet (DSMP_SAMPLE)
  101. -------------------------------------
  102. stream id (1 byte)
  103. syncpoint (1 bit)
  104. timestamp sign (1 bit, <0?)
  105. timestamp length (3 bits -> 0-7 bytes)
  106. duration length (3 bits -> 0-7 bytes)
  107. timestamp (0-7 bytes)
  108. duration (0-7 bytes)
  109. [... data ...]
  110. Notes:
  111. - sign == 1 && timestamp length == 0 -> timestamp and duration is unknown (but for syncpoints it cannot be unknown!)
  112. - sign == 0 && timestamp length == 0 -> simply means the value is stored on zero bytes and its value is zero too.
  113. - timestamps of syncpoints must be strictly in increasing order.
  114. - timestamps can be negative (to allow cutting a file at anywhere, preroll samples may need to be saved)
  115. SyncPoints : extends Packet (DSMP_SYNCPOINTS)
  116. ---------------------------------------------
  117. ... repeated n times ...
  118. timestamp delta sign (1 bit, <0?)
  119. timestamp delta length (3 bits -> 0-7 bytes)
  120. file position delta length (3 bits -> 0-7 bytes)
  121. reserved (1 bit)
  122. timestamp delta (0-7 bytes)
  123. file position delta (0-7 bytes)
  124. ... repeated n times ...
  125. Notes: 
  126. - "timestamp delta" / "file position delta" holds the difference to the previous value, both start at 0.
  127. The algorithm of SyncPoints generation
  128. --------------------------------------
  129. First example:
  130. stream 1: 1,5,8 (video)
  131. stream 2: 2,3,6,7,9 (audio)
  132. stream 3: 4 (subtitle)
  133. 1 ----|               1->2   1      +2        -> 1 (t 1, fp 1)
  134.       |---- 2         2->3   1,2    +3 -2     -> 1 
  135.       |---- 3         3->4   1,3    +4        -> 1
  136.     +-|-- 4 (start)   4->5   1,3,4  +5 -1     -> 1
  137. 5 --|-|               5->6   3,4,5  +6 -3     -> 3 (t 5, fp 3)
  138.     | |---- 6         6->7   4,5,6  +7 -6     -> 4 (t 6, fp 4)
  139.     | |---- 7         7->8   4,5,7  +8 -7 -4  -> 4
  140.     +-|-- 4 (stop)    
  141.       |---- 8         8->9   5,8    +9 -5     -> 5 (t 8, fp 5)
  142. 9 ----|               9->10  8,9   +10 -8     -> 8 (t 9, fp 8)
  143.       |---- 10        10->   9,10             -> 9 (t 10, fp 9)
  144. Notice how it is the values of the first and last elements of the queue are used.
  145. In the end it represents the following: (timestamp ranges mapped to file positions)
  146. 1->5:  [1]
  147. 5->6:  [3]
  148. 6->8:  [4]
  149. 8->9:  [5]
  150. 9->10: [8]
  151. 10->:  [9]
  152. Example usage: 
  153. Seeking to 7 would mean we need to start decoding at the file position of 4, which 
  154. makes sure we hit at least one syncpoint from every stream (4,5,7 and 6 too, but 6
  155. can be skipped) until we reach 7.
  156. ---
  157. Second example:
  158. This is going to be a bit more complicated case. (I hope you like my ascii art :)
  159. stream 1: 1,4,5,6,7 (video)
  160. stream 2: 2,3 (subtitle)
  161. 1 -----|              1->2   1      +2        -> 1 (t 1, fp 1)
  162.      +-|--- 2 (start) 2->3   1,2   (+3 NOT!)  -> 1
  163.    +-|-|- 3 (start)   3->4   1,2    +4 -1     -> 1
  164. 4 -|-|-|              4->5   2,4    +5 -4     -> 2 (t 4, fp 2)
  165. 5 -|-|-|              5->6   2,5    +6 -5 -2  -> 2
  166.    +-|-|- 3 (stop)    
  167.      +-|--- 2 (stop)  
  168. 6 -----|              6->7   6      +7 -6     -> 6 (t 6, fp 6)
  169. 7 -----|              7->    7                -> 7 (t 7, fp 7)
  170. The problem with subtitles that they are discontinous, overlapped and can totally hide 
  171. other syncpoints, just like 2 hides 4, 5 and even 3 fully (which requires special handling, 
  172. see "NOT!"). That means such a subtitle, when it is too long, can influence seeking time 
  173. by a lot. It might be wise and worth limiting the duration of samples to a couple of minutes, 
  174. possibly sacrificing a bit of correctness by it. Splitters can also choose to ignore the 
  175. suggested seek position, when it falls too far from the required, and go on searching the 
  176. stream for syncpoints themselves.
  177. Resource : extends Packet (DSMP_RESOURCE)
  178. -----------------------------------------
  179. compression type (2 bits, 0: none, 1: gzip, 2-3: reserved)
  180. reserved (6 bits)
  181. name string
  182. desc string
  183. mime string
  184. [... data ...]