Checking HAVE_NEON is not enough; e.g. android devices with armeabi-v7a are not required to have NEON, so every use of such functions should be check WELS_CPU_NEON in the cpu features as well.
Showing the changes to codec/encoder/core/src/deblocking.cpp (1 of 2 files). Show all
Unified · Split
| @@ -583,6 +583,56 @@ void DeblockingIntraMb (DeblockingFunc* pfDeblocking, SMB* pCurMb, SDeblockingFi · 582 unmodified lines | ||
| 583 | 583 | FilteringEdgeChromaHV (pfDeblocking, pCurMb, pFilter); |
| 584 | 584 | } |
| 585 | 585 | |
| 586 | +#if defined(HAVE_NEON) && defined(SINGLE_REF_FRAME) | |
| 587 | +void DeblockingBSCalc_neon (SWelsFuncPtrList* pFunc, SMB* pCurMb, uint8_t uiBS[2][4][4], Mb_Type uiCurMbType, | |
| 588 | + int32_t iMbStride, int32_t iLeftFlag, int32_t iTopFlag) { | |
| 589 | + DeblockingBSCalcEnc_neon (pCurMb->pNonZeroCount, pCurMb->sMv, pCurMb->uiNeighborAvail, iMbStride, uiBS); | |
| 590 | + if (iLeftFlag) { | |
| 591 | + if (IS_INTRA ((pCurMb - 1)->uiMbType)) { | |
| 592 | + * (uint32_t*)uiBS[0][0] = 0x04040404; | |
| 593 | + } | |
| 594 | + } else { | |
| 595 | + * (uint32_t*)uiBS[0][0] = 0; | |
| 596 | + } | |
| 597 | + if (iTopFlag) { | |
| 598 | + if (IS_INTRA ((pCurMb - iMbStride)->uiMbType)) { | |
| 599 | + * (uint32_t*)uiBS[1][0] = 0x04040404; | |
| 600 | + } | |
| 601 | + } else { | |
| 602 | + * (uint32_t*)uiBS[1][0] = 0; | |
| 603 | + } | |
| 604 | +} | |
| 605 | +#endif | |
| 606 | + | |
| 607 | +void DeblockingBSCalc_c (SWelsFuncPtrList* pFunc, SMB* pCurMb, uint8_t uiBS[2][4][4], Mb_Type uiCurMbType, | |
| 608 | + int32_t iMbStride, int32_t iLeftFlag, int32_t iTopFlag) { | |
| 609 | + if (iLeftFlag) { | |
| 610 | + * (uint32_t*)uiBS[0][0] = IS_INTRA ((pCurMb - 1)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase (pCurMb, | |
| 611 | + pCurMb - 1, 0); | |
| 612 | + } else { | |
| 613 | + * (uint32_t*)uiBS[0][0] = 0; | |
| 614 | + } | |
| 615 | + if (iTopFlag) { | |
| 616 | + * (uint32_t*)uiBS[1][0] = IS_INTRA ((pCurMb - iMbStride)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase ( | |
| 617 | + pCurMb, (pCurMb - iMbStride), 1); | |
| 618 | + } else { | |
| 619 | + * (uint32_t*)uiBS[1][0] = 0; | |
| 620 | + } | |
| 621 | + //SKIP MB_16x16 or others | |
| 622 | + if (uiCurMbType != MB_TYPE_SKIP) { | |
| 623 | + pFunc->pfSetNZCZero (pCurMb->pNonZeroCount); // set all none-zero nzc to 1; dbk can be opti! | |
| 624 | + | |
| 625 | + if (uiCurMbType == MB_TYPE_16x16) { | |
| 626 | + DeblockingBSInsideMBAvsbase (pCurMb->pNonZeroCount, uiBS, 1); | |
| 627 | + } else { | |
| 628 | + DeblockingBSInsideMBNormal (pCurMb, uiBS, pCurMb->pNonZeroCount); | |
| 629 | + } | |
| 630 | + } else { | |
| 631 | + * (uint32_t*)uiBS[0][1] = * (uint32_t*)uiBS[0][2] = * (uint32_t*)uiBS[0][3] = | |
| 632 | + * (uint32_t*)uiBS[1][1] = * (uint32_t*)uiBS[1][2] = * (uint32_t*)uiBS[1][3] = 0; | |
| 633 | + } | |
| 634 | +} | |
| 635 | + | |
| 586 | 636 | void DeblockingMbAvcbase (SWelsFuncPtrList* pFunc, SMB* pCurMb, SDeblockingFilter* pFilter) { |
| 587 | 637 | uint8_t uiBS[2][4][4] = {{{ 0 }}}; |
| 588 | 638 | |
| @@ -605,49 +655,7 @@ void DeblockingMbAvcbase (SWelsFuncPtrList* pFunc, SMB* pCurMb, SDeblockingFilte · 16 unmodified lines | ||
| 605 | 655 | DeblockingIntraMb (&pFunc->pfDeblocking, pCurMb, pFilter); |
| 606 | 656 | break; |
| 607 | 657 | default: |
| 608 | −#if (defined(HAVE_NEON) && defined(SINGLE_REF_FRAME)) | |
| 609 | − DeblockingBSCalcEnc_neon(pCurMb->pNonZeroCount, pCurMb->sMv, pCurMb->uiNeighborAvail, iMbStride, uiBS); | |
| 610 | − if (iLeftFlag){ | |
| 611 | − if (IS_INTRA((pCurMb-1)->uiMbType)) { | |
| 612 | − *(uint32_t*)uiBS[0][0] = 0x04040404; | |
| 613 | − } | |
| 614 | − } else { | |
| 615 | − *(uint32_t*)uiBS[0][0] = 0; | |
| 616 | − } | |
| 617 | − if (iTopFlag) { | |
| 618 | − if (IS_INTRA((pCurMb-iMbStride)->uiMbType)) { | |
| 619 | − *(uint32_t*)uiBS[1][0] = 0x04040404; | |
| 620 | − } | |
| 621 | − } else { | |
| 622 | − *(uint32_t*)uiBS[1][0] = 0; | |
| 623 | − } | |
| 624 | −#else | |
| 625 | − if (iLeftFlag) { | |
| 626 | − * (uint32_t*)uiBS[0][0] = IS_INTRA ((pCurMb - 1)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase (pCurMb, | |
| 627 | − pCurMb - 1, 0); | |
| 628 | − } else { | |
| 629 | − * (uint32_t*)uiBS[0][0] = 0; | |
| 630 | − } | |
| 631 | − if (iTopFlag) { | |
| 632 | − * (uint32_t*)uiBS[1][0] = IS_INTRA ((pCurMb - iMbStride)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase ( | |
| 633 | − pCurMb, (pCurMb - iMbStride), 1); | |
| 634 | − } else { | |
| 635 | − * (uint32_t*)uiBS[1][0] = 0; | |
| 636 | − } | |
| 637 | − //SKIP MB_16x16 or others | |
| 638 | − if (uiCurMbType != MB_TYPE_SKIP) { | |
| 639 | − pFunc->pfSetNZCZero (pCurMb->pNonZeroCount); // set all none-zero nzc to 1; dbk can be opti! | |
| 640 | − | |
| 641 | − if (uiCurMbType == MB_TYPE_16x16) { | |
| 642 | − DeblockingBSInsideMBAvsbase (pCurMb->pNonZeroCount, uiBS, 1); | |
| 643 | − } else { | |
| 644 | − DeblockingBSInsideMBNormal (pCurMb, uiBS, pCurMb->pNonZeroCount); | |
| 645 | − } | |
| 646 | − } else { | |
| 647 | − * (uint32_t*)uiBS[0][1] = * (uint32_t*)uiBS[0][2] = * (uint32_t*)uiBS[0][3] = | |
| 648 | − * (uint32_t*)uiBS[1][1] = * (uint32_t*)uiBS[1][2] = * (uint32_t*)uiBS[1][3] = 0; | |
| 649 | − } | |
| 650 | −#endif | |
| 658 | + pFunc->pfDeblocking.pfDeblockingBSCalc (pFunc, pCurMb, uiBS, uiCurMbType, iMbStride, iLeftFlag, iTopFlag); | |
| 651 | 659 | DeblockingInterMb (&pFunc->pfDeblocking, pCurMb, pFilter, uiBS); |
| 652 | 660 | break; |
| 653 | 661 | } |
| @@ -803,6 +811,8 @@ void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu) { · 149 unmodified lines | ||
| 803 | 811 | pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_c; |
| 804 | 812 | pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_c; |
| 805 | 813 | |
| 814 | + pFunc->pfDeblockingBSCalc = DeblockingBSCalc_c; | |
| 815 | + | |
| 806 | 816 | |
| 807 | 817 | #ifdef X86_ASM |
| 808 | 818 | if (iCpu & WELS_CPU_SSSE3) { |
| @@ -828,6 +838,10 @@ void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu) { · 19 unmodified lines | ||
| 828 | 838 | pFunc->pfChromaDeblockingEQ4Ver = DeblockChromaEq4V_neon; |
| 829 | 839 | pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_neon; |
| 830 | 840 | pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_neon; |
| 841 | + | |
| 842 | +#if defined(SINGLE_REF_FRAME) | |
| 843 | + pFunc->pfDeblockingBSCalc = DeblockingBSCalc_neon; | |
| 844 | +#endif | |
| 831 | 845 | } |
| 832 | 846 | #endif |
| 833 | 847 | } |