00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "contributors.h"
00018
00019 #include <limits.h>
00020
00021 #include "global.h"
00022 #include "image.h"
00023 #include "img_chroma.h"
00024
00025
00026
00027
00028
00029
00030
00031
00032 static void generateChroma00( int size_x_minus1, int size_y_minus1, imgpel **wImgDst, imgpel **imgUV)
00033 {
00034 int i, j;
00035 int jpad = 0;
00036 static imgpel *wBufDst;
00037 static imgpel *wBufSrc0;
00038
00039 wBufDst = wImgDst[jpad++];
00040 wBufSrc0 = imgUV[0];
00041
00042 for (i = -img_pad_size_uv_x; i < 0; i++)
00043 {
00044 *(wBufDst++) = *wBufSrc0;
00045 }
00046
00047 memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
00048 wBufDst += size_x_minus1;
00049 wBufSrc0 += size_x_minus1;
00050
00051 for (i = 0; i < img_pad_size_uv_x; i++)
00052 {
00053 *(wBufDst++) = *wBufSrc0;
00054 }
00055
00056 for (j = -img_pad_size_uv_y; j < -1; j++, jpad++)
00057 {
00058 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00059 }
00060
00061 for (j = 0; j < size_y_minus1; j++)
00062 {
00063 wBufDst = wImgDst[jpad++];
00064 wBufSrc0 = imgUV[j ];
00065
00066 for (i = -img_pad_size_uv_x; i < 0; i++)
00067 {
00068 *(wBufDst++) = *wBufSrc0;
00069 }
00070
00071 memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
00072 wBufDst += size_x_minus1;
00073 wBufSrc0 += size_x_minus1;
00074
00075 for (i = 0; i < img_pad_size_uv_x; i++)
00076 {
00077 *(wBufDst++) = *wBufSrc0;
00078 }
00079 }
00080
00081 wBufDst = wImgDst[jpad++];
00082 wBufSrc0 = imgUV[size_y_minus1];
00083
00084 for (i = -img_pad_size_uv_x; i < 0; i++)
00085 {
00086 *(wBufDst++) = *wBufSrc0;
00087 }
00088
00089 memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
00090 wBufDst += size_x_minus1;
00091 wBufSrc0 += size_x_minus1;
00092
00093 for (i = 0; i < img_pad_size_uv_x; i++)
00094 {
00095 *(wBufDst++) = *wBufSrc0;
00096 }
00097
00098 for (j = 1; j < img_pad_size_uv_y; j++, jpad++)
00099 {
00100 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00101 }
00102 }
00103
00104
00105
00106
00107
00108
00109
00110 static void generateChroma01( int size_x_minus1, int size_y_minus1, int weight00, int weight01, imgpel **wImgDst, imgpel **imgUV)
00111 {
00112 int i, j;
00113 int jpad = 0;
00114 int cur_value;
00115 static imgpel *wBufDst;
00116 static imgpel *wBufSrc0;
00117
00118 wBufDst = wImgDst[jpad++];
00119 wBufSrc0 = imgUV[0];
00120
00121 for (i = -img_pad_size_uv_x; i < 0; i++)
00122 {
00123 *(wBufDst++) = *wBufSrc0;
00124 }
00125
00126 for (i = 0; i < size_x_minus1; i++)
00127 {
00128 cur_value = weight00 * (*wBufSrc0++);
00129 cur_value += weight01 * (*wBufSrc0 );
00130 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00131 }
00132
00133 for (i = 0; i < img_pad_size_uv_x; i++)
00134 {
00135 *(wBufDst++) = *wBufSrc0;
00136 }
00137
00138 for (j = -img_pad_size_uv_y; j < -1; j++, jpad++)
00139 {
00140 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00141 }
00142
00143 for (j = 0; j < size_y_minus1; j++)
00144 {
00145 wBufDst = wImgDst[jpad++];
00146 wBufSrc0 = imgUV[j ];
00147
00148 for (i = -img_pad_size_uv_x; i < 0; i++)
00149 {
00150 *(wBufDst++) = *wBufSrc0;
00151 }
00152
00153 for (i = 0; i < size_x_minus1; i++)
00154 {
00155 cur_value = weight00 * (*wBufSrc0++);
00156 cur_value += weight01 * (*wBufSrc0 );
00157 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00158 }
00159
00160 for (i = 0; i < img_pad_size_uv_x; i++)
00161 {
00162 *(wBufDst++) = *wBufSrc0;
00163 }
00164 }
00165
00166 wBufDst = wImgDst[jpad++];
00167 wBufSrc0 = imgUV[size_y_minus1];
00168
00169 for (i = -img_pad_size_uv_x; i < 0; i++)
00170 {
00171 *(wBufDst++) = *wBufSrc0;
00172 }
00173
00174 for (i = 0; i < size_x_minus1; i++)
00175 {
00176 cur_value = weight00 * (*wBufSrc0++);
00177 cur_value += weight01 * (*wBufSrc0 );
00178 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00179 }
00180
00181 for (i = 0; i < img_pad_size_uv_x; i++)
00182 {
00183 *(wBufDst++) = *wBufSrc0;
00184 }
00185
00186 for (j = 1; j < img_pad_size_uv_y; j++, jpad++)
00187 {
00188 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00189 }
00190 }
00191
00192
00193
00194
00195
00196
00197
00198 static void generateChroma10( int size_x_minus1, int size_y_minus1, int weight00, int weight10, imgpel **wImgDst, imgpel **imgUV)
00199 {
00200 int i, j;
00201 int jpad = 0;
00202 int cur_value;
00203 static imgpel *wBufDst;
00204 static imgpel *wBufSrc0, *wBufSrc1;
00205
00206 wBufDst = wImgDst[jpad++];
00207 wBufSrc0 = imgUV[0];
00208
00209
00210 for (i = -img_pad_size_uv_x; i < 0; i++)
00211 {
00212 *(wBufDst++) = *wBufSrc0;
00213 }
00214
00215 memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
00216 wBufDst += size_x_minus1;
00217 wBufSrc0 += size_x_minus1;
00218
00219 for (i = 0; i < img_pad_size_uv_x; i++)
00220 {
00221 *(wBufDst++) = *wBufSrc0;
00222 }
00223
00224 for (j = -img_pad_size_uv_y; j < -1; j++, jpad++)
00225 {
00226 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00227 }
00228
00229 for (j = 0; j < size_y_minus1; j++)
00230 {
00231 wBufDst = wImgDst[jpad++];
00232 wBufSrc0 = imgUV[j ];
00233 wBufSrc1 = imgUV[j + 1];
00234
00235 cur_value = rshift_rnd_sf(weight00 * (*wBufSrc0) + weight10 * (*wBufSrc1), 6 );
00236 for (i = -img_pad_size_uv_x; i < 0; i++)
00237 {
00238 *(wBufDst++) = (imgpel) cur_value;
00239 }
00240
00241 for (i = 0; i < size_x_minus1; i++)
00242 {
00243 cur_value = weight00 * (*wBufSrc0++) + weight10 * (*wBufSrc1++);
00244 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00245 }
00246
00247 cur_value = rshift_rnd_sf(weight00 * (*wBufSrc0) + weight10 * (*wBufSrc1), 6 );
00248 for (i = 0; i < img_pad_size_uv_x; i++)
00249 {
00250 *(wBufDst++) = (imgpel) cur_value;
00251 }
00252 }
00253
00254 wBufDst = wImgDst[jpad++];
00255 wBufSrc0 = imgUV[size_y_minus1];
00256
00257 for (i = -img_pad_size_uv_x; i < 0; i++)
00258 {
00259 *(wBufDst++) = *wBufSrc0;
00260 }
00261
00262 memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
00263 wBufDst += size_x_minus1;
00264 wBufSrc0 += size_x_minus1;
00265
00266 for (i = 0; i < img_pad_size_uv_x; i++)
00267 {
00268 *(wBufDst++) = *wBufSrc0;
00269 }
00270
00271 for (j = 1; j < img_pad_size_uv_y; j++, jpad++)
00272 {
00273 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00274 }
00275 }
00276
00277
00278
00279
00280
00281
00282
00283 static void generateChromaXX( int size_x_minus1, int size_y_minus1, int weight00, int weight01, int weight10, int weight11, imgpel **wImgDst, imgpel **imgUV)
00284 {
00285 int i, j;
00286 int jpad = 0;
00287 int cur_value;
00288 static imgpel *wBufDst;
00289 static imgpel *wBufSrc0, *wBufSrc1;
00290 int weight0001 = weight00 + weight01;
00291 int weight1011 = weight10 + weight11;
00292 int weight0010 = weight00 + weight10;
00293 int weight0111 = weight01 + weight11;
00294
00295 wBufDst = wImgDst[jpad++];
00296 wBufSrc0 = imgUV[0];
00297
00298 for (i = -img_pad_size_uv_x; i < 0; i++)
00299 {
00300 *(wBufDst++) = *wBufSrc0;
00301 }
00302
00303 for (i = 0; i < size_x_minus1; i++)
00304 {
00305 cur_value = weight0010 * (*wBufSrc0++);
00306 cur_value += weight0111 * (*wBufSrc0 );
00307 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00308 }
00309
00310 for (i = 0; i < img_pad_size_uv_x; i++)
00311 {
00312 *(wBufDst++) = *wBufSrc0;
00313 }
00314
00315 for (j = -img_pad_size_uv_y; j < -1; j++, jpad++)
00316 {
00317 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00318 }
00319
00320 for (j = 0; j < size_y_minus1; j++)
00321 {
00322 wBufDst = wImgDst[jpad++];
00323 wBufSrc0 = imgUV[j ];
00324 wBufSrc1 = imgUV[j + 1];
00325
00326 cur_value = rshift_rnd_sf(weight0001 * (*wBufSrc0) + weight1011 * (*wBufSrc1), 6 );
00327 for (i = -img_pad_size_uv_x; i < 0; i++)
00328 {
00329 *(wBufDst++) = (imgpel) cur_value;
00330 }
00331
00332 for (i = 0; i < size_x_minus1; i++)
00333 {
00334 cur_value = weight00 * (*wBufSrc0++) + weight10 * (*wBufSrc1++);
00335 cur_value += weight01 * (*wBufSrc0 ) + weight11 * (*wBufSrc1 );
00336 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00337 }
00338
00339 cur_value = rshift_rnd_sf(weight0001 * (*wBufSrc0) + weight1011 * (*wBufSrc1), 6 );
00340 for (i = 0; i < img_pad_size_uv_x; i++)
00341 {
00342 *(wBufDst++) = (imgpel) cur_value;
00343 }
00344 }
00345
00346 wBufDst = wImgDst[jpad++];
00347 wBufSrc0 = imgUV[size_y_minus1];
00348
00349 for (i = -img_pad_size_uv_x; i < 0; i++)
00350 {
00351 *(wBufDst++) = *wBufSrc0;
00352 }
00353
00354 for (i = 0; i < size_x_minus1; i++)
00355 {
00356 cur_value = weight0010 * (*wBufSrc0++);
00357 cur_value += weight0111 * (*wBufSrc0 );
00358 *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
00359 }
00360
00361 for (i = 0; i < img_pad_size_uv_x; i++)
00362 {
00363 *(wBufDst++) = *wBufSrc0;
00364 }
00365
00366 for (j = 1; j < img_pad_size_uv_y; j++, jpad++)
00367 {
00368 memcpy(wImgDst[jpad], wImgDst[jpad - 1], (2 * img_pad_size_uv_x + size_x_minus1) * sizeof(imgpel));
00369 }
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 void getSubImagesChroma( StorablePicture *s )
00385 {
00386 int uv, k, l, m;
00387 int weight00, weight01, weight10, weight11;
00388 int subimages_y, subimages_x, subx, suby;
00389 int size_x_minus1, size_y_minus1;
00390
00391
00392 int mul_x, mul_y;
00393 int mm, kk;
00394
00395 size_x_minus1 = s->size_x_cr - 1;
00396 size_y_minus1 = s->size_y_cr - 1;
00397
00398 if ( img->yuv_format == YUV420 )
00399 {
00400 subimages_x = 8;
00401 subimages_y = 8;
00402 mul_x = mul_y = 1;
00403 }
00404 else if ( img->yuv_format == YUV422 )
00405 {
00406 subimages_x = 8;
00407 subimages_y = 4;
00408 mul_y = 2;
00409 mul_x = 1;
00410 }
00411 else
00412 {
00413 subimages_x = 4;
00414 subimages_y = 4;
00415 mul_x = mul_y = 2;
00416 }
00417
00418
00419 for ( uv = 0; uv < 2; uv++ )
00420 {
00421 for ( suby = 0, k = 0; suby < subimages_y; suby++, k += mul_y )
00422 {
00423 m = (8 - k);
00424 mm = m << 3;
00425 kk = k << 3;
00426 for ( subx = 0, l = 0; subx < subimages_x; subx++, l += mul_x )
00427 {
00428 weight01 = m * l;
00429 weight00 = mm - weight01;
00430 weight11 = k * l;
00431 weight10 = kk - weight11;
00432
00433
00434 if (weight01 == 0 && weight10 == 0 && weight11 == 0)
00435 {
00436 generateChroma00( size_x_minus1, size_y_minus1, s->imgUV_sub[uv][suby][subx], s->imgUV[uv]);
00437 }
00438 else if (weight10 == 0 && weight11 == 0)
00439 {
00440 generateChroma01( size_x_minus1, size_y_minus1, weight00, weight01, s->imgUV_sub[uv][suby][subx], s->imgUV[uv]);
00441 }
00442 else if (weight01 == 0 && weight11 == 0)
00443 {
00444 generateChroma10( size_x_minus1, size_y_minus1, weight00, weight10, s->imgUV_sub[uv][suby][subx], s->imgUV[uv]);
00445 }
00446 else
00447 {
00448 generateChromaXX( size_x_minus1, size_y_minus1, weight00, weight01, weight10, weight11, s->imgUV_sub[uv][suby][subx], s->imgUV[uv]);
00449 }
00450 }
00451 }
00452 }
00453 }
00454