#ifndef _VIDEO_H #define _VIDEO_H #include #include #include #include "main.h" #define NUM_WIDGETS 11 class VideoOutput; class SubsItem; class VideoOutputChild { public: VideoOutputChild() { m_mon_x=m_mon_y=0; } virtual ~VideoOutputChild() { } virtual int create(VideoOutput *parent, int w, int h, unsigned int type, int flipit, double aspectratio)=0; //return 1 if ok virtual int needChange()=0; //return 1 if need to renegociate video output virtual int onPaint(HWND hwnd, HDC hdc) { return 0; } //return 1 if override virtual void displayFrame(const char *buf, int size, int time)=0; virtual void goFullScreen()=0; virtual void removeFullScreen()=0; virtual int showOSD() { return 0; } virtual void hideOSD() { } virtual void timerCallback() { } virtual void setPalette(RGBQUAD *pal) { } virtual void drawSubtitle(SubsItem *item) { } virtual void resetSubtitle() { } char m_szTest[512]; void update_monitor_coords(VideoOutput *parent); int m_mon_x; int m_mon_y; int m_found_devguid; GUID m_devguid; HMONITOR m_monitor_to_find; }; #include "vid_overlay.h" #include "vid_ddraw.h" class VideoOutput : public IVideoOutput { public: VideoOutput(HWND parent_hwnd=NULL, int initxpos=CW_USEDEFAULT, int initypos=CW_USEDEFAULT); ~VideoOutput(); int open(int w, int h, int vflip, double aspectratio, unsigned int fmt); void close(); void draw(void *frame); void drawSubtitle(SubsItem *item); void showStatusMsg(const char *text); void notifyBufferState(int bufferstate); /* 0-255*/ int get_latency(); void setcallback(LRESULT (*msgcallback)(void *token, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam), void *token) { m_msgcallback_tok=token; m_msgcallback=msgcallback; } void setNSVDecoder(NSVDecoder *nsv_decoder) { decoder = nsv_decoder; } void fullscreen(); void remove_fullscreen(); int is_fullscreen(); HWND getHwnd() { return video_hwnd; } void adjustAspect(RECT &rd); int vid_vsync; int vid_aspectadj; int vid_overlays; int vid_ddraw; void getViewport(RECT *r, HWND wnd, int full); void setOutputSize(int w, int h); void getOutputSize(int *w, int *h); int osdShowing() { return show_osd; } int osdReady() { return ctrlrects_ready; } void showOSD(); void hideOSD(); void drawOSD(HDC hdc, RECT *r); int getOSDbarHeight() { return (show_osd && ctrlrects_ready) ? (ctrlrect_all.bottom - ctrlrect_all.top) : 0; }; private: LRESULT WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static int class_refcnt; static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND video_hwnd, video_parent_hwnd; NSVDecoder *decoder; double aspect; int width, height, flip; unsigned int type; int uyvy_output,yuy2_output; int i420_output; int is_fs; int ignore_mousemove_count; int show_osd; HWND oldfsparent; RECT oldfsrect; // the old window rect, BEFORE fullscreen mode was entered RECT lastfsrect; // the most recent bounding rect when in fullscreen mode LONG oldfsstyle; int m_bufferstate; void resetSubtitle(); SubsItem *curSubtitle; // ONSCREEN DISPLAY (osd): HFONT osdFontText; HFONT osdFontSymbol; HGDIOBJ osdProgressBrushBg; HGDIOBJ osdProgressBrushFg; HGDIOBJ osdProgressPenBg; HGDIOBJ osdProgressPenFg; HGDIOBJ osdProgressPenBgHilite; HGDIOBJ osdBlackBrush; void osdHitTest(int x, int y, int dragging); int osdLastClickItem; HDC osdMemDC; // memory device context HBITMAP osdMemBM; // memory bitmap (for memDC) HBITMAP osdOldBM; // old bitmap (from memDC) int osdMemBMW; // width of memory bitmap int osdMemBMH; // height of memory bitmap int osdLastMouseX; // for WM_MOUSEMOVE thresholding, so osd isn't spastic int osdLastMouseY; // for WM_MOUSEMOVE thresholding, so osd isn't spastic RECT ctrlrect[NUM_WIDGETS]; // relative to [i.e. (0,0) is] upper left corner of the black strip @ the bottom RECT ctrlrect_all; // relative to [i.e. (0,0) is] upper left corner of the black strip @ the bottom int ctrlrects_ready; LRESULT (*m_msgcallback)(void *token, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void *m_msgcallback_tok; VideoOutputChild *m_video_output; VideoOutputChild *createVideoOutput(int n); CRITICAL_SECTION m_cs; char *m_statusmsg; int m_need_change; HBITMAP m_logo; int m_logo_w, m_logo_h; DWORD m_lastbufinvalid; #ifdef ACTIVEX_CONTROL int m_firstframe; #endif }; #endif