summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_shared/sendpt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_shared/sendpt.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_shared/sendpt.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_shared/sendpt.cpp b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_shared/sendpt.cpp
new file mode 100644
index 00000000000..6a02d51f201
--- /dev/null
+++ b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_shared/sendpt.cpp
@@ -0,0 +1,141 @@
+/* $Id$ */
+
+/* Copyright (c) 1995 Oregon Graduate Institute of Science and Technology
+ * P.O.Box 91000-1000, Portland, OR 97291, USA;
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of O.G.I. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. O.G.I. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * O.G.I. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * O.G.I. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+ * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Shanwei Cen
+ * Department of Computer Science and Engineering
+ * email: scen@cse.ogi.edu
+ */
+#include "ace/OS.h"
+#include <string.h>
+#include "sendpt.h"
+
+ACE_RCSID(mpeg_shared, sendpt, "$Id$")
+
+/* parameters:
+ pat -- pattern
+ buf -- buffer for holding sendpattern computed;
+ len -- length of pattern and send pattern (number of frames);
+ f -- number of frames to send (represented by result send pattern);
+*/
+void ComputeSendPattern(char * pat, char * buf, int len, int f)
+{
+ memset(buf, 0, len);
+ if (f >= len)
+ {
+ memset(buf, 1, len);
+ }
+ else if (f <= 1)
+ {
+ buf[0] = 1;
+ }
+ else
+ {
+ int i, is = 0, ps = 0, bs = 0;
+
+ memset(buf, 1, len);
+ for (i = 0; i < len; i++)
+ {
+ if (pat[i] == 'I')
+ is ++;
+ else if (pat[i] == 'P')
+ ps ++;
+ else /* B frame */
+ bs ++;
+ }
+ f = len - f; /* number of frames to drop */
+ if (f < bs) /* drops only B frames */
+ {
+ double scale = (double)bs / (double)f;
+ int ptr = 0, ptr1 = 0;
+ for (i = 0; i < len; i ++)
+ {
+ if (pat[i] == 'B')
+ {
+ if ( ptr == (int) ((double)ptr1 * scale + 0.5))
+ {
+ buf[i] = 0;
+ ptr1 ++;
+ }
+ ptr ++;
+ }
+ }
+ goto endOfCompute;
+ }
+
+ /* drop all B frames */
+ for (i = 0; i < len; i ++)
+ if (pat[i] == 'B')
+ buf[i] = 0;
+
+ if (f == bs)
+ goto endOfCompute;
+
+ if (f > bs && f < bs + ps) /* drop also some P frames */
+ {
+ int ptr = len - 1;
+ for (i = 0; i < is; i ++)
+ {
+ int j;
+ for (j = 0; j < (f - bs) / is; j ++)
+ {
+ while (pat[ptr] != 'P') ptr --;
+ buf[ptr] = 0;
+ ptr --;
+ }
+ while (pat[ptr] != 'I') ptr --;
+ }
+ ptr = len - 1;
+ for (i = 0; i < (f - bs) % is; i ++)
+ {
+ while (pat[ptr] != 'P' || buf[ptr] == 0) ptr --;
+ buf[ptr] = 0;
+ while (pat[ptr] != 'I') ptr --;
+ }
+ goto endOfCompute;
+ }
+
+ /* drop all P frames */
+ for (i = 0; i < len; i ++)
+ if (pat[i] == 'P')
+ buf[i] = 0;
+
+ if (f > bs + ps) /* needs to drop some I frames */
+ {
+ double scale = (double)is / (double)(f - bs - ps);
+ int ptr = 0, ptr1 = 0;
+ for (i = 0; i < len; i ++)
+ {
+ if (pat[i] == 'I')
+ {
+ if ( ptr == (int) ((double)ptr1 * scale + 0.5))
+ {
+ buf[i] = 0;
+ ptr1 ++;
+ }
+ ptr ++;
+ }
+ }
+ goto endOfCompute;
+ }
+ }
+ endOfCompute:;
+}