core/vidl_vil1/vidl_vil1_movie.h

Go to the documentation of this file.
00001 #ifndef vidl_vil1_movie_h
00002 #define vidl_vil1_movie_h
00003 //:
00004 // \file
00005 // \author Nicolas Dano, september 1999
00006 //
00007 // \verbatim
00008 //  Modifications
00009 //   June 2000 Julien ESTEVE          Ported from TargetJr
00010 //   10/4/2001 Ian Scott (Manchester) Converted perceps header to doxygen
00011 //   10/9/2004 Peter Vanroose Added copy ctor with explicit vbl_ref_count init
00012 // \endverbatim
00013 
00014 #include <vbl/vbl_ref_count.h>
00015 #include <vidl_vil1/vidl_vil1_movie_sptr.h>
00016 #include <vidl_vil1/vidl_vil1_frame_sptr.h>
00017 #include <vidl_vil1/vidl_vil1_clip_sptr.h>
00018 #include <vil1/vil1_image.h>
00019 #include <vcl_list.h>
00020 
00021 //: Video movie
00022 //   A vidl_vil1_movie is a movie sequence
00023 //   It is basically a list of clips.
00024 // See also vidl_vil1_frame and vidl_vil1_clip.
00025 class vidl_vil1_movie : public vbl_ref_count
00026 {
00027   // PUBLIC INTERFACE
00028  public:
00029 
00030   // Constructors/Initializers/Destructors
00031   vidl_vil1_movie ();
00032   vidl_vil1_movie(vidl_vil1_clip_sptr clip);
00033   ~vidl_vil1_movie();
00034   vidl_vil1_movie(vidl_vil1_movie const& x)
00035     : vbl_ref_count(), frame_rate_(x.frame_rate_), clip_(x.clip_) {}
00036 
00037   // Operators
00038   vidl_vil1_movie& operator=(const vidl_vil1_movie&);
00039 
00040   // Data Access
00041   vidl_vil1_frame_sptr get_frame(int n);
00042   vil1_image get_image(int n);
00043   int length() const;
00044   unsigned int frame_rate() const {return frame_rate_;}
00045   void set_frame_rate(unsigned int fr) {frame_rate_ = fr;}
00046 
00047   vcl_list<vidl_vil1_clip_sptr> get_clips() const {return clip_;}
00048 
00049   int width() const;
00050   int height() const;
00051 
00052   // Data Control
00053   void add_clip(vidl_vil1_clip_sptr  clip);
00054 
00055  private:
00056   unsigned int frame_rate_;
00057 
00058  protected:
00059   // Data Members
00060   vcl_list<vidl_vil1_clip_sptr> clip_;
00061 
00062 
00063   //----------------------------
00064   // Iterator definition
00065   //----------------------------
00066  public:
00067 
00068   class frame_iterator
00069   {
00070     //
00071     // This class is an iterator for the frames in a vidl_vil1_movie.
00072     // One should think of a vidl_vil1_movie as being a list of vidl_vil1_frames.
00073     // The frame_iterator allows one to access the individual frames.
00074     // Thus, dereferencing the frame iterator gives a vidl_vil1_frame.
00075     // i.e. if we have frame_iterator it, then *it is a vidl_vil1_frame.
00076     // and it-> accesses the members of vidl_vil1_frame.
00077     //
00078     // Correct way of running through all the frames of a movie is
00079     // for (vidl_vil1_movie::frame_iterator frame = movie.begin();
00080     //      frame != movie.end();
00081     //      ++frame)
00082     //
00083     // Also look at examples/vidl_vil1_mpegcodec_example.cxx for other examples
00084 
00085    private :
00086     vidl_vil1_movie_sptr movie_;
00087     int frame_number_;
00088 
00089    public :
00090     // Constructors / destructors
00091     frame_iterator (vidl_vil1_movie_sptr movie, int frame_number) :
00092       movie_(movie), frame_number_(frame_number) {}
00093 
00094     frame_iterator (vidl_vil1_movie_sptr movie) :
00095       movie_(movie), frame_number_(0) {}
00096 
00097     frame_iterator (const frame_iterator &fr) :
00098       movie_(fr.movie_), frame_number_(fr.frame_number_) {}
00099 
00100     ~frame_iterator () {}
00101 
00102     // Assigning one iterator to another
00103     frame_iterator& operator= (const frame_iterator &fr)
00104     {
00105       movie_ = fr.movie_;
00106       frame_number_ = fr.frame_number_;
00107       return *this;
00108     }
00109 
00110     frame_iterator& operator= (int n) { frame_number_ = n; return *this; }
00111 
00112     // Incrementing the frame number
00113     frame_iterator& operator++ () { frame_number_ ++; return *this; }
00114     frame_iterator& operator-- () { frame_number_ --; return *this; }
00115     frame_iterator& operator+= (int n) { frame_number_ += n; return *this; }
00116     frame_iterator& operator-= (int n) { frame_number_ -= n; return *this; }
00117 
00118     // Treating as a vidl_vil1_frame_sptr
00119     operator vidl_vil1_frame_sptr () const
00120     {
00121       if (frame_number_ < 0 || frame_number_ >= movie_->length())
00122         return vidl_vil1_frame_sptr(0);
00123       return movie_->get_frame(frame_number_);
00124     }
00125 
00126     vidl_vil1_frame_sptr operator -> () const { return (vidl_vil1_frame_sptr) *this; }
00127 
00128     // Comparison against other iterators
00129     friend bool operator == (const frame_iterator &fr1,
00130                              const frame_iterator &fr2)
00131        { return fr1.frame_number_ == fr2.frame_number_; }
00132 
00133     friend bool operator != (const frame_iterator &fr1,
00134                              const frame_iterator &fr2)
00135        { return fr1.frame_number_ != fr2.frame_number_; }
00136 
00137     friend bool operator <(const frame_iterator&fr1,
00138                            const frame_iterator&fr2)
00139        { return fr1.frame_number_ < fr2.frame_number_; }
00140     friend bool operator > (const frame_iterator &fr1,
00141                             const frame_iterator& fr2)
00142        { return fr1.frame_number_ > fr2.frame_number_; }
00143 
00144     friend bool operator <= (const frame_iterator &fr1,
00145                              const frame_iterator &fr2)
00146        { return fr1.frame_number_ <= fr2.frame_number_; }
00147 
00148     friend bool operator >= (const frame_iterator &fr1,
00149                              const frame_iterator &fr2)
00150        { return fr1.frame_number_ >= fr2.frame_number_; }
00151 
00152     // Comparison against integers
00153     bool operator ==(int n) const { return frame_number_ == n; }
00154     bool operator !=(int n) const { return frame_number_ != n; }
00155     bool operator < (int n) const { return frame_number_ < n; }
00156     bool operator > (int n) const { return frame_number_ > n; }
00157     bool operator <=(int n) const { return frame_number_ <= n; }
00158     bool operator >=(int n) const { return frame_number_ >= n; }
00159 
00160     // Data member access
00161     int current_frame_number () const { return frame_number_; }
00162     vidl_vil1_movie_sptr get_movie () const  { return movie_; }
00163   };
00164 
00165   //---------------------------------------------------------------------
00166   // Methods that return iterators
00167   frame_iterator first() { return frame_iterator(this, 0); }
00168   frame_iterator last()  { return frame_iterator(this,this->length()-1); }
00169   frame_iterator begin() { return first(); }
00170   frame_iterator end()   { return frame_iterator(this,this->length()); }
00171 };
00172 
00173 #endif // vidl_vil1_movie_h

Generated on Tue Dec 2 05:09:13 2008 for core/vidl_vil1 by  doxygen 1.5.1