|
안녕하세요~ 경호님!
작년 오프때 경호님 사진을 올렸어야했는데... (구로디지털단지에서..;;)
흠... 처리 로직은 잘 모르겠고;; ^^;
YUV(YCbCr)의 경우 데이타를 줄이면 상대적으로 연산이 줄어들꺼라 생각하다가...
가만 생각해보니 결국 표면에 기록해야하는거니 줄어든걸 결국 펴바르게 되서 별 도움이 안되겠네요. ㅋ;
그럴거면 인터레이스 방식은 어떠신가요?
홀수 짝수 그리기... 그러면 높이의 for루프 연산이 반으로 줄어들게 됩니다.
요즘은 HD방식이 1900x1080p로 프로그래시브하게 다 그리지만 코덱에서 인터레이스 방식을 아직 지원하고 있습니다.
H.264까지는 수용했지만 지금부터 준비하는 UD 시대의 코덱에는 인터레이스 방식이 빠진다고 합니다.
(그렇다고 코덱 조절하시란 말은 아니구요 ~_~;;)
앞으로 코덱에서 그런 효과는 낼 수 없겠지만 표면 복사하는 연산을 반으로 줄 일 수 있으니 괜찮지 않을까 합니다.
for (DWORD j=0 ; j<dwHeight/2; j=j+2)
for (DWORD j=1 ; j<dwHeight/2; j=j+2)
이렇게 루프를 2개로 분리해서 번갈아...
다만! 인터레이스 방식의 가장 큰 약점은... 역시 빠른 영상에서 잔상 처럼 효과가 나타나는...
아직도 영화 다운(불법??) 받아서 보게되면 그렇게 인코딩한 사람들이 있더라구요. --;
바로 지우고 다시 다른걸 다운(불법??) 받아서 보지만.. ㅋ;;
경호 님이 쓰신 글 :
: 안녕하세요 ?
: 경호입니다.
:
: directdraw를 이용해서 화면에 동영상을 play하고 있습니다.
: 여기저기 최적화를 하다가 이쪽에 지식을 가지신 분들이 있으면 도움을 받을까 해서
: 간단하게 올려 봅니다
:
: 일단 Codec에서 YUV를 뽑아내고 있는 방식은
: 1. 버퍼 1개에 YUV데이터를 모두 붙여서 얻어온다.
: (Y전체 쓰고 U쓰고 V쓰고 : 일반적으로 파일에 YUV데이터를 쌓는 형태)
: 2. YUV를 각각의 개별버퍼를 만들어 얻어 온다
: (즉 3개의 버퍼에 개별적으로 Y와 U,V를 얻어 온다)
:
: 위쪽은 MMX 및 ASM으로 이미 최적화를 한상태 입니다.
:
: 제가 줄이고 싶은 부분은 Directdraw부분인대 즉 YUV데이터를 Surface에 쓸때 사용되는 for문을 줄일 수 있을까
: 하는 것입니다.
:
: 실제 사용되는 소스는
: for (DWORD j=0 ; j<dwHeight/2; ++j)
: {
: memmove((BYTE*)m_ddsd.lpSurface + j*m_ddsd.lPitch, pSrcData + j*dwWidth, dwWidth);
: memmove((BYTE*)m_ddsd.lpSurface + j*m_ddsd.lPitch + dwHeight/2*m_ddsd.lPitch, pSrcData + dwHeight/2*dwWidth + j*dwWidth, dwWidth);
: memmove((BYTE*)m_ddsd.lpSurface + m_ddsd.lPitch*m_ddsd.dwHeight*5/4 + j*m_ddsd.lPitch/2, pSrcData + dwWidth*dwHeight + j*dwWidth/2, dwWidth/2);
: memmove((BYTE*)m_ddsd.lpSurface + m_ddsd.lPitch*m_ddsd.dwHeight + j*m_ddsd.lPitch/2, pSrcData + dwWidth*dwHeight*5/4 + j*dwWidth/2, dwWidth/2);
: }
: 입니다. 현재는 버퍼 하나에 쌓인 YUV데이터를 surface에 그리면서 위와 같이 처리하고 있는대
: 이 부분을 처리하면서 CPU부하를 적게 먹게 할 방법이 있을까요 ?
:
: 물론 위코드에서 for문 안에 있는 * / 부분은 전부 변수로 빼서 따로 계산하도록은 할것 입니다.
:
: 논리적으로나 또는 surface에 데이터를 쓸때 YUV를 따로 가지고 처리하면 부하를 적게 먹는다던지
: 이런 부분이 있을 수 있는지 도움을 받을 수 있으면 감사 드리겠습니다.
|