summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorphintuka <phintuka>2011-03-08 08:55:14 +0000
committerphintuka <phintuka>2011-03-08 08:55:14 +0000
commitb3fddc0fa49b0002e76bd98d8343ec0c9ab68837 (patch)
tree3c86f9a1f2e0c22a666e4c62b19a6f443565497d /tools
parent71d1c7db5a1f9fc3c4a6a8c756cef1beee5ab138 (diff)
downloadxineliboutput-b3fddc0fa49b0002e76bd98d8343ec0c9ab68837.tar.gz
xineliboutput-b3fddc0fa49b0002e76bd98d8343ec0c9ab68837.tar.bz2
Added implementations for uncompress functions
Diffstat (limited to 'tools')
-rw-r--r--tools/rle.c74
-rw-r--r--tools/rle.h13
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()