History

mv mc_neon.S to common,add MC arm code to encoder

Licai Guo committed 12 years ago

Commit 71467f91 parent 14f55186 files · +727 −8Browse files

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

Unified · Split

codec/encoder/core/src/mc.cpp+113−0
@@ -480,6 +480,99 @@ void McChroma_ssse3 (const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int · 479 unmodified lines
480}480}
481 481
482#endif //X86_ASM482#endif //X86_ASM
483
484 //***************************************************************************//
485 // NEON implementation //
486 //***************************************************************************//
487#if defined(HAVE_NEON)
488void McHorVer20Width9Or17_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
489 int32_t iWidth, int32_t iHeight) {
490 if (iWidth == 17)
491 McHorVer20Width17_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
492 else //if (iWidth == 9)
493 McHorVer20Width9_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
494}
495void McHorVer02Height9Or17_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
496 int32_t iWidth, int32_t iHeight){
497 if (iWidth == 16)
498 McHorVer02Height17_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
499 else //if (iWidth == 8)
500 McHorVer02Height9_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
501}
502void McHorVer22Width9Or17Height9Or17_neon(const uint8_t* pSrc, int32_t iSrcStride, uint8_t* pDst, int32_t iDstStride,
503 int32_t iWidth, int32_t iHeight){
504 if (iWidth == 17)
505 McHorVer22Width17_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
506 else //if (iWidth == 9)
507 McHorVer22Width9_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
508}
509void 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}
515void 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}
521void 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}
527void 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}
533void 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}
539void 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}
545void 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}
551void 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}
557void 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;
561 if (0 == kiD8x && 0 == kiD8y) {
562 if(8 == iWidth)
563 McCopyWidthEq8_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
564 else // iWidth == 4
565 McCopyWidthEq4_neon(pSrc, iSrcStride, pDst, iDstStride, iHeight);
566 }
567 else {
568 if(8 == iWidth)
569 McChromaWidthEq8_neon(pSrc, iSrcStride, pDst, iDstStride, (int32_t*)(g_kuiABCD[kiD8y][kiD8x]), iHeight);
570 else //if(4 == iWidth)
571 McChromaWidthEq4_neon(pSrc, iSrcStride, pDst, iDstStride, (int32_t*)(g_kuiABCD[kiD8y][kiD8x]), iHeight);
572 }
573}
574#endif
575
483typedef void (*PixelAvgFunc) (uint8_t*, int32_t, const uint8_t*, int32_t, const uint8_t*, int32_t, int32_t);576typedef void (*PixelAvgFunc) (uint8_t*, int32_t, const uint8_t*, int32_t, const uint8_t*, int32_t, int32_t);
484void WelsInitMcFuncs (SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag) {577void WelsInitMcFuncs (SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag) {
485 static PixelAvgFunc pfPixAvgFunc[2] = {PixelAvgWidthEq8_c, PixelAvgWidthEq16_c};578 static PixelAvgFunc pfPixAvgFunc[2] = {PixelAvgWidthEq8_c, PixelAvgWidthEq16_c};
@@ -498,6 +591,14 @@ void WelsInitMcFuncs (SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag) { · 12 unmodified lines
498 McHorVer03WidthEq16, McHorVer13WidthEq16, McHorVer23WidthEq16, McHorVer33WidthEq16591 McHorVer03WidthEq16, McHorVer13WidthEq16, McHorVer23WidthEq16, McHorVer33WidthEq16
499 };592 };
500#endif593#endif
594#if defined(HAVE_NEON)
595 static PWelsLumaQuarpelMcFunc pWelsMcFuncWidthEq16_neon[16] = { //[x][y]
596 McCopyWidthEq16_neon, McHorVer10WidthEq16_neon, McHorVer20WidthEq16_neon, McHorVer30WidthEq16_neon,
597 McHorVer01WidthEq16_neon, EncMcHorVer11_neon, EncMcHorVer21_neon, EncMcHorVer31_neon,
598 McHorVer02WidthEq16_neon, EncMcHorVer12_neon, McHorVer22WidthEq16_neon, EncMcHorVer32_neon,
599 McHorVer03WidthEq16_neon, EncMcHorVer13_neon, EncMcHorVer23_neon, EncMcHorVer33_neon
600 };
601#endif
501 602
502 pFuncList->sMcFuncs.pfLumaHalfpelHor = McHorVer20_c;603 pFuncList->sMcFuncs.pfLumaHalfpelHor = McHorVer20_c;
503 pFuncList->sMcFuncs.pfLumaHalfpelVer = McHorVer02_c;604 pFuncList->sMcFuncs.pfLumaHalfpelVer = McHorVer02_c;
@@ -538,5 +639,17 @@ void WelsInitMcFuncs (SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag) { · 34 unmodified lines
538 }639 }
539 640
540#endif //(X86_ASM)641#endif //(X86_ASM)
642
643#if defined(HAVE_NEON)
644 if (uiCpuFlag & WELS_CPU_NEON) {
645 pFuncList->sMcFuncs.pfLumaQuarpelMc = pWelsMcFuncWidthEq16_neon;
646 pFuncList->sMcFuncs.pfChromaMc = EncMcChroma_neon;
647 pFuncList->sMcFuncs.pfSampleAveraging[0] = PixStrideAvgWidthEq8_neon;
648 pFuncList->sMcFuncs.pfSampleAveraging[1] = PixStrideAvgWidthEq16_neon;
649 pFuncList->sMcFuncs.pfLumaHalfpelHor = McHorVer20Width9Or17_neon;//iWidth+1:8/16
650 pFuncList->sMcFuncs.pfLumaHalfpelVer = McHorVer02Height9Or17_neon;//heigh+1:8/16
651 pFuncList->sMcFuncs.pfLumaHalfpelCen = McHorVer22Width9Or17Height9Or17_neon;//iWidth+1/heigh+1
652 }
653#endif
541}654}
542}655}

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