// generated by Fast Light User Interface Designer (fluid) version 1.0300
#include "stdafx.h"
#include "OBPM_UI.h"
OBPMViewUI::OBPMViewUI() 
{
        int wCam,hCam;
        wCam=4;  //  1280;
        hCam=3;  //960;
//layout of widgets of interface        
  {   
        int wWin,hWin;
        mainWindow = new Fl_Double_Window(1600, 844, "Video Player");
    mainWindow->fullscreen();
    mainWindow->user_data((void*)(this));
        wWin=mainWindow->decorated_w();
    hWin=mainWindow->decorated_h();     

        int wZoomSlider,hZoomSlider;
        hZoomSlider=30;
        int wYPanSlider,hYPanSlider;
        wYPanSlider=30;
        int wXPanSlider,hXPanSlider;
        hXPanSlider=30;

    int wView,hView;    
        hView=hWin;

        int wBox,hBox;
        hBox=hView-hZoomSlider-hXPanSlider;
        wBox=1.0*wCam/hCam*hBox;
        wView=wBox+wYPanSlider;

        wZoomSlider=wBox;       hYPanSlider=hBox;       wXPanSlider=wBox;

    { VideoView = new Fl_Group(0, 0, wView, hView);
      VideoView->align(Fl_Align(FL_ALIGN_CENTER));
          {
            zoom_fit=new Fl_Button(0,0,wYPanSlider,hZoomSlider,"@<->");
          } // Fl_Button* zoom_fit

          {
                origin_fit=new Fl_Button(0,hZoomSlider+hYPanSlider,
                                             wYPanSlider,hXPanSlider,"@+");
          }// Fl_Button* origin_fit

      {
                zoom = new Fl_Value_Slider(wYPanSlider, 0, wZoomSlider, 
                                               hZoomSlider, "Zoom");
        zoom->type(5);
        zoom->selection_color((Fl_Color)1);
        zoom->labeltype(FL_NO_LABEL);
        zoom->labelfont(1);
        zoom->labelsize(12);
        zoom->minimum(0.01);
        zoom->maximum(10);
        zoom->step(0.01);
        zoom->value(1.0);
        zoom->align(Fl_Align(FL_ALIGN_LEFT));
      } // Fl_Slider* zoom
      { ypan = new Fl_Value_Slider(0, hZoomSlider, wYPanSlider, 
                                              hYPanSlider, "Y Pan");
        ypan->type(4);
        ypan->selection_color((Fl_Color)4);
        ypan->labeltype(FL_NO_LABEL);
        ypan->labelsize(12);
        ypan->minimum(-1.0);
        ypan->maximum(1.0);
        ypan->step(0.01);
        ypan->value(0.0);
        ypan->align(Fl_Align(FL_ALIGN_LEFT));
      } // Fl_Slider* ypan
      {
                xpan = new Fl_Value_Slider(wYPanSlider, hView-hXPanSlider, 
                                               wXPanSlider, hXPanSlider, "X 
pan");
        xpan->type(5);
        xpan->selection_color((Fl_Color)4);
        xpan->labeltype(FL_NO_LABEL);
        xpan->labelfont(1);
        xpan->labelsize(12);
        xpan->minimum(-1.0);
        xpan->maximum(1.0);
        xpan->step(0.01);
        xpan->value(0.0);
        xpan->align(Fl_Align(FL_ALIGN_LEFT));
      } // Fl_Slider* xpan

          {
                glView = new VideoGlWin(wYPanSlider,hZoomSlider,wBox,hBox);
                glView->selection_color((Fl_Color)10);
          }
      VideoView->end();
    } // Fl_Group* VideoView
        
        int wBtnPannel,hBtnPannel;
        wBtnPannel=wWin-wView;
        hBtnPannel=wBtnPannel*0.3;

        int mBtn=3,nBtn=2;
        int wBtn,hBtn;
        wBtn=wBtnPannel/mBtn*0.8;
        hBtn=hBtnPannel/nBtn*0.8;
        int dwBtn,dhBtn;
        dwBtn=(wBtnPannel-wBtn*mBtn)/(mBtn+1.0);
        dhBtn=(hBtnPannel-hBtn*nBtn)/(nBtn+1.0);
    { grpCommandBtn = new Fl_Group(wWin-wBtnPannel, hWin-hBtnPannel, 
                                           wBtnPannel, hBtnPannel);
      grpCommandBtn->box(FL_FLAT_BOX);
      grpCommandBtn->color((Fl_Color)33);
      grpCommandBtn->align(Fl_Align(FL_ALIGN_BOTTOM_RIGHT));
      { btnFileSrc = new Fl_Light_Button(wWin-wBtnPannel+1.0*wBtn+2.0*dwBtn, 
                               hWin-hBtnPannel+1.0*dhBtn, wBtn, hBtn, "Open 
File...");

        btnFileSrc->labelfont(1);
        btnFileSrc->labelsize(20);
                btnFileSrc->selection_color((Fl_Color)2);
      } // Fl_Button* btnFileSrc
      grpCommandBtn->end();
    } // Fl_Group* grpCommandBtn

//set the callback functions
        
        btnFileSrc->callback((Fl_Callback*)cb_FileSrc);

        zoom->callback((Fl_Callback*)cb_zoom);
        xpan->callback((Fl_Callback*)cb_xpan);
        ypan->callback((Fl_Callback*)cb_ypan);
        zoom_fit->callback( (Fl_Callback*)cb_zoom_fit);
        origin_fit->callback( (Fl_Callback*)cb_origin_fit);

    mainWindow->end();
  } // Fl_Double_Window* mainWindow
  
  SRC_ID=0;
  m_pVideoFileCapture=NULL;
  m_continueCaptureThread=false;
  m_rawVideoframe=NULL;
  m_heventCaptureThreadDone = CreateEvent( NULL, FALSE, FALSE, NULL );

}


void OBPMViewUI::start(int argc,char**argv)
{
        mainWindow->show(argc,argv);
}


void OBPMViewUI::cb_zoom_i(Fl_Value_Slider * o, void * v)
{
        this->glView->zoom_ratio=o->value();
        this->glView->redraw();
}
void OBPMViewUI::cb_zoom(Fl_Value_Slider * o, void * v)
{
        ((OBPMViewUI*)(o->parent()->parent()->user_data()))->cb_zoom_i(o,v);    
}


void OBPMViewUI::cb_xpan_i(Fl_Value_Slider* o, void*) 
{
        this->glView->xpan_ratio=o->value();
        this->glView->redraw();
}
void OBPMViewUI::cb_xpan(Fl_Value_Slider* o, void* v) 
{
  ((OBPMViewUI*)(o->parent()->parent()->user_data()))->cb_xpan_i(o,v);
}

void OBPMViewUI::cb_ypan_i(Fl_Value_Slider* o, void*) 
{
        this->glView->ypan_ratio=o->value();
        this->glView->redraw();
}
void OBPMViewUI::cb_ypan(Fl_Value_Slider* o, void* v) 
{
  ((OBPMViewUI*)(o->parent()->parent()->user_data()))->cb_ypan_i(o,v);
}

void OBPMViewUI::cb_zoom_fit_i(Fl_Button* o, void* v)
{
        this->glView->zoom_ratio=1.0;
        this->zoom->value(1.0);
        this->glView->redraw();
}

void OBPMViewUI::cb_zoom_fit(Fl_Button* o, void* v)
{
        ((OBPMViewUI*)(o->parent()->parent()->user_data()))->cb_zoom_fit_i(o,v);
}

void OBPMViewUI::cb_origin_fit_i(Fl_Button* o, void* v)
{
        this->glView->xpan_ratio=0.0;
        this->glView->ypan_ratio=0.0;
        this->xpan->value(0.0);
        this->ypan->value(0.0);
        this->glView->redraw();
}

void OBPMViewUI::cb_origin_fit(Fl_Button* o, void* v)
{
        
((OBPMViewUI*)(o->parent()->parent()->user_data()))->cb_origin_fit_i(o,v);
}


void OBPMViewUI::cb_FileSrc_i(Fl_Light_Button* o, void* v)
{
        
        OBPMViewUI* pUI=((OBPMViewUI*)(o->parent()->parent()->user_data()));

        if(pUI->SRC_ID==0)
        {
                bool bSuccess;
                bSuccess=true;
                //file choose dialog//
                Fl_Native_File_Chooser fnfc;
                const char szFilter[1024]=
                         "Video 
files(*.mpg,*.mpeg,*.mov,*.avi)\t*.{mpg,mpeg,mov,avi}\n";
                fnfc.title("Choose a video file");
                fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);
                fnfc.filter(szFilter);  
                switch(fnfc.show())
                {
                case -1:
                case 1:
                        o->clear();
                        return;
                        break;
                default:
                        break;
                }

                CvCapture *pCapture;
                pCapture=cvCreateFileCapture(fnfc.filename());                  
                if(!pCapture)
                        bSuccess=false;
                else
                        pUI->VideoFileConnect(pCapture);

                if(bSuccess)
                {
                        ((Fl_Light_Button*) o)->set();
                        pUI->SRC_ID=1;
                }
                else
                {
                        ((Fl_Light_Button*) o)->clear();
                        fl_alert("Can not open specified file! \n Please check 
again.");
                }
        }
        else if(pUI->SRC_ID==1)
        {
                pUI->m_continueCaptureThread=false;                     
                DWORD dwRet = WaitForSingleObject( m_heventCaptureThreadDone, 
5000 );
                if(dwRet==WAIT_TIMEOUT)
                        fl_alert("Can not get grab finish signal within 5s");
                
                if(pUI->glView->m_processedImage)
                {
                        cvReleaseImage(&pUI->glView->m_processedImage);
                        pUI->glView->m_processedImage=NULL;
                }
                ((Fl_Light_Button*) o)->clear();
                pUI->glView->redraw();
                SRC_ID=0;
        }

}

void OBPMViewUI::cb_FileSrc(Fl_Light_Button* o, void* v)
{
        ((OBPMViewUI*)(o->parent()->parent()->user_data()))->cb_FileSrc_i(o,v);
}


void OBPMViewUI::VideoFileConnect(CvCapture *pVideo)
{
        m_pVideoFileCapture=pVideo;
        m_continueCaptureThread=true;
        
fl_create_thread(thread_capture_video_file,&ThreadCaptureVideoFile,this);
}


void* OBPMViewUI::ThreadCaptureVideoFile(void* pparam)
{
        OBPMViewUI* pUI =( (OBPMViewUI*) pparam);
        unsigned int uiRet;
        uiRet=pUI->DoCaptureLoop();
        if(uiRet!=0)
        {
                fl_alert("The grab thread has encountered a problem and had to 
terminate.");
                //Signal that the thread has died.
                SetEvent(pUI->m_heventCaptureThreadDone);
        }
        return 0;
}

//
// The image Capture thread.
unsigned int OBPMViewUI::DoCaptureLoop(void)
{       
        OBPMViewUI* pUI =this;  
        //start of main capture loop
        while(pUI->m_continueCaptureThread)
        {
                m_rawVideoframe=cvQueryFrame(m_pVideoFileCapture);              
                if(!m_rawVideoframe)
                        break;
                if(!m_continueCaptureThread)                    break;
                
                CvSize sz;
                sz.width=m_rawVideoframe->width; 
                sz.height=m_rawVideoframe->height;

                CSingleLock dataLock( &m_csData );
                dataLock.Lock();

                if(!pUI->glView->m_processedImage)
                        
pUI->glView->m_processedImage=cvCreateImage(sz,IPL_DEPTH_8U,1);

                switch(m_rawVideoframe->nChannels)
                {
                case 3:
                        {
                                cvCvtColor(m_rawVideoframe,
                                        pUI->glView->m_processedImage,
                                        CV_BGR2GRAY);
                                break;
                        }
                case 1:
                        {
                                
cvCopyImage(m_rawVideoframe,pUI->glView->m_processedImage);
                                break;
                        }
                default:
                        break;
                }               
                dataLock.Unlock();

                //redraw the window
                pUI->glView->redraw();
        }
        pUI->m_continueCaptureThread=false;
        SetEvent(pUI->m_heventCaptureThreadDone);

        return 0;
}




_______________________________________________
fltk-opengl mailing list
fltk-opengl@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk-opengl

Reply via email to