00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "contributors.h"
00017
00018 #include <limits.h>
00019
00020 #include "global.h"
00021 #include "image.h"
00022 #include "img_luma.h"
00023 #include "memalloc.h"
00024
00025 const int ONE_FOURTH_TAP[2][3] =
00026 {
00027 {20, -5, 1},
00028 {20,-4, 0},
00029 };
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 void getSubImagesLuma( StorablePicture *s )
00043 {
00044 imgpel **p_curr_img = s->p_curr_img;
00045 imgpel ****cImgSub = s->p_curr_img_sub;
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 getSubImageInteger( s, cImgSub[0][0], p_curr_img);
00057
00058
00059
00060
00061
00062 getHorSubImageSixTap( s, cImgSub[0][2], cImgSub[0][0] );
00063
00064
00065
00066 getVerSubImageSixTap( s, cImgSub[2][0], cImgSub[0][0]);
00067
00068
00069
00070 getVerSubImageSixTapTmp( s, cImgSub[2][2], cImgSub[0][2]);
00071
00072
00073
00074
00075 getSubImageBiLinear ( s, cImgSub[0][1], cImgSub[0][0], cImgSub[0][2]);
00076
00077 getSubImageBiLinear ( s, cImgSub[1][0], cImgSub[0][0], cImgSub[2][0]);
00078
00079 getSubImageBiLinear ( s, cImgSub[1][1], cImgSub[0][2], cImgSub[2][0]);
00080
00081 getSubImageBiLinear ( s, cImgSub[1][2], cImgSub[0][2], cImgSub[2][2]);
00082
00083 getSubImageBiLinear ( s, cImgSub[2][1], cImgSub[2][0], cImgSub[2][2]);
00084
00085
00086 getHorSubImageBiLinear ( s, cImgSub[0][3], cImgSub[0][2], cImgSub[0][0]);
00087
00088 getHorSubImageBiLinear ( s, cImgSub[1][3], cImgSub[0][2], cImgSub[2][0]);
00089
00090 getHorSubImageBiLinear ( s, cImgSub[2][3], cImgSub[2][2], cImgSub[2][0]);
00091
00092
00093 getVerSubImageBiLinear ( s, cImgSub[3][0], cImgSub[2][0], cImgSub[0][0]);
00094
00095 getVerSubImageBiLinear ( s, cImgSub[3][1], cImgSub[2][0], cImgSub[0][2]);
00096
00097 getVerSubImageBiLinear ( s, cImgSub[3][2], cImgSub[2][2], cImgSub[0][2]);
00098
00099
00100 getDiagSubImageBiLinear( s, cImgSub[3][3], cImgSub[0][2], cImgSub[2][0]);
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 void getSubImageInteger( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
00118 {
00119 int i, j;
00120 int size_x_minus1 = s->size_x - 1;
00121
00122 static imgpel *wBufSrc, *wBufDst;
00123
00124
00125 wBufDst = &( dstImg[0][0] );
00126 wBufSrc = srcImg[0];
00127
00128 for (i = 0; i < IMG_PAD_SIZE; i++)
00129 *(wBufDst++) = wBufSrc[0];
00130
00131 memcpy(wBufDst, wBufSrc, s->size_x * sizeof(imgpel));
00132 wBufDst += s->size_x;
00133
00134 for (i = 0; i < IMG_PAD_SIZE; i++)
00135 *(wBufDst++) = wBufSrc[size_x_minus1];
00136
00137
00138 for (j = 1; j < IMG_PAD_SIZE + 1; j++)
00139 {
00140 memcpy(dstImg[j], dstImg[j - 1], s->size_x_padded * sizeof(imgpel));
00141 }
00142
00143 for (j = 1; j < s->size_y; j++)
00144 {
00145 wBufDst = &( dstImg[j + IMG_PAD_SIZE][0] );
00146 wBufSrc = srcImg[j];
00147
00148 for (i = 0; i < IMG_PAD_SIZE; i++)
00149 *(wBufDst++) = wBufSrc[0];
00150
00151 memcpy(wBufDst, wBufSrc, s->size_x * sizeof(imgpel));
00152 wBufDst += s->size_x;
00153
00154 for (i = 0; i < IMG_PAD_SIZE; i++)
00155 *(wBufDst++) = wBufSrc[size_x_minus1];
00156 }
00157
00158
00159 for (j = s->size_y + IMG_PAD_SIZE; j < s->size_y_padded; j++)
00160 {
00161 memcpy(dstImg[j], dstImg[j - 1], s->size_x_padded * sizeof(imgpel));
00162 }
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 void getHorSubImageSixTap( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
00179 {
00180 int is, jpad, ipad;
00181 int ypadded_size = s->size_y_padded;
00182 int xpadded_size = s->size_x_padded;
00183
00184 static imgpel *wBufSrc, *wBufDst;
00185 static imgpel *srcImgA, *srcImgB, *srcImgC, *srcImgD, *srcImgE, *srcImgF;
00186 static int *iBufDst;
00187 const int tap0 = ONE_FOURTH_TAP[0][0];
00188 const int tap1 = ONE_FOURTH_TAP[0][1];
00189 const int tap2 = ONE_FOURTH_TAP[0][2];
00190
00191 for (jpad = 0; jpad < ypadded_size; jpad++)
00192 {
00193 wBufSrc = srcImg[jpad];
00194 wBufDst = dstImg[jpad];
00195 iBufDst = imgY_sub_tmp[jpad];
00196
00197 srcImgA = &wBufSrc[0];
00198 srcImgB = &wBufSrc[0];
00199 srcImgC = &wBufSrc[0];
00200 srcImgD = &wBufSrc[1];
00201 srcImgE = &wBufSrc[2];
00202 srcImgF = &wBufSrc[3];
00203
00204
00205 is =
00206 (tap0 * (*srcImgA++ + *srcImgD++) +
00207 tap1 * (*srcImgB + *srcImgE++) +
00208 tap2 * (*srcImgC + *srcImgF++));
00209
00210 *iBufDst++ = is;
00211 *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00212
00213 is =
00214 (tap0 * (*srcImgA++ + *srcImgD++) +
00215 tap1 * (*srcImgB++ + *srcImgE++) +
00216 tap2 * (*srcImgC + *srcImgF++));
00217
00218 *iBufDst++ = is;
00219 *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00220
00221
00222 for (ipad = 2; ipad < xpadded_size - 4; ipad++)
00223 {
00224 is =
00225 (tap0 * (*srcImgA++ + *srcImgD++) +
00226 tap1 * (*srcImgB++ + *srcImgE++) +
00227 tap2 * (*srcImgC++ + *srcImgF++));
00228
00229 *iBufDst++ = is;
00230 *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00231 }
00232
00233 is = (
00234 tap0 * (*srcImgA++ + *srcImgD++) +
00235 tap1 * (*srcImgB++ + *srcImgE++) +
00236 tap2 * (*srcImgC++ + *srcImgF ));
00237
00238 *iBufDst++ = is;
00239 *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00240
00241
00242 is = (
00243 tap0 * (*srcImgA++ + *srcImgD++) +
00244 tap1 * (*srcImgB++ + *srcImgE) +
00245 tap2 * (*srcImgC++ + *srcImgF));
00246
00247 *iBufDst++ = is;
00248 *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00249
00250 is = (
00251 tap0 * (*srcImgA++ + *srcImgD) +
00252 tap1 * (*srcImgB++ + *srcImgE) +
00253 tap2 * (*srcImgC++ + *srcImgF));
00254
00255 *iBufDst++ = is;
00256 *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00257
00258 is = (
00259 tap0 * (*srcImgA + *srcImgD) +
00260 tap1 * (*srcImgB + *srcImgE) +
00261 tap2 * (*srcImgC + *srcImgF));
00262
00263 *iBufDst = is;
00264 *wBufDst = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00265
00266 }
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 void getVerSubImageSixTap( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
00284 {
00285 int is, jpad, ipad;
00286 int ypadded_size = s->size_y_padded;
00287 int xpadded_size = s->size_x_padded;
00288 int maxy = ypadded_size - 1;
00289
00290 static imgpel *wxLineDst;
00291 static imgpel *srcImgA, *srcImgB, *srcImgC, *srcImgD, *srcImgE, *srcImgF;
00292 const int tap0 = ONE_FOURTH_TAP[0][0];
00293 const int tap1 = ONE_FOURTH_TAP[0][1];
00294 const int tap2 = ONE_FOURTH_TAP[0][2];
00295
00296
00297
00298 for (jpad = 0; jpad < 2; jpad++)
00299 {
00300 wxLineDst = dstImg[jpad];
00301 srcImgA = srcImg[jpad ];
00302 srcImgB = srcImg[0];
00303 srcImgC = srcImg[0];
00304 srcImgD = srcImg[jpad + 1];
00305 srcImgE = srcImg[jpad + 2];
00306 srcImgF = srcImg[jpad + 3];
00307 for (ipad = 0; ipad < xpadded_size; ipad++)
00308 {
00309 is =
00310 (tap0 * (*srcImgA++ + *srcImgD++) +
00311 tap1 * (*srcImgB++ + *srcImgE++) +
00312 tap2 * (*srcImgC++ + *srcImgF++));
00313
00314 wxLineDst[ipad] = (imgpel) iClip1 (img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00315 }
00316 }
00317
00318 for (jpad = 2; jpad < ypadded_size - 3; jpad++)
00319 {
00320 wxLineDst = dstImg[jpad];
00321 srcImgA = srcImg[jpad ];
00322 srcImgB = srcImg[jpad - 1];
00323 srcImgC = srcImg[jpad - 2];
00324 srcImgD = srcImg[jpad + 1];
00325 srcImgE = srcImg[jpad + 2];
00326 srcImgF = srcImg[jpad + 3];
00327 for (ipad = 0; ipad < xpadded_size; ipad++)
00328 {
00329 is =
00330 (tap0 * (*srcImgA++ + *srcImgD++) +
00331 tap1 * (*srcImgB++ + *srcImgE++) +
00332 tap2 * (*srcImgC++ + *srcImgF++));
00333
00334 wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00335 }
00336 }
00337
00338
00339 for (jpad = ypadded_size - 3; jpad < ypadded_size; jpad++)
00340 {
00341 wxLineDst = dstImg[jpad];
00342 srcImgA = srcImg[jpad ];
00343 srcImgB = srcImg[jpad - 1];
00344 srcImgC = srcImg[jpad - 2];
00345 srcImgD = srcImg[imin (maxy, jpad + 1)];
00346 srcImgE = srcImg[maxy];
00347 srcImgF = srcImg[maxy];
00348 for (ipad = 0; ipad < xpadded_size; ipad++)
00349 {
00350 is =
00351 (tap0 * (*srcImgA++ + *srcImgD++) +
00352 tap1 * (*srcImgB++ + *srcImgE++) +
00353 tap2 * (*srcImgC++ + *srcImgF++));
00354
00355 wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
00356 }
00357 }
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 void getVerSubImageSixTapTmp( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
00374 {
00375 int is, jpad, ipad;
00376 int ypadded_size = s->size_y_padded;
00377 int xpadded_size = s->size_x_padded;
00378 int maxy = ypadded_size - 1;
00379
00380 static imgpel *wxLineDst;
00381 static int *srcImgA, *srcImgB, *srcImgC, *srcImgD, *srcImgE, *srcImgF;
00382 const int tap0 = ONE_FOURTH_TAP[0][0];
00383 const int tap1 = ONE_FOURTH_TAP[0][1];
00384 const int tap2 = ONE_FOURTH_TAP[0][2];
00385
00386
00387 for (jpad = 0; jpad < 2; jpad++)
00388 {
00389 wxLineDst = dstImg[jpad];
00390 srcImgA = imgY_sub_tmp[jpad ];
00391 srcImgB = imgY_sub_tmp[0];
00392 srcImgC = imgY_sub_tmp[0];
00393 srcImgD = imgY_sub_tmp[jpad + 1];
00394 srcImgE = imgY_sub_tmp[jpad + 2];
00395 srcImgF = imgY_sub_tmp[jpad + 3];
00396
00397 for (ipad = 0; ipad < xpadded_size; ipad++)
00398 {
00399 is =
00400 (tap0 * (*srcImgA++ + *srcImgD++) +
00401 tap1 * (*srcImgB++ + *srcImgE++) +
00402 tap2 * (*srcImgC++ + *srcImgF++));
00403
00404 wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 10 ) );
00405 }
00406 }
00407
00408
00409 for (jpad = 2; jpad < ypadded_size - 3; jpad++)
00410 {
00411 wxLineDst = dstImg[jpad];
00412 srcImgA = imgY_sub_tmp[jpad ];
00413 srcImgB = imgY_sub_tmp[jpad - 1];
00414 srcImgC = imgY_sub_tmp[jpad - 2];
00415 srcImgD = imgY_sub_tmp[jpad + 1];
00416 srcImgE = imgY_sub_tmp[jpad + 2];
00417 srcImgF = imgY_sub_tmp[jpad + 3];
00418 for (ipad = 0; ipad < xpadded_size; ipad++)
00419 {
00420 is =
00421 (tap0 * (*srcImgA++ + *srcImgD++) +
00422 tap1 * (*srcImgB++ + *srcImgE++) +
00423 tap2 * (*srcImgC++ + *srcImgF++));
00424
00425 wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 10 ) );
00426 }
00427 }
00428
00429
00430 for (jpad = ypadded_size - 3; jpad < ypadded_size; jpad++)
00431 {
00432 wxLineDst = dstImg[jpad];
00433 srcImgA = imgY_sub_tmp[jpad ];
00434 srcImgB = imgY_sub_tmp[jpad - 1];
00435 srcImgC = imgY_sub_tmp[jpad - 2];
00436 srcImgD = imgY_sub_tmp[imin (maxy, jpad + 1)];
00437 srcImgE = imgY_sub_tmp[maxy];
00438 srcImgF = imgY_sub_tmp[maxy];
00439 for (ipad = 0; ipad < xpadded_size; ipad++)
00440 {
00441 is =
00442 (tap0 * (*srcImgA++ + *srcImgD++) +
00443 tap1 * (*srcImgB++ + *srcImgE++) +
00444 tap2 * (*srcImgC++ + *srcImgF++));
00445
00446 wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 10 ) );
00447 }
00448 }
00449 }
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466 void getSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgL, imgpel **srcImgR)
00467 {
00468 int jpad, ipad;
00469 int ypadded_size = s->size_y_padded;
00470 int xpadded_size = s->size_x_padded;
00471
00472 static imgpel *wBufSrcL, *wBufSrcR, *wBufDst;
00473
00474 for (jpad = 0; jpad < ypadded_size; jpad++)
00475 {
00476 wBufSrcL = srcImgL[jpad];
00477 wBufSrcR = srcImgR[jpad];
00478 wBufDst = dstImg[jpad];
00479
00480 for (ipad = 0; ipad < xpadded_size; ipad++)
00481 {
00482 *wBufDst++ = (imgpel) rshift_rnd_sf( *wBufSrcL++ + *wBufSrcR++, 1 );
00483 }
00484 }
00485 }
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503 void getHorSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgL, imgpel **srcImgR)
00504 {
00505 int jpad, ipad;
00506 int ypadded_size = s->size_y_padded;
00507 int xpadded_size = s->size_x_padded - 1;
00508
00509 static imgpel *wBufSrcL, *wBufSrcR, *wBufDst;
00510
00511 for (jpad = 0; jpad < ypadded_size; jpad++)
00512 {
00513 wBufSrcL = srcImgL[jpad];
00514 wBufSrcR = &srcImgR[jpad][1];
00515 wBufDst = dstImg[jpad];
00516
00517
00518 for (ipad = 0; ipad < xpadded_size; ipad++)
00519 {
00520 *wBufDst++ = (imgpel) rshift_rnd_sf( *wBufSrcL++ + *wBufSrcR++, 1 );
00521 }
00522
00523 *wBufDst++ = (imgpel) rshift_rnd_sf( *wBufSrcL++ + wBufSrcR[-1], 1 );
00524 }
00525 }
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543 void getVerSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgT, imgpel **srcImgB)
00544 {
00545 int jpad, ipad;
00546 int ypadded_size = s->size_y_padded - 1;
00547 int xpadded_size = s->size_x_padded;
00548
00549 static imgpel *wBufSrcT, *wBufSrcB, *wBufDst;
00550
00551
00552 for (jpad = 0; jpad < ypadded_size; jpad++)
00553 {
00554 wBufSrcT = srcImgT[jpad];
00555 wBufDst = dstImg[jpad];
00556 wBufSrcB = srcImgB[jpad + 1];
00557
00558 for (ipad = 0; ipad < xpadded_size; ipad++)
00559 {
00560 *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcT++ + *wBufSrcB++, 1);
00561 }
00562 }
00563
00564 wBufSrcT = srcImgT[ypadded_size];
00565 wBufDst = dstImg[ypadded_size];
00566 wBufSrcB = srcImgB[ypadded_size];
00567
00568 for (ipad = 0; ipad < xpadded_size; ipad++)
00569 {
00570 *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcT++ + *wBufSrcB++, 1);
00571 }
00572 }
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590 void getDiagSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgT, imgpel **srcImgB )
00591 {
00592 int jpad, ipad;
00593 int maxx = s->size_x_padded - 1;
00594 int maxy = s->size_y_padded - 1;
00595
00596 static imgpel *wBufSrcL, *wBufSrcR, *wBufDst;
00597
00598 for (jpad = 0; jpad < maxy; jpad++)
00599 {
00600 wBufSrcL = srcImgT[jpad + 1];
00601 wBufSrcR = &srcImgB[jpad][1];
00602 wBufDst = dstImg[jpad];
00603
00604 for (ipad = 0; ipad < maxx; ipad++)
00605 {
00606 *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + *wBufSrcR++, 1);
00607 }
00608
00609 *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + wBufSrcR[-1], 1);
00610 }
00611
00612 wBufSrcL = srcImgT[maxy];
00613 wBufSrcR = &srcImgB[maxy][1];
00614 wBufDst = dstImg[maxy];
00615
00616 for (ipad = 0; ipad < maxx; ipad++)
00617 {
00618 *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + *wBufSrcR++, 1);
00619 }
00620
00621 *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + wBufSrcR[-1], 1);
00622 }
00623
00624