| | 560 | static void FilterI422( vout_thread_t *p_vout, |
|---|
| | 561 | const picture_t *p_pic, picture_t *p_outpic ) |
|---|
| | 562 | { |
|---|
| | 563 | int i_index; |
|---|
| | 564 | switch( p_vout->p_sys->i_mode ) |
|---|
| | 565 | { |
|---|
| | 566 | case TRANSFORM_MODE_180: |
|---|
| | 567 | case TRANSFORM_MODE_HFLIP: |
|---|
| | 568 | case TRANSFORM_MODE_VFLIP: |
|---|
| | 569 | /* Fall back on the default implementation */ |
|---|
| | 570 | FilterPlanar( p_vout, p_pic, p_outpic ); |
|---|
| | 571 | return; |
|---|
| | 572 | |
|---|
| | 573 | case TRANSFORM_MODE_90: |
|---|
| | 574 | for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) |
|---|
| | 575 | { |
|---|
| | 576 | int i_pitch = p_pic->p[i_index].i_pitch; |
|---|
| | 577 | |
|---|
| | 578 | uint8_t *p_in = p_pic->p[i_index].p_pixels; |
|---|
| | 579 | |
|---|
| | 580 | uint8_t *p_out = p_outpic->p[i_index].p_pixels; |
|---|
| | 581 | uint8_t *p_out_end = p_out + |
|---|
| | 582 | p_outpic->p[i_index].i_visible_lines * |
|---|
| | 583 | p_outpic->p[i_index].i_pitch; |
|---|
| | 584 | |
|---|
| | 585 | if( i_index == 0 ) |
|---|
| | 586 | { |
|---|
| | 587 | for( ; p_out < p_out_end ; ) |
|---|
| | 588 | { |
|---|
| | 589 | uint8_t *p_line_end; |
|---|
| | 590 | |
|---|
| | 591 | p_out_end -= p_outpic->p[i_index].i_pitch |
|---|
| | 592 | - p_outpic->p[i_index].i_visible_pitch; |
|---|
| | 593 | p_line_end = p_in + p_pic->p[i_index].i_visible_lines * |
|---|
| | 594 | i_pitch; |
|---|
| | 595 | |
|---|
| | 596 | for( ; p_in < p_line_end ; ) |
|---|
| | 597 | { |
|---|
| | 598 | p_line_end -= i_pitch; |
|---|
| | 599 | *(--p_out_end) = *p_line_end; |
|---|
| | 600 | } |
|---|
| | 601 | |
|---|
| | 602 | p_in++; |
|---|
| | 603 | } |
|---|
| | 604 | } |
|---|
| | 605 | else /* i_index == 1 or 2 */ |
|---|
| | 606 | { |
|---|
| | 607 | for( ; p_out < p_out_end ; ) |
|---|
| | 608 | { |
|---|
| | 609 | uint8_t *p_line_end, *p_out_end2; |
|---|
| | 610 | |
|---|
| | 611 | p_out_end -= p_outpic->p[i_index].i_pitch |
|---|
| | 612 | - p_outpic->p[i_index].i_visible_pitch; |
|---|
| | 613 | p_out_end2 = p_out_end - p_outpic->p[i_index].i_pitch; |
|---|
| | 614 | p_line_end = p_in + p_pic->p[i_index].i_visible_lines * |
|---|
| | 615 | i_pitch; |
|---|
| | 616 | |
|---|
| | 617 | for( ; p_in < p_line_end ; ) |
|---|
| | 618 | { |
|---|
| | 619 | uint8_t p1, p2; |
|---|
| | 620 | |
|---|
| | 621 | p_line_end -= i_pitch; |
|---|
| | 622 | p1 = *p_line_end; |
|---|
| | 623 | p_line_end -= i_pitch; |
|---|
| | 624 | p2 = *p_line_end; |
|---|
| | 625 | |
|---|
| | 626 | /* Trick for (x+y)/2 without overflow, based on |
|---|
| | 627 | * x + y == (x ^ y) + 2 * (x & y) */ |
|---|
| | 628 | *(--p_out_end) = (p1 & p2) + ((p1 ^ p2) / 2); |
|---|
| | 629 | *(--p_out_end2) = (p1 & p2) + ((p1 ^ p2) / 2); |
|---|
| | 630 | } |
|---|
| | 631 | |
|---|
| | 632 | p_out_end = p_out_end2; |
|---|
| | 633 | p_in++; |
|---|
| | 634 | } |
|---|
| | 635 | } |
|---|
| | 636 | } |
|---|
| | 637 | break; |
|---|
| | 638 | |
|---|
| | 639 | case TRANSFORM_MODE_270: |
|---|
| | 640 | for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) |
|---|
| | 641 | { |
|---|
| | 642 | int i_pitch = p_pic->p[i_index].i_pitch; |
|---|
| | 643 | |
|---|
| | 644 | uint8_t *p_in = p_pic->p[i_index].p_pixels; |
|---|
| | 645 | |
|---|
| | 646 | uint8_t *p_out = p_outpic->p[i_index].p_pixels; |
|---|
| | 647 | uint8_t *p_out_end = p_out + |
|---|
| | 648 | p_outpic->p[i_index].i_visible_lines * |
|---|
| | 649 | p_outpic->p[i_index].i_pitch; |
|---|
| | 650 | |
|---|
| | 651 | if( i_index == 0 ) |
|---|
| | 652 | { |
|---|
| | 653 | for( ; p_out < p_out_end ; ) |
|---|
| | 654 | { |
|---|
| | 655 | uint8_t *p_in_end; |
|---|
| | 656 | |
|---|
| | 657 | p_in_end = p_in + p_pic->p[i_index].i_visible_lines * |
|---|
| | 658 | i_pitch; |
|---|
| | 659 | |
|---|
| | 660 | for( ; p_in < p_in_end ; ) |
|---|
| | 661 | { |
|---|
| | 662 | p_in_end -= i_pitch; |
|---|
| | 663 | *p_out++ = *p_in_end; |
|---|
| | 664 | } |
|---|
| | 665 | |
|---|
| | 666 | p_out += p_outpic->p[i_index].i_pitch |
|---|
| | 667 | - p_outpic->p[i_index].i_visible_pitch; |
|---|
| | 668 | p_in++; |
|---|
| | 669 | } |
|---|
| | 670 | } |
|---|
| | 671 | else /* i_index == 1 or 2 */ |
|---|
| | 672 | { |
|---|
| | 673 | for( ; p_out < p_out_end ; ) |
|---|
| | 674 | { |
|---|
| | 675 | uint8_t *p_in_end, *p_out2; |
|---|
| | 676 | |
|---|
| | 677 | p_in_end = p_in + p_pic->p[i_index].i_visible_lines * |
|---|
| | 678 | i_pitch; |
|---|
| | 679 | p_out2 = p_out + p_outpic->p[i_index].i_pitch; |
|---|
| | 680 | |
|---|
| | 681 | for( ; p_in < p_in_end ; ) |
|---|
| | 682 | { |
|---|
| | 683 | uint8_t p1, p2; |
|---|
| | 684 | |
|---|
| | 685 | p_in_end -= i_pitch; |
|---|
| | 686 | p1 = *p_in_end; |
|---|
| | 687 | p_in_end -= i_pitch; |
|---|
| | 688 | p2 = *p_in_end; |
|---|
| | 689 | |
|---|
| | 690 | /* Trick for (x+y)/2 without overflow, based on |
|---|
| | 691 | * x + y == (x ^ y) + 2 * (x & y) */ |
|---|
| | 692 | *p_out++ = (p1 & p2) + ((p1 ^ p2) / 2); |
|---|
| | 693 | *p_out2++ = (p1 & p2) + ((p1 ^ p2) / 2); |
|---|
| | 694 | } |
|---|
| | 695 | |
|---|
| | 696 | p_out2 += p_outpic->p[i_index].i_pitch |
|---|
| | 697 | - p_outpic->p[i_index].i_visible_pitch; |
|---|
| | 698 | p_out = p_out2; |
|---|
| | 699 | p_in++; |
|---|
| | 700 | } |
|---|
| | 701 | } |
|---|
| | 702 | } |
|---|
| | 703 | break; |
|---|
| | 704 | |
|---|
| | 705 | default: |
|---|
| | 706 | break; |
|---|
| | 707 | } |
|---|
| | 708 | } |
|---|
| | 709 | |
|---|
| 687 | | case TRANSFORM_MODE_HFLIP: |
|---|
| 688 | | for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) |
|---|
| 689 | | { |
|---|
| 690 | | uint8_t *p_in = p_pic->p[i_index].p_pixels; |
|---|
| 691 | | uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines |
|---|
| 692 | | * p_pic->p[i_index].i_pitch; |
|---|
| 693 | | |
|---|
| 694 | | uint8_t *p_out = p_outpic->p[i_index].p_pixels; |
|---|
| 695 | | |
|---|
| 696 | | for( ; p_in < p_in_end ; ) |
|---|
| 697 | | { |
|---|
| 698 | | p_in_end -= p_pic->p[i_index].i_pitch; |
|---|
| 699 | | p_vout->p_libvlc->pf_memcpy( p_out, p_in_end, |
|---|
| 700 | | p_pic->p[i_index].i_visible_pitch ); |
|---|
| 701 | | p_out += p_pic->p[i_index].i_pitch; |
|---|
| 702 | | } |
|---|
| 703 | | } |
|---|
| 704 | | break; |
|---|
| 705 | | |
|---|