diff --git a/core/fextracker_main_events.cpp b/core/fextracker_main_events.cpp index 8c37a66e9..464074ce7 100644 --- a/core/fextracker_main_events.cpp +++ b/core/fextracker_main_events.cpp @@ -97,7 +97,7 @@ void FrameMain::OnVideoTrackPoints(wxCommandEvent &event) { // Get Video bool usedDirectshow; - VideoProvider *movie = new VideoProvider(videoBox->videoDisplay->videoName, wxString(_T("")), 1.0,usedDirectshow,true); + VideoProvider *movie = new AvisynthVideoProvider(videoBox->videoDisplay->videoName, wxString(_T("")), 1.0,usedDirectshow,true); // Create Tracker if( curline->Tracker ) delete curline->Tracker; diff --git a/core/video_display.cpp b/core/video_display.cpp index 4f0a7044f..93515bc28 100644 --- a/core/video_display.cpp +++ b/core/video_display.cpp @@ -157,7 +157,7 @@ void VideoDisplay::SetVideo(const wxString &filename) { bool usedDirectshow; - provider = new VideoProvider(filename,GetTempWorkFile(),zoomValue,usedDirectshow,true); + provider = new AvisynthVideoProvider(filename,GetTempWorkFile(),zoomValue,usedDirectshow,true); // Set keyframes wxString ext = filename.Right(4).Lower(); diff --git a/core/video_display.h b/core/video_display.h index 2108455dc..7c64fa0b7 100644 --- a/core/video_display.h +++ b/core/video_display.h @@ -43,7 +43,7 @@ #include #include #include -#include "video_provider.h" +#include "video_provider_avs.h" ////////////// diff --git a/core/video_provider.h b/core/video_provider.h index 1226e9281..7c1ebff87 100644 --- a/core/video_provider.h +++ b/core/video_provider.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006, Fredrik Mellbin +// Copyright (c) 2006, Rodrigo Braz Monteiro, Fredrik Mellbin // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -33,70 +33,31 @@ // Contact: mailto:zeratul@cellosoft.com // -#ifndef VIDEO_PROVIDER_H -#define VIDEO_PROVIDER_H -#include "avisynth_wrap.h" +#pragma once -/*class GetFrameVPThread: public wxThread { -private: - int getting_n; - int current_n; - PClip video; - - wxThread::ExitCode Entry(); +//////////////////////////// +// Video Provider interface +class VideoProvider { public: - void GetFrame(int n); - GetFrameVPThread(PClip clip); -};*/ + virtual ~VideoProvider() {} -class VideoProvider: public AviSynthWrapper { -private: - VideoInfo vi; + virtual void RefreshSubtitles()=0; + virtual void SetDAR(double _dar)=0; + virtual void SetZoom(double _zoom)=0; - wxString subfilename; + virtual wxBitmap GetFrame(int n)=0; + virtual void GetFloatFrame(float* Buffer, int n)=0; - int last_fnum; + virtual int GetPosition()=0; + virtual int GetFrameCount()=0; + virtual double GetFPS()=0; - unsigned char* data; - wxBitmap last_frame; + virtual int GetWidth()=0; + virtual int GetHeight()=0; + virtual double GetZoom()=0; - double dar; - double zoom; - - PClip RGB32Video; - PClip SubtitledVideo; - PClip ResizedVideo; - - PClip OpenVideo(wxString _filename, bool &usedDirectshow, bool mpeg2dec3_priority = true); - PClip ApplySubtitles(wxString _filename, PClip videosource); - PClip ApplyDARZoom(double _zoom, double _dar, PClip videosource); - wxBitmap GetFrame(int n, bool force); - void LoadVSFilter(); - -public: - VideoProvider(wxString _filename, wxString _subfilename, double _zoom, bool &usedDirectshow, bool mpeg2dec3_priority = true); - ~VideoProvider(); - - void RefreshSubtitles(); - void SetDAR(double _dar); - void SetZoom(double _zoom); - - wxBitmap GetFrame(int n) { return GetFrame(n,false); }; - void GetFloatFrame(float* Buffer, int n); - - // properties - int GetPosition() { return last_fnum; }; - int GetFrameCount() { return vi.num_frames; }; - double GetFPS() { return (double)vi.fps_numerator/(double)vi.fps_denominator; }; - - int GetWidth() { return vi.width; }; - int GetHeight() { return vi.height; }; - double GetZoom() { return zoom; }; - - int GetSourceWidth() { return RGB32Video->GetVideoInfo().width; }; - int GetSourceHeight() { return RGB32Video->GetVideoInfo().height; }; + virtual int GetSourceWidth()=0; + virtual int GetSourceHeight()=0; }; - -#endif \ No newline at end of file diff --git a/core/video_provider.cpp b/core/video_provider_avs.cpp similarity index 90% rename from core/video_provider.cpp rename to core/video_provider_avs.cpp index 22eda7003..ad83ba5a2 100644 --- a/core/video_provider.cpp +++ b/core/video_provider_avs.cpp @@ -35,12 +35,12 @@ #include #include -#include "video_provider.h" +#include "video_provider_avs.h" #include "options.h" #include "main.h" -VideoProvider::VideoProvider(wxString _filename, wxString _subfilename, double _zoom, bool &usedDirectshow, bool mpeg2dec3_priority) { +AvisynthVideoProvider::AvisynthVideoProvider(wxString _filename, wxString _subfilename, double _zoom, bool &usedDirectshow, bool mpeg2dec3_priority) { RGB32Video = NULL; SubtitledVideo = NULL; ResizedVideo = NULL; @@ -68,14 +68,14 @@ VideoProvider::VideoProvider(wxString _filename, wxString _subfilename, double _ vi = ResizedVideo->GetVideoInfo(); } -VideoProvider::~VideoProvider() { +AvisynthVideoProvider::~AvisynthVideoProvider() { RGB32Video = NULL; SubtitledVideo = NULL; ResizedVideo = NULL; if( data ) delete data; } -void VideoProvider::RefreshSubtitles() { +void AvisynthVideoProvider::RefreshSubtitles() { ResizedVideo = NULL; SubtitledVideo = NULL; @@ -84,7 +84,7 @@ void VideoProvider::RefreshSubtitles() { GetFrame(last_fnum,true); } -void VideoProvider::SetDAR(double _dar) { +void AvisynthVideoProvider::SetDAR(double _dar) { dar = _dar; ResizedVideo = NULL; @@ -95,7 +95,7 @@ void VideoProvider::SetDAR(double _dar) { GetFrame(last_fnum,true); } -void VideoProvider::SetZoom(double _zoom) { +void AvisynthVideoProvider::SetZoom(double _zoom) { zoom = _zoom; ResizedVideo = NULL; @@ -106,7 +106,7 @@ void VideoProvider::SetZoom(double _zoom) { GetFrame(last_fnum,true); } -PClip VideoProvider::OpenVideo(wxString _filename, bool &usedDirectshow, bool mpeg2dec3_priority) { +PClip AvisynthVideoProvider::OpenVideo(wxString _filename, bool &usedDirectshow, bool mpeg2dec3_priority) { wxMutexLocker lock(AviSynthMutex); AVSValue script; @@ -161,7 +161,7 @@ PClip VideoProvider::OpenVideo(wxString _filename, bool &usedDirectshow, bool mp return (env->Invoke("Cache", script)).AsClip(); } -PClip VideoProvider::ApplySubtitles(wxString _filename, PClip videosource) { +PClip AvisynthVideoProvider::ApplySubtitles(wxString _filename, PClip videosource) { wxMutexLocker lock(AviSynthMutex); // Insert subs @@ -180,7 +180,7 @@ PClip VideoProvider::ApplySubtitles(wxString _filename, PClip videosource) { return (env->Invoke("Cache", script)).AsClip(); } -PClip VideoProvider::ApplyDARZoom(double _zoom, double _dar, PClip videosource) { +PClip AvisynthVideoProvider::ApplyDARZoom(double _zoom, double _dar, PClip videosource) { wxMutexLocker lock(AviSynthMutex); AVSValue script; @@ -205,7 +205,7 @@ PClip VideoProvider::ApplyDARZoom(double _zoom, double _dar, PClip videosource) return (env->Invoke("Cache",script)).AsClip(); } -wxBitmap VideoProvider::GetFrame(int n, bool force) { +wxBitmap AvisynthVideoProvider::GetFrame(int n, bool force) { if (n != last_fnum || force) { wxMutexLocker lock(AviSynthMutex); @@ -234,7 +234,7 @@ wxBitmap VideoProvider::GetFrame(int n, bool force) { return wxBitmap(last_frame); } -void VideoProvider::GetFloatFrame(float* Buffer, int n) { +void AvisynthVideoProvider::GetFloatFrame(float* Buffer, int n) { wxMutexLocker lock(AviSynthMutex); PVideoFrame frame = ResizedVideo->GetFrame(n,env); @@ -253,7 +253,7 @@ void VideoProvider::GetFloatFrame(float* Buffer, int n) { } } -void VideoProvider::LoadVSFilter() { +void AvisynthVideoProvider::LoadVSFilter() { // Loading an avisynth plugin multiple times does almost nothing wxFileName vsfilterPath(AegisubApp::folderName + _T("vsfilter.dll")); diff --git a/core/video_provider_avs.h b/core/video_provider_avs.h new file mode 100644 index 000000000..4541efcbe --- /dev/null +++ b/core/video_provider_avs.h @@ -0,0 +1,103 @@ +// Copyright (c) 2006, Fredrik Mellbin +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + +#ifndef VIDEO_PROVIDER_AVS_H +#define VIDEO_PROVIDER_AVS_H + +#include "avisynth_wrap.h" +#include "video_provider.h" + +/*class GetFrameVPThread: public wxThread { +private: + int getting_n; + int current_n; + + PClip video; + + wxThread::ExitCode Entry(); +public: + void GetFrame(int n); + GetFrameVPThread(PClip clip); +};*/ + +class AvisynthVideoProvider: public VideoProvider, AviSynthWrapper { +private: + VideoInfo vi; + + wxString subfilename; + + int last_fnum; + + unsigned char* data; + wxBitmap last_frame; + + double dar; + double zoom; + + PClip RGB32Video; + PClip SubtitledVideo; + PClip ResizedVideo; + + PClip OpenVideo(wxString _filename, bool &usedDirectshow, bool mpeg2dec3_priority = true); + PClip ApplySubtitles(wxString _filename, PClip videosource); + PClip ApplyDARZoom(double _zoom, double _dar, PClip videosource); + wxBitmap GetFrame(int n, bool force); + void LoadVSFilter(); + +public: + AvisynthVideoProvider(wxString _filename, wxString _subfilename, double _zoom, bool &usedDirectshow, bool mpeg2dec3_priority = true); + ~AvisynthVideoProvider(); + + void RefreshSubtitles(); + void SetDAR(double _dar); + void SetZoom(double _zoom); + + wxBitmap GetFrame(int n) { return GetFrame(n,false); }; + void GetFloatFrame(float* Buffer, int n); + + // properties + int GetPosition() { return last_fnum; }; + int GetFrameCount() { return vi.num_frames; }; + double GetFPS() { return (double)vi.fps_numerator/(double)vi.fps_denominator; }; + + int GetWidth() { return vi.width; }; + int GetHeight() { return vi.height; }; + double GetZoom() { return zoom; }; + + int GetSourceWidth() { return RGB32Video->GetVideoInfo().width; }; + int GetSourceHeight() { return RGB32Video->GetVideoInfo().height; }; +}; + +#endif