[HN Gopher] Video codec in 100 lines of Rust ___________________________________________________________________ Video codec in 100 lines of Rust Author : kevmo314 Score : 127 points Date : 2022-12-19 17:50 UTC (5 hours ago) (HTM) web link (blog.tempus-ex.com) (TXT) w3m dump (blog.tempus-ex.com) | dr-ando wrote: | Funnily enough I recently released 0.1.0 of "less-avc" a pure | Rust H.264 (AVC) video encoder: https://github.com/strawlab/less- | avc/ . For now it only implements a lossless I PCM encoder but | supports a few features I need such as high bit depth. If anyone | has a codec-writing itch they want to scratch, I would welcome | work towards the compression algorithms H.264 supports: context- | adaptive variable-length coding (CAVLC) and context-adaptive | binary arithmetic coding (CABAC). Also I'm happy for constructive | criticism or questions on this library. I think it is fairly | idiomatic, and no `unsafe`, rust. While H.264 is an older codec | now, as far as I can tell, this also means any patents on it are | about to run out and it is very widely supported. | pcwalton wrote: | This is really an image codec, isn't it? Since it doesn't have | any temporal compression capabilities. | | It's interesting to see how well such a simple technique | performs. I wonder what would happen if you added trivial | temporal compression by simply subtracting the color values of | the previous frame from the next and encoding the residual. How | would that perform? | sjsdaiuasgdia wrote: | Why would temporal compression be a necessary requirement to be | called a video codec? | | Quite a few codecs in the "intra-frame only" section of this | Wikipedia list, and that section is within the "Video | compression formats" section: | | https://en.wikipedia.org/wiki/List_of_codecs#Intra-frame-onl... | IshKebab wrote: | It's a bit debatable but he definitely only did the image | coding part of the video codec. All of those listed formats | also support the metadata required for video. | | I was certainly expecting some motion coding. | a-dub wrote: | some early implementations of mpeg-1 compressors only | supported I frames. amusingly, this is still a valid mpeg-1 | bitstream. | pornel wrote: | A simple delta between frames wouldn't perform well if there | was any camera movement: you'd pay for every edge twice. | | Instead of working with a delta, conditionally using previous | frame as prediction source could work (e.g. if pixel A was | closer to previous frame's A than to current frame's B, predict | from previous frame's X). Or you could signal prediction source | explicitly per block or with RLE. Ideally you'd do motion | compensation, but doing that precisely enough for a lossless | compressor is more than 100 lines. | vkaku wrote: | I-P-B. | | Some video formats only go I. Then there's not a lot different | between images and video, as far as editing goes. Decoding for | end user transportation has a lot more going on, but one has to | start somewhere. | | Anyway - I think that this kind of work is a great starter and | gets more people interested in this. | Lerc wrote: | Naive Image and video codecs are quite fun to make, I have done a | bunch of them over the years and it's quite easy to get within | cooee of established formats. And even surpass them under certain | conditions. I made a lossy image format that achieves 20-25 PSNR | at around 200:1 compression, which is better than most lossy | formats because that's in a quality/data-size that most image | formats consider out of scope. | | QOI https://qoiformat.org/ is a good example of a practically | useful simple format. | | It's still quite a leap to get to the best new codecs, suddenly | you are in a world of head hurty math. | | It's also worth noting that it is easy to beat the old formats | all-round with off-the-shelf parts, both JPEG and PNG can be | bested by changing the outer level of compression for something | that was invented after the formats were made. For instance using | LZMA or zstd as the final stage. Quite often that's enough to put | them on a par with more radically different newer formats. | repple wrote: | within cooee : within hailing distance : not unapproachable | adamnemecek wrote: | (2021) | kevmo314 wrote: | I discovered this cool guide while looking for more resources for | my own codec from scratch project: | https://github.com/kevmo314/codec-from-scratch ___________________________________________________________________ (page generated 2022-12-19 23:00 UTC)