Advertisement
Guest User

smk_demuxer.bms

a guest
Jul 21st, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. # SMK demuxer by bnnm
  2.  
  3.  
  4. get ID long
  5. reverselong ID
  6. if ID != 0x534D4B32 && ID != 0x534D4B34
  7. print "not an SMK"
  8. exit
  9. endif
  10.  
  11. # get header info
  12. get DUMMY long
  13. get DUMMY long
  14. get FRAMES long
  15. get FRAME_RATE long
  16.  
  17. goto 0x14
  18. get FLAGS long
  19.  
  20. if FLAGS & 1
  21. math FRAMES += 1
  22. endif
  23.  
  24. goto 0x34
  25. get TREES_SIZE long
  26.  
  27. goto 0x68
  28.  
  29. set AUDIO_FRAMES long 0
  30.  
  31. xmath TABLE1_OFFSET " 0x68 "
  32. xmath TABLE1_SIZE " FRAMES * 0x04 "
  33. log MEMORY_FILE1 TABLE1_OFFSET TABLE1_SIZE
  34.  
  35. xmath TABLE2_OFFSET " TABLE1_OFFSET + TABLE1_SIZE "
  36. xmath TABLE2_SIZE " FRAMES * 0x01 "
  37. log MEMORY_FILE2 TABLE2_OFFSET TABLE2_SIZE
  38.  
  39. xmath DATA_OFFSET " TABLE2_OFFSET + TABLE2_SIZE + TREES_SIZE "
  40.  
  41. # reconstruct frame sizes, types and data so non-audio is skipped
  42. log MEMORY_FILE3 0 0
  43. log MEMORY_FILE4 0 0
  44. log MEMORY_FILE5 0 0
  45.  
  46. set NEW_FRAMES long 0
  47.  
  48. # copy audio packets and skip rest and reconstruct tables
  49. for I = 0 < FRAMES
  50.  
  51. get FRAME_SIZE long MEMORY_FILE1
  52. get FRAME_TYPE byte MEMORY_FILE2
  53.  
  54. math FRAME_SIZE &= 0xFFFFFFFC #remove flags
  55.  
  56. math OFFSET = DATA_OFFSET
  57. math DATA_OFFSET += FRAME_SIZE
  58. #print "offset=%OFFSET|h% "
  59.  
  60. # skip non-audio frames
  61. xmath TEST " FRAME_TYPE & 0xFE "
  62. if TEST == 0
  63. continue # no audio
  64. endif
  65.  
  66. math NEW_FRAMES += 1 #audio frames only
  67. xmath NEW_TYPE " FRAME_TYPE & 0xFE " #remove palette flag
  68. set NEW_SIZE long 0
  69.  
  70.  
  71.  
  72. # skip palette
  73. xmath TEST " FRAME_TYPE & 1 "
  74. if TEST == 1
  75. goto OFFSET
  76. get PALETTE_SIZE byte
  77. math PALETTE_SIZE *= 0x04
  78. math OFFSET += PALETTE_SIZE
  79. endif
  80.  
  81.  
  82. # read audio packets and copy to memory file from all 7 possible streams
  83. for J = 0 < 7
  84. # test if frame has audio packet for stream J
  85. xmath STREAM_FLAG " J + 1 "
  86. xmath TEST " FRAME_TYPE & (1 << STREAM_FLAG) "
  87. if TEST > 0
  88. goto OFFSET
  89. get AUDIO_SIZE long
  90.  
  91. #print "log: frame=%I%, stream=%J%, offset=%OFFSET|h%, size=%AUDIO_SIZE|h% "
  92. append
  93. log MEMORY_FILE5 OFFSET AUDIO_SIZE
  94. append
  95.  
  96. math NEW_SIZE += AUDIO_SIZE
  97. math OFFSET += AUDIO_SIZE
  98. endif
  99. next J
  100.  
  101. put NEW_SIZE long MEMORY_FILE3
  102. put NEW_TYPE byte MEMORY_FILE4
  103.  
  104. #print "%I% %OFFSET|h%: %FRAME_SIZE|h%, %FRAME_TYPE|h% "
  105. next I
  106.  
  107. #print "new: frames=%NEW_FRAMES%, size=%NEW_SIZE|h% "
  108.  
  109. if NEW_FRAMES == 0
  110. print "file has no audio"
  111. exit
  112. endif
  113.  
  114.  
  115. # recalculate frame rate for approximate duration
  116. set NEW_FRAME_RATE long FRAME_RATE
  117.  
  118. # this looks kinda off and original framerate works ok-ish
  119. #set NEW_FRAME_RATE long 0
  120. #if FRAME_RATE > 0
  121. # xmath RATIO " FRAMES*1000 / FRAME_RATE "
  122. # xmath NEW_FRAME_RATE " NEW_FRAMES*1000 / RATIO "
  123. #
  124. #elif FRAME_RATE < 0
  125. # math FRAME_RATE n= FRAME_RATE #needed for xmath
  126. # xmath RATIO " FRAMES*100000 / FRAME_RATE "
  127. # xmath NEW_FRAME_RATE " NEW_FRAMES*100000 / RATIO "
  128. # math NEW_FRAME_RATE n= NEW_FRAME_RATE
  129. # #print "FPS: %RATIO%, %NEW_FRAME_RATE%"
  130. #
  131. #else
  132. # # defaults to 10 fps?
  133. #endif
  134.  
  135.  
  136. # copy header and fix some values
  137. log MEMORY_FILE7 0 0x68
  138.  
  139. putvarchr MEMORY_FILE7 0x04 0 long #width
  140. putvarchr MEMORY_FILE7 0x08 0 long #height
  141. putvarchr MEMORY_FILE7 0x0c NEW_FRAMES long
  142. putvarchr MEMORY_FILE7 0x10 NEW_FRAME_RATE long
  143. putvarchr MEMORY_FILE7 0x14 0 long #flags
  144. putvarchr MEMORY_FILE7 0x34 0 long #trees size
  145. putvarchr MEMORY_FILE7 0x38 0 long #table size
  146. putvarchr MEMORY_FILE7 0x3c 0 long #table size
  147. putvarchr MEMORY_FILE7 0x40 0 long #table size
  148. putvarchr MEMORY_FILE7 0x44 0 long #table size
  149.  
  150. get MEM3_SIZE asize MEMORY_FILE3
  151. get MEM4_SIZE asize MEMORY_FILE4
  152. get MEM5_SIZE asize MEMORY_FILE5
  153. append
  154. log MEMORY_FILE7 0 MEM3_SIZE MEMORY_FILE3
  155. log MEMORY_FILE7 0 MEM4_SIZE MEMORY_FILE4
  156. log MEMORY_FILE7 0 MEM5_SIZE MEMORY_FILE5
  157. append
  158.  
  159. get MEM7_SIZE asize MEMORY_FILE7
  160.  
  161. get BASE_NAME basename
  162. string NAME p= "%s.audio.smk" BASE_NAME
  163.  
  164. log NAME 0 MEM7_SIZE MEMORY_FILE7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement