Changeset 716 in 3DVCSoftware for branches/HTM-8.2-dev0-MediaTek/source/Lib/TLibCommon/TComPrediction.cpp
- Timestamp:
- 28 Nov 2013, 10:04:37 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-8.2-dev0-MediaTek/source/Lib/TLibCommon/TComPrediction.cpp
r712 r716 561 561 } 562 562 563 #if MTK_SPIVMP_F0110 564 Void TComPrediction::xGetSubPUAddrAndMerge(TComDataCU* pcCU, UInt uiPartAddr, Int iSPWidth, Int iSPHeight, Int iNumSPInOneLine, Int iNumSP, UInt* uiMergedSPW, UInt* uiMergedSPH, UInt* uiSPAddr ) 565 { 566 for (Int i = 0; i < iNumSP; i++) 567 { 568 uiMergedSPW[i] = iSPWidth; 569 uiMergedSPH[i] = iSPHeight; 570 pcCU->getSPAbsPartIdx(uiPartAddr, iSPWidth, iSPHeight, i, iNumSPInOneLine, uiSPAddr[i]); 571 } 572 // horizontal sub-PU merge 573 for (Int i=0; i<iNumSP; i++) 574 { 575 if (i % iNumSPInOneLine == iNumSPInOneLine - 1 || uiMergedSPW[i]==0 || uiMergedSPH[i]==0) 576 { 577 continue; 578 } 579 for (Int j=i+1; j<i+iNumSPInOneLine-i%iNumSPInOneLine; j++) 580 { 581 if (xCheckTwoSPMotion(pcCU, uiSPAddr[i], uiSPAddr[j])) 582 { 583 uiMergedSPW[i] += iSPWidth; 584 uiMergedSPW[j] = uiMergedSPH[j] = 0; 585 } 586 else 587 { 588 break; 589 } 590 } 591 } 592 //vertical sub-PU merge 593 for (Int i=0; i<iNumSP-iNumSPInOneLine; i++) 594 { 595 if (uiMergedSPW[i]==0 || uiMergedSPH[i]==0) 596 { 597 continue; 598 } 599 for (Int j=i+iNumSPInOneLine; j<iNumSP; j+=iNumSPInOneLine) 600 { 601 if (xCheckTwoSPMotion(pcCU, uiSPAddr[i], uiSPAddr[j]) && uiMergedSPW[i]==uiMergedSPW[j]) 602 { 603 uiMergedSPH[i] += iSPHeight; 604 uiMergedSPH[j] = uiMergedSPW[j] = 0; 605 } 606 else 607 { 608 break; 609 } 610 } 611 } 612 } 613 614 Bool TComPrediction::xCheckTwoSPMotion ( TComDataCU* pcCU, UInt PartAddr0, UInt PartAddr1 ) 615 { 616 if( pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(PartAddr0) != pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(PartAddr1)) 617 { 618 return false; 619 } 620 if( pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(PartAddr0) != pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(PartAddr1)) 621 { 622 return false; 623 } 624 625 if (pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(PartAddr0) >= 0) 626 { 627 if (pcCU->getCUMvField(REF_PIC_LIST_0)->getMv(PartAddr0) != pcCU->getCUMvField(REF_PIC_LIST_0)->getMv(PartAddr1)) 628 { 629 return false; 630 } 631 } 632 633 if (pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(PartAddr0) >= 0) 634 { 635 if (pcCU->getCUMvField(REF_PIC_LIST_1)->getMv(PartAddr0) != pcCU->getCUMvField(REF_PIC_LIST_1)->getMv(PartAddr1)) 636 { 637 return false; 638 } 639 } 640 return true; 641 } 642 #endif 563 643 564 644 Void TComPrediction::motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx ) … … 592 672 else 593 673 { 594 if ( xCheckIdenticalMotion( pcCU, uiPartAddr ) ) 595 { 596 xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred ); 674 #if MTK_SPIVMP_F0110 675 if ( pcCU->getSPIVMPFlag(uiPartAddr)!=0) 676 { 677 Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight; 678 679 pcCU->getSPPara(iWidth, iHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight); 680 681 UInt uiW[256], uiH[256]; 682 UInt uiSPAddr[256]; 683 684 xGetSubPUAddrAndMerge(pcCU, uiPartAddr, iSPWidth, iSPHeight, iNumSPInOneLine, iNumSP, uiW, uiH, uiSPAddr); 685 686 //MC 687 for (Int i = 0; i < iNumSP; i++) 688 { 689 if (uiW[i]==0 || uiH[i]==0) 690 { 691 continue; 692 } 693 if( xCheckIdenticalMotion( pcCU, uiSPAddr[i] )) 694 { 695 xPredInterUni (pcCU, uiSPAddr[i], uiW[i], uiH[i], REF_PIC_LIST_0, pcYuvPred ); 696 } 697 else 698 { 699 xPredInterBi (pcCU, uiSPAddr[i], uiW[i], uiH[i], pcYuvPred); 700 } 701 } 597 702 } 598 703 else 599 704 { 600 xPredInterBi (pcCU, uiPartAddr, iWidth, iHeight, pcYuvPred ); 601 } 705 #endif 706 if ( xCheckIdenticalMotion( pcCU, uiPartAddr ) ) 707 { 708 xPredInterUni (pcCU, uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred ); 709 } 710 else 711 { 712 xPredInterBi (pcCU, uiPartAddr, iWidth, iHeight, pcYuvPred ); 713 } 714 #if MTK_SPIVMP_F0110 715 } 716 #endif 602 717 } 603 718 #if H_3D_VSP … … 643 758 else 644 759 { 760 #if MTK_SPIVMP_F0110 761 if (pcCU->getSPIVMPFlag(uiPartAddr)!=0) 762 { 763 Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight; 764 765 pcCU->getSPPara(iWidth, iHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight); 766 767 UInt uiW[256], uiH[256]; 768 UInt uiSPAddr[256]; 769 770 xGetSubPUAddrAndMerge(pcCU, uiPartAddr, iSPWidth, iSPHeight, iNumSPInOneLine, iNumSP, uiW, uiH, uiSPAddr); 771 //MC 772 for (Int i = 0; i < iNumSP; i++) 773 { 774 if (uiW[i]==0 || uiH[i]==0) 775 { 776 continue; 777 } 778 if( xCheckIdenticalMotion( pcCU, uiSPAddr[i] )) 779 { 780 xPredInterUni (pcCU, uiSPAddr[i], uiW[i], uiH[i], REF_PIC_LIST_0, pcYuvPred ); 781 } 782 else 783 { 784 xPredInterBi (pcCU, uiSPAddr[i], uiW[i], uiH[i], pcYuvPred); 785 } 786 } 787 } 788 else 789 { 790 #endif 645 791 if ( xCheckIdenticalMotion( pcCU, uiPartAddr ) ) 646 792 { … … 651 797 xPredInterBi (pcCU, uiPartAddr, iWidth, iHeight, pcYuvPred ); 652 798 } 799 #if MTK_SPIVMP_F0110 800 } 801 #endif 653 802 } 654 803 #if H_3D_VSP
Note: See TracChangeset for help on using the changeset viewer.