summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/24bit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/24bit.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/24bit.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/24bit.cpp b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/24bit.cpp
new file mode 100644
index 00000000000..8b8c0ee03ed
--- /dev/null
+++ b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/24bit.cpp
@@ -0,0 +1,218 @@
+/* $Id$ */
+
+/*
+ * Copyright (c) 1992 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose, without fee, and without written agreement is
+ * hereby granted, provided that the above copyright notice and the following
+ * two paragraphs appear in all copies of this software.
+ *
+ * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
+ * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
+ * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "ace/OS.h"
+#include <stdlib.h>
+#include <string.h>
+#include "video.h"
+#include "dither.h"
+#include "proto.h"
+
+ACE_RCSID(mpeg_client, 24bit, "$Id$")
+
+/*
+ * We'll define the "ConvertColor" macro here to do fixed point arithmetic
+ * that'll convert from YCrCb to RGB using:
+ * R = L + 1.40200*Cr;
+ * G = L - 0.34414*Cb - 0.71414*Cr
+ * B = L + 1.77200*Cb;
+ *
+ * We'll use fixed point by adding two extra bits after the decimal.
+ */
+
+#define BITS 8
+#define ONE ((int) 1)
+#define CONST_SCALE (ONE << BITS)
+#define ROUND_FACTOR (ONE << (BITS-1))
+
+/* Macro to convert integer to fixed. */
+#define UP(x) (((int)(x)) << BITS)
+
+/* Macro to convert fixed to integer (with rounding). */
+#define DOWN(x) (((x) + ROUND_FACTOR) >> BITS)
+
+/* Macro to convert a float to a fixed */
+#define FIX(x) ((int) ((x)*CONST_SCALE + 0.5))
+
+#define CLAMP(ll,x,ul) ( ((x)<(ll)) ?(ll):( ((x)>(ul)) ?(ul):(x)))
+
+static int *Cb_r_tab, *Cr_g_tab, *Cb_g_tab, *Cr_b_tab;
+
+/*
+ *--------------------------------------------------------------
+ *
+ * InitColorDither --
+ *
+ * To get rid of the multiply and other conversions in color
+ * dither, we use a lookup table.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * The lookup tables are initialized.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+InitColorDither()
+{
+ int CR, CB, i;
+
+ Cr_b_tab = (int *)ACE_OS::malloc(256*sizeof(int));
+ Cr_g_tab = (int *)ACE_OS::malloc(256*sizeof(int));
+ Cb_g_tab = (int *)ACE_OS::malloc(256*sizeof(int));
+ Cb_r_tab = (int *)ACE_OS::malloc(256*sizeof(int));
+
+ for (i=0; i<256; i++) {
+ CB = CR = i;
+
+ CB -= 128; CR -= 128;
+
+ Cb_r_tab[i] = FIX(1.40200) * CB;
+ Cr_g_tab[i] = -FIX(0.34414) * CR;
+ Cb_g_tab[i] = -FIX(0.71414) * CB;
+ Cr_b_tab[i] = FIX(1.77200) * CR;
+ }
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * ColorDitherImage --
+ *
+ * Converts image into 24 bit color.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+ColorDitherImage(unsigned char *lum, unsigned char *cr,
+ unsigned char *cb, unsigned char *out,
+ int rows, int cols)
+{
+ int L, CR, CB;
+ unsigned int *row1, *row2;
+ unsigned char *lum2;
+ int x, y;
+ unsigned int r, b, g;
+ int cb_r;
+ int cr_g;
+ int cb_g;
+ int cr_b;
+
+ row1 = (unsigned int *)out;
+ row2 = row1 + cols;
+ lum2 = lum + cols;
+ for (y=0; y<rows; y+=2) {
+ for (x=0; x<cols; x+=2) {
+ int R, G, B;
+
+ CR = *cr++;
+ CB = *cb++;
+ cb_r = Cb_r_tab[CB];
+ cr_g = Cr_g_tab[CR];
+ cb_g = Cb_g_tab[CB];
+ cr_b = Cr_b_tab[CR];
+
+ L = *lum++;
+ L = UP(L);
+ R = L + cb_r;
+ G = L + cr_g + cb_g;
+ B = L + cr_b;
+#ifndef LITTLE_ENDIAN
+ r = CLAMP(0,R,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;
+#else
+ b = CLAMP(0,B,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;
+#endif
+ *row1++ = r | g | b;
+
+ L = *lum++;
+ L = UP(L);
+ R = L + cb_r;
+ G = L + cr_g + cb_g;
+ B = L + cr_b;
+#ifndef LITTLE_ENDIAN
+ r = CLAMP(0,R,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;
+#else
+ b = CLAMP(0,B,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;
+#endif
+ *row1++ = r | g | b;
+
+ /*
+ * Now, do second row.
+ */
+ L = *lum2++;
+ L = UP(L);
+ R = L + cb_r;
+ G = L + cr_g + cb_g;
+ B = L + cr_b;
+#ifndef LITTLE_ENDIAN
+ r = CLAMP(0,R,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;
+#else
+ b = CLAMP(0,B,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;
+#endif
+ *row2++ = r | g | b;
+
+ L = *lum2++;
+ L = UP(L);
+ R = L + cb_r;
+ G = L + cr_g + cb_g;
+ B = L + cr_b;
+#ifndef LITTLE_ENDIAN
+ r = CLAMP(0,R,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;
+#else
+ b = CLAMP(0,B,UP(255)) >> BITS;
+ g = CLAMP(0,G,UP(255)) & 0xff00;
+ r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;
+#endif
+ *row2++ = r | g | b;
+ }
+ lum += cols;
+ lum2 += cols;
+ row1 += cols;
+ row2 += cols;
+ }
+}