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
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.
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.
|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)|
|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)
|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|