Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Usage with uint8_t array #5

Open
cinderblock opened this issue Oct 10, 2021 · 2 comments
Open

Usage with uint8_t array #5

cinderblock opened this issue Oct 10, 2021 · 2 comments

Comments

@cinderblock
Copy link

I have image data in a uint8_t array that takes up a lot of flash space in my embedded project. It's rather simple image patterns so I suspect it should be possible to compress significantly.

At the lowest level, since C strings are basically just arrays of bytes, I feel it should be possible to use this awesome system to get the same compile time compression, but I'm not seeing the necessary syntax.

I bet I could coax my byte array into a string first and use this project directly, but with bytes often outside the ASCII range I expect that will end up rather... "ugly".

I could alternatively compress my image data ahead of time and use some runtime decompressor of my choosing, but that seems more complicated (for now).

So, is there some alternate API that I'm not seeing to use this with an array of bytes?

@tcsullivan
Copy link
Owner

It looks like I never provided an easy way to use this with arrays, sorry. I've added two new methods to support this, they've been pushed so you can try them out:

// 1. Pass defined array into the compressor.
constexpr uint8_t array[] = {
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2
};
constinit auto numberData = huffman_compress<array>;

// 2. List array elements in-place.
constinit auto numberData = huffman_compress_array<uint8_t,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2,
    1, 1, 2, 3, 1, 4, 1, 2, 2, 5, 4, 7, 3, 3, 1, 2
>;

The second option allows for a single declaration and "cleaner" syntax, though the first option compiles faster (20k elements in 10 seconds vs. 15 sec.). array is also kept out of the compiled binary. I tested on gcc 10.1 with no optimizations.

Do one of these options work for you? I'm open to any suggestions.

@cinderblock
Copy link
Author

These looks great! Thank you.

I'd tried something similar but didn't find the right syntax.

I'll give them a try later today.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants