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 |