[Mplayer-cvslog] CVS: main/libmpcodecs/native qtrle.c,1.3,1.4

Roberto Togni CVS rtognimp at mplayerhq.hu
Sun Jan 26 23:05:21 CET 2003


Update of /cvsroot/mplayer/main/libmpcodecs/native
In directory mail:/var/tmp.root/cvs-serv23044/native

Modified Files:
	qtrle.c 
Log Message:
Quicktime rle 32 bit supported

Index: qtrle.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/native/qtrle.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- qtrle.c	12 Jul 2002 17:47:35 -0000	1.3
+++ qtrle.c	26 Jan 2003 22:05:18 -0000	1.4
@@ -3,6 +3,7 @@
 
     (C) 2001 Mike Melanson
     8 and 16bpp support by Alex Beregszaszi
+    32 bpp support by Roberto Togni
 */
 
 #include "config.h"
@@ -258,6 +259,96 @@
   }
 }
 
+void qt_decode_rle32(
+  unsigned char *encoded,
+  int encoded_size,
+  unsigned char *decoded,
+  int width,
+  int height,
+  int bytes_per_pixel)
+{
+  int stream_ptr;
+  int header;
+  int start_line;
+  int lines_to_change;
+  signed char rle_code;
+  int row_ptr, pixel_ptr;
+  int row_inc = bytes_per_pixel * width;
+  unsigned char r, g, b;
+
+  // check if this frame is even supposed to change
+  if (encoded_size < 8)
+    return;
+
+  // start after the chunk size
+  stream_ptr = 4;
+
+  // fetch the header
+  header = BE_16(&encoded[stream_ptr]);
+  stream_ptr += 2;
+
+  // if a header is present, fetch additional decoding parameters
+  if (header & 0x0008)
+  {
+    start_line = BE_16(&encoded[stream_ptr]);
+    stream_ptr += 4;
+    lines_to_change = BE_16(&encoded[stream_ptr]);
+    stream_ptr += 4;
+  }
+  else
+  {
+    start_line = 0;
+    lines_to_change = height;
+  }
+
+  row_ptr = row_inc * start_line;
+  while (lines_to_change--)
+  {
+    pixel_ptr = row_ptr + ((encoded[stream_ptr++] - 1) * bytes_per_pixel);
+
+    while (stream_ptr < encoded_size &&
+           (rle_code = (signed char)encoded[stream_ptr++]) != -1)
+    {
+      if (rle_code == 0)
+        // there's another skip code in the stream
+        pixel_ptr += ((encoded[stream_ptr++] - 1) * bytes_per_pixel);
+      else if (rle_code < 0)
+      {
+        // decode the run length code
+        rle_code = -rle_code;
+        stream_ptr++; // Ignore alpha channel
+        r = encoded[stream_ptr++];
+        g = encoded[stream_ptr++];
+        b = encoded[stream_ptr++];
+        while (rle_code--)
+        {
+          decoded[pixel_ptr++] = b;
+          decoded[pixel_ptr++] = g;
+          decoded[pixel_ptr++] = r;
+          if (bytes_per_pixel == 4)
+            pixel_ptr++;
+        }
+      }
+      else
+      {
+        // copy pixels directly to output
+        while (rle_code--)
+        {
+          stream_ptr++; // Ignore alpha channel
+          decoded[pixel_ptr++] = encoded[stream_ptr + 2];
+          decoded[pixel_ptr++] = encoded[stream_ptr + 1];
+          decoded[pixel_ptr++] = encoded[stream_ptr + 0];
+          stream_ptr += 3;
+          if (bytes_per_pixel == 4)
+            pixel_ptr++;
+        }
+      }
+    }
+
+    row_ptr += row_inc;
+  }
+}
+
 void qt_decode_rle(
   unsigned char *encoded,
   int encoded_size,
@@ -289,6 +380,15 @@
       break;
     case 24:
       qt_decode_rle24(
+        encoded,
+        encoded_size,
+        decoded,
+        width,
+        height,
+        bytes_per_pixel);
+      break;
+    case 32:
+      qt_decode_rle32(
         encoded,
         encoded_size,
         decoded,



More information about the MPlayer-cvslog mailing list