00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003 #include "vlc.h"
00004
00005 #include <stdio.h>
00006
00007
00008
00009
00010 void mpeg3video_calc_mv(int *pred, int r_size, int motion_code, int motion_r, int full_pel_vector)
00011 {
00012 int lim = 16 << r_size;
00013 int vec = full_pel_vector ? (*pred >> 1) : (*pred);
00014
00015 if(motion_code > 0)
00016 {
00017 vec += ((motion_code - 1) << r_size) + motion_r + 1;
00018 if(vec >= lim) vec -= lim + lim;
00019 }
00020 else
00021 if(motion_code < 0)
00022 {
00023 vec -= ((-motion_code - 1) << r_size) + motion_r + 1;
00024 if(vec < -lim) vec += lim + lim;
00025 }
00026 *pred = full_pel_vector ? (vec << 1) : vec;
00027 }
00028
00029
00030
00031
00032
00033
00034 void mpeg3video_calc_dmv(mpeg3video_t *video,
00035 int DMV[][2],
00036 int *dmvector,
00037 int mvx,
00038 int mvy)
00039 {
00040 if(video->pict_struct == FRAME_PICTURE)
00041 {
00042 if(video->topfirst)
00043 {
00044
00045 DMV[0][0] = ((mvx + (mvx>0)) >> 1) + dmvector[0];
00046 DMV[0][1] = ((mvy + (mvy>0)) >> 1) + dmvector[1] - 1;
00047
00048
00049 DMV[1][0] = ((3 * mvx + (mvx > 0)) >> 1) + dmvector[0];
00050 DMV[1][1] = ((3 * mvy + (mvy > 0)) >> 1) + dmvector[1] + 1;
00051 }
00052 else
00053 {
00054
00055 DMV[0][0] = ((3 * mvx + (mvx>0)) >> 1) + dmvector[0];
00056 DMV[0][1] = ((3 * mvy + (mvy>0)) >> 1) + dmvector[1] - 1;
00057
00058
00059 DMV[1][0] = ((mvx + (mvx>0)) >> 1) + dmvector[0];
00060 DMV[1][1] = ((mvy + (mvy>0)) >> 1) + dmvector[1] + 1;
00061 }
00062 }
00063 else
00064 {
00065
00066 DMV[0][0] = ((mvx + (mvx > 0)) >> 1) + dmvector[0];
00067 DMV[0][1] = ((mvy + (mvy > 0)) >> 1) + dmvector[1];
00068
00069
00070 if(video->pict_struct == TOP_FIELD)
00071 DMV[0][1]--;
00072 else
00073 DMV[0][1]++;
00074 }
00075 }
00076
00077 int mpeg3video_get_mv(mpeg3_slice_t *slice)
00078 {
00079 int code;
00080 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00081
00082 if(mpeg3slice_getbit(slice_buffer))
00083 {
00084 return 0;
00085 }
00086
00087 if((code = mpeg3slice_showbits9(slice_buffer)) >= 64)
00088 {
00089 code >>= 6;
00090 mpeg3slice_flushbits(slice_buffer, mpeg3_MVtab0[code].len);
00091 return mpeg3slice_getbit(slice_buffer) ? -mpeg3_MVtab0[code].val : mpeg3_MVtab0[code].val;
00092 }
00093
00094 if(code >= 24)
00095 {
00096 code >>= 3;
00097 mpeg3slice_flushbits(slice_buffer, mpeg3_MVtab1[code].len);
00098 return mpeg3slice_getbit(slice_buffer) ? -mpeg3_MVtab1[code].val : mpeg3_MVtab1[code].val;
00099 }
00100
00101 if((code -= 12) < 0)
00102 {
00103
00104 slice->fault = 1;
00105 return 1;
00106 }
00107
00108 mpeg3slice_flushbits(slice_buffer, mpeg3_MVtab2[code].len);
00109 return mpeg3slice_getbit(slice_buffer) ? -mpeg3_MVtab2[code].val : mpeg3_MVtab2[code].val;
00110 }
00111
00112
00113
00114 int mpeg3video_get_dmv(mpeg3_slice_t *slice)
00115 {
00116 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00117 if(mpeg3slice_getbit(slice_buffer))
00118 {
00119 return mpeg3slice_getbit(slice_buffer) ? -1 : 1;
00120 }
00121 else
00122 {
00123 return 0;
00124 }
00125 }
00126
00127
00128
00129
00130
00131 void mpeg3video_motion_vector(mpeg3_slice_t *slice,
00132 mpeg3video_t *video,
00133 int *PMV,
00134 int *dmvector,
00135 int h_r_size,
00136 int v_r_size,
00137 int dmv,
00138 int mvscale,
00139 int full_pel_vector)
00140 {
00141 int motion_r;
00142 int motion_code = mpeg3video_get_mv(slice);
00143 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00144
00145 if(slice->fault) return;
00146 motion_r = (h_r_size != 0 && motion_code != 0) ? mpeg3slice_getbits(slice_buffer, h_r_size) : 0;
00147
00148 mpeg3video_calc_mv(&PMV[0], h_r_size, motion_code, motion_r, full_pel_vector);
00149
00150 if(dmv) dmvector[0] = mpeg3video_get_dmv(slice);
00151
00152 motion_code = mpeg3video_get_mv(slice);
00153 if(slice->fault) return;
00154 motion_r = (v_r_size != 0 && motion_code != 0) ? mpeg3slice_getbits(slice_buffer, v_r_size) : 0;
00155
00156
00157 if(mvscale) PMV[1] >>= 1;
00158
00159 mpeg3video_calc_mv(&PMV[1], v_r_size, motion_code, motion_r, full_pel_vector);
00160
00161 if(mvscale) PMV[1] <<= 1;
00162 if(dmv) dmvector[1] = mpeg3video_get_dmv(slice);
00163 }
00164
00165 int mpeg3video_motion_vectors(mpeg3_slice_t *slice,
00166 mpeg3video_t *video,
00167 int PMV[2][2][2],
00168 int dmvector[2],
00169 int mv_field_sel[2][2],
00170 int s,
00171 int mv_count,
00172 int mv_format,
00173 int h_r_size,
00174 int v_r_size,
00175 int dmv,
00176 int mvscale)
00177 {
00178 int result = 0;
00179 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00180 if(mv_count == 1)
00181 {
00182 if(mv_format == MV_FIELD && !dmv)
00183 {
00184 mv_field_sel[1][s] = mv_field_sel[0][s] = mpeg3slice_getbit(slice_buffer);
00185 }
00186
00187 mpeg3video_motion_vector(slice,
00188 video,
00189 PMV[0][s],
00190 dmvector,
00191 h_r_size,
00192 v_r_size,
00193 dmv,
00194 mvscale,
00195 0);
00196 if(slice->fault) return 1;
00197
00198
00199 PMV[1][s][0] = PMV[0][s][0];
00200 PMV[1][s][1] = PMV[0][s][1];
00201 }
00202 else
00203 {
00204 mv_field_sel[0][s] = mpeg3slice_getbit(slice_buffer);
00205 mpeg3video_motion_vector(slice,
00206 video,
00207 PMV[0][s],
00208 dmvector,
00209 h_r_size,
00210 v_r_size,
00211 dmv,
00212 mvscale,
00213 0);
00214 if(slice->fault) return 1;
00215
00216 mv_field_sel[1][s] = mpeg3slice_getbit(slice_buffer);
00217 mpeg3video_motion_vector(slice,
00218 video,
00219 PMV[1][s],
00220 dmvector,
00221 h_r_size,
00222 v_r_size,
00223 dmv,
00224 mvscale,
00225 0);
00226 if(slice->fault) return 1;
00227 }
00228 return 0;
00229 }