Notice
Link
- Today
- Total
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- mybatis exception
- view 획득
- sql exception
- CSS
- vc++
- 파티션 빠른 삭제
- springboot 재가동
- 피쉬랜드
- MFC
- MariaDB
- MySQL
- kill -9
- reactnative
- CentOS
- c언어
- 스크롤적용
- 텍스트컬러
- pid 찾아 kill
- SQL 첫날
- ffmpeg
- 말줌임 CSS
- springboot
- rn
- SQL 마지막날
- DB 계정생성
- Back 키 클릭 감지
- 터치좌표 view
- 코드로 서버 재실행
- 가변영역 스크롤
- Activity 전체화면
Archives
개발은 하는건가..
[MFC] DC 에 동영상 출력 시 가장 빠르게 출력 하기 위한 방법 본문
반응형
동영상을 디코딩하여 나온 RGB raw 데이터를 DirectX 나 openGl 같은 것들을 사용하지 않고 DC 에서도 충분히 빠른 속도로 출력이 가능하다.
화면을 가득 채우는 FHD 해상도의 영상도 높지 않은 CPU 점유율을 소모하면서 30 프레임은 가능했다.
단, 조건은 영상을 디코딩 시 32bit BGRA 형태여야 한다. 그래야 출력 과정에서 RGB 데이터들을 다시 재배치하는 연산을 수행하지 않고 그대로 출력이되므로 속도가 빠르다.
RECT m_rcView = { 0, 0, 1280, 720 }; // 출력 영역
BITMAPINFO* m_pBitmapInfo = NULL; // 비트맵 정보
void CVideoStreamDlg::DrawVideo(CDC *pDC, BYTE *pFrameData, UINT nWidth, UINT nHeight)
{
if (m_pBitmapInfo == NULL) {
// DC 에 draw 를 위한 BitmapInfo 생성
m_pBitmapInfo = (BITMAPINFO*)(new BYTE[sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD)]);
ZeroMemory(m_pBitmapInfo, sizeof(BITMAPINFO));
m_pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBitmapInfo->bmiHeader.biPlanes = 1;
m_pBitmapInfo->bmiHeader.biCompression = BI_RGB;
m_pBitmapInfo->bmiHeader.biClrImportant = 0;
m_pBitmapInfo->bmiHeader.biWidth = nWidth;
m_pBitmapInfo->bmiHeader.biHeight = -(int)nHeight; // bitmap 상하 flip 를 위해 - 값으로 취한다.
m_pBitmapInfo->bmiHeader.biBitCount = 32;
}
// 영상 위에 추가적인 Drawing 시 속도 향상을 위해 memDC 이용 (CMemDC 는 MFC 클래스)
CMemDC memDC(*pDC, m_rcView);
pDC = &memDC.GetDC();
pDC->SetStretchBltMode(HALFTONE); // COLORONCOLOR HALFTONE
// pFrameData 의 RGB 데이터를 drawing
::StretchDIBits(pDC->GetSafeHdc(),
m_rcView.left, m_rcView.top, m_rcView.Width(), m_rcView.Height(), // Draw target rect
0, 0, nWidth, nHeight, // Src rect
pFrameData, // Bitmap data
m_pBitmapInfo, // BitmapInfo
DIB_RGB_COLORS,
SRCCOPY);
// 영상 시간 표시를 위한 처리
CString strStatus;
LONGLONG llElapsed = GetTickCount64() - m_nFrameStartTs;
int nHour, nMin, nSec, nMs;
nHour = (int)(llElapsed / (1000 * 60 * 60));
nMin = (int)(llElapsed / (1000 * 60)) % 60;
nSec = (int)(llElapsed / 1000) % 60;
nMs = (int)(llElapsed % 1000);
strStatus.Format(_T("ElapsedTime=%02d:%02d:%02d.%03d), nHour, nMin, nSec, nMs);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0, 0, 0));
pDC->TextOutW(m_rcView.left + 6, m_rcView.top + 6, strStatus);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->TextOutW(m_rcView.left + 5, m_rcView.top + 5, strStatus);
}
'C, C++, MFC' 카테고리의 다른 글
MFC UDP Socket Base class (0) | 2022.07.19 |
---|---|
CListCtrl 선택된 Item 인덱스 (0) | 2022.07.19 |
[FFMPEG] H264 AvPacket 데이터를 mp4 파일로 만들기 (0) | 2022.03.14 |
c 매크로 - 엔디안 변환 (0) | 2022.02.10 |
VC++ 타이틀바가 없는 프로그램에 아이콘 나오는 법 (0) | 2018.10.31 |
Comments