No description
Find a file
2023-05-23 22:54:32 +09:00
doxygen WIP libpng image decoding 2021-11-11 22:17:00 +09:00
res Add another generated blue-noise image to res/ 2021-12-01 17:38:34 +09:00
src Support multiple OpenCL platforms 2023-05-23 22:51:08 +09:00
.gitignore WIP libpng image decoding 2021-11-11 22:17:00 +09:00
.lvimrc WIP libpng image decoding 2021-11-11 22:17:00 +09:00
CMakeLists.txt Apply fixes based on FFmpeg 5.0 2022-02-18 15:24:31 +09:00
Doxyfile WIP libpng image decoding 2021-11-11 22:17:00 +09:00
LICENSE Update LICENSE year 2023-05-23 22:54:32 +09:00
README.md Update README.md 2022-02-18 15:25:53 +09:00

Dithering with OpenCL

Note about Maintenance and Versions

The project at tag 1.0.0 refers to the state of the project upon completion of the course. Newer versions are meant to be maintenance releases; fixes that keep the project working. As of 2022-01-18, there may be (after now) a version 1.1.0 or 1.0.1 due to keeping up to date with the FFmpeg dependency as a new major version of FFmpeg was released (version 5.0).

To be clear, version 1.0.0 of this project is expected to work with FFmpeg version 4.4.

Fixes were applied for FFmpeg version 5. A macro is used to change incompatible code based on what version of FFmpeg is specified in the headers, so external checking of version is not necessary. Thus, the latest version of this repo should work with both FFmpeg 5.0 and 4.4.

Background

Project Proposal PDF

The proposal mentioned dithering live-input frames, but I ended up with just dithering single images or turning a video into dithered images.

Usage

A "blue-noise" image is integral to dithering images. A generated blue-noise image is provided in the "res/" directory. Run the program with "--help" to get info on how to use it.

Blue-noise images were generated using my other project that generates blue-noise with/without OpenCL.

PNG, PGM, and PPM image formats are supported.

For decoding video, any format that ffmpeg can read should work (though if things don't work, try using MP4 files).

WARNING: Video decoding is still a WIP. The video is currently decoded, but an output video being encoded hasn't been implemented yet. The current implementation writes each video frame to a PNG image in the current directory.

Video decoding and encoding is finished, but there is some noticable drops in quality when encoding to colored dithered video but the resulting video may end up being too large. It may be better to just output each frame to individual PNGs, then combining them later just like as mentioned here with the params you want set: https://trac.ffmpeg.org/wiki/Slideshow .

Other Notes

I plan on adding the MIT License to this project once the course (that this project was made for) is over.

I went ahead and applied the MIT License earlier than noted here.

C++ Compatability

The source is written to work with C++11 but not any higher. The only significant part that this affects are the functions in the "Image" class that return an optional value (non-optional on success). Ideally, C++17's std::optional would be used in that case, but since I am keeping things to work up to C++11, std::unique_ptr is used instead.

Project Presentation

Click here to view the presentation

Legal Stuff

This program uses FFmpeg which is licensed under the LGPL 2.1 license

This program uses libpng which is licensed under the PNG Reference Library License Version 2