| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/yuv_row.h" | 5 #include "media/base/yuv_row.h" |
| 6 | 6 |
| 7 #ifdef _DEBUG | 7 #ifdef _DEBUG |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #else | 9 #else |
| 10 #define DCHECK(a) | 10 #define DCHECK(a) |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 | 293 |
| 294 asm( | 294 asm( |
| 295 ".global FastConvertYUVToRGB32Row\n" | 295 ".global FastConvertYUVToRGB32Row\n" |
| 296 "FastConvertYUVToRGB32Row:\n" | 296 "FastConvertYUVToRGB32Row:\n" |
| 297 "pusha\n" | 297 "pusha\n" |
| 298 "mov 0x24(%esp),%edx\n" | 298 "mov 0x24(%esp),%edx\n" |
| 299 "mov 0x28(%esp),%edi\n" | 299 "mov 0x28(%esp),%edi\n" |
| 300 "mov 0x2c(%esp),%esi\n" | 300 "mov 0x2c(%esp),%esi\n" |
| 301 "mov 0x30(%esp),%ebp\n" | 301 "mov 0x30(%esp),%ebp\n" |
| 302 "mov 0x34(%esp),%ecx\n" | 302 "mov 0x34(%esp),%ecx\n" |
| 303 "jmp Lconvertend\n" | 303 "jmp convertend\n" |
| 304 | 304 |
| 305 "Lconvertloop:" | 305 "convertloop:" |
| 306 "movzbl (%edi),%eax\n" | 306 "movzbl (%edi),%eax\n" |
| 307 "add $0x1,%edi\n" | 307 "add $0x1,%edi\n" |
| 308 "movzbl (%esi),%ebx\n" | 308 "movzbl (%esi),%ebx\n" |
| 309 "add $0x1,%esi\n" | 309 "add $0x1,%esi\n" |
| 310 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 310 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" |
| 311 "movzbl (%edx),%eax\n" | 311 "movzbl (%edx),%eax\n" |
| 312 "paddsw kCoefficientsRgbV(,%ebx,8),%mm0\n" | 312 "paddsw kCoefficientsRgbV(,%ebx,8),%mm0\n" |
| 313 "movzbl 0x1(%edx),%ebx\n" | 313 "movzbl 0x1(%edx),%ebx\n" |
| 314 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 314 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 315 "add $0x2,%edx\n" | 315 "add $0x2,%edx\n" |
| 316 "movq kCoefficientsRgbY(,%ebx,8),%mm2\n" | 316 "movq kCoefficientsRgbY(,%ebx,8),%mm2\n" |
| 317 "paddsw %mm0,%mm1\n" | 317 "paddsw %mm0,%mm1\n" |
| 318 "paddsw %mm0,%mm2\n" | 318 "paddsw %mm0,%mm2\n" |
| 319 "psraw $0x6,%mm1\n" | 319 "psraw $0x6,%mm1\n" |
| 320 "psraw $0x6,%mm2\n" | 320 "psraw $0x6,%mm2\n" |
| 321 "packuswb %mm2,%mm1\n" | 321 "packuswb %mm2,%mm1\n" |
| 322 "movntq %mm1,0x0(%ebp)\n" | 322 "movntq %mm1,0x0(%ebp)\n" |
| 323 "add $0x8,%ebp\n" | 323 "add $0x8,%ebp\n" |
| 324 "Lconvertend:" | 324 "convertend:" |
| 325 "sub $0x2,%ecx\n" | 325 "sub $0x2,%ecx\n" |
| 326 "jns Lconvertloop\n" | 326 "jns convertloop\n" |
| 327 | 327 |
| 328 "and $0x1,%ecx\n" | 328 "and $0x1,%ecx\n" |
| 329 "je Lconvertdone\n" | 329 "je convertdone\n" |
| 330 | 330 |
| 331 "movzbl (%edi),%eax\n" | 331 "movzbl (%edi),%eax\n" |
| 332 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 332 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" |
| 333 "movzbl (%esi),%eax\n" | 333 "movzbl (%esi),%eax\n" |
| 334 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" | 334 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" |
| 335 "movzbl (%edx),%eax\n" | 335 "movzbl (%edx),%eax\n" |
| 336 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 336 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 337 "paddsw %mm0,%mm1\n" | 337 "paddsw %mm0,%mm1\n" |
| 338 "psraw $0x6,%mm1\n" | 338 "psraw $0x6,%mm1\n" |
| 339 "packuswb %mm1,%mm1\n" | 339 "packuswb %mm1,%mm1\n" |
| 340 "movd %mm1,0x0(%ebp)\n" | 340 "movd %mm1,0x0(%ebp)\n" |
| 341 "Lconvertdone:" | 341 "convertdone:" |
| 342 "popa\n" | 342 "popa\n" |
| 343 "ret\n" | 343 "ret\n" |
| 344 ); | 344 ); |
| 345 | 345 |
| 346 | 346 |
| 347 void ScaleYUVToRGB32Row(const uint8* y_buf, | 347 void ScaleYUVToRGB32Row(const uint8* y_buf, |
| 348 const uint8* u_buf, | 348 const uint8* u_buf, |
| 349 const uint8* v_buf, | 349 const uint8* v_buf, |
| 350 uint8* rgb_buf, | 350 uint8* rgb_buf, |
| 351 int width, | 351 int width, |
| 352 int scaled_dx); | 352 int scaled_dx); |
| 353 | 353 |
| 354 asm( | 354 asm( |
| 355 ".global ScaleYUVToRGB32Row\n" | 355 ".global ScaleYUVToRGB32Row\n" |
| 356 "ScaleYUVToRGB32Row:\n" | 356 "ScaleYUVToRGB32Row:\n" |
| 357 "pusha\n" | 357 "pusha\n" |
| 358 "mov 0x24(%esp),%edx\n" | 358 "mov 0x24(%esp),%edx\n" |
| 359 "mov 0x28(%esp),%edi\n" | 359 "mov 0x28(%esp),%edi\n" |
| 360 "mov 0x2c(%esp),%esi\n" | 360 "mov 0x2c(%esp),%esi\n" |
| 361 "mov 0x30(%esp),%ebp\n" | 361 "mov 0x30(%esp),%ebp\n" |
| 362 "mov 0x34(%esp),%ecx\n" | 362 "mov 0x34(%esp),%ecx\n" |
| 363 "xor %ebx,%ebx\n" | 363 "xor %ebx,%ebx\n" |
| 364 "jmp Lscaleend\n" | 364 "jmp scaleend\n" |
| 365 | 365 |
| 366 "Lscaleloop:" | 366 "scaleloop:" |
| 367 "mov %ebx,%eax\n" | 367 "mov %ebx,%eax\n" |
| 368 "sar $0x5,%eax\n" | 368 "sar $0x5,%eax\n" |
| 369 "movzbl (%edi,%eax,1),%eax\n" | 369 "movzbl (%edi,%eax,1),%eax\n" |
| 370 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 370 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" |
| 371 "mov %ebx,%eax\n" | 371 "mov %ebx,%eax\n" |
| 372 "sar $0x5,%eax\n" | 372 "sar $0x5,%eax\n" |
| 373 "movzbl (%esi,%eax,1),%eax\n" | 373 "movzbl (%esi,%eax,1),%eax\n" |
| 374 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" | 374 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" |
| 375 "mov %ebx,%eax\n" | 375 "mov %ebx,%eax\n" |
| 376 "add 0x38(%esp),%ebx\n" | 376 "add 0x38(%esp),%ebx\n" |
| 377 "sar $0x4,%eax\n" | 377 "sar $0x4,%eax\n" |
| 378 "movzbl (%edx,%eax,1),%eax\n" | 378 "movzbl (%edx,%eax,1),%eax\n" |
| 379 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 379 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 380 "mov %ebx,%eax\n" | 380 "mov %ebx,%eax\n" |
| 381 "add 0x38(%esp),%ebx\n" | 381 "add 0x38(%esp),%ebx\n" |
| 382 "sar $0x4,%eax\n" | 382 "sar $0x4,%eax\n" |
| 383 "movzbl (%edx,%eax,1),%eax\n" | 383 "movzbl (%edx,%eax,1),%eax\n" |
| 384 "movq kCoefficientsRgbY(,%eax,8),%mm2\n" | 384 "movq kCoefficientsRgbY(,%eax,8),%mm2\n" |
| 385 "paddsw %mm0,%mm1\n" | 385 "paddsw %mm0,%mm1\n" |
| 386 "paddsw %mm0,%mm2\n" | 386 "paddsw %mm0,%mm2\n" |
| 387 "psraw $0x6,%mm1\n" | 387 "psraw $0x6,%mm1\n" |
| 388 "psraw $0x6,%mm2\n" | 388 "psraw $0x6,%mm2\n" |
| 389 "packuswb %mm2,%mm1\n" | 389 "packuswb %mm2,%mm1\n" |
| 390 "movntq %mm1,0x0(%ebp)\n" | 390 "movntq %mm1,0x0(%ebp)\n" |
| 391 "add $0x8,%ebp\n" | 391 "add $0x8,%ebp\n" |
| 392 "Lscaleend:" | 392 "scaleend:" |
| 393 "sub $0x2,%ecx\n" | 393 "sub $0x2,%ecx\n" |
| 394 "jns Lscaleloop\n" | 394 "jns scaleloop\n" |
| 395 | 395 |
| 396 "and $0x1,%ecx\n" | 396 "and $0x1,%ecx\n" |
| 397 "je Lscaledone\n" | 397 "je scaledone\n" |
| 398 | 398 |
| 399 "mov %ebx,%eax\n" | 399 "mov %ebx,%eax\n" |
| 400 "sar $0x5,%eax\n" | 400 "sar $0x5,%eax\n" |
| 401 "movzbl (%edi,%eax,1),%eax\n" | 401 "movzbl (%edi,%eax,1),%eax\n" |
| 402 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 402 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" |
| 403 "mov %ebx,%eax\n" | 403 "mov %ebx,%eax\n" |
| 404 "sar $0x5,%eax\n" | 404 "sar $0x5,%eax\n" |
| 405 "movzbl (%esi,%eax,1),%eax\n" | 405 "movzbl (%esi,%eax,1),%eax\n" |
| 406 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" | 406 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" |
| 407 "mov %ebx,%eax\n" | 407 "mov %ebx,%eax\n" |
| 408 "sar $0x4,%eax\n" | 408 "sar $0x4,%eax\n" |
| 409 "movzbl (%edx,%eax,1),%eax\n" | 409 "movzbl (%edx,%eax,1),%eax\n" |
| 410 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 410 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 411 "mov %ebx,%eax\n" | 411 "mov %ebx,%eax\n" |
| 412 "sar $0x4,%eax\n" | 412 "sar $0x4,%eax\n" |
| 413 "movzbl (%edx,%eax,1),%eax\n" | 413 "movzbl (%edx,%eax,1),%eax\n" |
| 414 "movq kCoefficientsRgbY(,%eax,8),%mm2\n" | 414 "movq kCoefficientsRgbY(,%eax,8),%mm2\n" |
| 415 "paddsw %mm0,%mm1\n" | 415 "paddsw %mm0,%mm1\n" |
| 416 "paddsw %mm0,%mm2\n" | 416 "paddsw %mm0,%mm2\n" |
| 417 "psraw $0x6,%mm1\n" | 417 "psraw $0x6,%mm1\n" |
| 418 "psraw $0x6,%mm2\n" | 418 "psraw $0x6,%mm2\n" |
| 419 "packuswb %mm2,%mm1\n" | 419 "packuswb %mm2,%mm1\n" |
| 420 "movd %mm1,0x0(%ebp)\n" | 420 "movd %mm1,0x0(%ebp)\n" |
| 421 | 421 |
| 422 "Lscaledone:" | 422 "scaledone:" |
| 423 "popa\n" | 423 "popa\n" |
| 424 "ret\n" | 424 "ret\n" |
| 425 ); | 425 ); |
| 426 | 426 |
| 427 #else // USE_MMX | 427 #else // USE_MMX |
| 428 | 428 |
| 429 // Reference version of YUV converter. | 429 // Reference version of YUV converter. |
| 430 static const int kClipTableSize = 256; | 430 static const int kClipTableSize = 256; |
| 431 static const int kClipOverflow = 288; // Cb max is 535. | 431 static const int kClipOverflow = 288; // Cb max is 535. |
| 432 | 432 |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 uint8 v = v_buf[scaled_x >> 5]; | 603 uint8 v = v_buf[scaled_x >> 5]; |
| 604 uint8 y0 = y_buf[scaled_x >> 4]; | 604 uint8 y0 = y_buf[scaled_x >> 4]; |
| 605 YuvPixel(y0, u, v, rgb_buf); | 605 YuvPixel(y0, u, v, rgb_buf); |
| 606 rgb_buf += 4; | 606 rgb_buf += 4; |
| 607 scaled_x += scaled_dx; | 607 scaled_x += scaled_dx; |
| 608 } | 608 } |
| 609 } | 609 } |
| 610 #endif // USE_MMX | 610 #endif // USE_MMX |
| 611 } // extern "C" | 611 } // extern "C" |
| 612 | 612 |
| OLD | NEW |