diff options
| author | phintuka <phintuka> | 2011-03-08 08:55:14 +0000 |
|---|---|---|
| committer | phintuka <phintuka> | 2011-03-08 08:55:14 +0000 |
| commit | b3fddc0fa49b0002e76bd98d8343ec0c9ab68837 (patch) | |
| tree | 3c86f9a1f2e0c22a666e4c62b19a6f443565497d /tools | |
| parent | 71d1c7db5a1f9fc3c4a6a8c756cef1beee5ab138 (diff) | |
| download | xineliboutput-b3fddc0fa49b0002e76bd98d8343ec0c9ab68837.tar.gz xineliboutput-b3fddc0fa49b0002e76bd98d8343ec0c9ab68837.tar.bz2 | |
Added implementations for uncompress functions
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/rle.c | 74 | ||||
| -rw-r--r-- | tools/rle.h | 13 |
2 files changed, 81 insertions, 6 deletions
diff --git a/tools/rle.c b/tools/rle.c index 71013f55..a8423681 100644 --- a/tools/rle.c +++ b/tools/rle.c @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: rle.c,v 1.7 2011-01-21 14:43:17 phintuka Exp $ + * $Id: rle.c,v 1.8 2011-03-08 08:55:14 phintuka Exp $ * */ @@ -368,3 +368,75 @@ int rle_uncompress_hdmv(xine_rle_elem_t **data, return rle_count; } + +void rle_uncompress_lut8(uint8_t *dst, + uint w, uint h, uint stride, + const struct xine_rle_elem_s *rle_data, uint num_rle) +{ + uint i, pixelcounter = 0; + uint idx = 0, line = 0; + + for(i = 0; i < num_rle; ++i) { + uint8_t color = (rle_data + i)->color; + uint len = (rle_data + i)->len; + uint j; + + for (j = 0; j < len; ++j) { + if (pixelcounter >= w) { + idx += stride - pixelcounter; + pixelcounter = 0; + if (++line >= h) + return; + } + dst[idx] = color; + ++idx; + ++pixelcounter; + } + } +} + +void rle_palette_to_argb(uint32_t *argb, const struct xine_clut_s *palette, uint entries) +{ + uint i; + for (i = 0; i < entries; i++) { + argb[i] = (palette[i].alpha << 24) | + (palette[i].r << 16) | + (palette[i].g << 8 ) | + (palette[i].b ); + } +} + + +void rle_uncompress_argb(uint32_t *dst, + uint w, uint h, uint stride, + const struct xine_rle_elem_s *rle_data, uint num_rle, + const struct xine_clut_s *palette, uint palette_entries) +{ + uint32_t lut[256]; + uint i, pixelcounter = 0; + uint idx = 0, line = 0; + + if (palette_entries > 255) + return; + + rle_palette_to_argb(lut, palette, palette_entries); + + for(i = 0; i < num_rle; ++i) { + uint32_t color = lut[(rle_data + i)->color]; + uint len = (rle_data + i)->len; + uint j; + + for (j = 0; j < len; ++j) { + if (pixelcounter >= w) { + idx += stride - pixelcounter; + pixelcounter = 0; + if (++line >= h) + return; + } + dst[idx] = color; + ++idx; + ++pixelcounter; + } + } +} + diff --git a/tools/rle.h b/tools/rle.h index 8ad82ad3..5ff5c682 100644 --- a/tools/rle.h +++ b/tools/rle.h @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: rle.h,v 1.5 2011-01-21 14:43:17 phintuka Exp $ + * $Id: rle.h,v 1.6 2011-03-08 08:55:14 phintuka Exp $ * */ @@ -29,12 +29,15 @@ uint rle_compress(struct xine_rle_elem_s **rle_data, const uint8_t *data, uint w uint rle_compress_net(uint8_t **rle_data, uint *elems, const uint8_t *data, uint w, uint h); uint rle_recompress_net(uint8_t *raw, xine_rle_elem_t *data, uint elems); -void rle_uncompress_lut8(const struct xine_rle_elem_s *rle_data, - uint8_t *data, uint w, uint h); +void rle_palette_to_argb(uint32_t *argb, const struct xine_clut_s *palette, uint entries); + +void rle_uncompress_lut8(uint8_t *dst, + uint w, uint h, uint stride, + const struct xine_rle_elem_s *rle_data, uint num_rle); void rle_uncompress_argb(uint32_t *dst, - const struct xine_rle_elem_s *rle_data, uint num_rle, uint w, uint h, uint stride, - struct xine_clut_s *palette); + const struct xine_rle_elem_s *rle_data, uint num_rle, + const struct xine_clut_s *palette, uint palette_entries); /* * rle_scale_nearest() |
