基于嵌入式Linux的视频采集系统15-----源程序----display.cpp

2019-07-13 04:27发布

本文件来自:
http://blog.chinaunix.net/uid-23093301-id-86404.html

#include "display.h" #include "log.h" #include "singleton.hpp" #include #include "rtp_service.h" #define ID_TIMER 0
const Uint32 overlay_format = GAL_YV12_OVERLAY;//GAL_YV12_OVERLAY;
CDisplay::CDisplay(): m_started(false) { logtrace(("CDisplay::CDisplay begin... ")); m_img = calloc(1, YUV_WIDTH*YUV_HEIGHT*3); logtrace(("CDisplay::CDisplay end ok ")); }
CDisplay::~CDisplay() { logtrace(("CDisplay::~CDisplay begin... ")); logtrace(("CDisplay::~CDisplay end ok ")); } int CDisplay::Display_WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { int ret =0; ret = singleton::instance().hanlde_winpro(hWnd,message,wParam,lParam); return 0; } int CDisplay::start() { logtrace(("CDisplay::start begin... ")); int ret =0; MSG Msg; m_started = true; m_CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; m_CreateInfo.dwExStyle = WS_EX_NONE; m_CreateInfo.spCaption = WINDOW_Caption; m_CreateInfo.hMenu = 0; m_CreateInfo.hCursor = GetSystemCursor(0); m_CreateInfo.hIcon = 0; m_CreateInfo.MainWindowProc = Display_WinProc; m_CreateInfo.lx = 0; m_CreateInfo.ty = 0; m_CreateInfo.rx = g_rcScr.right; m_CreateInfo.by = g_rcScr.bottom; m_CreateInfo.iBkColor = COLOR_lightwhite; m_CreateInfo.dwAddData = 0; m_CreateInfo.hHosting = HWND_DESKTOP;          m_hMainWnd = CreateMainWindow (&m_CreateInfo);          if (m_hMainWnd == HWND_INVALID)         return -1;     ShowWindow(m_hMainWnd, SW_SHOWNORMAL);     while (GetMessage(&Msg, m_hMainWnd)) {             TranslateMessage(&Msg);             DispatchMessage(&Msg);      }//! end while     MainWindowThreadCleanup (m_hMainWnd); logtrace(("CDisplay::start end ok ")); return ret; } int CDisplay::hanlde_winpro(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { logtrace(("CDisplay::hanlde_winpro begin... ")); int ret =0; //HDC hdc; switch (message) { case MSG_CREATE: { overlay = CreateYUVOverlay(YUV_WIDTH, YUV_HEIGHT, overlay_format, HDC_SCREEN); SetTimer (hWnd, ID_TIMER, 100); }break; case MSG_CLOSE: { DestroyMainWindow (hWnd); PostQuitMessage (hWnd); }break; case MSG_KEYDOWN: case MSG_LBUTTONUP: { ret = handle_click(hWnd,wParam,lParam); }break; case MSG_PAINT: { ret = handle_paint(hWnd); }break; case MSG_TIMER: { logtrace(("CDisplay::hanlde_TIMER HOOOOOOOH ")); ret = handle_timer(hWnd); }break; default: { ret =  DefaultMainWinProc(hWnd, message, wParam, lParam); }break; }//! end switch logtrace(("CDisplay::hanlde_winpro end ok ")); return ret; } int CDisplay::drow_img(void* img,size_t size) { logtrace(("CDisplay::drow_img begin...size=<%u> ",size)); if(m_started) m_decoder.push_frame(img,size); logtrace(("CDisplay::drow_img end ok ")); return 0; }
int CDisplay::init_window() { logtrace(("CDisplay::init_window begin... ")); int ret =0; logtrace(("CDisplay::init_window end ok ret=<%d> ",ret)); return ret; } int CDisplay::handle_paint(HWND hWnd) { logtrace(("CDisplay::handle_paint begin...m_size=<%d> ",m_size)); int ret =0; HDC hdc; hdc =  BeginPaint (hWnd);//GetClientDC(hWnd);     EndPaint (hWnd, hdc); logtrace(("CDisplay::handle_paint end ok ret=<%d> ",ret)); return ret; }
int CDisplay::handle_click(HWND hWnd, WPARAM wParam, LPARAM lParam) { logtrace(("CDisplay::handle_click begin... ")); int ret =0; ret = handle_paint(hWnd); logtrace(("CDisplay::handle_click end ok ret=<%d> ",ret)); return ret; }
int CDisplay::handle_timer(HWND hWnd) { for(int i=0;;i++){ usleep(1000); ShowYUVOverlay(HDC_SCREEN); } //SetTimer (hWnd, ID_TIMER, 1);//100 = 1s logdebug(("CDisplay::handle_timer end ok ")); return 0; } void CDisplay::ShowYUVOverlay( HDC hdc) { RECT rect; AVFrame   pict; LockYUVOverlay(overlay); rect.left = 0;     rect.top=0;     rect.right=YUV_WIDTH;     rect.bottom=YUV_HEIGHT;     pict.data[0] = overlay->pixels[0];     pict.data[1] = overlay->pixels[2];     pict.data[2] = overlay->pixels[1];
    pict.linesize[0] = overlay->pitches[0];     pict.linesize[1] = overlay->pitches[2];     pict.linesize[2] = overlay->pitches[1];     m_decoder.try_show(&pict);    UnlockYUVOverlay (overlay);    /* 将 YUV 覆盖显示到 DC 对象上的指定矩形区间 */    DisplayYUVOverlay(overlay, &rect); }