summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/motionvector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/motionvector.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/motionvector.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/motionvector.cpp b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/motionvector.cpp
new file mode 100644
index 00000000000..3b95e694cdc
--- /dev/null
+++ b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_client/motionvector.cpp
@@ -0,0 +1,197 @@
+/* $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 "video.h"
+#include "proto.h"
+#include "util.h"
+
+ACE_RCSID(mpeg_client, motionvector, "$Id$")
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeVector --
+ *
+ * Computes motion vector given parameters previously parsed
+ * and reconstructed.
+ *
+ * Results:
+ * Reconstructed motion vector info is put into recon_* parameters
+ * passed to this function. Also updated previous motion vector
+ * information.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+#define ComputeVector(recon_right_ptr, recon_down_ptr, recon_right_prev, recon_down_prev, f, full_pel_vector, motion_h_code, motion_v_code, motion_h_r, motion_v_r) \
+ \
+{ \
+ int comp_h_r, comp_v_r; \
+ int right_little, right_big, down_little, down_big; \
+ int max, min, new_vector; \
+ \
+ /* The following procedure for the reconstruction of motion vectors \
+ is a direct and simple implementation of the instructions given \
+ in the mpeg December 1991 standard draft. \
+ */ \
+ \
+ if (f == 1 || motion_h_code == 0) \
+ comp_h_r = 0; \
+ else \
+ comp_h_r = f - 1 - motion_h_r; \
+ \
+ if (f == 1 || motion_v_code == 0) \
+ comp_v_r = 0; \
+ else \
+ comp_v_r = f - 1 - motion_v_r; \
+ \
+ right_little = motion_h_code * f; \
+ if (right_little == 0) \
+ right_big = 0; \
+ else { \
+ if (right_little > 0) { \
+ right_little = right_little - comp_h_r; \
+ right_big = right_little - 32 * f; \
+ } \
+ else { \
+ right_little = right_little + comp_h_r; \
+ right_big = right_little + 32 * f; \
+ } \
+ } \
+ \
+ down_little = motion_v_code * f; \
+ if (down_little == 0) \
+ down_big = 0; \
+ else { \
+ if (down_little > 0) { \
+ down_little = down_little - comp_v_r; \
+ down_big = down_little - 32 * f; \
+ } \
+ else { \
+ down_little = down_little + comp_v_r; \
+ down_big = down_little + 32 * f; \
+ } \
+ } \
+ \
+ max = 16 * f - 1; \
+ min = -16 * f; \
+ \
+ new_vector = recon_right_prev + right_little; \
+ \
+ if (new_vector <= max && new_vector >= min) \
+ *recon_right_ptr = recon_right_prev + right_little; \
+ /* just new_vector */ \
+ else \
+ *recon_right_ptr = recon_right_prev + right_big; \
+ recon_right_prev = *recon_right_ptr; \
+ if (full_pel_vector) \
+ *recon_right_ptr = *recon_right_ptr << 1; \
+ \
+ new_vector = recon_down_prev + down_little; \
+ if (new_vector <= max && new_vector >= min) \
+ *recon_down_ptr = recon_down_prev + down_little; \
+ /* just new_vector */ \
+ else \
+ *recon_down_ptr = recon_down_prev + down_big; \
+ recon_down_prev = *recon_down_ptr; \
+ if (full_pel_vector) \
+ *recon_down_ptr = *recon_down_ptr << 1; \
+}
+
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeForwVector --
+ *
+ * Computes forward motion vector by calling ComputeVector
+ * with appropriate parameters.
+ *
+ * Results:
+ * Reconstructed motion vector placed in recon_right_for_ptr and
+ * recon_down_for_ptr.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+ComputeForwVector(int *recon_right_for_ptr, int *recon_down_for_ptr)
+{
+
+ Pict *picture;
+ Macroblock *mblock;
+
+ picture = &(curVidStream->picture);
+ mblock = &(curVidStream->mblock);
+
+ ComputeVector(recon_right_for_ptr, recon_down_for_ptr,
+ mblock->recon_right_for_prev,
+ mblock->recon_down_for_prev,
+ picture->forw_f, picture->full_pel_forw_vector,
+ mblock->motion_h_forw_code, mblock->motion_v_forw_code,
+ mblock->motion_h_forw_r, mblock->motion_v_forw_r);
+}
+
+
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeBackVector --
+ *
+ * Computes backward motion vector by calling ComputeVector
+ * with appropriate parameters.
+ *
+ * Results:
+ * Reconstructed motion vector placed in recon_right_back_ptr and
+ * recon_down_back_ptr.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+ComputeBackVector(int *recon_right_back_ptr, int *recon_down_back_ptr)
+{
+ Pict *picture;
+ Macroblock *mblock;
+
+ picture = &(curVidStream->picture);
+ mblock = &(curVidStream->mblock);
+
+ ComputeVector(recon_right_back_ptr, recon_down_back_ptr,
+ mblock->recon_right_back_prev,
+ mblock->recon_down_back_prev,
+ picture->back_f, picture->full_pel_back_vector,
+ mblock->motion_h_back_code, mblock->motion_v_back_code,
+ mblock->motion_h_back_r, mblock->motion_v_back_r);
+
+}