C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[60116] Re:YUV데이터를 Surface에 쓸때 CPU를 줄이는 방법이 있을까요 ?
남병철.레조 [lezo] 1550 읽음    2010-02-02 16:32
안녕하세요~ 경호님!
작년 오프때 경호님 사진을 올렸어야했는데... (구로디지털단지에서..;;)

흠... 처리 로직은 잘 모르겠고;; ^^;
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를 따로 가지고 처리하면 부하를 적게 먹는다던지
: 이런 부분이 있을 수 있는지 도움을 받을 수 있으면 감사 드리겠습니다.

+ -

관련 글 리스트
60101 YUV데이터를 Surface에 쓸때 CPU를 줄이는 방법이 있을까요 ? 경호 1385 2010/02/01
60116     Re:YUV데이터를 Surface에 쓸때 CPU를 줄이는 방법이 있을까요 ? 남병철.레조 1550 2010/02/02
60105     Re:YUV데이터를 Surface에 쓸때 CPU를 줄이는 방법이 있을까요 ? Nibble 1457 2010/02/01
60110         Re:Re:YUV데이터를 Surface에 쓸때 CPU를 줄이는 방법이 있을까요 ? 경호 1204 2010/02/02
60113             Re:Re:Re:YUV데이터를 Surface에 쓸때 CPU를 줄이는 방법이 있을까요 ? Nibble 1064 2010/02/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.