DirectShow Video Provider now supports zoom and aspect ratio, but it's ugly and slow... still no subs.

Originally committed to SVN as r666.
This commit is contained in:
Rodrigo Braz Monteiro 2006-12-31 22:38:54 +00:00
parent 79ec29c204
commit 1ea3e085d9
3 changed files with 43 additions and 23 deletions

View File

@ -341,10 +341,6 @@ void FrameMain::InitMenu() {
wxMenuItem *RecentKeyframesParent = new wxMenuItem(videoMenu, Menu_File_Recent_Keyframes_Parent, _("Recent"), _T(""), wxITEM_NORMAL, RecentKeyframes);
videoMenu->Append(RecentKeyframesParent);
videoMenu->AppendSeparator();
AppendBitmapMenuItem(videoMenu,Menu_Video_JumpTo, _("&Jump To...\t") + Hotkeys.GetText(_T("Video Jump")), _("Jump to frame or time"), wxBITMAP(jumpto_button));
AppendBitmapMenuItem(videoMenu,Menu_Subs_Snap_Video_To_Start, _("Jump video to start\t") + Hotkeys.GetText(_T("Jump Video To Start")), _("Jumps the video to the start frame of current subtitle"), wxBITMAP(video_to_substart));
AppendBitmapMenuItem(videoMenu,Menu_Subs_Snap_Video_To_End, _("Jump video to end\t") + Hotkeys.GetText(_T("Jump Video To End")), _("Jumps the video to the end frame of current subtitle"), wxBITMAP(video_to_subend));
videoMenu->AppendSeparator();
wxMenu *ZoomMenu = new wxMenu;
wxMenuItem *ZoomParent = new wxMenuItem(subtitlesMenu,Menu_View_Zoom,_("Set Zoom"),_T(""),wxITEM_NORMAL,ZoomMenu);
ZoomParent->SetBitmap(wxBITMAP(blank_button));
@ -361,6 +357,10 @@ void FrameMain::InitMenu() {
AspectMenu->AppendCheckItem(Menu_Video_AR_235, _("&Cinematic (2.35)"), _("Forces video to 2.35 aspect ratio"));
AspectMenu->AppendCheckItem(Menu_Video_AR_Custom, _("Custom..."), _("Forces video to a custom aspect ratio"));
videoMenu->Append(AspectParent);
videoMenu->AppendSeparator();
AppendBitmapMenuItem(videoMenu,Menu_Video_JumpTo, _("&Jump To...\t") + Hotkeys.GetText(_T("Video Jump")), _("Jump to frame or time"), wxBITMAP(jumpto_button));
AppendBitmapMenuItem(videoMenu,Menu_Subs_Snap_Video_To_Start, _("Jump video to start\t") + Hotkeys.GetText(_T("Jump Video To Start")), _("Jumps the video to the start frame of current subtitle"), wxBITMAP(video_to_substart));
AppendBitmapMenuItem(videoMenu,Menu_Subs_Snap_Video_To_End, _("Jump video to end\t") + Hotkeys.GetText(_T("Jump Video To End")), _("Jumps the video to the end frame of current subtitle"), wxBITMAP(video_to_subend));
MenuBar->Append(videoMenu, _("&Video"));
// Create audio menu

View File

@ -56,6 +56,8 @@ DEFINE_GUID(CLSID_VideoSink, 0xf13d3732, 0x96bd, 0x4108, 0xaf, 0xeb, 0xe8, 0x5f,
// Constructor
// Based on Haali's code for DirectShowSource2
DirectShowVideoProvider::DirectShowVideoProvider(wxString _filename, wxString _subfilename) {
zoom = 1.0;
dar = 4.0/3.0;
m_hFrameReady = CreateEvent(NULL, FALSE, FALSE, NULL);
OpenVideo(_filename);
}
@ -205,7 +207,7 @@ HRESULT DirectShowVideoProvider::OpenVideo(wxString _filename) {
// Set allowed types for sink
//sink->SetAllowedTypes(IVS_RGB32|IVS_YV12|IVS_YUY2);
sink->SetAllowedTypes(IVS_RGB32);
sink->SetAllowedTypes(IVS_RGB24);
// Pass the event to sink, so it gets set when a frame is available
ResetEvent(m_hFrameReady);
@ -320,28 +322,39 @@ void DirectShowVideoProvider::ReadFrame(long long timestamp, unsigned format, un
// Set frame
DF *df = (DF*) arg;
df->timestamp = timestamp;
int w_cp = width;
int h_cp = height;
unsigned int w_cp = width;
unsigned int h_cp = height;
// Create data
unsigned char *data;
data = new unsigned char[width*height*bpp];
int dstride = width*bpp;
//data = new unsigned char[width*height*bpp];
data = (unsigned char *) malloc(width*height*bpp);
unsigned int dstride = width*bpp;
// Read RGB32 data
if (format == IVS_RGB32) {
// Read RGB24 data
if (format == IVS_RGB24) {
unsigned char *dst = data + h_cp*dstride;
const unsigned char *src = frame;
//unsigned char t1,t2;
w_cp *= bpp;
for (int y = 0; y < h_cp; ++y) {
for (int y=h_cp; --y>=0;) {
dst -= dstride;
for (int x=width; --x>=0;) {
//t1 = *src++;
//t2 = *src++;
*dst++ = *(src+2);
*dst++ = *(src+1);
*dst++ = *src;
src += 3;
}
dst -= dstride;
memcpy(dst, frame, w_cp);
frame += stride;
}
}
// Create bitmap out of data
df->frame = wxBitmap((const char*) data, width, height, bpp*8);
delete data;
//df->frame = wxBitmap((const char*) data, width, height, bpp*8);
//delete data;
df->frame = wxImage(width,height,data,false);
//else if (format == IVS_YV12 && vi->pixel_type == VideoInfo::CS_YV12) {
// // plane Y
@ -412,6 +425,9 @@ bool DirectShowVideoProvider::NextFrame(DF &_df,int &_fn) {
if (frameno >= 0 && frameno <= (signed) num_frames) {
_fn = frameno;
_df = df;
if (zoom != 1.0 || dar != 1.0) {
_df.frame.Rescale(height*zoom*dar,height*zoom,wxIMAGE_QUALITY_NORMAL);
}
return true;
}
}
@ -426,7 +442,7 @@ wxBitmap DirectShowVideoProvider::GetFrame(int n) {
if (n >= (signed) num_frames) n = num_frames-1;
// Current
if (n == last_fnum) return rdf.frame;
if (n == last_fnum) return wxBitmap(rdf.frame);
// Variables
DF df;
@ -439,7 +455,7 @@ wxBitmap DirectShowVideoProvider::GetFrame(int n) {
NextFrame(df,fn);
last_fnum = n;
rdf.frame = df.frame;
return rdf.frame;
return wxBitmap(rdf.frame);
}
// Not the next, reset and seek first
@ -486,7 +502,7 @@ seek:
// Return frame
last_fnum = n;
return rdf.frame;
return wxBitmap(rdf.frame);
}
@ -499,12 +515,16 @@ void DirectShowVideoProvider::RefreshSubtitles() {
///////////
// Set DAR
void DirectShowVideoProvider::SetDAR(double _dar) {
dar = _dar;
last_fnum = -2;
}
////////////
// Set Zoom
void DirectShowVideoProvider::SetZoom(double _zoom) {
zoom = _zoom;
last_fnum = -2;
}

View File

@ -58,10 +58,10 @@ class DirectShowVideoProvider: public VideoProvider {
struct DF {
public:
REFERENCE_TIME timestamp; // DS timestamp that we used for this frame
wxBitmap frame;
wxImage frame;
DF() : timestamp(-1) { }
DF(wxBitmap f) : timestamp(-1), frame(f) { }
DF(wxImage f) : timestamp(-1), frame(f) { }
DF(const DF& f) { operator=(f); }
DF& operator=(const DF& f) { timestamp = f.timestamp; frame = f.frame; return *this; }
};
@ -118,8 +118,8 @@ public:
int GetFrameCount() { return num_frames; };
double GetFPS() { return fps; };
int GetWidth() { return width; };
int GetHeight() { return height; };
int GetWidth() { return height*zoom*dar; };
int GetHeight() { return height*zoom; };
double GetZoom() { return zoom; };
int GetSourceWidth() { return width; };