Infantile Paralysiser's DSM format is used to hold video for playback on Nintendo DS game consoles, using homebrew software.

The file format is noninterleaved, multi-chunk.

Video appears to be specially compressed image frames, with no temporal encoding.

Audio is a modified TTA1 codec with a stripped header, TTB1.

Container Format

Index 0: Sector=0x13298c size=12304
Index 1: Sector=0x135f24 size=8
Index 2: Sector=0x25f274 size=158264
Index 3: Sector=0x2c7134 size=226400
Index 4: Sector=0x304e8c size=408632
Index 5: Sector=0xfffffff size=0

VideoSeektable: 412445416 = 23992 bytes
AudioSeektable: 27348652 = 5568 bytes
20986 frames 0x51FA
15.100fps
15bit

0x0000  44 53 4d 32     DSM2
0x0004  6c 64 a1 01

00000000  44 53 4d 32 6c 64 a1 01  7c 06 f4 16 e8 6a 95 18  |DSM2ld?.|.?.?j..|
00000010  b8 5d 00 00 28 00 00 00  84 4e a1 01 ac 4e a1 01  |?]..(....N?.?N?.|
00000020  c0 15 00 00 99 19 0f ff  54 54 42 31 02 00 00 00  |?......?TTB1....|
00000030  08 00 00 00 50 0f 00 00  00 10 00 00 6c 2b 00 00  |....P.......l+..|
00000040  80 04 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|


DSMFilename=[yesy]_Utawarerumono_-_17_[5FD891C1].dsm
FileSize=412469408byte

HeaderID:DSM2
VideoData=27,354,220 -> 385,091,196byte
VideoSeekTableData=412,445,416 -> 23,992byte
AudioData=40 -> 27,348,612byte
AudioSeekTableData=27,348,652 -> 5,568byte

VideoInfo
FrameCount=20986Frames
ScreenSize=(256x144)Pixels
SampleRate=32768Hz

AudioInfo
HeaderID:TTB1
Attribute=3920Hz,8bits,2chs
FrameLength=4096Samples
FramesCount=11116Frames

ExtendInfo
TotalSamples=45,531,136Samples
TotalTime=0:23:09
FPS=15.100frames/sec

Video Format

Nothing yet.

Audio Format

00000000  54 54 42 31 02 00 00 00  08 00 00 00 50 0f 00 00  |TTB1........P...|
00000010  00 10 00 00 6c 2b 00 00  80 04 00 00 00 00 00 00  |....l+..........|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

Format          54 54 42 31     TTB1
Channels        02 00 00 00     0x00000002      2 CH
Bits            08 00 00 00     0x00000008      8 bit
Hz              50 0f 00 00     0x00000f50      3920Hz
FrameLen        00 10 00 00     0x00001000      4096 Samples
Frames          6c 2b 00 00     0x00002b6c      11116 Frames

Frame Data:
FrameSz         80 04 00 00     0x00000480      1152 bytes (variable, incl crc32)
FrameData
FrameCRC32      3e a5 95 68     0x6895a53e      CRC32

00000010  00 10 00 00 6c 2b 00 00  80 04 00 00 00 00 00 00  |....l+..........|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000490  00 00 00 00 00 00 00 00  3e a5 95 68 80 04 00 00  |........>?.h....|

0x18-$

01 00


echo -en "\x54\x54\x41\x31\x00\x00\x02\x00\x08\x00\x50\x0f\x00\x00\x00\x10\x00\x00\x13\x0c\x6c\x74" > tta.hdr

dd if=test.snd of=tta.smp bs=24 skip=1
cat tta.hdr tta.smp > sound.tta

See also: genSeekTable.php