j2k-metal 0.10.0

Metal decoder and encode-stage adapter for j2k
Documentation
inline void decode_sign_bit(
    thread J2kArithmeticDecoder &decoder,
    thread uchar *contexts,
    thread uchar *states,
    device uint *coefficients,
    uint padded_width,
    uint index_x,
    uint index_y,
    uint height,
    uint style_flags
) {
    const uchar2 sign_ctx = sign_context(
        states,
        padded_width,
        index_x,
        index_y,
        height,
        style_flags
    );
    const uint sign_bit = arithmetic_decode_bit(decoder, contexts, uint(sign_ctx.x)) ^ uint(sign_ctx.y);
    const uint idx = coeff_index(padded_width, index_x, index_y);
    coeff_set_sign(states, idx, sign_bit);
    coeff_set_sign_packed(coefficients, idx, sign_bit);
    set_significant(states, padded_width, index_x, index_y);
}

inline void decode_sign_bit_plain_dev(
    thread J2kArithmeticDecoder &decoder,
    thread uchar *contexts,
    device uchar *states,
    device uint *coefficients,
    uint padded_width,
    uint index_x,
    uint index_y
) {
    const uchar2 sign_ctx = sign_context_plain_dev(states, padded_width, index_x, index_y);
    const uint sign_bit = arithmetic_decode_bit(decoder, contexts, uint(sign_ctx.x)) ^ uint(sign_ctx.y);
    const uint idx = coeff_index(padded_width, index_x, index_y);
    coeff_set_sign_dev(states, idx, sign_bit);
    coeff_set_sign_packed(coefficients, idx, sign_bit);
    set_significant_plain_dev(states, padded_width, index_x, index_y);
}

inline void decode_sign_bit_plain_tg(
    thread J2kArithmeticDecoder &decoder,
    thread uchar *contexts,
    threadgroup uchar *states,
    device uint *coefficients,
    uint padded_width,
    uint index_x,
    uint index_y
) {
    const uchar2 sign_ctx = sign_context_plain_tg(states, padded_width, index_x, index_y);
    const uint sign_bit = arithmetic_decode_bit(decoder, contexts, uint(sign_ctx.x)) ^ uint(sign_ctx.y);
    const uint idx = coeff_index(padded_width, index_x, index_y);
    coeff_set_sign_tg(states, idx, sign_bit);
    coeff_set_sign_packed(coefficients, idx, sign_bit);
    set_significant_plain_tg(states, padded_width, index_x, index_y);
}

inline uchar magnitude_refinement_context_plain_dev(
    device const uchar *states,
    uint padded_width,
    uint index_x,
    uint index_y
) {
    const uint idx = coeff_index(padded_width, index_x, index_y);
    const uchar m1 = coeff_is_magnitude_refined_dev(states, idx) * uchar(16u);
    const uchar m2 = uchar(14u + min(uint(neighborhood_states_plain_dev(
        states,
        padded_width,
        index_x,
        index_y
    )), 1u));
    return max(m1, m2);
}

inline uchar magnitude_refinement_context_plain_tg(
    threadgroup const uchar *states,
    uint padded_width,
    uint index_x,
    uint index_y
) {
    const uint idx = coeff_index(padded_width, index_x, index_y);
    const uchar m1 = coeff_is_magnitude_refined_tg(states, idx) * uchar(16u);
    const uchar m2 = uchar(14u + min(uint(neighborhood_states_plain_tg(
        states,
        padded_width,
        index_x,
        index_y
    )), 1u));
    return max(m1, m2);
}

inline bool decode_sign_bit_bypass(
    thread J2kBypassDecoder &decoder,
    thread uchar *states,
    device uint *coefficients,
    uint padded_width,
    uint index_x,
    uint index_y
) {
    uint sign_bit = 0u;
    if (!bypass_read_bit(decoder, sign_bit)) {
        return false;
    }
    const uint idx = coeff_index(padded_width, index_x, index_y);
    coeff_set_sign(states, idx, sign_bit);
    coeff_set_sign_packed(coefficients, idx, sign_bit);
    set_significant(states, padded_width, index_x, index_y);
    return true;
}