W55RP20 SSM HDMI 출력 예제를 이용하여 실시간으로 이미지를 전송 할 수 있도록 수정해 보았다.
320x240 BMP 이미지를 전송하기 때문에 320x240x16 = 153600 Byte가 전송되며 대략 1.2Mbit 정도 되는 데이터 이기 때문에 W55RP20의 최대 TCP전송 속도 테스트 결과에 따라 26Mbit/s 이므로 최대 8프레임 정도는 나올것 같다.
그래서 기존 코드를 수정해서 실시간 화면 캡쳐를 하고 TCP로 전송하도록 수정해 보았다.
void CEthernetHostDlg::ScreenCapture()
{
CDC* dc;
dc = m_ctlGraph.GetDC();
CRect rect;
::GetWindowRect(m_hWnd, &rect);
int x, y;
x = rect.left- FRAME_WIDTH - CAPTURE_OFFSET;
y = rect.top;
m_ctlGraph.GetClientRect(rect);
CDC memDC;
CBitmap bitmap;
int cx, cy;
cx = FRAME_WIDTH;
cy = FRAME_HEIGHT;
CClientDC ScreenDC(GetDesktopWindow());
memDC.CreateCompatibleDC(&ScreenDC);
bitmap.CreateCompatibleBitmap(&ScreenDC, cx, cy);
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.StretchBlt(0, 0, 320, 240, &ScreenDC, x, y, FRAME_WIDTH, FRAME_HEIGHT, SRCCOPY);
CBitmap* bmp;
bmp = memDC.GetCurrentBitmap();
BYTE* p_image_data = NULL;
BITMAP pBitMap;
unsigned int BitCnt = ::GetDeviceCaps(memDC, BITSPIXEL);
unsigned int uBufferSize = FRAME_WIDTH * FRAME_HEIGHT * (BitCnt/8);
unsigned char* Buf = new unsigned char[uBufferSize];
bitmap.GetBitmapBits(uBufferSize, Buf);
unsigned int r, g, b, a;
int i, j;
unsigned short color = 0x000;
unsigned int index = 0;
int X = FRAME_WIDTH;
int Y = FRAME_HEIGHT;
int cnt = 0;
for (i = Y; i > 0; i--)
{
for (j = X; j > 0; j--)
{
if (BitCnt == 32)
{
//32비트 이미지
b = Buf[index++];
g = Buf[index++];
r = Buf[index++];
a = Buf[index++];
}
else if (BitCnt == 24)
{
//24비트 이미지
b = Buf[index++];
g = Buf[index++];
r = Buf[index++];
}
m_gImgBuffer[cnt] = ((r << 8) & 0xF800) | ((g << 3) & 0x07E0) | ((b >> 3) & 0x1F);
cnt++;
}
}
dc->BitBlt(0, 0, FRAME_WIDTH, FRAME_HEIGHT, &memDC, 0, 0, SRCCOPY);
delete[] Buf;
Buf = NULL;
memDC.SelectObject(pOldBitmap);
m_ctlGraph.ReleaseDC(dc);
}
실제로 구현해서 테스트 해보면 실시간으로 화면을 캡쳐하고 네트웍으로 전송하게 되면 초당 2장도 보내기 힘들다
어떤 문제 일까?
5프레임 정도는 나와야 하는데...
https://www.youtube.com/watch?v=UtRTdlKb86g
우선 이미지를 전송 받고 이미지를 업데이트 하는시간이 필요하기 때문에 이미지 전송시작을 알리는 부분의 구조를 좀 변경해야 할 것같다.
그리고 TCP보다 UDP로 전송해야 속도를 더 높일 수 있을것 같다.
BMP 이미지 1장 전송하는데 750ms가 소요된다.
일단 전송 패킷 사이즈를 변경해 보자
2k 이상 으로 키우면 속도가 더 느려진다.
이더넷 전송사이즈인 1460으로 했을때 가장 빠르다
//#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
#define ETHERNET_BUF_MAX_SIZE (1460)
이렇게 하고 전송하면 이미지 1장 전송하는 시간이 400ms로 빨라 지는것을 확인 할 수 있다.
테스트 동영상
반응형