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.
Download
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)
Usage
Just unzip the distribution into any directory and start the QPC2.exe file. Unzip any additional movie files into the same directory.
Control
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.
Header
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 |
… |