motion.c
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:6k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  2. /*
  3.  * Disclaimer of Warranty
  4.  *
  5.  * These software programs are available to the user without any license fee or
  6.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  7.  * any and all warranties, whether express, implied, or statuary, including any
  8.  * implied warranties or merchantability or of fitness for a particular
  9.  * purpose.  In no event shall the copyright-holder be liable for any
  10.  * incidental, punitive, or consequential damages of any kind whatsoever
  11.  * arising from the use of these programs.
  12.  *
  13.  * This disclaimer of warranty extends to the user of these programs and user's
  14.  * customers, employees, agents, transferees, successors, and assigns.
  15.  *
  16.  * The MPEG Software Simulation Group does not represent or warrant that the
  17.  * programs furnished hereunder are free of infringement of any third-party
  18.  * patents.
  19.  *
  20.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  21.  * are subject to royalty fees to patent holders.  Many of these patents are
  22.  * general enough such that they are unavoidable regardless of implementation
  23.  * design.
  24.  *
  25.  */
  26. #include "global.h"
  27. #include "getbit.h"
  28. __forceinline static void motion_vector(int *PMV, int *dmvector, int h_r_size, int v_r_size,
  29. int dmv, int mvscale, int full_pel_vector);
  30. __forceinline static void decode_motion_vector(int *pred, int r_size, int motion_code,
  31. int motion_residualesidual, int full_pel_vector);
  32. __forceinline static int Get_motion_code(void);
  33. __forceinline static int Get_dmvector(void);
  34. /* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
  35. void motion_vectors(int PMV[2][2][2],int dmvector[2],
  36. int motion_vertical_field_select[2][2], int s,
  37. int motion_vector_count, int mv_format, int h_r_size,
  38. int v_r_size, int dmv, int mvscale)
  39. {
  40. if (motion_vector_count==1)
  41. {
  42. if (mv_format==MV_FIELD && !dmv)
  43. motion_vertical_field_select[1][s] =
  44. motion_vertical_field_select[0][s] = Get_Bits(1);
  45. motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
  46. /* update other motion vector predictors */
  47. PMV[1][s][0] = PMV[0][s][0];
  48. PMV[1][s][1] = PMV[0][s][1];
  49. }
  50. else
  51. {
  52. motion_vertical_field_select[0][s] = Get_Bits(1);
  53. motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
  54. motion_vertical_field_select[1][s] = Get_Bits(1);
  55. motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
  56. }
  57. }
  58. /* get and decode motion vector and differential motion vector for one prediction */
  59. static void motion_vector(int *PMV, int *dmvector, int h_r_size, int v_r_size,
  60.    int dmv, int mvscale, int full_pel_vector)
  61. {
  62. int motion_code, motion_residual;
  63. /* horizontal component */
  64. /* ISO/IEC 13818-2 Table B-10 */
  65. motion_code = Get_motion_code();
  66. motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
  67. decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
  68. if (dmv)
  69. dmvector[0] = Get_dmvector();
  70. /* vertical component */
  71. motion_code     = Get_motion_code();
  72. motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
  73. if (mvscale)
  74. PMV[1] >>= 1; /* DIV 2 */
  75. decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
  76. if (mvscale)
  77. PMV[1] <<= 1;
  78. if (dmv)
  79. dmvector[1] = Get_dmvector();
  80. }
  81. /* calculate motion vector component */
  82. /* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
  83. /* Note: the arithmetic here is more elegant than that which is shown 
  84.    in 7.6.3.1.  The end results (PMV[][][]) should, however, be the same.  */
  85. static void decode_motion_vector(int *pred, int r_size, int motion_code,
  86.  int motion_residual, int full_pel_vector)
  87. {
  88. int lim, vec;
  89. lim = 16<<r_size;
  90. vec = full_pel_vector ? (*pred >> 1) : (*pred);
  91. if (motion_code>0)
  92. {
  93. vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
  94. if (vec>=lim)
  95. vec-= lim + lim;
  96. }
  97. else if (motion_code<0)
  98. {
  99. vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
  100. if (vec<-lim)
  101. vec+= lim + lim;
  102. }
  103. *pred = full_pel_vector ? (vec<<1) : vec;
  104. }
  105. /* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
  106. void Dual_Prime_Arithmetic(int DMV[][2],int *dmvector, int mvx,int mvy)
  107. {
  108. if (picture_structure==FRAME_PICTURE)
  109. {
  110. if (top_field_first)
  111. {
  112. /* vector for prediction of top field from bottom field */
  113. DMV[0][0] = ((mvx  +(mvx>0))>>1) + dmvector[0];
  114. DMV[0][1] = ((mvy  +(mvy>0))>>1) + dmvector[1] - 1;
  115. /* vector for prediction of bottom field from top field */
  116. DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
  117. DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
  118. }
  119. else
  120. {
  121. /* vector for prediction of top field from bottom field */
  122. DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
  123. DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
  124. /* vector for prediction of bottom field from top field */
  125. DMV[1][0] = ((mvx  +(mvx>0))>>1) + dmvector[0];
  126. DMV[1][1] = ((mvy  +(mvy>0))>>1) + dmvector[1] + 1;
  127. }
  128. }
  129. else
  130. {
  131. /* vector for prediction from field of opposite 'parity' */
  132. DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
  133. DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
  134. /* correct for vertical field shift */
  135. if (picture_structure==TOP_FIELD)
  136. DMV[0][1]--;
  137. else
  138. DMV[0][1]++;
  139. }
  140. }
  141. static int Get_motion_code()
  142. {
  143. int code;
  144. if (Get_Bits(1))
  145. return 0;
  146. if ((code = Show_Bits(9))>=64)
  147. {
  148. code >>= 6;
  149. Flush_Buffer(MVtab0[code].len);
  150. return Get_Bits(1)?-MVtab0[code].val:MVtab0[code].val;
  151. }
  152. if (code>=24)
  153. {
  154. code >>= 3;
  155. Flush_Buffer(MVtab1[code].len);
  156. return Get_Bits(1)?-MVtab1[code].val:MVtab1[code].val;
  157. }
  158. if ((code-=12)<0)
  159. {
  160. Fault_Flag = 10;
  161. return 0;
  162. }
  163. Flush_Buffer(MVtab2[code].len);
  164. return Get_Bits(1) ? -MVtab2[code].val : MVtab2[code].val;
  165. }
  166. /* get differential motion vector (for dual prime prediction) */
  167. static int Get_dmvector()
  168. {
  169. if (Get_Bits(1))
  170. return Get_Bits(1) ? -1 : 1;
  171. else
  172. return 0;
  173. }