dreamstack/devices/waveshare-p4-panel/main/ds_codec.h

54 lines
1.8 KiB
C

/**
* DreamStack Delta Codec — C port for ESP32-P4
*
* Ported from engine/ds-stream/src/codec.rs
* Handles XOR+RLE delta decompression for the thin client.
*/
#pragma once
#include <stdint.h>
#include <stddef.h>
/**
* RLE-decode a compressed delta buffer (in-place to output).
*
* Encoding: 0x00 followed by 2-byte LE count = zero run.
* Non-zero bytes pass through literally.
*
* @param compressed RLE-compressed data from relay
* @param comp_len Length of compressed data
* @param output Pre-allocated output buffer
* @param out_cap Capacity of output buffer
* @return Actual decoded length, or 0 on error
*/
size_t ds_rle_decode(const uint8_t *compressed, size_t comp_len,
uint8_t *output, size_t out_cap);
/**
* Apply XOR delta to reconstruct current frame.
*
* framebuffer[i] ^= delta[i] for each byte.
* Modifies framebuffer in-place.
*
* @param framebuffer Current framebuffer (modified in-place)
* @param delta Decoded delta buffer
* @param len Length (must match for both buffers)
*/
void ds_xor_apply(uint8_t *framebuffer, const uint8_t *delta, size_t len);
/**
* Decode an RLE-compressed delta and apply it to the framebuffer.
* Convenience function combining rle_decode + xor_apply.
*
* Uses a scratch buffer for the intermediate decoded delta.
*
* @param framebuffer Current framebuffer (modified in-place)
* @param fb_len Framebuffer length
* @param compressed RLE-compressed delta from relay
* @param comp_len Length of compressed data
* @param scratch Temporary buffer (must be >= fb_len)
* @return 0 on success, -1 on error
*/
int ds_apply_delta_rle(uint8_t *framebuffer, size_t fb_len,
const uint8_t *compressed, size_t comp_len,
uint8_t *scratch);