summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/fs4.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/fs4.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/fs4.cpp313
1 files changed, 313 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/fs4.cpp b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/fs4.cpp
new file mode 100644
index 00000000000..a61ba89e4fb
--- /dev/null
+++ b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/fs4.cpp
@@ -0,0 +1,313 @@
+/* $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.
+ */
+
+/* This file contains C code to do YCrCb -> colormap space. */
+
+#include "ace/OS.h"
+#include <stdlib.h>
+#include <string.h>
+#include "fs4.h"
+#include "video.h"
+#include "proto.h"
+#include "dither.h"
+
+ACE_RCSID(mpeg_client, fs4, "$Id$")
+
+/* Structures containing precomputed error terms. */
+
+static FS4Dither lum_index[256];
+static FS4Dither cr_index[256];
+static FS4Dither cb_index[256];
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * InitFS4Dither --
+ *
+ * Initializes structures used for f-s dithering. Precomputes
+ * error terms.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+InitFS4Dither()
+{
+ int i;
+
+ for (i=0; i<256; i++) {
+ lum_index[i].value = (i * LUM_RANGE) / 256;
+
+ lum_index[i].e1 = (7 * (i-lum_values[lum_index[i].value])) / 16;
+ lum_index[i].e2 = (i-lum_values[lum_index[i].value])/16;
+ lum_index[i].e3 = (5 * (i - lum_values[lum_index[i].value])) / 16;
+ lum_index[i].e4 = (i-lum_values[lum_index[i].value]) - lum_index[i].e1 -
+ lum_index[i].e2 - lum_index[i].e3;
+
+ lum_index[i].value *= LUM_BASE;
+
+ cr_index[i].value = (i * CR_RANGE) / 256;
+
+ cr_index[i].e1 = (7 * (i-cr_values[cr_index[i].value])) / 16;
+ cr_index[i].e2 = (i-cr_values[cr_index[i].value])/16;
+ cr_index[i].e3 = (5 * (i - cr_values[cr_index[i].value])) / 16;
+ cr_index[i].e4 = (i-cr_values[cr_index[i].value]) - cr_index[i].e1 -
+ cr_index[i].e2 - cr_index[i].e3;
+ cr_index[i].value *= CR_BASE;
+
+ cb_index[i].value = (i * CB_RANGE) / 256;
+
+ cb_index[i].e1 = (7 * (i-cb_values[cb_index[i].value])) / 16;
+ cb_index[i].e2 = (i-cb_values[cb_index[i].value])/16;
+ cb_index[i].e3 = (5 * (i - cb_values[cb_index[i].value])) / 16;
+ cb_index[i].e4 = (i-cb_values[cb_index[i].value]) - cb_index[i].e1 -
+ cb_index[i].e2 - cb_index[i].e3;
+ cb_index[i].value *= CB_BASE;
+
+ }
+
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * DitherImage --
+ *
+ * Converts lum, cr, cb image planes into fixed colormap
+ * space. Uses Floyd-Steinberg dithering in serpentine
+ * pattern with standard 4 errors propogated.
+ *
+ * Results:
+ * The display plane is replaced by 8-bit colormap space
+ * image.
+ *
+ * Side effects:
+ * Hopefully, none.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+FS4DitherImage(unsigned char *lum, unsigned char *cr,
+ unsigned char *cb, unsigned char *disp,
+ int rows, int cols)
+{
+ static char *cur_row_error, *next_row_error;
+ static int first = 1;
+ char *cur_row_err_mark, *next_row_err_mark;
+ char *temp;
+ int i, j, pixsum, c_cols;
+ unsigned char *cur_row, *channel, *dest_row;
+ FS4Dither *chan_index;
+
+ if (first) {
+ cur_row_error = (char *) ACE_OS::malloc(cols+2);
+ next_row_error = (char *) ACE_OS::malloc(cols+2);
+ first = 0;
+ }
+
+ memset(cur_row_error, 0, cols+2);
+ memset(next_row_error, 0, cols+2);
+
+ for(i=0; i<rows; i+=2) {
+ cur_row = lum + (i*cols);
+ dest_row = disp + (i*cols);
+
+ cur_row_err_mark = cur_row_error + 1;
+ next_row_err_mark = next_row_error + 1;
+
+ for (j=0; j<cols; j++) {
+
+ pixsum = *cur_row + *cur_row_err_mark;
+ if (pixsum < 0) pixsum = 0;
+ else if (pixsum > 255) pixsum = 255;
+
+ *dest_row = lum_index[pixsum].value;
+ *(cur_row_err_mark+1) += lum_index[pixsum].e1;
+ *(next_row_err_mark+1) += lum_index[pixsum].e2;
+ *next_row_err_mark += lum_index[pixsum].e3;
+ *(next_row_err_mark-1) += lum_index[pixsum].e4;
+
+ cur_row++;
+ dest_row++;
+ cur_row_err_mark++;
+ next_row_err_mark++;
+ }
+
+ temp = cur_row_error;
+ cur_row_error = next_row_error;
+ next_row_error = temp;
+
+ memset(next_row_error, 0, cols+2);
+
+ cur_row += cols-1;
+ dest_row += cols-1;
+ cur_row_err_mark = cur_row_error + cols;
+ next_row_err_mark = next_row_error + cols;
+
+ for (j=0; j<cols; j++) {
+
+ pixsum = *cur_row + *cur_row_err_mark;
+ if (pixsum < 0) pixsum = 0;
+ else if (pixsum > 255) pixsum = 255;
+
+ *dest_row = lum_index[pixsum].value;
+ *(cur_row_err_mark-1) += lum_index[pixsum].e1;
+ *(next_row_err_mark-1) += lum_index[pixsum].e2;
+ *next_row_err_mark += lum_index[pixsum].e3;
+ *(next_row_err_mark+1) += lum_index[pixsum].e4;
+
+ cur_row--;
+ dest_row--;
+ cur_row_err_mark--;
+ next_row_err_mark--;
+ }
+
+ temp = cur_row_error;
+ cur_row_error = next_row_error;
+ next_row_error = temp;
+
+ memset(next_row_error, 0, cols+2);
+ }
+
+ memset(cur_row_error, 0, cols+2);
+
+ c_cols = cols >> 1;
+
+ channel = cr;
+ chan_index = cr_index;
+
+ repeat:
+
+ for (i=0; i < rows; i+=2) {
+ cur_row = channel + ((i>>1)*c_cols);
+ dest_row = disp + (i*cols);
+
+ cur_row_err_mark = cur_row_error+1;
+ next_row_err_mark = next_row_error+1;
+
+ for (j=0; j<cols; j++) {
+ int p_val;
+
+ p_val = *cur_row;
+
+ pixsum = *cur_row_err_mark + p_val;
+
+ if (pixsum < 0) pixsum = 0;
+ else if (pixsum > 255) pixsum = 255;
+
+ *dest_row += chan_index[pixsum].value;
+
+ *(cur_row_err_mark+1) += chan_index[pixsum].e1;
+ *(next_row_err_mark+1) += chan_index[pixsum].e2;
+ *next_row_err_mark += chan_index[pixsum].e3;
+ *(next_row_err_mark-1) += chan_index[pixsum].e4;
+
+
+ if (j&1) cur_row++;
+ dest_row++;
+ cur_row_err_mark++;
+ next_row_err_mark++;
+ }
+
+ temp = cur_row_error;
+ cur_row_error = next_row_error;
+ next_row_error = temp;
+
+ memset(next_row_error, 0, cols+2);
+
+ cur_row += c_cols-1;
+ dest_row += cols-1;
+ cur_row_err_mark = cur_row_error+cols;
+ next_row_err_mark = next_row_error+cols;
+
+ for (j=0; j<cols; j++) {
+ int p_val;
+
+ p_val = *cur_row;
+
+ pixsum = *cur_row_err_mark + p_val;
+
+ if (pixsum < 0) pixsum = 0;
+ else if (pixsum > 255) pixsum = 255;
+
+ *dest_row += chan_index[pixsum].value;
+
+ *(cur_row_err_mark-1) += chan_index[pixsum].e1;
+ *(next_row_err_mark-1) += chan_index[pixsum].e2;
+ *next_row_err_mark += chan_index[pixsum].e3;
+ *(next_row_err_mark+1) += chan_index[pixsum].e4;
+
+ if (j&1) cur_row--;
+ dest_row--;
+ cur_row_err_mark--;
+ next_row_err_mark--;
+ }
+
+ temp = cur_row_error;
+ cur_row_error = next_row_error;
+ next_row_error = temp;
+
+ memset(next_row_error, 0, cols+2);
+ }
+
+ if (channel == cr) {
+ channel = cb;
+ chan_index = cb_index;
+ memset(cur_row_error, 0, cols+2);
+
+ goto repeat;
+ }
+
+ dest_row = disp;
+
+
+ for (i=0; i<rows; i++) {
+ for (j=0; j<cols; j++) {
+ *dest_row = pixel[*dest_row];
+ dest_row++;
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+