Сжатие данных с Halide

У меня есть следующий алгоритм сжатия данных (который упрощен для этого вопроса). Он включает в себя битовую операцию, а положение выходного элемента (и общий размер вывода) зависит от предыдущих входных данных.

void compress_algrorithm(const uint8_t* src, size_t srcsz,
                         uint8_t* dst, size_t& dstsz, uint8_t* flags)
{
        auto srcend = src + srcsz;
        auto q = dst;
        auto r = flags;
        for (auto pp = src; pp < srcend; pp += 4*8) {
                uint8_t f = 0;
                for (int i = 0; i < 8; ++i) {
                        auto p = pp + i*4;
                        if (p[0] < 0x40 && p[1] < 0x40 && p[2] < 0x40 && p[3] < 0x40) {
                                // p[]s are all 6-bit value
                                f |= 1 << i;
                                // compress 6*4 bits (in 4 bytes) into 3 bytes
                                q[0] = p[0] | (p[1] << 6);
                                q[1] = (p[1] >> 2) | (p[2] << 4);
                                q[2] = (p[2] >> 4) | (p[3] << 2);
                                q += 3;
                        } else {
                                // if not, just copy
                                q[0] = p[0];
                                q[1] = p[1];
                                q[2] = p[2];
                                q[3] = p[3];
                                q += 4;
                        }
                }
                *r++ = f;
        }
        dstsz = q - dst;
}

Можно ли выразить этот алгоритм в галиде?

0 ответов

Другие вопросы по тегам