As I mentioned previously, after making 0.5.0 na_game_tool release I’d rather work on something else for a change (if at all), so here are some bits about what I’ve been doing since:
- first of all, I’ve implemented support for AV, a Polished AVI format. By that I mean the format comes apparently from a Polish company and it’s simplified remux of AVI data: first there’s
BITMAPINFOHEADER(and optionally palette) followed by video stream header (starting with the familiarvidstag), then there may beWAVEFORMATstructure withaudsstream header, then you have table of contents (video and audio frame sizes plus flags) followed by video and audio chunks. The format was trivial to guess and I’ve added support for it because why not; - I’ve also finally implemented functions for reading arrays of integers. First I’ve introduced them to
na_game_tooland tried them in some decoders, and then ported them to the mainNihAVcodebase. The idea behind it is that reading data directly into destination array (with optional byte-swapping) is faster than reading data, re-interpreting it as an integer and finally copying it into the destination buffer. I had a specific version of it implemented in MP4 demuxer already (because otherwise opening a 2-3 hour long video would cause a noticeable delay) but overall it’s nicer to have just one call instead of a loop; - in other things, I’ve re-started
na_eofdecdevelopment using the currentna_game_toolcodebase. That does not mean I’m starting developing it (or going to do so in the nearest feature) but at least when I eventually get to it, I can add some archive extraction modules as well. Beside that it should be a sandbox for testing MOV muxer that I want to write sooner or later (kinda like OpenDML AVI muxer inNihAVis a backport of one fromna_game_tool). Of course it would need to get a couple more formats to test it on but I’m not in a hurry; - speaking of MOV, I’ve improved support for MOV in MacBinary II. So far I’ve seen four flavours of it: essentially flat MOV with MacBin header, MOV with
mdatbox in data fork andmoovatom in resource fork, the same but data fork containingmdatcontents without size and tag, and even older format (with samples from 1990) with much flatter structure (i.e. lots of nesting chunks are not present at all). The first three are detected and handled more or less fine now, I’ll try to support it even if as a historical curiosity; - there was one major code refactoring in
NihAV, namely I’ve put demuxing handling code into a newnihav_hlblockscrate and made all my tools use it instead of dragging local copies of it. If you wonder why this was necessary, that’s because you can have normal demuxers (that return full packets for the streams) as well as raw stream demuxers (that return pieces of data belonging to a stream and you need to form full packet using a packetiser). And of course you can have simply raw streams like MP3 that needs a packetiser but no demuxer. That’s why I’ve made aDemuxerObject(yes, very original name) that encapsulates them all and represents all of them as a normal demuxer; - and finally I’ve discovered that I can call
SDL_UpdateYUVTextureinstead of copying frame data into the texture manually. And then I discovered that it did not work with the time display (because it also wrote to the texture directly in presumption that it will update some pixels on the frame; there is a note in the documentation telling not to do so but it worked by chance before). So I’ve changed it to render a separate small RGBA texture and blit it over the frame instead—like it should’ve been done from the start. I somewhat wonder when I’ll have to adapt it all to SDL3 but apparently I can postpone it for now.
That’s all for now. There’s a lot to do, maybe some of it will actually be done.
Cool news!
More formats and codecs to look at!
you are the only one looking into the ancient .mov . nice work
As I wrote in the previous post, the majority of old (but not ancient) MOV files that can’t be converted with other tools have Truemotion 1, Escape 130 (both supported by
libavcodec) or Radius Studio (a JPEG hack, should be easy to support really) and yet nobody has bothered even to add FOURCCs for them… Ironically,NihAVsupports even more obscure formats (like Motion Pixels in AVI) yet it’s certain other project claims that its goal is to play all possible video files while not doing anything about achieving it.