added support for FexTracker
added "Track this line" button in bottom right corner of video box added 2 new button bitmaps added function to display tracked points for current line as overlay in VideoDisplay Originally committed to SVN as r35.
This commit is contained in:
parent
732aa4a1ba
commit
3e6637cb26
12 changed files with 156 additions and 2 deletions
|
@ -47,6 +47,8 @@
|
||||||
////////////////////// AssDialogue //////////////////////
|
////////////////////// AssDialogue //////////////////////
|
||||||
// Constructs AssDialogue
|
// Constructs AssDialogue
|
||||||
AssDialogue::AssDialogue() {
|
AssDialogue::AssDialogue() {
|
||||||
|
Tracker = 0;
|
||||||
|
|
||||||
Type = ENTRY_DIALOGUE;
|
Type = ENTRY_DIALOGUE;
|
||||||
group = _T("[Events]");
|
group = _T("[Events]");
|
||||||
|
|
||||||
|
@ -67,6 +69,8 @@ AssDialogue::AssDialogue() {
|
||||||
|
|
||||||
|
|
||||||
AssDialogue::AssDialogue(wxString _data,bool IsSSA) {
|
AssDialogue::AssDialogue(wxString _data,bool IsSSA) {
|
||||||
|
Tracker = 0;
|
||||||
|
|
||||||
Type = ENTRY_DIALOGUE;
|
Type = ENTRY_DIALOGUE;
|
||||||
group = _T("[Events]");
|
group = _T("[Events]");
|
||||||
data = _data;
|
data = _data;
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "ass_entry.h"
|
#include "ass_entry.h"
|
||||||
#include "ass_time.h"
|
#include "ass_time.h"
|
||||||
|
class FexTracker;
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
|
@ -165,6 +166,7 @@ public:
|
||||||
wxString Actor; // Actor name
|
wxString Actor; // Actor name
|
||||||
wxString Effect; // Effect name
|
wxString Effect; // Effect name
|
||||||
wxString Text; // Raw text data
|
wxString Text; // Raw text data
|
||||||
|
FexTracker *Tracker; // Point tracker
|
||||||
|
|
||||||
bool Parse(bool IsSSA=false); // Parses raw ASS data into everything else
|
bool Parse(bool IsSSA=false); // Parses raw ASS data into everything else
|
||||||
void ParseASSTags(); // Parses text to generate block information (doesn't update data)
|
void ParseASSTags(); // Parses text to generate block information (doesn't update data)
|
||||||
|
|
BIN
core/bitmaps/button_track_points.bmp
Normal file
BIN
core/bitmaps/button_track_points.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
core/bitmaps/button_track_split.bmp
Normal file
BIN
core/bitmaps/button_track_split.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
|
@ -105,6 +105,7 @@ private:
|
||||||
void OnVideoPlayLine(wxCommandEvent &event);
|
void OnVideoPlayLine(wxCommandEvent &event);
|
||||||
void OnVideoStop(wxCommandEvent &event);
|
void OnVideoStop(wxCommandEvent &event);
|
||||||
void OnVideoToggleScroll(wxCommandEvent &event);
|
void OnVideoToggleScroll(wxCommandEvent &event);
|
||||||
|
void OnVideoTrackPoints(wxCommandEvent &event);
|
||||||
|
|
||||||
void OnKeyDown(wxKeyEvent &event);
|
void OnKeyDown(wxKeyEvent &event);
|
||||||
|
|
||||||
|
@ -321,6 +322,7 @@ enum {
|
||||||
Video_Play_Line,
|
Video_Play_Line,
|
||||||
Video_Stop,
|
Video_Stop,
|
||||||
Video_Auto_Scroll,
|
Video_Auto_Scroll,
|
||||||
|
Video_Track_Points,
|
||||||
|
|
||||||
Menu_File_Recent = 2000,
|
Menu_File_Recent = 2000,
|
||||||
Menu_Video_Recent = 2200,
|
Menu_Video_Recent = 2200,
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <wx/mimetype.h>
|
#include <wx/mimetype.h>
|
||||||
#include <wx/filename.h>
|
#include <wx/filename.h>
|
||||||
#include <wx/tglbtn.h>
|
#include <wx/tglbtn.h>
|
||||||
|
#include <wx/rawbmp.h>
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "video_display.h"
|
#include "video_display.h"
|
||||||
|
@ -71,6 +72,8 @@
|
||||||
#include "toggle_bitmap.h"
|
#include "toggle_bitmap.h"
|
||||||
#include "dialog_hotkeys.h"
|
#include "dialog_hotkeys.h"
|
||||||
#include "dialog_timing_processor.h"
|
#include "dialog_timing_processor.h"
|
||||||
|
#include "FexTracker.h"
|
||||||
|
#include "FexTrackingFeature.h"
|
||||||
|
|
||||||
|
|
||||||
////////////////////
|
////////////////////
|
||||||
|
@ -83,6 +86,7 @@ BEGIN_EVENT_TABLE(FrameMain, wxFrame)
|
||||||
EVT_BUTTON(Video_Play_Line, FrameMain::OnVideoPlayLine)
|
EVT_BUTTON(Video_Play_Line, FrameMain::OnVideoPlayLine)
|
||||||
EVT_BUTTON(Video_Stop, FrameMain::OnVideoStop)
|
EVT_BUTTON(Video_Stop, FrameMain::OnVideoStop)
|
||||||
EVT_TOGGLEBUTTON(Video_Auto_Scroll, FrameMain::OnVideoToggleScroll)
|
EVT_TOGGLEBUTTON(Video_Auto_Scroll, FrameMain::OnVideoToggleScroll)
|
||||||
|
EVT_BUTTON(Video_Track_Points, FrameMain::OnVideoTrackPoints)
|
||||||
|
|
||||||
EVT_CLOSE(FrameMain::OnCloseWindow)
|
EVT_CLOSE(FrameMain::OnCloseWindow)
|
||||||
|
|
||||||
|
@ -1123,6 +1127,47 @@ void FrameMain::OnVideoToggleScroll(wxCommandEvent &event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////
|
||||||
|
// Track current line
|
||||||
|
void FrameMain::OnVideoTrackPoints(wxCommandEvent &event) {
|
||||||
|
videoBox->videoDisplay->Stop();
|
||||||
|
|
||||||
|
// Get line
|
||||||
|
AssDialogue *curline = SubsBox->GetDialogue(EditBox->linen);
|
||||||
|
if (!curline) return;
|
||||||
|
|
||||||
|
// Get Video
|
||||||
|
bool usedDirectshow;
|
||||||
|
VideoProvider *movie = new VideoProvider(videoBox->videoDisplay->videoName, wxString(_T("")), 1.0,usedDirectshow,true);
|
||||||
|
|
||||||
|
// Create Tracker
|
||||||
|
if( curline->Tracker ) delete curline->Tracker;
|
||||||
|
curline->Tracker = new FexTracker( movie->GetWidth(), movie->GetHeight(), 250 );
|
||||||
|
curline->Tracker->minFeatures = 250;
|
||||||
|
|
||||||
|
// Allocate temp image
|
||||||
|
float* FloatImg = new float[ movie->GetWidth()*movie->GetHeight() ];
|
||||||
|
|
||||||
|
int StartFrame = VFR_Output.CorrectFrameAtTime(curline->Start.GetMS(),true);
|
||||||
|
int EndFrame = VFR_Output.CorrectFrameAtTime(curline->End.GetMS(),false);
|
||||||
|
|
||||||
|
for( int Frame = StartFrame; Frame <= EndFrame; Frame ++ )
|
||||||
|
{
|
||||||
|
wxString Text;
|
||||||
|
Text = wxString::Format( _T("Tracking ... %.2f %%"), float(Frame-StartFrame)/(EndFrame-StartFrame)*100.0f );
|
||||||
|
videoBox->videoDisplay->DrawText( wxPoint(20,20), Text );
|
||||||
|
|
||||||
|
movie->GetFloatFrame( FloatImg, Frame );
|
||||||
|
curline->Tracker->ProcessImage( FloatImg );
|
||||||
|
}
|
||||||
|
|
||||||
|
delete FloatImg;
|
||||||
|
delete movie;
|
||||||
|
|
||||||
|
videoBox->videoDisplay->RefreshVideo();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
// Choose a different language
|
// Choose a different language
|
||||||
void FrameMain::OnChooseLanguage (wxCommandEvent &event) {
|
void FrameMain::OnChooseLanguage (wxCommandEvent &event) {
|
||||||
|
|
|
@ -79,6 +79,8 @@ shift_to_frame_disable BITMAP "bitmaps/shift_to_frame_disable.bmp"
|
||||||
|
|
||||||
button_play BITMAP "bitmaps/button_play.bmp"
|
button_play BITMAP "bitmaps/button_play.bmp"
|
||||||
button_stop BITMAP "bitmaps/button_stop.bmp"
|
button_stop BITMAP "bitmaps/button_stop.bmp"
|
||||||
|
button_track_points BITMAP "bitmaps/button_track_points.bmp"
|
||||||
|
|
||||||
button_bold BITMAP "bitmaps/button_bold.bmp"
|
button_bold BITMAP "bitmaps/button_bold.bmp"
|
||||||
button_italics BITMAP "bitmaps/button_italics.bmp"
|
button_italics BITMAP "bitmaps/button_italics.bmp"
|
||||||
button_underline BITMAP "bitmaps/button_underline.bmp"
|
button_underline BITMAP "bitmaps/button_underline.bmp"
|
||||||
|
|
|
@ -59,6 +59,8 @@ VideoBox::VideoBox(wxPanel *parent) {
|
||||||
AutoScroll = new ToggleBitmap(videoPage,Video_Auto_Scroll,wxBITMAP(toggle_video_autoscroll),wxSize(30,-1));
|
AutoScroll = new ToggleBitmap(videoPage,Video_Auto_Scroll,wxBITMAP(toggle_video_autoscroll),wxSize(30,-1));
|
||||||
AutoScroll->SetToolTip(_("Toggle autoscroll of video"));
|
AutoScroll->SetToolTip(_("Toggle autoscroll of video"));
|
||||||
AutoScroll->SetValue(Options.AsBool(_T("Sync video with subs")));
|
AutoScroll->SetValue(Options.AsBool(_T("Sync video with subs")));
|
||||||
|
wxBitmapButton *VideoTrackPointsButton = new wxBitmapButton(videoPage,Video_Track_Points,wxBITMAP(button_track_points),wxDefaultPosition,wxSize(25,-1));
|
||||||
|
VideoTrackPointsButton->SetToolTip(_("Track point movements in video"));
|
||||||
|
|
||||||
// Seek
|
// Seek
|
||||||
videoSlider = new VideoSlider(videoPage,-1);
|
videoSlider = new VideoSlider(videoPage,-1);
|
||||||
|
@ -93,6 +95,7 @@ VideoBox::VideoBox(wxPanel *parent) {
|
||||||
videoBottomSizer->Add(AutoScroll,0,wxTOP|wxBOTTOM|wxALIGN_CENTER|wxEXPAND,2);
|
videoBottomSizer->Add(AutoScroll,0,wxTOP|wxBOTTOM|wxALIGN_CENTER|wxEXPAND,2);
|
||||||
videoBottomSizer->Add(VideoPosition,1,wxLEFT|wxALIGN_CENTER,5);
|
videoBottomSizer->Add(VideoPosition,1,wxLEFT|wxALIGN_CENTER,5);
|
||||||
videoBottomSizer->Add(VideoSubsPos,1,wxALIGN_CENTER,0);
|
videoBottomSizer->Add(VideoSubsPos,1,wxALIGN_CENTER,0);
|
||||||
|
videoBottomSizer->Add(VideoTrackPointsButton,0,wxTOP|wxBOTTOM|wxALIGN_CENTER,2);
|
||||||
VideoSizer = new wxBoxSizer(wxVERTICAL);
|
VideoSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
VideoSizer->Add(videoDisplay,0,wxEXPAND,0);
|
VideoSizer->Add(videoDisplay,0,wxEXPAND,0);
|
||||||
VideoSizer->Add(videoSliderSizer,0,wxEXPAND,0);
|
VideoSizer->Add(videoSliderSizer,0,wxEXPAND,0);
|
||||||
|
|
|
@ -53,6 +53,8 @@
|
||||||
#include <wx/clipbrd.h>
|
#include <wx/clipbrd.h>
|
||||||
#include <wx/filename.h>
|
#include <wx/filename.h>
|
||||||
#include <wx/config.h>
|
#include <wx/config.h>
|
||||||
|
#include "FexTracker.h"
|
||||||
|
#include "FexTrackingFeature.h"
|
||||||
|
|
||||||
|
|
||||||
///////
|
///////
|
||||||
|
@ -275,6 +277,8 @@ void VideoDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
|
|
||||||
// Draw frame
|
// Draw frame
|
||||||
dc.DrawBitmap(GetFrame(frame_n),0,0);
|
dc.DrawBitmap(GetFrame(frame_n),0,0);
|
||||||
|
// Draw the control points for FexTracker
|
||||||
|
DrawTrackingOverlay( dc );
|
||||||
|
|
||||||
// Current position info
|
// Current position info
|
||||||
if (x >= 0 && x < w && y >= 0 && y < h) {
|
if (x >= 0 && x < w && y >= 0 && y < h) {
|
||||||
|
@ -523,6 +527,44 @@ void VideoDisplay::OnCopyCoords(wxCommandEvent &event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
// Draw Tracking Overlay
|
||||||
|
void VideoDisplay::DrawTrackingOverlay( wxDC &dc )
|
||||||
|
{
|
||||||
|
if( IsPlaying ) return;
|
||||||
|
|
||||||
|
// Get line
|
||||||
|
AssDialogue *curline = grid->GetDialogue(grid->editBox->linen);
|
||||||
|
if( !curline || !curline->Tracker ) return;
|
||||||
|
|
||||||
|
int StartFrame = VFR_Output.CorrectFrameAtTime(curline->Start.GetMS(),true);
|
||||||
|
int EndFrame = VFR_Output.CorrectFrameAtTime(curline->End.GetMS(),false);
|
||||||
|
|
||||||
|
if( frame_n<StartFrame || frame_n>EndFrame ) return;
|
||||||
|
|
||||||
|
int localframe = frame_n - StartFrame;
|
||||||
|
if( curline->Tracker->GetFrame() <= localframe ) return;
|
||||||
|
|
||||||
|
dc.SetPen(wxPen(wxColour(255,255,255),1));
|
||||||
|
dc.SetLogicalFunction(wxINVERT);
|
||||||
|
|
||||||
|
for( int i=0;i<curline->Tracker->GetCount();i++ )
|
||||||
|
{
|
||||||
|
FexTrackingFeature* f = (*curline->Tracker)[i];
|
||||||
|
if( f->StartTime > localframe ) continue;
|
||||||
|
int llf = localframe - f->StartTime;
|
||||||
|
if( f->Pos.size() <= llf ) continue;
|
||||||
|
vec2 pt = f->Pos[llf];
|
||||||
|
pt.x *= provider->GetZoom();
|
||||||
|
pt.y *= provider->GetZoom();
|
||||||
|
pt.x = int(pt.x);
|
||||||
|
pt.y = int(pt.y);
|
||||||
|
dc.DrawLine( pt.x-2, pt.y, pt.x+3, pt.y );
|
||||||
|
dc.DrawLine( pt.x, pt.y-2, pt.x, pt.y+3 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
// Refresh screen
|
// Refresh screen
|
||||||
void VideoDisplay::RefreshVideo() {
|
void VideoDisplay::RefreshVideo() {
|
||||||
|
@ -530,6 +572,29 @@ void VideoDisplay::RefreshVideo() {
|
||||||
wxClientDC dc(this);
|
wxClientDC dc(this);
|
||||||
dc.BeginDrawing();
|
dc.BeginDrawing();
|
||||||
dc.DrawBitmap(GetFrame(),0,0);
|
dc.DrawBitmap(GetFrame(),0,0);
|
||||||
|
|
||||||
|
// Draw the control points for FexTracker
|
||||||
|
DrawTrackingOverlay( dc );
|
||||||
|
|
||||||
|
dc.EndDrawing();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
// DrawVideoWithOverlay
|
||||||
|
void VideoDisplay::DrawText( wxPoint Pos, wxString text ) {
|
||||||
|
// Draw frame
|
||||||
|
wxClientDC dc(this);
|
||||||
|
dc.BeginDrawing();
|
||||||
|
dc.SetBrush(wxBrush(wxColour(128,128,128),wxSOLID));
|
||||||
|
dc.DrawRectangle( 0,0, provider->GetWidth(), provider->GetHeight() );
|
||||||
|
dc.SetTextForeground(wxColour(64,64,64));
|
||||||
|
dc.DrawText(text,Pos.x+1,Pos.y-1);
|
||||||
|
dc.DrawText(text,Pos.x+1,Pos.y+1);
|
||||||
|
dc.DrawText(text,Pos.x-1,Pos.y-1);
|
||||||
|
dc.DrawText(text,Pos.x-1,Pos.y+1);
|
||||||
|
dc.SetTextForeground(wxColour(255,255,255));
|
||||||
|
dc.DrawText(text,Pos.x,Pos.y);
|
||||||
dc.EndDrawing();
|
dc.EndDrawing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,8 @@ private:
|
||||||
void OnCopyCoords(wxCommandEvent &event);
|
void OnCopyCoords(wxCommandEvent &event);
|
||||||
void OnPlayTimer(wxTimerEvent &event);
|
void OnPlayTimer(wxTimerEvent &event);
|
||||||
|
|
||||||
|
void DrawTrackingOverlay( wxDC &dc );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VideoProvider *provider;
|
VideoProvider *provider;
|
||||||
|
|
||||||
|
@ -119,6 +121,7 @@ public:
|
||||||
void JumpToTime(int ms);
|
void JumpToTime(int ms);
|
||||||
void RefreshSubtitles();
|
void RefreshSubtitles();
|
||||||
void RefreshVideo();
|
void RefreshVideo();
|
||||||
|
void DrawText( wxPoint Pos, wxString Text );
|
||||||
void UpdatePositionDisplay();
|
void UpdatePositionDisplay();
|
||||||
void SetAspectRatio(int type);
|
void SetAspectRatio(int type);
|
||||||
void SetZoom(double value);
|
void SetZoom(double value);
|
||||||
|
|
|
@ -57,15 +57,22 @@ VideoProvider::VideoProvider(wxString _filename, wxString _subfilename, double _
|
||||||
|
|
||||||
dar = GetSourceWidth()/(double)GetSourceHeight();
|
dar = GetSourceWidth()/(double)GetSourceHeight();
|
||||||
|
|
||||||
SubtitledVideo = ApplySubtitles(subfilename, RGB32Video);
|
if( _subfilename == _T("") ) SubtitledVideo = RGB32Video;
|
||||||
|
else SubtitledVideo = ApplySubtitles(subfilename, RGB32Video);
|
||||||
|
/*
|
||||||
|
if( _zoom == 1.0 ) ResizedVideo = SubtitledVideo;
|
||||||
|
else ResizedVideo = ApplyDARZoom(zoom, dar, SubtitledVideo);
|
||||||
|
*/
|
||||||
ResizedVideo = ApplyDARZoom(zoom, dar, SubtitledVideo);
|
ResizedVideo = ApplyDARZoom(zoom, dar, SubtitledVideo);
|
||||||
|
|
||||||
|
vi = ResizedVideo->GetVideoInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoProvider::~VideoProvider() {
|
VideoProvider::~VideoProvider() {
|
||||||
RGB32Video = NULL;
|
RGB32Video = NULL;
|
||||||
SubtitledVideo = NULL;
|
SubtitledVideo = NULL;
|
||||||
ResizedVideo = NULL;
|
ResizedVideo = NULL;
|
||||||
delete data;
|
if( data ) delete data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoProvider::RefreshSubtitles() {
|
void VideoProvider::RefreshSubtitles() {
|
||||||
|
@ -228,6 +235,25 @@ wxBitmap VideoProvider::GetFrame(int n, bool force) {
|
||||||
return wxBitmap(last_frame);
|
return wxBitmap(last_frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VideoProvider::GetFloatFrame(float* Buffer, int n) {
|
||||||
|
wxMutexLocker lock(AviSynthMutex);
|
||||||
|
|
||||||
|
PVideoFrame frame = ResizedVideo->GetFrame(n,env);
|
||||||
|
|
||||||
|
int rs = vi.RowSize();
|
||||||
|
const unsigned char* src = frame->GetReadPtr();
|
||||||
|
int srcpitch = frame->GetPitch();
|
||||||
|
|
||||||
|
for( int i = 0; i < vi.height; i++ )
|
||||||
|
{
|
||||||
|
for( int x=0; x<vi.width;x++ )
|
||||||
|
{
|
||||||
|
Buffer[(vi.height-i-1)*vi.width+x] = src[x*4+0]*0.3 + src[x*4+1]*0.4 + src[x*4+2]*0.3;
|
||||||
|
}
|
||||||
|
src+=srcpitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VideoProvider::LoadVSFilter() {
|
void VideoProvider::LoadVSFilter() {
|
||||||
// Loading an avisynth plugin multiple times does almost nothing
|
// Loading an avisynth plugin multiple times does almost nothing
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ public:
|
||||||
void SetZoom(double _zoom);
|
void SetZoom(double _zoom);
|
||||||
|
|
||||||
wxBitmap GetFrame(int n) { return GetFrame(n,false); };
|
wxBitmap GetFrame(int n) { return GetFrame(n,false); };
|
||||||
|
void GetFloatFrame(float* Buffer, int n);
|
||||||
|
|
||||||
// properties
|
// properties
|
||||||
int GetPosition() { return last_fnum; };
|
int GetPosition() { return last_fnum; };
|
||||||
|
@ -92,6 +93,7 @@ public:
|
||||||
|
|
||||||
int GetWidth() { return vi.width; };
|
int GetWidth() { return vi.width; };
|
||||||
int GetHeight() { return vi.height; };
|
int GetHeight() { return vi.height; };
|
||||||
|
double GetZoom() { return zoom; };
|
||||||
|
|
||||||
int GetSourceWidth() { return RGB32Video->GetVideoInfo().width; };
|
int GetSourceWidth() { return RGB32Video->GetVideoInfo().width; };
|
||||||
int GetSourceHeight() { return RGB32Video->GetVideoInfo().height; };
|
int GetSourceHeight() { return RGB32Video->GetVideoInfo().height; };
|
||||||
|
|
Loading…
Reference in a new issue