4 ** $VER: mpegmotionvector.c 1.11 (30.10.97)
5 ** mpegvideo.datatype 1.11
7 ** This file handles computation of the forward/backward
10 ** Written 1996/1997 by Roland 'Gizzy' Mainz
14 /* project includes */
15 #include "mpegvideo.h"
16 #include "mpegproto.h"
21 *--------------------------------------------------------------
25 * Computes motion vector given parameters previously parsed
29 * Reconstructed motion vector info is put into recon_* parameters
30 * passed to this function. Also updated previous motion vector
36 *--------------------------------------------------------------
40 #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 ) \
42 int comp_h_r, comp_v_r; \
43 int right_little, right_big, down_little, down_big; \
44 int max, min, new_vector; \
46 /* The following procedure for the reconstruction of motion vectors \
47 * is a direct and simple implementation of the instructions given \
48 * in the mpeg December 1991 standard draft. \
51 comp_h_r = ((f == 1) || (motion_h_code == 0))?(0):(f - 1 - motion_h_r); \
52 comp_v_r = ((f == 1) || (motion_v_code == 0))?(0):(f - 1 - motion_v_r); \
54 right_little = motion_h_code * f; \
56 if( right_little == 0 ) \
62 if( right_little > 0 ) \
64 right_little = right_little - comp_h_r; \
65 right_big = right_little - (f << 5); \
69 right_little = right_little + comp_h_r; \
70 right_big = right_little + (f << 5); \
74 down_little = motion_v_code * f; \
76 if( down_little == 0 ) \
82 if( down_little > 0 ) \
84 down_little = down_little - comp_v_r; \
85 down_big = down_little - (f << 5); \
89 down_little = down_little + comp_v_r; \
90 down_big = down_little + (f << 5); \
97 new_vector = recon_right_prev + right_little; \
99 if( (new_vector <= max) && (new_vector >= min) ) \
101 *recon_right_ptr = recon_right_prev + right_little; /* just new_vector */ \
105 *recon_right_ptr = recon_right_prev + right_big; \
108 recon_right_prev = *recon_right_ptr; \
110 if( full_pel_vector ) \
112 *recon_right_ptr = *recon_right_ptr << 1; \
115 new_vector = recon_down_prev + down_little; \
117 if( (new_vector <= max) && (new_vector >= min) ) \
119 *recon_down_ptr = recon_down_prev + down_little; /* just new_vector */ \
123 *recon_down_ptr = recon_down_prev + down_big; \
125 recon_down_prev = *recon_down_ptr; \
127 if( full_pel_vector ) \
129 *recon_down_ptr = *recon_down_ptr << 1; \
135 *--------------------------------------------------------------
137 * ComputeForwVector --
139 * Computes forward motion vector by calling ComputeVector
140 * with appropriate parameters.
143 * Reconstructed motion vector placed in recon_right_for_ptr and
144 * recon_down_for_ptr.
149 *--------------------------------------------------------------
153 void ComputeForwVector( struct MPEGVideoInstData
*mvid
, int *recon_right_for_ptr
, int *recon_down_for_ptr
)
158 picture
= (&(curVidStream
-> picture
));
159 mblock
= (&(curVidStream
-> mblock
));
161 ComputeVector( recon_right_for_ptr
, recon_down_for_ptr
,
162 (mblock
-> recon_right_for_prev
),
163 (mblock
-> recon_down_for_prev
),
164 (picture
-> forw_f
), (picture
-> full_pel_forw_vector
),
165 (mblock
-> motion_h_forw_code
), (mblock
-> motion_v_forw_code
),
166 (mblock
-> motion_h_forw_r
), (mblock
-> motion_v_forw_r
) );
171 *--------------------------------------------------------------
173 * ComputeBackVector --
175 * Computes backward motion vector by calling ComputeVector
176 * with appropriate parameters.
179 * Reconstructed motion vector placed in recon_right_back_ptr and
180 * recon_down_back_ptr.
185 *--------------------------------------------------------------
189 void ComputeBackVector( struct MPEGVideoInstData
*mvid
, int *recon_right_back_ptr
, int *recon_down_back_ptr
)
194 picture
= (&(curVidStream
-> picture
));
195 mblock
= (&(curVidStream
-> mblock
));
197 ComputeVector( recon_right_back_ptr
, recon_down_back_ptr
,
198 (mblock
-> recon_right_back_prev
),
199 (mblock
-> recon_down_back_prev
),
200 (picture
-> back_f
), (picture
-> full_pel_back_vector
),
201 (mblock
-> motion_h_back_code
), (mblock
-> motion_v_back_code
),
202 (mblock
-> motion_h_back_r
), (mblock
-> motion_v_back_r
) );