2013-10-18 3 views
0

비디오의 픽셀을 임의로 뒤섞는 NV12 비디오 변환을 적용하고 있습니다. 비디오의 시작 *ARM NEON 이미지 변환을위한 최적화

//Temporary tables for the destination 
for (j = 0; j < height; j++) 
    for (i = 0; i < width; i++) { 
     toY[i][j] = j * width + i; 
     toUV[i][j] = j/2 * width + ((int)(i/2)) * 2; 
    } 

//Temporary tables for the source 
for (j = 0; j < height; j++) 
    for (i = 0; i < width; i++) { 
     fromY[i][j] = funcY(i, j) * width + funcX(i, j); 
     fromUV[i][j] = funcY(i, j)/2 * width + ((int)(funcX(i, j)/2)) * 2; 
    } 
에서 한 번만 수행

* 전처리 : 구글 넥서스 7 2013와 같은 ARM 장치에서 성능은 다음과 같은 C 코드와 1024x512 영역에 대해 초당 30 프레임에 아주 나쁜 각 프레임에서 수행

* 프로세스 *

for (j = 0; j < height; j++) 
    for (i = 0; i < width; i++) { 
     destY[ toY[i][j] ] = srcY[ fromY[i][j] ]; 
     if ((i % 2 == 0) && (j % 2 == 0)) { 
      destUV[ toUV[i][j] ] = srcUV[ fromUV[i][j] ]; 
      destUV[ toUV[i][j] + 1 ] = srcUV[ fromUV[i][j] + 1 ]; 
     } 
    } 

가 한 번만 계산 비록, funcX/Y는이 파를 최적화하는 것은 매우 쉬운 일이 아닙니다 그래서 꽤 복잡한 변환이 티.

각 프레임에서 계산 된 이중 루프를 주어진 "원본"테이블로 고정 할 수있는 방법이 아직 남아 있습니까?

+0

인덱스에 테이블을 사용하지 않는 것이 좋습니다. 항상 산술을 사용하십시오. 메모리 대역폭은 CPU보다 부족합니다. 이미지를보다 명확하게 트래버스하는 방법을 알려주고 사람들이 개선 방법에 대한 더 나은 아이디어를 줄 수 있는지도 모릅니다. – auselen

답변

0

원본 이미지의 8 배에 해당하는 4 개의 찾아보기 테이블을 생성 하시겠습니까?

불필요한 if 문을 가장 안쪽 루프에 넣으시겠습니까?

i와 j를 교체하는 방법은 무엇입니까?

정직하게 말하면, 팔, 네온 또는 이미지 처리 대신 [c]로 질문을 시작해야합니다.

funcY와 funcX가하는 것을 보여주지 않았으므로 내가 줄 수있는 최선의 대답은 다음과 같습니다. (실적 급증 그리고 정말 중요한 일입니다.) 당신은 피해야한다

//Temporary tables for the source 
pTemp = fromYUV; 
for (j = 0; j < height; j+=2) 
{ 
    for (i = 0; i < width; i+=2) { 
     *pTemp++ = funcY(i, j) * width + funcX(i, j); 
     *pTemp++ = funcY(i+1, j) * width + funcX(i+1, j); 
     *pTemp++ = funcY(i, j)/2 * width + ((int)(funcX(i, j)/2)) * 2; 
    } 
    for (i = 0; i < width; i+=2) { 
     *pTemp++ = funcY(i, j+1) * width + funcX(i, j+1); 
     *pTemp++ = funcY(i+1, j+1) * width + funcX(i+1, j+1); 
    } 
} 

* Process done at each frame * 
pTemp = fromYUV; 
pTempY = destY; 
pTempUV = destUV; 
for (j = 0; j < height; j+=2) 
{ 
    for (i = 0; i < width; i+=2) { 
     *pTempY++ = srcY[*pTemp++]; 
     *pTempY++ = srcY[*pTemp++]; 
     *pTempUV++ = srcUV[*pTemp++]; 
    } 
    for (i = 0; i < width; i+=2) { 
     *pTempY++ = srcY[*pTemp++]; 
     *pTempY++ = srcY[*pTemp++]; 
    } 
} 

(수) : 내 if 문 복수의 메모리 영역

  • 임의 메모리 액세스
    • 액세스 루프

    최악의 범죄는 i와 j의 rder. 당신이 좌표 x와 y에서의 픽셀에 액세스하는 경우

    를 (어떤 당신이 시작할 필요가 없습니다), 그것은 픽셀 = 이미지 [Y]의 [X]와 하지 이미지 [X] [Y]

  • 관련 문제