Ticket #143: yuv422p_to_rgb.patch
| File yuv422p_to_rgb.patch, 12.8 KB (added by peter_b, 2 years ago) |
|---|
-
libswscale/yuv2rgb.c
104 104 int srcSliceH, uint8_t* dst[], int dstStride[]) \ 105 105 {\ 106 106 int y;\ 107 int vshift = c->srcFormat == PIX_FMT_YUV420P;\ 107 108 \ 108 if (!alpha && c->srcFormat == PIX_FMT_YUV422P) {\ 109 srcStride[1] *= 2;\ 110 srcStride[2] *= 2;\ 111 }\ 112 for (y=0; y<srcSliceH; y+=2) {\ 109 for (y=0; y<srcSliceH; y++) {\ 113 110 dst_type *dst_1 = (dst_type*)(dst[0] + (y+srcSliceY )*dstStride[0]);\ 114 dst_type *dst_2 = (dst_type*)(dst[0] + (y+srcSliceY+1)*dstStride[0]);\115 111 dst_type av_unused *r, *b;\ 116 112 dst_type *g;\ 117 113 const uint8_t *py_1 = src[0] + y*srcStride[0];\ 118 const uint8_t *py_2 = py_1 + srcStride[0];\ 119 const uint8_t *pu = src[1] + (y>>1)*srcStride[1];\ 120 const uint8_t *pv = src[2] + (y>>1)*srcStride[2];\ 121 const uint8_t av_unused *pa_1, *pa_2;\ 114 const uint8_t *pu = src[1] + (y>>vshift)*srcStride[1];\ 115 const uint8_t *pv = src[2] + (y>>vshift)*srcStride[2];\ 116 const uint8_t av_unused *pa_1;\ 122 117 unsigned int h_size = c->dstW>>3;\ 123 118 if (alpha) {\ 124 119 pa_1 = src[3] + y*srcStride[3];\ 125 pa_2 = pa_1 + srcStride[3];\126 120 }\ 127 121 while (h_size--) {\ 128 122 int av_unused U, V;\ … … 132 126 pu += 4;\ 133 127 pv += 4;\ 134 128 py_1 += 8;\ 135 py_2 += 8;\136 129 dst_1 += dst_delta;\ 137 dst_2 += dst_delta;\138 130 }\ 139 131 if (c->dstW & 4) {\ 140 132 int av_unused Y, U, V;\ … … 152 144 YUV2RGBFUNC(yuv2rgb_c_48, uint8_t, 0) 153 145 LOADCHROMA(0); 154 146 PUTRGB48(dst_1,py_1,0); 155 PUTRGB48(dst_2,py_2,0);156 147 157 148 LOADCHROMA(1); 158 PUTRGB48(dst_2,py_2,1);159 149 PUTRGB48(dst_1,py_1,1); 160 150 161 151 LOADCHROMA(2); 162 152 PUTRGB48(dst_1,py_1,2); 163 PUTRGB48(dst_2,py_2,2);164 153 165 154 LOADCHROMA(3); 166 PUTRGB48(dst_2,py_2,3);167 155 PUTRGB48(dst_1,py_1,3); 168 156 ENDYUV2RGBLINE(48) 169 157 LOADCHROMA(0); 170 158 PUTRGB48(dst_1,py_1,0); 171 PUTRGB48(dst_2,py_2,0);172 159 173 160 LOADCHROMA(1); 174 PUTRGB48(dst_2,py_2,1);175 161 PUTRGB48(dst_1,py_1,1); 176 162 ENDYUV2RGBFUNC() 177 163 178 164 YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0) 179 165 LOADCHROMA(0); 180 166 PUTRGB(dst_1,py_1,0); 181 PUTRGB(dst_2,py_2,0);182 167 183 168 LOADCHROMA(1); 184 PUTRGB(dst_2,py_2,1);185 169 PUTRGB(dst_1,py_1,1); 186 170 187 171 LOADCHROMA(2); 188 172 PUTRGB(dst_1,py_1,2); 189 PUTRGB(dst_2,py_2,2);190 173 191 174 LOADCHROMA(3); 192 PUTRGB(dst_2,py_2,3);193 175 PUTRGB(dst_1,py_1,3); 194 176 ENDYUV2RGBLINE(8) 195 177 LOADCHROMA(0); 196 178 PUTRGB(dst_1,py_1,0); 197 PUTRGB(dst_2,py_2,0);198 179 199 180 LOADCHROMA(1); 200 PUTRGB(dst_2,py_2,1);201 181 PUTRGB(dst_1,py_1,1); 202 182 ENDYUV2RGBFUNC() 203 183 204 184 YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1) 205 185 LOADCHROMA(0); 206 186 PUTRGBA(dst_1,py_1,pa_1,0,24); 207 PUTRGBA(dst_2,py_2,pa_2,0,24);208 187 209 188 LOADCHROMA(1); 210 PUTRGBA(dst_2,py_2,pa_1,1,24); 211 PUTRGBA(dst_1,py_1,pa_2,1,24); 189 PUTRGBA(dst_1,py_1,pa_1,1,24); 212 190 213 191 LOADCHROMA(2); 214 192 PUTRGBA(dst_1,py_1,pa_1,2,24); 215 PUTRGBA(dst_2,py_2,pa_2,2,24);216 193 217 194 LOADCHROMA(3); 218 PUTRGBA(dst_2,py_2,pa_1,3,24); 219 PUTRGBA(dst_1,py_1,pa_2,3,24); 195 PUTRGBA(dst_1,py_1,pa_1,3,24); 220 196 pa_1 += 8;\ 221 pa_2 += 8;\222 197 ENDYUV2RGBLINE(8) 223 198 LOADCHROMA(0); 224 199 PUTRGBA(dst_1,py_1,pa_1,0,24); 225 PUTRGBA(dst_2,py_2,pa_2,0,24);226 200 227 201 LOADCHROMA(1); 228 PUTRGBA(dst_2,py_2,pa_1,1,24); 229 PUTRGBA(dst_1,py_1,pa_2,1,24); 202 PUTRGBA(dst_1,py_1,pa_1,1,24); 230 203 ENDYUV2RGBFUNC() 231 204 232 205 YUV2RGBFUNC(yuva2argb_c, uint32_t, 1) 233 206 LOADCHROMA(0); 234 207 PUTRGBA(dst_1,py_1,pa_1,0,0); 235 PUTRGBA(dst_2,py_2,pa_2,0,0);236 208 237 209 LOADCHROMA(1); 238 PUTRGBA(dst_2,py_2,pa_2,1,0);239 210 PUTRGBA(dst_1,py_1,pa_1,1,0); 240 211 241 212 LOADCHROMA(2); 242 213 PUTRGBA(dst_1,py_1,pa_1,2,0); 243 PUTRGBA(dst_2,py_2,pa_2,2,0);244 214 245 215 LOADCHROMA(3); 246 PUTRGBA(dst_2,py_2,pa_2,3,0);247 216 PUTRGBA(dst_1,py_1,pa_1,3,0); 248 217 pa_1 += 8;\ 249 pa_2 += 8;\250 218 ENDYUV2RGBLINE(8) 251 219 LOADCHROMA(0); 252 220 PUTRGBA(dst_1,py_1,pa_1,0,0); 253 PUTRGBA(dst_2,py_2,pa_2,0,0);254 221 255 222 LOADCHROMA(1); 256 PUTRGBA(dst_2,py_2,pa_2,1,0);257 223 PUTRGBA(dst_1,py_1,pa_1,1,0); 258 224 ENDYUV2RGBFUNC() 259 225 260 226 YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0) 261 227 LOADCHROMA(0); 262 228 PUTRGB24(dst_1,py_1,0); 263 PUTRGB24(dst_2,py_2,0);264 229 265 230 LOADCHROMA(1); 266 PUTRGB24(dst_2,py_2,1);267 231 PUTRGB24(dst_1,py_1,1); 268 232 269 233 LOADCHROMA(2); 270 234 PUTRGB24(dst_1,py_1,2); 271 PUTRGB24(dst_2,py_2,2);272 235 273 236 LOADCHROMA(3); 274 PUTRGB24(dst_2,py_2,3);275 237 PUTRGB24(dst_1,py_1,3); 276 238 ENDYUV2RGBLINE(24) 277 239 LOADCHROMA(0); 278 240 PUTRGB24(dst_1,py_1,0); 279 PUTRGB24(dst_2,py_2,0);280 241 281 242 LOADCHROMA(1); 282 PUTRGB24(dst_2,py_2,1);283 243 PUTRGB24(dst_1,py_1,1); 284 244 ENDYUV2RGBFUNC() 285 245 … … 287 247 YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t, 0) 288 248 LOADCHROMA(0); 289 249 PUTBGR24(dst_1,py_1,0); 290 PUTBGR24(dst_2,py_2,0);291 250 292 251 LOADCHROMA(1); 293 PUTBGR24(dst_2,py_2,1);294 252 PUTBGR24(dst_1,py_1,1); 295 253 296 254 LOADCHROMA(2); 297 255 PUTBGR24(dst_1,py_1,2); 298 PUTBGR24(dst_2,py_2,2);299 256 300 257 LOADCHROMA(3); 301 PUTBGR24(dst_2,py_2,3);302 258 PUTBGR24(dst_1,py_1,3); 303 259 ENDYUV2RGBLINE(24) 304 260 LOADCHROMA(0); 305 261 PUTBGR24(dst_1,py_1,0); 306 PUTBGR24(dst_2,py_2,0);307 262 308 263 LOADCHROMA(1); 309 PUTBGR24(dst_2,py_2,1);310 264 PUTBGR24(dst_1,py_1,1); 311 265 ENDYUV2RGBFUNC() 312 266 313 267 // This is exactly the same code as yuv2rgb_c_32 except for the types of 314 // r, g, b, dst_1 , dst_2268 // r, g, b, dst_1 315 269 YUV2RGBFUNC(yuv2rgb_c_16, uint16_t, 0) 316 270 LOADCHROMA(0); 317 271 PUTRGB(dst_1,py_1,0); 318 PUTRGB(dst_2,py_2,0);319 272 320 273 LOADCHROMA(1); 321 PUTRGB(dst_2,py_2,1);322 274 PUTRGB(dst_1,py_1,1); 323 275 324 276 LOADCHROMA(2); 325 277 PUTRGB(dst_1,py_1,2); 326 PUTRGB(dst_2,py_2,2);327 278 328 279 LOADCHROMA(3); 329 PUTRGB(dst_2,py_2,3);330 280 PUTRGB(dst_1,py_1,3); 331 281 CLOSEYUV2RGBFUNC(8) 332 282 333 283 #if 0 // Currently unused 334 284 // This is exactly the same code as yuv2rgb_c_32 except for the types of 335 // r, g, b, dst_1 , dst_2285 // r, g, b, dst_1 336 286 YUV2RGBFUNC(yuv2rgb_c_8, uint8_t, 0) 337 287 LOADCHROMA(0); 338 288 PUTRGB(dst_1,py_1,0); 339 PUTRGB(dst_2,py_2,0);340 289 341 290 LOADCHROMA(1); 342 PUTRGB(dst_2,py_2,1);343 291 PUTRGB(dst_1,py_1,1); 344 292 345 293 LOADCHROMA(2); 346 294 PUTRGB(dst_1,py_1,2); 347 PUTRGB(dst_2,py_2,2);348 295 349 296 LOADCHROMA(3); 350 PUTRGB(dst_2,py_2,3);351 297 PUTRGB(dst_1,py_1,3); 352 298 CLOSEYUV2RGBFUNC(8) 353 299 #endif 354 300 355 // r, g, b, dst_1 , dst_2301 // r, g, b, dst_1 356 302 YUV2RGBFUNC(yuv2rgb_c_12_ordered_dither, uint16_t, 0) 357 303 const uint8_t *d16 = dither_4x4_16[y&3]; 358 304 #define PUTRGB12(dst,src,i,o) \ … … 363 309 364 310 LOADCHROMA(0); 365 311 PUTRGB12(dst_1,py_1,0,0); 366 PUTRGB12(dst_2,py_2,0,0+8);367 312 368 313 LOADCHROMA(1); 369 PUTRGB12(dst_2,py_2,1,2+8);370 314 PUTRGB12(dst_1,py_1,1,2); 371 315 372 316 LOADCHROMA(2); 373 317 PUTRGB12(dst_1,py_1,2,4); 374 PUTRGB12(dst_2,py_2,2,4+8);375 318 376 319 LOADCHROMA(3); 377 PUTRGB12(dst_2,py_2,3,6+8);378 320 PUTRGB12(dst_1,py_1,3,6); 379 321 CLOSEYUV2RGBFUNC(8) 380 322 381 // r, g, b, dst_1 , dst_2323 // r, g, b, dst_1 382 324 YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0) 383 325 const uint8_t *d32 = dither_8x8_32[y&7]; 384 326 const uint8_t *d64 = dither_8x8_73[y&7]; … … 390 332 391 333 LOADCHROMA(0); 392 334 PUTRGB8(dst_1,py_1,0,0); 393 PUTRGB8(dst_2,py_2,0,0+8);394 335 395 336 LOADCHROMA(1); 396 PUTRGB8(dst_2,py_2,1,2+8);397 337 PUTRGB8(dst_1,py_1,1,2); 398 338 399 339 LOADCHROMA(2); 400 340 PUTRGB8(dst_1,py_1,2,4); 401 PUTRGB8(dst_2,py_2,2,4+8);402 341 403 342 LOADCHROMA(3); 404 PUTRGB8(dst_2,py_2,3,6+8);405 343 PUTRGB8(dst_1,py_1,3,6); 406 344 CLOSEYUV2RGBFUNC(8) 407 345 … … 449 387 450 388 LOADCHROMA(0); 451 389 PUTRGB4D(dst_1,py_1,0,0); 452 PUTRGB4D(dst_2,py_2,0,0+8);453 390 454 391 LOADCHROMA(1); 455 PUTRGB4D(dst_2,py_2,1,2+8);456 392 PUTRGB4D(dst_1,py_1,1,2); 457 393 458 394 LOADCHROMA(2); 459 395 PUTRGB4D(dst_1,py_1,2,4); 460 PUTRGB4D(dst_2,py_2,2,4+8);461 396 462 397 LOADCHROMA(3); 463 PUTRGB4D(dst_2,py_2,3,6+8);464 398 PUTRGB4D(dst_1,py_1,3,6); 465 399 CLOSEYUV2RGBFUNC(4) 466 400 467 401 #if 0 // Currently unused 468 402 // This is exactly the same code as yuv2rgb_c_32 except for the types of 469 // r, g, b, dst_1 , dst_2403 // r, g, b, dst_1 470 404 YUV2RGBFUNC(yuv2rgb_c_4b, uint8_t, 0) 471 405 LOADCHROMA(0); 472 406 PUTRGB(dst_1,py_1,0); 473 PUTRGB(dst_2,py_2,0);474 407 475 408 LOADCHROMA(1); 476 PUTRGB(dst_2,py_2,1);477 409 PUTRGB(dst_1,py_1,1); 478 410 479 411 LOADCHROMA(2); 480 412 PUTRGB(dst_1,py_1,2); 481 PUTRGB(dst_2,py_2,2);482 413 483 414 LOADCHROMA(3); 484 PUTRGB(dst_2,py_2,3);485 415 PUTRGB(dst_1,py_1,3); 486 416 CLOSEYUV2RGBFUNC(8) 487 417 #endif … … 498 428 499 429 LOADCHROMA(0); 500 430 PUTRGB4DB(dst_1,py_1,0,0); 501 PUTRGB4DB(dst_2,py_2,0,0+8);502 431 503 432 LOADCHROMA(1); 504 PUTRGB4DB(dst_2,py_2,1,2+8);505 433 PUTRGB4DB(dst_1,py_1,1,2); 506 434 507 435 LOADCHROMA(2); 508 436 PUTRGB4DB(dst_1,py_1,2,4); 509 PUTRGB4DB(dst_2,py_2,2,4+8);510 437 511 438 LOADCHROMA(3); 512 PUTRGB4DB(dst_2,py_2,3,6+8);513 439 PUTRGB4DB(dst_1,py_1,3,6); 514 440 CLOSEYUV2RGBFUNC(8) 515 441 516 442 YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0) 517 443 const uint8_t *d128 = dither_8x8_220[y&7]; 518 char out_1 = 0 , out_2 = 0;444 char out_1 = 0; 519 445 g= c->table_gU[128] + c->table_gV[128]; 520 446 521 447 #define PUTRGB1(out,src,i,o) \ … … 525 451 out+= out + g[Y+d128[1+o]]; 526 452 527 453 PUTRGB1(out_1,py_1,0,0); 528 PUTRGB1(out_2,py_2,0,0+8);529 454 530 PUTRGB1(out_2,py_2,1,2+8);531 455 PUTRGB1(out_1,py_1,1,2); 532 456 533 457 PUTRGB1(out_1,py_1,2,4); 534 PUTRGB1(out_2,py_2,2,4+8);535 458 536 PUTRGB1(out_2,py_2,3,6+8);537 459 PUTRGB1(out_1,py_1,3,6); 538 460 539 461 dst_1[0]= out_1; 540 dst_2[0]= out_2;541 462 CLOSEYUV2RGBFUNC(1) 542 463 543 464 SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) 544 465 { 545 466 SwsFunc t = NULL; 546 467 #if HAVE_MMX 547 t = ff_yuv2rgb_init_mmx(c);468 t = ff_yuv2rgb_init_mmx(c); 548 469 #endif 549 470 #if HAVE_VIS 550 471 t = ff_yuv2rgb_init_vis(c); -
libswscale/x86/yuv2rgb_template.c
50 50 if (h_size * depth > FFABS(dstStride[0])) \ 51 51 h_size -= 8; \ 52 52 \ 53 if (c->srcFormat == PIX_FMT_YUV422P) { \ 54 srcStride[1] *= 2; \ 55 srcStride[2] *= 2; \ 56 } \ 53 vshift = c->srcFormat == PIX_FMT_YUV420P; \ 57 54 \ 58 55 __asm__ volatile ("pxor %mm4, %mm4\n\t"); \ 59 56 for (y = 0; y < srcSliceH; y++) { \ 60 57 uint8_t *image = dst[0] + (y + srcSliceY) * dstStride[0]; \ 61 58 const uint8_t *py = src[0] + y * srcStride[0]; \ 62 const uint8_t *pu = src[1] + (y >> 1) * srcStride[1]; \63 const uint8_t *pv = src[2] + (y >> 1) * srcStride[2]; \59 const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \ 60 const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \ 64 61 x86_reg index = -h_size / 2; \ 65 62 66 63 #define YUV2RGB_INITIAL_LOAD \ … … 193 190 int srcSliceY, int srcSliceH, 194 191 uint8_t *dst[], int dstStride[]) 195 192 { 196 int y, h_size ;193 int y, h_size, vshift; 197 194 198 195 YUV2RGB_LOOP(2) 199 196 … … 221 218 int srcSliceY, int srcSliceH, 222 219 uint8_t *dst[], int dstStride[]) 223 220 { 224 int y, h_size ;221 int y, h_size, vshift; 225 222 226 223 YUV2RGB_LOOP(2) 227 224 … … 310 307 int srcSliceY, int srcSliceH, 311 308 uint8_t *dst[], int dstStride[]) 312 309 { 313 int y, h_size ;310 int y, h_size, vshift; 314 311 315 312 YUV2RGB_LOOP(3) 316 313 … … 328 325 int srcSliceY, int srcSliceH, 329 326 uint8_t *dst[], int dstStride[]) 330 327 { 331 int y, h_size ;328 int y, h_size, vshift; 332 329 333 330 YUV2RGB_LOOP(3) 334 331 … … 371 368 int srcSliceY, int srcSliceH, 372 369 uint8_t *dst[], int dstStride[]) 373 370 { 374 int y, h_size ;371 int y, h_size, vshift; 375 372 376 373 YUV2RGB_LOOP(4) 377 374 … … 392 389 uint8_t *dst[], int dstStride[]) 393 390 { 394 391 #if HAVE_7REGS 395 int y, h_size ;392 int y, h_size, vshift; 396 393 397 394 YUV2RGB_LOOP(4) 398 395 … … 414 411 int srcSliceY, int srcSliceH, 415 412 uint8_t *dst[], int dstStride[]) 416 413 { 417 int y, h_size ;414 int y, h_size, vshift; 418 415 419 416 YUV2RGB_LOOP(4) 420 417 … … 435 432 uint8_t *dst[], int dstStride[]) 436 433 { 437 434 #if HAVE_7REGS 438 int y, h_size ;435 int y, h_size, vshift; 439 436 440 437 YUV2RGB_LOOP(4) 441 438
