History

Add Motion Compehension ARM64 Neon Code

dongzhang committed 12 years ago

Commit ad9e2da1 parent b47606a8 files · +5475 −480Browse files

Showing the changes to codec/encoder/core/src/mc.cpp (1 of 8 files). Show all

Unified · Split

codec/encoder/core/src/mc.cpp+200−81
@@ -89,8 +89,10 @@ VerFilterFunc fpVerFilter = NULL; · 88 unmodified lines
8989 HorFilterFunc fpHorFilter = NULL;
9090 HorFilterFuncInput16Bits fpHorFilterInput16Bits = NULL;
9191
92−typedef void (*WelsMcFunc0) (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight);
93−typedef void (*WelsMcFunc1) (uint8_t* pDst, int32_t iDstStride, const uint8_t* psrcA, int32_t iSrcAStride, const uint8_t* pSrcB,
92+typedef void (*WelsMcFunc0) (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
93+ int32_t iHeight);
94+typedef void (*WelsMcFunc1) (uint8_t* pDst, int32_t iDstStride, const uint8_t* psrcA, int32_t iSrcAStride,
95+ const uint8_t* pSrcB,
9496 int32_t iSrcBStride, int32_t iHeight);
9597 WelsMcFunc0 McCopyWidthEq16 = NULL;
9698 WelsMcFunc0 McCopyWidthEq8 = NULL;
@@ -323,7 +325,8 @@ static inline void McHorVer33WidthEq16 (const uint8_t* pSrc, int32_t iSrcStride, · 226 unmodified lines
323325 pfPixelAvgWidthEq16 (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
324326 }
325327
326−static inline void McHorVer20_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iWidth,
328+static inline void McHorVer20_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
329+ int32_t iWidth,
327330 int32_t iHeight) {
328331 int32_t i, j;
329332 for (i = 0; i < iHeight; i++) {
@@ -335,7 +338,8 @@ static inline void McHorVer20_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_ · 5 unmodified lines
335338 }
336339 }
337340 //vertical filter to gain half sample, that is (0, 2) location in quarter sample
338−static inline void McHorVer02_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iWidth,
341+static inline void McHorVer02_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
342+ int32_t iWidth,
339343 int32_t iHeight) {
340344 int32_t i, j;
341345 for (i = 0; i < iHeight; i++) {
@@ -347,7 +351,8 @@ static inline void McHorVer02_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_ · 5 unmodified lines
347351 }
348352 }
349353 //horizontal and vertical filter to gain half sample, that is (2, 2) location in quarter sample
350−static inline void McHorVer22_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iWidth,
354+static inline void McHorVer22_c (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
355+ int32_t iWidth,
351356 int32_t iHeight) {
352357 int16_t pTmp[17 + 5] = {0}; //w+1
353358 int32_t i, j, k;
@@ -481,94 +486,190 @@ void McChroma_ssse3 (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int · 127 unmodified lines
481486
482487 #endif //X86_ASM
483488
484− //***************************************************************************//
485− // NEON implementation //
486− //***************************************************************************//
489+//***************************************************************************//
490+// NEON implementation //
491+//***************************************************************************//
487492 #if defined(HAVE_NEON)
488−void McHorVer20Width9Or17_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
489− int32_t iWidth, int32_t iHeight) {
493+void McHorVer20Width9Or17_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
494+ int32_t iWidth, int32_t iHeight) {
490495 if (iWidth == 17)
491− McHorVer20Width17_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
496+ McHorVer20Width17_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
492497 else //if (iWidth == 9)
493− McHorVer20Width9_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
498+ McHorVer20Width9_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
494499 }
495−void McHorVer02Height9Or17_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
496− int32_t iWidth, int32_t iHeight){
500+void McHorVer02Height9Or17_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
501+ int32_t iWidth, int32_t iHeight) {
497502 if (iWidth == 16)
498− McHorVer02Height17_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
503+ McHorVer02Height17_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
499504 else //if (iWidth == 8)
500− McHorVer02Height9_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
505+ McHorVer02Height9_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
501506 }
502−void McHorVer22Width9Or17Height9Or17_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
503− int32_t iWidth, int32_t iHeight){
507+void McHorVer22Width9Or17Height9Or17_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
508+ int32_t iWidth, int32_t iHeight) {
504509 if (iWidth == 17)
505− McHorVer22Width17_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
510+ McHorVer22Width17_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
506511 else //if (iWidth == 9)
507− McHorVer22Width9_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
508−}
509−void EncMcHorVer11_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
510− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
511− McHorVer20WidthEq16_neon(pSrc, iSrcStride, pTmp, 16, iHeight);
512− McHorVer02WidthEq16_neon(pSrc, iSrcStride, &pTmp[256], 16, iHeight);
513− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
514−}
515−void EncMcHorVer12_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
516− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
517− McHorVer02WidthEq16_neon(pSrc, iSrcStride, pTmp, 16, iHeight);
518− McHorVer22WidthEq16_neon(pSrc, iSrcStride, &pTmp[256], 16, iHeight);
519− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
520−}
521−void EncMcHorVer13_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
522− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
523− McHorVer20WidthEq16_neon(pSrc+iSrcStride, iSrcStride, pTmp, 16, iHeight);
524− McHorVer02WidthEq16_neon(pSrc, iSrcStride, &pTmp[256], 16, iHeight);
525− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
526−}
527−void EncMcHorVer21_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
528− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
529− McHorVer20WidthEq16_neon(pSrc, iSrcStride, pTmp, 16, iHeight);
530− McHorVer22WidthEq16_neon(pSrc, iSrcStride, &pTmp[256], 16, iHeight);
531− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
532−}
533−void EncMcHorVer23_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
534− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
535− McHorVer20WidthEq16_neon(pSrc+iSrcStride, iSrcStride, pTmp, 16, iHeight);
536− McHorVer22WidthEq16_neon(pSrc, iSrcStride, &pTmp[256], 16, iHeight);
537− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
538−}
539−void EncMcHorVer31_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
540− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
541− McHorVer20WidthEq16_neon(pSrc, iSrcStride, pTmp, 16, iHeight);
542− McHorVer02WidthEq16_neon(pSrc+1, iSrcStride, &pTmp[256], 16, iHeight);
543− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
544−}
545−void EncMcHorVer32_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
546− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
547− McHorVer02WidthEq16_neon(pSrc+1, iSrcStride, pTmp, 16, iHeight);
548− McHorVer22WidthEq16_neon(pSrc, iSrcStride, &pTmp[256], 16, iHeight);
549− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
550−}
551−void EncMcHorVer33_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
552− ENFORCE_STACK_ALIGN_1D(uint8_t, pTmp, 512, 16)
553− McHorVer20WidthEq16_neon(pSrc+iSrcStride, iSrcStride, pTmp, 16, iHeight);
554− McHorVer02WidthEq16_neon(pSrc+1, iSrcStride, &pTmp[256], 16, iHeight);
555− PixelAvgWidthEq16_neon(pDst, iDstStride, pTmp, &pTmp[256], iHeight);
556−}
557−void EncMcChroma_neon(const uint8_t *pSrc, int32_t iSrcStride, uint8_t *pDst, int32_t iDstStride,
558− SMVUnitXY sMv, int32_t iWidth, int32_t iHeight) {
559− const int32_t kiD8x = sMv.iMvX&0x07;
560− const int32_t kiD8y = sMv.iMvY&0x07;
512+ McHorVer22Width9_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
513+}
514+void EncMcHorVer11_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
515+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
516+ McHorVer20WidthEq16_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
517+ McHorVer02WidthEq16_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
518+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
519+}
520+void EncMcHorVer12_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
521+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
522+ McHorVer02WidthEq16_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
523+ McHorVer22WidthEq16_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
524+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
525+}
526+void EncMcHorVer13_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
527+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
528+ McHorVer20WidthEq16_neon (pSrc + iSrcStride, iSrcStride, pTmp, 16, iHeight);
529+ McHorVer02WidthEq16_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
530+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
531+}
532+void EncMcHorVer21_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
533+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
534+ McHorVer20WidthEq16_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
535+ McHorVer22WidthEq16_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
536+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
537+}
538+void EncMcHorVer23_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
539+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
540+ McHorVer20WidthEq16_neon (pSrc + iSrcStride, iSrcStride, pTmp, 16, iHeight);
541+ McHorVer22WidthEq16_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
542+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
543+}
544+void EncMcHorVer31_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
545+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
546+ McHorVer20WidthEq16_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
547+ McHorVer02WidthEq16_neon (pSrc + 1, iSrcStride, &pTmp[256], 16, iHeight);
548+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
549+}
550+void EncMcHorVer32_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
551+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
552+ McHorVer02WidthEq16_neon (pSrc + 1, iSrcStride, pTmp, 16, iHeight);
553+ McHorVer22WidthEq16_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
554+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
555+}
556+void EncMcHorVer33_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride, int32_t iHeight) {
557+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
558+ McHorVer20WidthEq16_neon (pSrc + iSrcStride, iSrcStride, pTmp, 16, iHeight);
559+ McHorVer02WidthEq16_neon (pSrc + 1, iSrcStride, &pTmp[256], 16, iHeight);
560+ PixelAvgWidthEq16_neon (pDst, iDstStride, pTmp, &pTmp[256], iHeight);
561+}
562+void EncMcChroma_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
563+ SMVUnitXY sMv, int32_t iWidth, int32_t iHeight) {
564+ const int32_t kiD8x = sMv.iMvX & 0x07;
565+ const int32_t kiD8y = sMv.iMvY & 0x07;
561566 if (0 == kiD8x && 0 == kiD8y) {
562− if(8 == iWidth)
563− McCopyWidthEq8_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
567+ if (8 == iWidth)
568+ McCopyWidthEq8_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
564569 else // iWidth == 4
565− McCopyWidthEq4_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
570+ McCopyWidthEq4_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
571+ } else {
572+ if (8 == iWidth)
573+ McChromaWidthEq8_neon (pSrc, iSrcStride, pDst, iDstStride, (int32_t*) (g_kuiABCD[kiD8y][kiD8x]), iHeight);
574+ else //if(4 == iWidth)
575+ McChromaWidthEq4_neon (pSrc, iSrcStride, pDst, iDstStride, (int32_t*) (g_kuiABCD[kiD8y][kiD8x]), iHeight);
566576 }
567− else {
568− if(8 == iWidth)
569− McChromaWidthEq8_neon(pSrc, iSrcStride, pDst, iDstStride, (int32_t*)(g_kuiABCD[kiD8y][kiD8x]), iHeight);
577+}
578+#endif
579+
580+#if defined(HAVE_NEON_AARCH64)
581+void McHorVer20Width9Or17_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
582+ int32_t iWidth, int32_t iHeight) {
583+ if (iWidth == 17)
584+ McHorVer20Width17_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
585+ else //if (iWidth == 9)
586+ McHorVer20Width9_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
587+}
588+void McHorVer02Height9Or17_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
589+ int32_t iWidth, int32_t iHeight) {
590+ if (iWidth == 16)
591+ McHorVer02Height17_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
592+ else //if (iWidth == 8)
593+ McHorVer02Height9_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
594+}
595+void McHorVer22Width9Or17Height9Or17_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst,
596+ int32_t iDstStride,
597+ int32_t iWidth, int32_t iHeight) {
598+ if (iWidth == 17)
599+ McHorVer22Width17_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
600+ else //if (iWidth == 9)
601+ McHorVer22Width9_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
602+}
603+void EncMcHorVer11_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
604+ int32_t iHeight) {
605+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
606+ McHorVer20WidthEq16_AArch64_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
607+ McHorVer02WidthEq16_AArch64_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
608+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
609+}
610+void EncMcHorVer12_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
611+ int32_t iHeight) {
612+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
613+ McHorVer02WidthEq16_AArch64_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
614+ McHorVer22WidthEq16_AArch64_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
615+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
616+}
617+void EncMcHorVer13_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
618+ int32_t iHeight) {
619+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
620+ McHorVer20WidthEq16_AArch64_neon (pSrc + iSrcStride, iSrcStride, pTmp, 16, iHeight);
621+ McHorVer02WidthEq16_AArch64_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
622+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
623+}
624+void EncMcHorVer21_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
625+ int32_t iHeight) {
626+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
627+ McHorVer20WidthEq16_AArch64_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
628+ McHorVer22WidthEq16_AArch64_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
629+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
630+}
631+void EncMcHorVer23_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
632+ int32_t iHeight) {
633+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
634+ McHorVer20WidthEq16_AArch64_neon (pSrc + iSrcStride, iSrcStride, pTmp, 16, iHeight);
635+ McHorVer22WidthEq16_AArch64_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
636+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
637+}
638+void EncMcHorVer31_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
639+ int32_t iHeight) {
640+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
641+ McHorVer20WidthEq16_AArch64_neon (pSrc, iSrcStride, pTmp, 16, iHeight);
642+ McHorVer02WidthEq16_AArch64_neon (pSrc + 1, iSrcStride, &pTmp[256], 16, iHeight);
643+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
644+}
645+void EncMcHorVer32_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
646+ int32_t iHeight) {
647+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
648+ McHorVer02WidthEq16_AArch64_neon (pSrc + 1, iSrcStride, pTmp, 16, iHeight);
649+ McHorVer22WidthEq16_AArch64_neon (pSrc, iSrcStride, &pTmp[256], 16, iHeight);
650+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
651+}
652+void EncMcHorVer33_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
653+ int32_t iHeight) {
654+ ENFORCE_STACK_ALIGN_1D (uint8_t, pTmp, 512, 16)
655+ McHorVer20WidthEq16_AArch64_neon (pSrc + iSrcStride, iSrcStride, pTmp, 16, iHeight);
656+ McHorVer02WidthEq16_AArch64_neon (pSrc + 1, iSrcStride, &pTmp[256], 16, iHeight);
657+ PixelAvgWidthEq16_AArch64_neon (pDst, iDstStride, pTmp, 16, &pTmp[256], 16, iHeight);
658+}
659+void EncMcChroma_AArch64_neon (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
660+ SMVUnitXY sMv, int32_t iWidth, int32_t iHeight) {
661+ const int32_t kiD8x = sMv.iMvX & 0x07;
662+ const int32_t kiD8y = sMv.iMvY & 0x07;
663+ if (0 == kiD8x && 0 == kiD8y) {
664+ if (8 == iWidth)
665+ McCopyWidthEq8_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
666+ else // iWidth == 4
667+ McCopyWidthEq4_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, iHeight);
668+ } else {
669+ if (8 == iWidth)
670+ McChromaWidthEq8_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, (int32_t*) (g_kuiABCD[kiD8y][kiD8x]), iHeight);
570671 else //if(4 == iWidth)
571− McChromaWidthEq4_neon(pSrc, iSrcStride, pDst, iDstStride, (int32_t*)(g_kuiABCD[kiD8y][kiD8x]), iHeight);
672+ McChromaWidthEq4_AArch64_neon (pSrc, iSrcStride, pDst, iDstStride, (int32_t*) (g_kuiABCD[kiD8y][kiD8x]), iHeight);
572673 }
573674 }
574675 #endif
@@ -599,7 +700,14 @@ void WelsInitMcFuncs (SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag) { · 24 unmodified lines
599700 McHorVer03WidthEq16_neon, EncMcHorVer13_neon, EncMcHorVer23_neon, EncMcHorVer33_neon
600701 };
601702 #endif
602−
703+#if defined(HAVE_NEON_AARCH64)
704+ static PWelsLumaQuarpelMcFunc pWelsMcFuncWidthEq16_AArch64_neon[16] = { //[x][y]
705+ McCopyWidthEq16_AArch64_neon, McHorVer10WidthEq16_AArch64_neon, McHorVer20WidthEq16_AArch64_neon, McHorVer30WidthEq16_AArch64_neon,
706+ McHorVer01WidthEq16_AArch64_neon, EncMcHorVer11_AArch64_neon, EncMcHorVer21_AArch64_neon, EncMcHorVer31_AArch64_neon,
707+ McHorVer02WidthEq16_AArch64_neon, EncMcHorVer12_AArch64_neon, McHorVer22WidthEq16_AArch64_neon, EncMcHorVer32_AArch64_neon,
708+ McHorVer03WidthEq16_AArch64_neon, EncMcHorVer13_AArch64_neon, EncMcHorVer23_AArch64_neon, EncMcHorVer33_AArch64_neon
709+ };
710+#endif
603711 pFuncList->sMcFuncs.pfLumaHalfpelHor = McHorVer20_c;
604712 pFuncList->sMcFuncs.pfLumaHalfpelVer = McHorVer02_c;
605713 pFuncList->sMcFuncs.pfLumaHalfpelCen = McHorVer22_c;
@@ -651,5 +759,16 @@ void WelsInitMcFuncs (SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag) { · 45 unmodified lines
651759 pFuncList->sMcFuncs.pfLumaHalfpelCen = McHorVer22Width9Or17Height9Or17_neon;//iWidth+1/heigh+1
652760 }
653761 #endif
762+#if defined(HAVE_NEON_AARCH64)
763+ if (uiCpuFlag & WELS_CPU_NEON) {
764+ pFuncList->sMcFuncs.pfLumaQuarpelMc = pWelsMcFuncWidthEq16_AArch64_neon;
765+ pFuncList->sMcFuncs.pfChromaMc = EncMcChroma_AArch64_neon;
766+ pFuncList->sMcFuncs.pfSampleAveraging[0] = PixStrideAvgWidthEq8_AArch64_neon;
767+ pFuncList->sMcFuncs.pfSampleAveraging[1] = PixStrideAvgWidthEq16_AArch64_neon;
768+ pFuncList->sMcFuncs.pfLumaHalfpelHor = McHorVer20Width9Or17_AArch64_neon;//iWidth+1:8/16
769+ pFuncList->sMcFuncs.pfLumaHalfpelVer = McHorVer02Height9Or17_AArch64_neon;//heigh+1:8/16
770+ pFuncList->sMcFuncs.pfLumaHalfpelCen = McHorVer22Width9Or17Height9Or17_AArch64_neon;//iWidth+1/heigh+1
771+ }
772+#endif
654773 }
655774 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t