winamp/Src/nsv/nsvplay/video.h
2024-09-24 14:54:57 +02:00

160 lines
4.6 KiB
C++

#ifndef _VIDEO_H
#define _VIDEO_H
#include <windows.h>
#include <ddraw.h>
#include <multimon.h>
#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