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 | FilteringEdgeChromaHV (pfDeblocking, pCurMb, pFilter); | 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 | void DeblockingMbAvcbase (SWelsFuncPtrList* pFunc, SMB* pCurMb, SDeblockingFilter* pFilter) { | 636 | void DeblockingMbAvcbase (SWelsFuncPtrList* pFunc, SMB* pCurMb, SDeblockingFilter* pFilter) { |
| 587 | uint8_t uiBS[2][4][4] = {{{ 0 }}}; | 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 | DeblockingIntraMb (&pFunc->pfDeblocking, pCurMb, pFilter); | 655 | DeblockingIntraMb (&pFunc->pfDeblocking, pCurMb, pFilter); |
| 606 | break; | 656 | break; |
| 607 | default: | 657 | default: |
| 608 | #if (defined(HAVE_NEON) && defined(SINGLE_REF_FRAME)) | 658 | pFunc->pfDeblocking.pfDeblockingBSCalc (pFunc, pCurMb, uiBS, uiCurMbType, iMbStride, iLeftFlag, iTopFlag); |
| 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 | ||
| 651 | DeblockingInterMb (&pFunc->pfDeblocking, pCurMb, pFilter, uiBS); | 659 | DeblockingInterMb (&pFunc->pfDeblocking, pCurMb, pFilter, uiBS); |
| 652 | break; | 660 | break; |
| 653 | } | 661 | } |
| @@ -803,6 +811,8 @@ void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu) { · 149 unmodified lines | |||
| 803 | pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_c; | 811 | pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_c; |
| 804 | pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_c; | 812 | pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_c; |
| 805 | 813 | ||
| 814 | pFunc->pfDeblockingBSCalc = DeblockingBSCalc_c; | ||
| 815 | |||
| 806 | 816 | ||
| 807 | #ifdef X86_ASM | 817 | #ifdef X86_ASM |
| 808 | if (iCpu & WELS_CPU_SSSE3) { | 818 | if (iCpu & WELS_CPU_SSSE3) { |
| @@ -828,6 +838,10 @@ void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu) { · 19 unmodified lines | |||
| 828 | pFunc->pfChromaDeblockingEQ4Ver = DeblockChromaEq4V_neon; | 838 | pFunc->pfChromaDeblockingEQ4Ver = DeblockChromaEq4V_neon; |
| 829 | pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_neon; | 839 | pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_neon; |
| 830 | pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_neon; | 840 | pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_neon; |
| 841 | |||
| 842 | #if defined(SINGLE_REF_FRAME) | ||
| 843 | pFunc->pfDeblockingBSCalc = DeblockingBSCalc_neon; | ||
| 844 | #endif | ||
| 831 | } | 845 | } |
| 832 | #endif | 846 | #endif |
| 833 | } | 847 | } |