Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

DirImViewer.h

Go to the documentation of this file.
00001 //345678901234567890123456789012345678901234567890123456789012345678901234567890
00002 // Show video frames as a strip on a WindowTimeLine.
00003 //
00004 // Author: Richard van Balen
00005 
00006 #ifndef Impala_Visualization_DirImViewer_h
00007 #define Impala_Visualization_DirImViewer_h
00008 
00009 #include <time.h>
00010 
00011 #include "OglGui/FramesPerSecond.h"
00012 #include "OglGui/DocDimensions.h"
00013 #include "OglGui/DocFlowDrag.h"
00014 #include "Util/DirImageFileNames.h"
00015 #include "Core/Array/ReadFile.h"
00016 #include "Visualization/RgbOglImage.h"
00017 
00018 #ifndef NO_RAW
00019 #include "Core/Stream/RgbDataSrcFactory.h"
00020 #endif
00021 
00022 namespace Impala {
00023 namespace Visualization {
00024 
00025 class DirImViewer :  public OglGui::Window,
00026                      public OglGui::DocDimensions
00027 {
00028 public:
00029     typedef OglGui::Window                  Window;
00030     typedef Core::Array::Array2dVec3UInt8   Array2dVec3UInt8;
00031 #ifndef NO_RAW
00032     typedef Core::Stream::RgbDataSrcFactory RgbDataSrcFactory;
00033     typedef Core::Stream::RgbDataSrc        RgbDataSrc;
00034 #endif
00035 
00036     DirImViewer(int x, int y, int w, int h, int nOnRow=4) :
00037         Window(x,y,w,h)
00038     {
00039         Init(w,h,nOnRow);
00040     }
00041 
00042     DirImViewer(Window* parent, int w, int h, int nOnRow=4) :
00043         Window(parent,w,h)
00044     {
00045         Init(w,h,nOnRow);
00046     }
00047 
00048     DirImViewer(Window* parent, int x, int y, int w, int h, int nOnRow=4) :
00049         Window(parent,x,y,w,h)
00050     {
00051         Init(w,h,nOnRow);
00052     }
00053 
00054     ~DirImViewer()
00055     {
00056         ClearFiles();
00057     }
00058 
00059     void OpenDir(strconst dirName)
00060     {
00061         ClearFiles();
00062         mDirName = dirName;
00063         String fExt = FileNameExt(dirName);
00064 #ifndef NO_RAW
00065         if ((fExt == "raw") || (fExt == "mpg") || (fExt == "mpeg"))
00066         {
00067  #ifdef REPOSITORY_USED
00068             OpenSrc(Persistency::RgbDataSrcLocator("file:", "abs", dirName));
00069  #else
00070             RgbDataSrcFactory& f = RgbDataSrcFactory::Instance();
00071             mRgbDataSrc = f.Construct(dirName, fExt);
00072  #endif //REPOSITORY_USED
00073         }
00074 #endif // NO_RAW
00075         Util::DirImageFileNames(dirName, mFileNames);
00076         HandleDocDimensions(true,true);
00077     }
00078 
00079 #if !defined(NO_RAW) && defined(REPOSITORY_USED)
00080     void OpenSrc(const Persistency::RgbDataSrcLocator& loc)
00081     {
00082         ClearFiles();
00083         mDirName = loc.GetName();
00084         RgbDataSrcFactory& f = RgbDataSrcFactory::Instance();
00085         //mRgbDataSrc = f.Construct(RgbDataSrcFactory::SRC_RAW, loc);
00086         mRgbDataSrc = f.Construct(loc, "");
00087         HandleDocDimensions(true,true);
00088     }
00089 #endif
00090 
00091     void NrOfImOnRow(int n)         { mFixedCellDims = !(mNrOfImOnRow = n); }
00092     int  NrOfImOnRow()              { return mNrOfImOnRow; }
00093     void ShowNames(bool mode)       { mExtH = (mShowNames = mode) ? 6 : 0; }
00094     bool ShowNames()                { return mShowNames; }
00095     void ShowDims(bool mode)        { mShowDims = mode; }
00096     bool ShowDims()                 { return mShowDims; }
00097     int  CellWidth()                { return mCellW; }
00098     int  CellHeight()               { return mCellH; }
00099     void PagingExtra(int x)         { mPagingExtra = x; }
00100     int  PagingExtra()              { return mPagingExtra; }
00101 
00102     void MaxZoom(double mz)         { mMaxZoom = mz; }
00103 
00104     int  NrOfFiles()
00105     {
00106 #ifndef NO_RAW
00107         if (mRgbDataSrc)
00108             return mRgbDataSrc->LastFrame();
00109 #endif
00110         return mFileNames.size();
00111     }
00112 
00113     void FixedCellWidth(int w)
00114     {
00115         if (mFixedCellDims = (w > 20)) 
00116             mCellH = mExtH + (mCellW = w);
00117         else
00118             mCellH = mExtH + (mCellW = 128);
00119     }
00120 
00121     int ClampImIdx(int& idx)
00122     {
00123         if (idx < 0)
00124             idx = 0;
00125         if (idx > NrOfFiles()-1)
00126             idx = NrOfFiles()-1;
00127         return idx;
00128     }
00129 
00130     int ClampViewIdx(int& idx)
00131     {
00132         if (idx < 0)
00133             idx = 0;
00134         if (idx > mViews.size()-1)
00135             idx = mViews.size()-1;
00136         return idx;
00137     }
00138 
00139     void ClearFiles()
00140     {
00141 #ifndef NO_RAW
00142         if (mRgbDataSrc)
00143         {
00144             delete mRgbDataSrc;
00145             mRgbDataSrc = 0;
00146         }
00147 #endif
00148         unsigned int i;
00149         for (i=0 ; i<mFileNames.size() ; i++)
00150             delete mFileNames[i];
00151         mFileNames.clear();
00152     }
00153 
00154     void ClearViews(int start=0, int end=10000)
00155     {
00156         ClampViewIdx(start);
00157         ClampViewIdx(end);
00158         for (int i=start; i<end; i++)
00159         {
00160             viewSys.SetImage(mViews[i], 0);
00161             viewSys.ClearTags(mViews[i], visibleTag);
00162             mViews[i]->UserData1 = (void*)-1;
00163         }
00164     }
00165 
00166     int Y2Row(int y)
00167     {
00168         return (mDocY + mDocH - y) / mCellH;
00169     }
00170     int Row2Y(int row)
00171     {
00172         return (mDocY+mDocH-(row+1)*mCellH);
00173     }
00174 
00175     int NrRows()
00176     {
00177         return NrOfFiles() / mNrOfImOnRow;
00178     }
00179 
00180     int FindFirstVisible()
00181     {
00182         int first = Y2Row(H()) * mNrOfImOnRow;
00183         return ClampImIdx(first);
00184     }
00185     int FindLastVisible()
00186     {
00187         int last = Y2Row(-mCellH) * mNrOfImOnRow;
00188         return ClampImIdx(last);
00189     }
00190 
00191     int FindIndexFwd(int imIdx, int start=0)
00192     {
00193         ClampViewIdx(start);
00194         for (int i=start; i<mViews.size(); i++)
00195         {
00196             if (imIdx == (long long) mViews[i]->UserData1)
00197                 return i;
00198         }
00199         return -1;
00200     }
00201 
00202     int FindIndexBwd(int imIdx, int start=10000)
00203     {
00204         ClampViewIdx(start);
00205         for (int i=start; i>=0; i--)
00206         {
00207             if (imIdx == (long long) mViews[i]->UserData1)
00208                 return i;
00209         }
00210         return -1;
00211     }
00212 
00213     int FindIndex(int imIdx, int start, bool backward=false)
00214     {
00215         if (backward)
00216             return FindIndexBwd(imIdx, start);
00217         else
00218             return FindIndexFwd(imIdx, start);
00219     }
00220 
00221     void HandleDocDimensions(bool resizing=false, bool reset=false)
00222     {
00223         if (!mFixedCellDims)
00224         {
00225             mCellW = W() / mNrOfImOnRow;
00226             mCellH = mCellW + (mShowNames ? mExtH : 0);
00227         }
00228         else if ((mNrOfImOnRow = W() / mCellW)<1)
00229             mNrOfImOnRow = 1;
00230 
00231         int docH = (NrOfFiles() / mNrOfImOnRow) * mCellH;
00232 
00233         if (resizing && mOldStartIm != -1)
00234         {
00235             int row = mOldStartIm / mNrOfImOnRow;
00236             mDocY = H() - (NrRows() - row) * mCellH;
00237         }
00238         if (mDocY < (-docH+H()))
00239             mDocY = -docH+H();
00240         if (reset)
00241             SetDocDimensions(0,-docH+H(),W(), docH);
00242         else
00243             SetDocDimensions(mDocX, mDocY, W(), docH);
00244     }
00245 
00246     void HandleViewText(OGLVIEW* oglView)
00247     {
00248         if (!(mShowNames || mShowDims))
00249             return;
00250 
00251         OGLIMAGE*   oglIm = oglView->im;
00252         int         txtX  = oglView->x;
00253         int         txtY  = oglView->y-14;
00254         std::string txt   = "";
00255 
00256         if (mShowNames)
00257         {
00258             int userData1 = (long long)oglView->UserData1;
00259 #ifndef NO_RAW
00260             if (mRgbDataSrc)
00261                 txt = "im " + MakeString(userData1) + " ";
00262             else
00263 #endif
00264                 txt = *mFileNames[userData1] + " ";
00265         }
00266         if (mShowDims)
00267         {
00268             char buf[20];
00269             sprintf(buf, "[%dx%d]", oglIm->w, oglIm->h);
00270             txt += buf;
00271         }
00272         oglSys.StartScissor(mOglWnd,txtX,txtY-4,oglView->w,20);
00273         oglSys.PosColPrintf(mOglWnd,txtX,txtY,GetForeground(),"%s",txt.c_str());
00274         oglSys.EndScissor();
00275     }
00276 
00277     void HandleViewZoom(OGLVIEW* oglView)
00278     {
00279         OGLIMAGE*   oglIm = oglView->im;
00280         float       zoomX, zoomY;
00281 
00282         if (oglIm->w >= oglIm->h)
00283             zoomY = zoomX = (oglView->w)/(float)oglIm->w;
00284         else
00285             zoomX = zoomY = (oglView->h)/(float)oglIm->h;
00286         if (zoomX > mMaxZoom)
00287             zoomX = zoomY = mMaxZoom;
00288         viewSys.SetZoom(oglView, zoomX, zoomY);
00289     }
00290 
00291     virtual void HandleViewDecoration(OGLVIEW* view)
00292     {
00293         SetSolidLineColor(oglLIGHTGREY);
00294         DrawRectangle(view->x-2, view->y-2, view->w+4, view->h+4);
00295     }
00296 
00297     void HandleViewSettings(int vIdx)
00298     {
00299         OGLVIEW*  oglView;
00300         if (vIdx<0 || vIdx>mViews.size() || !(oglView=mViews[vIdx]))
00301             return;
00302         if (!mViews[vIdx]->im)
00303             return;
00304         HandleViewZoom(oglView);
00305         HandleViewText(oglView);
00306         HandleViewDecoration(oglView);
00307     }
00308 
00309     void ViewCreateImage(int dstIdx, int imIdx)
00310     {
00311             Array2dVec3UInt8* ar = 0;
00312 #ifndef NO_RAW
00313         if (mRgbDataSrc)
00314         {
00315             mRgbDataSrc->GotoFrame(imIdx);
00316             int imW = mRgbDataSrc->FrameWidth();
00317             int imH = mRgbDataSrc->FrameHeight();
00318                 ar = new Array2dVec3UInt8(imW, imH, 0, 0, 0, false);
00319                 memcpy( (void *) ar->CPB(0, 0), mRgbDataSrc->DataPtr(), imW*imH*3 );
00320         }
00321         else
00322 #endif
00323         {
00324             std::string fName = mDirName + "/" + *mFileNames[imIdx];
00325 #ifndef REPOSITORY_USED // Here comes the deprecated stuff
00326             Core::Array::ReadFile(ar, fName, &Util::Database::GetInstance());
00327 #else // REPOSITORY_USED
00328             // This is just a hack to get things to compile...
00329             Persistency::FileLocator loc(fName);
00330             typedef Persistency::RepositoryInFileSystem FS;
00331             Persistency::File f = FS::GetInstance().GetFile(loc, false, false);
00332             Core::Array::ReadFile(ar, f);
00333 #endif // REPOSITORY_USED
00334             if (ar == 0)
00335             {
00336                 ILOG_WARN("Could not read file: " << fName);
00337             }
00338         }
00339         if (ar != 0)
00340         {
00341             OGLIMAGE* oglIm = RgbOglImage::OglImage(ar);
00342             viewSys.SetImage(mViews[dstIdx],oglIm);
00343             ReleaseOglImage(oglIm);
00344         } else {
00345             ILOG_WARN("array = 0, image not loaded.");
00346             viewSys.SetImage(mViews[dstIdx], 0);
00347         }
00348         mViews[dstIdx]->UserData1 = (void *) imIdx;
00349     }
00350 
00351     void CopyImageFromView(int dstIdx, int srcIdx, int imIdx)
00352     {
00353         viewSys.SetImage(mViews[dstIdx], mViews[srcIdx]->im);
00354         mViews[dstIdx]->UserData1 = (void *) imIdx;
00355     }
00356 
00357     bool ViewNewPositionNeedsIm(int vIdx, int imIdx)
00358     {
00359         int row = imIdx / mNrOfImOnRow;
00360         int x   = (imIdx%mNrOfImOnRow) * mCellW + 4;
00361         int y   = Row2Y(row) + 12 + mExtH;
00362         int w   = mCellW - 8;
00363         int h   = mCellH - (18+mExtH);
00364 
00365         viewSys.SetDimensions(mViews[vIdx], x, y, w, h);
00366         viewSys.SetTags(mViews[vIdx], visibleTag);
00367         return ((long long) mViews[vIdx]->UserData1) != imIdx;
00368     }
00369 
00370     virtual void ReshapeFunc(int w, int h)
00371     {
00372         Window::ReshapeFunc(w,h);
00373         HandleDocDimensions(true,false);
00374     }
00375 
00376     void HandleView(int vIdx, int imIdx, bool bwd)
00377     {
00378         if (vIdx < 0 || vIdx > mViews.size()-1)
00379             return;
00380         if (ViewNewPositionNeedsIm(vIdx,imIdx))
00381         {
00382             int foundIdx;
00383             if ((foundIdx = FindIndex(imIdx,vIdx,bwd))!=-1)
00384                 CopyImageFromView(vIdx,foundIdx,imIdx);
00385             else
00386                 ViewCreateImage(vIdx,imIdx);
00387         }
00388         HandleViewSettings(vIdx);
00389     }
00390 
00391     virtual void DisplayFunc()
00392     {
00393         int cellH = CellHeight();
00394         int h     = H();
00395         int dif   = (cellH > h) ? h-cellH : h % cellH;
00396 
00397         mFlowDragger.SetFlowPageExtra(dif-mPagingExtra);
00398         mFlowDragger.FlowDragDisplay();
00399         OGC myOGC;
00400         OGCSave(&myOGC);
00401         int first  = FindFirstVisible();
00402         int last   = FindLastVisible();
00403         int range  = last - first + 1;
00404         int i, vIdx;
00405         if (mOldStartIm <= first)
00406         {
00407             for (i=first, vIdx=-1; i<=last; i++)
00408                 HandleView(++vIdx,i,false);
00409             ClearViews(vIdx+1);
00410         }
00411         else
00412         {
00413             for (i=last, vIdx=range; i>=first; i--)
00414                 HandleView(--vIdx, i, true);
00415             ClearViews(range);
00416         }
00417         mOldStartIm = first;
00418         OGCRestore(&myOGC);
00419         Window::DisplayFunc();
00420     }
00421 
00422     virtual void KeyboardFunc(int c, int state)
00423     {
00424         int oldDocY = mDocY;
00425         mFlowDragger.KeyboardFunc(c,state);
00426 
00427         if (c == '~')
00428             mFixedCellDims = !mFixedCellDims;
00429 
00430         Window::KeyboardFunc(c, state);
00431 
00432         if (oldDocY != mDocY) // In case keys mapped to external scroller
00433             return;
00434         if (c==oglPAGEDOWN)
00435             mDocY += H();
00436         if (c==oglPAGEUP)
00437             mDocY -= H();
00438         if (c==oglUP)
00439             mDocY += 10;
00440         if (c==oglDOWN)
00441             mDocY -= 10;
00442     }
00443 
00444     virtual void MouseFunc(int msg, int but, int state, int x, int y)
00445     {
00446         mFlowDragger.MouseFunc(msg,but,state,x,y);
00447         Window::MouseFunc(msg,but,state,x,y);
00448     }
00449 
00450 private:
00451 
00452     void Init(int w, int h, int nOnRow)
00453     {
00454         mFlowDragger.SetDocWnd(this,this);
00455         SetDocDimensions(0,0,w,h);
00456         ShowNames(true);
00457         ShowDims(true);
00458         FixedCellWidth(132); // Would result in fixed cell width, but overruled by next line
00459         NrOfImOnRow(nOnRow); // Results in fixed nr of im per row and scaling views
00460         ShowNames(true);
00461         ShowDims(true);
00462         mOldStartIm = -1;
00463         mPagingExtra = 1;
00464         mMaxZoom = 2;
00465         for (int i=0; i<1000; i++)
00466         {
00467             OGLVIEW* view = viewSys.View2D(mOglWnd,0,0,0,128,128);
00468             viewSys.SetTags(view, FlexViewTags);
00469             viewSys.ClearTags(view, visibleTag|showBorderTag|showBgTag|selectableTag);
00470             //viewSys.ClearTags(view, visibleTag|showBgTag|selectableTag);
00471             viewSys.SetColor(view, OGL_BG, oglTrLIGHTGREY);
00472             view->UserData1 = (void *) -1;
00473             mViews.push_back(view);
00474         }
00475 #ifndef NO_RAW
00476         mRgbDataSrc = 0;
00477 #endif
00478     }
00479 
00480     std::string                 mDirName;
00481     std::vector<std::string*>   mFileNames;
00482     std::vector<OGLVIEW*>       mViews;
00483 #ifndef NO_RAW
00484     RgbDataSrc*                 mRgbDataSrc;
00485 #endif
00486 
00487     bool                        mFixedCellDims;
00488     bool                        mShowNames;
00489     bool                        mShowDims;
00490     int                         mNrOfImOnRow;
00491     int                         mCellW;
00492     int                         mCellH;
00493     int                         mExtH;
00494 
00495     int                         mOldStartIm;
00496     int                         mPagingExtra;
00497 
00498     double                      mMaxZoom;
00499     OglGui::DocFlowDrag         mFlowDragger;
00500 
00501     ILOG_VAR_DEC;
00502 };
00503 
00504 ILOG_VAR_INIT(DirImViewer, Visualization);
00505 
00506 } // namespace Visualization
00507 } // namespace Impala
00508 #endif

Generated on Thu Jan 13 09:05:17 2011 for ImpalaSrc by  doxygen 1.5.1