본문 바로가기

Programming/MFC

[델파이] TMN H.263+ Decoder를 델파이에서 사용하기

출처 블로그 > 내 발바닥
원본 http://blog.naver.com/secueye/5398683

TMN H.263+ 디코더 소스를 VC++로 DLL로 만들었다


원 목적은 EVC++로 PocketPC용으로 만들었는데, 예상외로 VC++로도 그냥 만들어 졌다

어차피 공부용도로 만든거라 공개하는 하긴 하는데

소스야 TMN H.263+ 디코더 소스를 보면 될것 같아 그냥 DLL하고 샘플 프로그램만 올린다

아래 "회사서만든프로그램"코너 보면 SecuEyes Mobile이라는 제목하에 PocketPC용

프로그램이 있는데 여기서 이 DLL를 이용하기도 했다


그리고 이 DLL가지고는 상용 프로그램 만드는데는 무리가 많이 따른다

일단 내가 352x288이내의 영상만 디코딩 되게 해놓았고

YUV to RGB루틴이 C코드로 되어 있어서 CPU부하도 많이 잡아 먹게 된다



★ MTH263Decoder.pas

procedure MTH263_Load; cdecl;
procedure MTH263_Unload; cdecl;
procedure MTH263_Decoding(nImageFlip:Integer; pH263Data:PByte; nH263DataSize:Integer;
                          var pRGBData : Cardinal; var XSize:Integer; var YSize:Integer); cdecl;


DLL을 사용하기 위해서는 위 3개의 함수만 있으면 된다

MTH263_Load 함수는 어플리케이션이 시작할때 1번만 호출해주면 된다

MTH263_Unload 함수는 어플리케이션이 종료할때 1번만 호출해주면 된다

MTH263_Decoding함수는 실제 H.263+ 프레임을 디코딩하는 함수이다

  입력 파라메터는 다음과 같다

  nImageFlip : 이미지 상/하 뒤집기 여부

                   (음..지금생각하니 0이 뒤집기인지, 1이 뒤집기인지 기억이 안남)

  pH263Data : H263데이터이다. PByte형이므로 포인터형으로 넘겨주면 된다

  nH263DataSize : H263데이터의 크기이다. (단위는 바이트)

  출력 파라메터는 다음과 같다

  pRGBData  : Cardinal (Cardinal형이므로 뭘 의미하시는지 아실 것이다

                    바로 RGB데이터가 있는 Address값을 반환한다

                    Pointer(pRGBData)하면 해당 메모리에 접근이 가능하다)

  XSize, YSize : 디코딩된 이미지의 Width와 Height이다


★ 디코딩 예제

procedure Decoding( pData:PByte; nSize:Integer );
var
 
binfo : TBITMAPINFO;
  DecodeAddress : Cardinal;
  XSize, YSize : Integer;
begin

  MTH263_Decoding( 0, pData, nSize, DecodeAddress, XSize, YSize);
 
  binfo.bmiHeader.biSize          := sizeof(TBitmapInfoHeader);
  binfo.bmiHeader.biWidth         := XSize;
  binfo.bmiHeader.biHeight        := YSize;
  binfo.bmiHeader.biPlanes        := 1;
  binfo.bmiHeader.biBitCount      := 24;
  binfo.bmiHeader.biCompression   := BI_RGB;
  binfo.bmiHeader.biSizeImage     := XSize * YSize * 3; // 24Bit Color
  binfo.bmiHeader.biXPelsPerMeter := 0;
  binfo.bmiHeader.biYPelsPerMeter := 0;
  binfo.bmiHeader.biClrUsed       := 0;

  StretchDIBits(Canvas.Handle, 0, 0, XSize,YSize,
                               0, 0, XSize,YSize,
                               Pointer(DecodeAddress),
                               binfo,
                               DIB_RGB_COLORS,
                               SRCCOPY );
end;


★ ★ ★  해당 DLL은 공부용도로만 사용해주시길 부탁드립니다

    그리고 퍼 가실때는 출처라도 밝혀주세요 ^^


델/파/이/만/세

'Programming > MFC' 카테고리의 다른 글

[MFC] 다이얼로그에 아이콘이 없을때  (0) 2007.08.01
[MFC] 전역변수 선언하기  (0) 2007.08.01
right(),left(),mid(),find()  (0) 2007.08.01
[MFC] 커서 바꾸기  (0) 2007.08.01
[MFC] MSN스타일 스킨 에디트 박스  (0) 2007.08.01