본문 바로가기

RaspberryPi/W55RP20

[W55RP20 SSM] HDMI 출력 테스트 - 실시간 화면캡쳐 후 이미지 전송

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로 빨라 지는것을 확인 할 수 있다.

 

테스트 동영상

https://youtu.be/87KdFQ_3NtE

 

 

반응형