summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/util.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/util.cpp468
1 files changed, 468 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/util.cpp b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/util.cpp
new file mode 100644
index 00000000000..e085616b52a
--- /dev/null
+++ b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/util.cpp
@@ -0,0 +1,468 @@
+/* $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 "video.h"
+#include "proto.h"
+#include "util.h"
+
+ACE_RCSID(mpeg_client, util, "$Id$")
+
+#define TRUE 1
+#define FALSE 0
+
+/* Declarations of global variables used. */
+
+unsigned int curBits;
+int bitOffset;
+int bufLength;
+unsigned int *bitBuffer;
+
+/* Bit masks used by bit i/o operations. */
+
+unsigned int nBitMask[] = { 0x00000000, 0x80000000, 0xc0000000, 0xe0000000,
+ 0xf0000000, 0xf8000000, 0xfc000000, 0xfe000000,
+ 0xff000000, 0xff800000, 0xffc00000, 0xffe00000,
+ 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000,
+ 0xffff0000, 0xffff8000, 0xffffc000, 0xffffe000,
+ 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00,
+ 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0,
+ 0xfffffff0, 0xfffffff8, 0xfffffffc, 0xfffffffe};
+
+unsigned int bitMask[] = { 0xffffffff, 0x7fffffff, 0x3fffffff, 0x1fffffff,
+ 0x0fffffff, 0x07ffffff, 0x03ffffff, 0x01ffffff,
+ 0x00ffffff, 0x007fffff, 0x003fffff, 0x001fffff,
+ 0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff,
+ 0x0000ffff, 0x00007fff, 0x00003fff, 0x00001fff,
+ 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
+ 0x000000ff, 0x0000007f, 0x0000003f, 0x0000001f,
+ 0x0000000f, 0x00000007, 0x00000003, 0x00000001};
+
+unsigned int rBitMask[] = { 0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8,
+ 0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80,
+ 0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800,
+ 0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000,
+ 0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000,
+ 0xfff00000, 0xffe00000, 0xffc00000, 0xff800000,
+ 0xff000000, 0xfe000000, 0xfc000000, 0xf8000000,
+ 0xf0000000, 0xe0000000, 0xc0000000, 0x80000000};
+
+unsigned int bitTest[] = { 0x80000000, 0x40000000, 0x20000000, 0x10000000,
+ 0x08000000, 0x04000000, 0x02000000, 0x01000000,
+ 0x00800000, 0x00400000, 0x00200000, 0x00100000,
+ 0x00080000, 0x00040000, 0x00020000, 0x00010000,
+ 0x00008000, 0x00004000, 0x00002000, 0x00001000,
+ 0x00000800, 0x00000400, 0x00000200, 0x00000100,
+ 0x00000080, 0x00000040, 0x00000020, 0x00000010,
+ 0x00000008, 0x00000004, 0x00000002, 0x00000001};
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * correct_underflow --
+ *
+ * Called when buffer does not have sufficient data to
+ * satisfy request for bits.
+ * Calls get_more_data, an application specific routine
+ * required to fill the buffer with more data.
+ *
+ * Results:
+ * None really.
+ *
+ * Side effects:
+ * buf_length and buffer fields in curVidStream structure
+ * may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+correct_underflow() {
+
+ int status;
+
+ status = get_more_data(curVidStream->buf_start,
+ curVidStream->max_buf_length,
+ &bufLength, &bitBuffer);
+
+ if (status < 0) {
+ if (!quietFlag) {
+ fprintf (stderr, "\n");
+ ACE_OS::perror ("Unexpected read error.");
+ }
+ ACE_OS::exit (1);
+ }
+ else if ((status == 0) && (bufLength < 1)) {
+ if (!quietFlag) {
+ fprintf(stderr, "\nImproper or missing sequence end code.\n");
+ }
+#ifdef ANALYSIS
+ PrintAllStats();
+#endif
+ if (!quietFlag) {
+ PrintTimeInfo();
+ }
+/*
+ if (loopFlag) longjmp(env, 1);
+ DestroyVidStream(curVidStream);
+*/
+ ACE_OS::exit (0);
+ }
+#ifdef UTIL2
+ curBits = *bitBuffer << bitOffset;
+#else
+ curBits = *bitBuffer;
+#endif
+
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * next_bits --
+ *
+ * Compares next num bits to low order position in mask.
+ * Buffer pointer is NOT advanced.
+ *
+ * Results:
+ * TRUE, FALSE, or error code.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int next_bits(int num, unsigned int mask)
+{
+ unsigned int stream;
+ int ret_value;
+
+ /* If no current stream, return error. */
+
+ if (curVidStream == NULL)
+ return NO_VID_STREAM;
+
+ /* Get next num bits, no buffer pointer advance. */
+
+ show_bitsn(num, stream);
+
+ /* Compare bit stream and mask. Set return value toTRUE if equal, FALSE if
+ differs.
+ */
+
+ if (mask == stream) {
+ ret_value = TRUE;
+ } else ret_value = FALSE;
+
+ /* Return return value. */
+
+ return ret_value;
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * get_ext_data --
+ *
+ * Assumes that bit stream is at begining of extension
+ * data. Parses off extension data into dynamically
+ * allocated space until start code is hit.
+ *
+ * Results:
+ * Pointer to dynamically allocated memory containing
+ * extension data.
+ *
+ * Side effects:
+ * Bit stream irreversibly parsed.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *get_ext_data ()
+{
+ int size, marker;
+ char *dataPtr;
+ unsigned int data;
+
+ /* Set initial ext data buffer size. */
+
+ size = EXT_BUF_SIZE;
+
+ /* Allocate ext data buffer. */
+
+ dataPtr = (char *) ACE_OS::malloc(size);
+
+ /* Initialize marker to keep place in ext data buffer. */
+
+ marker = 0;
+
+ /* While next data is not start code... */
+ while (!next_bits(24, 0x000001)) {
+
+ /* Get next byte of ext data. */
+
+ get_bits8(data);
+
+ /* Put ext data into ext data buffer. Advance marker. */
+
+ dataPtr[marker] = (char) data;
+ marker++;
+
+ /* If end of ext data buffer reached, resize data buffer. */
+
+ if (marker == size) {
+ size += EXT_BUF_SIZE;
+ dataPtr = (char *) realloc(dataPtr, size);
+ }
+ }
+
+ /* Realloc data buffer to free any extra space. */
+
+ dataPtr = (char *) realloc(dataPtr, marker);
+
+ /* Return pointer to ext data buffer. */
+
+ return dataPtr;
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * next_start_code --
+ *
+ * Parses off bitstream until start code reached. When done
+ * next 4 bytes of bitstream will be start code. Bit offset
+ * reset to 0.
+ *
+ * Results:
+ * Status code.
+ *
+ * Side effects:
+ * Bit stream irreversibly parsed.
+ *
+ *--------------------------------------------------------------
+ */
+
+int next_start_code()
+{
+ int state;
+ int byteoff;
+ unsigned int data;
+
+ /* If no current stream, return error. */
+
+ if (curVidStream == NULL)
+ return NO_VID_STREAM;
+
+ /* If insufficient buffer length, correct underflow. */
+/*
+ if (bufLength < 2) {
+ correct_underflow();
+ }
+ */
+
+ /* If bit offset not zero, reset and advance buffer pointer. */
+
+ byteoff = bitOffset % 8;
+
+ if (byteoff != 0) {
+ flush_bits((8-byteoff));
+ }
+
+ /* Set state = 0. */
+
+ state = 0;
+
+ /* While buffer has data ... */
+
+ while(bufLength > 0) {
+
+ /* If insufficient data exists, correct underflow. */
+/*
+ if (bufLength < 2) {
+ correct_underflow();
+ }
+*/
+ /* If next byte is zero... */
+
+ get_bits8(data);
+
+ if (data == 0) {
+
+ /* If state < 2, advance state. */
+
+ if (state < 2) state++;
+ }
+
+ /* If next byte is one... */
+
+ else if (data == 1) {
+
+ /* If state == 2, advance state (i.e. start code found). */
+
+ if (state == 2) state++;
+
+ /* Otherwise, reset state to zero. */
+
+ else state = 0;
+ }
+
+ /* Otherwise byte is neither 1 or 0, reset state to 0. */
+
+ else {
+ state = 0;
+ }
+
+ /* If state == 3 (i.e. start code found)... */
+
+ if (state == 3) {
+
+ /* Set buffer pointer back and reset length & bit offsets so
+ next bytes will be beginning of start code.
+ */
+
+ bitOffset = bitOffset - 24;
+
+#ifdef ANALYSIS
+ bitCount -= 24;
+#endif
+
+ if (bitOffset < 0) {
+ bitOffset = 32 + bitOffset;
+ bufLength++;
+ bitBuffer--;
+#ifdef UTIL2
+ curBits = *bitBuffer << bitOffset;
+#else
+ curBits = *bitBuffer;
+#endif
+ }
+ else {
+#ifdef UTIL2
+ curBits = *bitBuffer << bitOffset;
+#else
+ curBits = *bitBuffer;
+#endif
+ }
+
+ /* Return success. */
+
+ return OK;
+ }
+ }
+
+ /* Return underflow error. */
+
+ return UNDERFLOW;
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * get_extra_bit_info --
+ *
+ * Parses off extra bit info stream into dynamically
+ * allocated memory. Extra bit info is indicated by
+ * a flag bit set to 1, followed by 8 bits of data.
+ * This continues until the flag bit is zero. Assumes
+ * that bit stream set to first flag bit in extra
+ * bit info stream.
+ *
+ * Results:
+ * Pointer to dynamically allocated memory with extra
+ * bit info in it. Flag bits are NOT included.
+ *
+ * Side effects:
+ * Bit stream irreversibly parsed.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *get_extra_bit_info ()
+{
+ int size, marker;
+ char *dataPtr;
+ unsigned int data;
+
+ /* Get first flag bit. */
+ get_bits1(data);
+
+ /* If flag is false, return NULL pointer (i.e. no extra bit info). */
+
+ if (!data) return NULL;
+
+ /* Initialize size of extra bit info buffer and allocate. */
+
+ size = EXT_BUF_SIZE;
+ dataPtr = (char *) ACE_OS::malloc(size);
+
+ /* Reset marker to hold place in buffer. */
+
+ marker = 0;
+
+ /* While flag bit is true. */
+
+ while (data) {
+
+ /* Get next 8 bits of data. */
+ get_bits8(data);
+
+ /* Place in extra bit info buffer. */
+
+ dataPtr[marker] = (char) data;
+ marker++;
+
+ /* If buffer is full, reallocate. */
+
+ if (marker == size) {
+ size += EXT_BUF_SIZE;
+ dataPtr = (char *) realloc(dataPtr, size);
+ }
+
+ /* Get next flag bit. */
+ get_bits1(data);
+ }
+
+ /* Reallocate buffer to free extra space. */
+
+ dataPtr = (char *) realloc(dataPtr, marker);
+
+ /* Return pointer to extra bit info buffer. */
+
+ return dataPtr;
+}
+
+
+
+
+
+
+
+