00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "contributors.h"
00011
00012 #include <math.h>
00013 #include <float.h>
00014
00015 #include "global.h"
00016 #include "image.h"
00017 #include "fmo.h"
00018 #include "macroblock.h"
00019 #include "mb_access.h"
00020 #include "ratectl.h"
00021 #include "rdoq.h"
00022 #include "mv-search.h"
00023
00024 #define RDOQ_BASE 0
00025
00026 const int estErr4x4[6][4][4] =
00027 {
00028 {
00029 {25600, 27040, 25600, 27040},
00030 {27040, 25600, 27040, 25600},
00031 {25600, 27040, 25600, 27040},
00032 {27040, 25600, 27040, 25600}
00033 },
00034 {
00035 {30976, 31360, 30976, 31360},
00036 {31360, 32400, 31360, 32400},
00037 {30976, 31360, 30976, 31360},
00038 {31360, 32400, 31360, 32400}
00039 },
00040 {
00041 {43264, 40960, 43264, 40960},
00042 {40960, 40000, 40960, 40000},
00043 {43264, 40960, 43264, 40960},
00044 {40960, 40000, 40960, 40000}
00045 },
00046 {
00047 {50176, 51840, 50176, 51840},
00048 {51840, 52900, 51840, 52900},
00049 {50176, 51840, 50176, 51840},
00050 {51840, 52900, 51840, 52900}
00051 },
00052 {
00053 {65536, 64000, 65536, 64000},
00054 {64000, 62500, 64000, 62500},
00055 {65536, 64000, 65536, 64000},
00056 {64000, 62500, 64000, 62500}
00057 },
00058 {
00059 {82944, 84640, 82944, 84640},
00060 {84640, 84100, 84640, 84100},
00061 {82944, 84640, 82944, 84640},
00062 {84640, 84100, 84640, 84100}
00063 }
00064 };
00065
00066 const int estErr8x8[6][8][8]={
00067 {
00068 {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
00069 {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
00070 {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
00071 {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
00072 {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
00073 {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
00074 {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
00075 {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}
00076 },
00077 {
00078 {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
00079 {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
00080 {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
00081 {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
00082 {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
00083 {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
00084 {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
00085 {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}
00086 },
00087 {
00088 {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
00089 {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
00090 {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
00091 {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
00092 {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
00093 {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
00094 {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
00095 {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}
00096 },
00097 {
00098 {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
00099 {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
00100 {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
00101 {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
00102 {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
00103 {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
00104 {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
00105 {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}
00106 },
00107 {
00108 {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
00109 {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
00110 {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
00111 {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
00112 {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
00113 {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
00114 {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
00115 {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}
00116 },
00117 {
00118 {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
00119 {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
00120 {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
00121 {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
00122 {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
00123 {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
00124 {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
00125 {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}
00126 }
00127 };
00128
00129 double norm_factor_4x4;
00130 double norm_factor_8x8;
00131
00132
00133
00134
00135
00136
00137
00138
00139 void init_rdoq_slice(int slice_type, int symbol_mode)
00140 {
00141
00142
00143 norm_factor_4x4 = pow(2, (2 * DQ_BITS + 19));
00144 norm_factor_8x8 = pow(2, (2 * Q_BITS_8 + 9));
00145 }
00146
00147
00148
00149
00150
00151
00152 int init_trellis_data_DC_cr_CAVLC(int **tblock, int qp_per, int qp_rem,
00153 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00154 levelDataStruct *dataLevel)
00155 {
00156 int i, j, coeff_ctr, end_coeff_ctr = img->num_cdc_coeff;
00157 static int *m7;
00158 int q_bits = Q_BITS + qp_per + 1;
00159 int q_offset = ( 1 << (q_bits - 1) );
00160 double err;
00161 int level, lowerInt, k;
00162 double estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4;
00163
00164 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00165 {
00166 j = *p_scan++;
00167 i = *p_scan++;
00168
00169 m7 = &tblock[j][i];
00170 if (*m7 == 0)
00171 {
00172 dataLevel->levelDouble = 0;
00173 dataLevel->level[0] = 0;
00174 dataLevel->noLevels = 1;
00175 err = 0.0;
00176 dataLevel->errLevel[0] = 0.0;
00177 dataLevel->pre_level = 0;
00178 dataLevel->sign = 0;
00179 }
00180 else
00181 {
00182 dataLevel->levelDouble = iabs(*m7 * levelscale);
00183 level = (dataLevel->levelDouble >> q_bits);
00184
00185 lowerInt=( ((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
00186 dataLevel->level[0] = 0;
00187 if (level == 0 && lowerInt == 1)
00188 {
00189 dataLevel->noLevels = 1;
00190 }
00191 else if (level == 0 && lowerInt == 0)
00192 {
00193 dataLevel->level[1] = level + 1;
00194 dataLevel->noLevels = 2;
00195 }
00196 else if (level > 0 && lowerInt == 1)
00197 {
00198 dataLevel->level[1] = level;
00199 dataLevel->noLevels = 2;
00200 }
00201 else
00202 {
00203 dataLevel->level[1] = level;
00204 dataLevel->level[2] = level + 1;
00205 dataLevel->noLevels = 3;
00206 }
00207
00208 for (k = 0; k < dataLevel->noLevels; k++)
00209 {
00210 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00211 dataLevel->errLevel[k] = (err * err * estErr);
00212 }
00213
00214 if(dataLevel->noLevels == 1)
00215 dataLevel->pre_level = 0;
00216 else
00217 dataLevel->pre_level = (iabs (*m7) * levelscale + leveloffset) >> q_bits;
00218 dataLevel->sign = isign(*m7);
00219 }
00220 dataLevel++;
00221 }
00222 return 0;
00223 }
00224
00225
00226
00227
00228
00229
00230
00231
00232 int init_trellis_data_DC_cr_CABAC(int **tblock, int qp_per, int qp_rem,
00233 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00234 levelDataStruct *dataLevel, int* kStart, int* kStop)
00235 {
00236 int noCoeff = 0;
00237 int i, j, coeff_ctr, end_coeff_ctr = img->num_cdc_coeff;
00238 static int *m7;
00239 int q_bits = Q_BITS + qp_per + 1;
00240 int q_offset = ( 1 << (q_bits - 1) );
00241 double err;
00242 int level, lowerInt, k;
00243 double estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4;
00244
00245 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00246 {
00247 j = *p_scan++;
00248 i = *p_scan++;
00249
00250 m7 = &tblock[j][i];
00251 if (*m7 == 0)
00252 {
00253 dataLevel->levelDouble = 0;
00254 dataLevel->level[0] = 0;
00255 dataLevel->noLevels = 1;
00256 err = 0.0;
00257 dataLevel->errLevel[0] = 0.0;
00258 }
00259 else
00260 {
00261 dataLevel->levelDouble = iabs(*m7 * levelscale);
00262 level = (dataLevel->levelDouble >> q_bits);
00263
00264 lowerInt=( ((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
00265 dataLevel->level[0] = 0;
00266 if (level == 0 && lowerInt == 1)
00267 {
00268 dataLevel->noLevels = 1;
00269 }
00270 else if (level == 0 && lowerInt == 0)
00271 {
00272 dataLevel->level[1] = level + 1;
00273 dataLevel->noLevels = 2;
00274 *kStop = coeff_ctr;
00275 noCoeff++;
00276 }
00277 else if (level > 0 && lowerInt == 1)
00278 {
00279 dataLevel->level[1] = level;
00280 dataLevel->noLevels = 2;
00281 *kStop = coeff_ctr;
00282 noCoeff++;
00283 }
00284 else
00285 {
00286 dataLevel->level[1] = level;
00287 dataLevel->level[2] = level + 1;
00288 dataLevel->noLevels = 3;
00289 *kStop = coeff_ctr;
00290 *kStart = coeff_ctr;
00291 noCoeff++;
00292 }
00293
00294 for (k = 0; k < dataLevel->noLevels; k++)
00295 {
00296 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00297 dataLevel->errLevel[k] = (err * err * estErr);
00298 }
00299 }
00300 dataLevel++;
00301 }
00302 return (noCoeff);
00303 }
00304
00305 void trellis_mp(Slice *currSlice, Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
00306 {
00307 int masterQP = 0, deltaQP;
00308 int qp_left, qp_up;
00309 #if RDOQ_BASE
00310 const int deltaQPTabB[] = {0, 1, -1, 2, 3, -2, 4, 5, -3};
00311 const int deltaQPTabP[] = {0, -1, 1, -2, 2, -3, 3, -4, 4};
00312 #endif
00313 int deltaQPCnt;
00314 int qp_anchor;
00315 int prev_mb = FmoGetPreviousMBNr(img->current_mb_nr);
00316 int qp_offset = (img->type == B_SLICE) ? (params->RDOQ_QP_Num / 3): (params->RDOQ_QP_Num >> 1);
00317
00318 masterQP = img->masterQP = img->qp;
00319 Motion_Selected = 0;
00320 rddata_trellis_best.min_rdcost = 1e30;
00321
00322 if (params->symbol_mode == CABAC)
00323 {
00324 estRunLevel_CABAC(currSlice, currMB, LUMA_4x4);
00325 estRunLevel_CABAC(currSlice, currMB, LUMA_16AC);
00326 estRunLevel_CABAC(currSlice, currMB, LUMA_16DC);
00327 if (params->Transform8x8Mode)
00328 estRunLevel_CABAC(currSlice, currMB, LUMA_8x8);
00329 if (img->yuv_format != YUV400)
00330 {
00331 estRunLevel_CABAC(currSlice, currMB, CHROMA_AC);
00332 if (img->yuv_format == YUV420)
00333 estRunLevel_CABAC(currSlice, currMB, CHROMA_DC);
00334 else
00335 estRunLevel_CABAC(currSlice, currMB, CHROMA_DC_2x4);
00336 }
00337 }
00338
00339 qp_left = (currMB->mb_available_left) ? currMB->mb_available_left->qp : img->masterQP;
00340 qp_up = (currMB->mb_available_up) ? currMB->mb_available_up->qp : img->masterQP;
00341 qp_anchor = (qp_left + qp_up + 1)>>1;
00342
00343 for (deltaQPCnt=0; deltaQPCnt < params->RDOQ_QP_Num; deltaQPCnt++)
00344 {
00345 rdopt = &rddata_trellis_curr;
00346 #if RDOQ_BASE
00347 if (img->type == B_SLICE)
00348 deltaQP = deltaQPTabB[deltaQPCnt];
00349 else
00350 deltaQP = deltaQPTabP[deltaQPCnt];
00351 #else
00352
00353
00354
00355 if (deltaQPCnt == 0)
00356 deltaQP = 0;
00357 else if (deltaQPCnt <= qp_offset)
00358 deltaQP = deltaQPCnt - 1 - qp_offset;
00359 else
00360 deltaQP = deltaQPCnt - qp_offset;
00361
00362 #endif
00363
00364 img->qp = iClip3(-img->bitdepth_luma_qp_scale, 51, masterQP + deltaQP);
00365 deltaQP = masterQP - img->qp;
00366
00367 #if 0
00368 if(deltaQP != 0 && !(img->qp - qp_anchor >= -2 && img->qp - qp_anchor <= 1) && currMB->mb_available_left && currMB->mb_available_up && img->type == P_SLICE)
00369 continue;
00370 if(deltaQP != 0 && !(img->qp - qp_anchor >= -1 && img->qp - qp_anchor <= 2) && currMB->mb_available_left && currMB->mb_available_up && img->type == B_SLICE)
00371 continue;
00372 #endif
00373
00374 reset_macroblock(img, currMB, prev_mb);
00375 currMB->qp = img->qp;
00376 currMB->delta_qp = currMB->qp - currMB->prev_qp;
00377 update_qp (img, currMB);
00378
00379 encode_one_macroblock (currSlice, currMB);
00380
00381 if ( rddata_trellis_curr.min_rdcost < rddata_trellis_best.min_rdcost)
00382 copy_rddata_trellis(&rddata_trellis_best, rdopt);
00383
00384 if (params->RDOQ_CP_MV)
00385 Motion_Selected = 1;
00386
00387 #if (!RDOQ_BASE)
00388 if (params->RDOQ_Fast)
00389 {
00390 if ((img->qp - rddata_trellis_best.qp > 1))
00391 break;
00392 if ((rddata_trellis_curr.cbp == 0) && (rddata_trellis_curr.mb_type != 0))
00393 break;
00394 if ((rddata_trellis_best.mb_type == 0) && (rddata_trellis_best.cbp == 0))
00395 break;
00396 }
00397 #endif
00398 }
00399
00400 reset_macroblock(img, currMB, prev_mb);
00401 rdopt = &rddata_trellis_best;
00402
00403 copy_rdopt_data (currMB, FALSE);
00404 write_macroblock (img, currSlice, currMB, 1, prev_recode_mb);
00405 img->qp = masterQP;
00406 }
00407
00408 void trellis_sp(Slice *currSlice, Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
00409 {
00410 img->masterQP = img->qp;
00411
00412 if (params->symbol_mode == CABAC)
00413 {
00414 estRunLevel_CABAC(currSlice, currMB, LUMA_4x4);
00415 estRunLevel_CABAC(currSlice, currMB, LUMA_16AC);
00416
00417 estRunLevel_CABAC(currSlice, currMB, LUMA_16DC);
00418 if (params->Transform8x8Mode)
00419 estRunLevel_CABAC(currSlice, currMB, LUMA_8x8);
00420
00421 if (img->yuv_format != YUV400)
00422 {
00423 estRunLevel_CABAC(currSlice, currMB, CHROMA_AC);
00424
00425 if (img->yuv_format == YUV420)
00426 estRunLevel_CABAC(currSlice, currMB, CHROMA_DC);
00427 else
00428 estRunLevel_CABAC(currSlice, currMB, CHROMA_DC_2x4);
00429 }
00430 }
00431
00432 encode_one_macroblock (currSlice, currMB);
00433
00434 write_macroblock (img, currSlice, currMB, 1, prev_recode_mb);
00435 }
00436
00437 void trellis_coding(Slice *currSlice, Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
00438 {
00439 if (params->RDOQ_QP_Num > 1)
00440 {
00441 trellis_mp(currSlice, currMB, CurrentMbAddr, prev_recode_mb);
00442 }
00443 else
00444 {
00445 trellis_sp(currSlice, currMB, CurrentMbAddr, prev_recode_mb);
00446 }
00447 }
00448
00449
00450 void RDOQ_update_mode(RD_PARAMS *enc_mb, int bslice)
00451 {
00452 int i;
00453 for(i=0; i<MAXMODE; i++)
00454 enc_mb->valid[i] = 0;
00455
00456 enc_mb->valid[rdopt->mb_type] = 1;
00457
00458 if(rdopt->mb_type == P8x8)
00459 {
00460 enc_mb->valid[4] = (params->InterSearch[bslice][4]);
00461 enc_mb->valid[5] = (params->InterSearch[bslice][5] && !(params->Transform8x8Mode==2));
00462 enc_mb->valid[6] = (params->InterSearch[bslice][6] && !(params->Transform8x8Mode==2));
00463 enc_mb->valid[7] = (params->InterSearch[bslice][7] && !(params->Transform8x8Mode==2));
00464 }
00465 }
00466
00467 void copy_rddata_trellis (RD_DATA *dest, RD_DATA *src)
00468 {
00469 int j;
00470
00471 dest->min_rdcost = src->min_rdcost;
00472 dest->min_dcost = src->min_dcost;
00473
00474 memcpy(&dest->rec_mbY[0][0],&src->rec_mbY[0][0], MB_PIXELS * sizeof(imgpel));
00475
00476 if (img->yuv_format != YUV400)
00477 {
00478
00479 memcpy(&dest->rec_mb_cr[0][0][0],&src->rec_mb_cr[0][0][0], 2 * MB_PIXELS * sizeof(imgpel));
00480 }
00481
00482 memcpy(&dest->cofAC[0][0][0][0], &src->cofAC[0][0][0][0], (4 + img->num_blk8x8_uv) * 4 * 2 * 65 * sizeof(int));
00483 memcpy(&dest->cofDC[0][0][0], &src->cofDC[0][0][0], 3 * 2 * 18 * sizeof(int));
00484
00485 dest->mb_type = src->mb_type;
00486 memcpy(dest->b8mode, src->b8mode, BLOCK_MULTIPLE * sizeof(short));
00487 memcpy(dest->b8pdir, src->b8pdir, BLOCK_MULTIPLE * sizeof(short));
00488 dest->cbp = src->cbp;
00489 dest->mode = src->mode;
00490 dest->i16offset = src->i16offset;
00491 dest->c_ipred_mode = src->c_ipred_mode;
00492 dest->luma_transform_size_8x8_flag = src->luma_transform_size_8x8_flag;
00493 dest->NoMbPartLessThan8x8Flag = src->NoMbPartLessThan8x8Flag;
00494 dest->qp = src->qp;
00495
00496 dest->prev_qp = src->prev_qp;
00497 dest->prev_dqp = src->prev_dqp;
00498 dest->delta_qp = src->delta_qp;
00499 dest->prev_cbp = src->prev_cbp;
00500 dest->cbp_blk = src->cbp_blk;
00501
00502
00503 if (img->type != I_SLICE)
00504 {
00505
00506 memcpy(&dest->all_mv [0][0][0][0][0][0], &src->all_mv [0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));
00507 }
00508
00509 memcpy(dest->intra_pred_modes,src->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
00510 memcpy(dest->intra_pred_modes8x8,src->intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
00511 for(j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
00512 memcpy(&dest->ipredmode[j][img->block_x],&src->ipredmode[j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
00513
00514 memcpy(&dest->refar[LIST_0][0][0], &src->refar[LIST_0][0][0], 2 * BLOCK_MULTIPLE * BLOCK_MULTIPLE * sizeof(char));
00515 }
00516
00517 void updateMV_mp(int *m_cost, short ref, int list, int h, int v, int blocktype, int *lambda_factor, int block8x8)
00518 {
00519 int i, j;
00520 int bsx = params->blc_size[blocktype][0];
00521 int bsy = params->blc_size[blocktype][1];
00522 short all_mv[2];
00523 Macroblock *currMB = &img->mb_data[img->current_mb_nr];
00524 if ( (params->Transform8x8Mode == 1) && (blocktype == 4) && currMB->luma_transform_size_8x8_flag)
00525 {
00526 all_mv[0] = tmp_mv8[list][ref][v][h][0];
00527 all_mv[1] = tmp_mv8[list][ref][v][h][1];
00528 *m_cost = motion_cost8[list][ref][block8x8];
00529 }
00530 else
00531 {
00532 all_mv[0] = rddata_trellis_best.all_mv[list][ref][blocktype][v][h][0];
00533 all_mv[1] = rddata_trellis_best.all_mv[list][ref][blocktype][v][h][1];
00534 }
00535
00536 for (j = 0; j < (bsy>>2); j++)
00537 {
00538 for (i = 0; i < (bsx>>2); i++)
00539 memcpy(img->all_mv[list][ref][blocktype][v+j][h+i], all_mv, 2 * sizeof(short));
00540 }
00541
00542
00543
00544
00545
00546
00547
00548
00549 }
00550
00551
00552