QMovie player

QMovie is my attempt at a movie player for SMSQ/E, specifically for QPC as I’m not sure the other platforms can cope. The saga was supposed to be over with v1.0, a mere technology demo without any UI and still pretty choppy in terms of playback. Here I present version 2.0, a fully WMAN enabled player that works smoothly even at 25 fps. Unfortunately even QPC is not fast enough to decompress video on-the-fly (other than primitive RLE compression) and thus the video files are huuuuuge. So you will still not be able to watch your 2 hours movie with this thing. But seeing live video with sound in a QL window is still pretty amazing.


The qmovie-v2.00.zip archive includes a completely configured ready-to-run QPC2 distribution and the QMovie application itself plus smaller demo movies. The other ZIP files can be unzipped in the same directory to add additional movies.

qmovie-v2.00.zip (25MB) – Base distribution including two small movie examples
qmovie-v2.00-src.zip – Source code as-is
qmovie-maidens.zip (374MB)
qmovie-baby.zip (29MB)
qmovie-kitty.zip (19MB)


Just unzip the distribution into any directory and start the QPC2.exe file.  Unzip any additional movie files into the same directory.


The movie can be controlled in various ways:

Using the buttons in the upper right corner or their respective selection keys:

  • Skip backwards (“<” key)
  • Pause/resume (“P” key)
  • Skip forward (“>” key)

While the mouse cursor is in the movie window there are additional keys available:

  • Alt-Left = Skip backwards
  • Alr+right = Skip forward
  • Space = pause/resume

Also you can directly seek within the movie using the bar at the bottom.

Creating your own movies

This is currently done using a Perl script, but could also be done differently given the file format description. This will be made available if there is interest, but currently it’s still a pretty manual process.

Source code

Is now available above. It is supposed to be compiled using QMake.

QMV file format

This is the only file format supported by QMovie. I designed it specifically so the reading code can be implemented fairly easily. It consists of a header and then a separate block for every second of video. Every block starts with a long word that holds its size, so it can quickly be skipped over without any knowledge about the block whatsoever.


Offset Size Meaning
0 Long “QMV1”. Fixed bytes to identify the file format
4 Long Size of header excluding this field
8 Word Length of title string (standard QDOS string)
10 ([len]+1)&~1 bytes Title characters. Must be padded with 0 if string size is odd (like QDOS standard string)
10+x Word X resolution
12+x Word Y resolution
14+x Word Frames per seconds
16+x Word QL mode number the frames are designed for. Currently not evaluated
18+x Long Number of frames
22+x Long Maximum size of a one-second block in bytes
26+x Word Sound frequency (must always be 20000Hz)
28+x Word Sound channels (0, 1 or 2)
30+x Word Flags. Currently only bit 0 is used, which means “loop endlessly”
32+x Word Spare word for future use, must currently be 0
34+x [frames]/[fps] longs Frame index. This holds the absolute file offsets for every one-second block in the file

Video block (one for every second of video)

Offset Size Meaning
0 Long Length of block excluding this field
4 Long Size of the sound data excluding this field [s]
8 Bytes The raw sound data
8+[s] Long Size of the frame excluding this field [f]
12+[s] Bytes The frame data (standard sprite format)
12+[s]+[f] Long Size of the next frame excluding this field [f2]
16+[s]+[f] Bytes The data of the second frame (standard sprite format)
16+[s]+[f]+[f2] Long Size of the next frame excluding this field