00001 #ifndef vidl_vil1_movie_h
00002 #define vidl_vil1_movie_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
00022
00023
00024
00025 class vidl_vil1_movie : public vbl_ref_count
00026 {
00027
00028 public:
00029
00030
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
00038 vidl_vil1_movie& operator=(const vidl_vil1_movie&);
00039
00040
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
00053 void add_clip(vidl_vil1_clip_sptr clip);
00054
00055 private:
00056 unsigned int frame_rate_;
00057
00058 protected:
00059
00060 vcl_list<vidl_vil1_clip_sptr> clip_;
00061
00062
00063
00064
00065
00066 public:
00067
00068 class frame_iterator
00069 {
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 private :
00086 vidl_vil1_movie_sptr movie_;
00087 int frame_number_;
00088
00089 public :
00090
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
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
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
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
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
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
00161 int current_frame_number () const { return frame_number_; }
00162 vidl_vil1_movie_sptr get_movie () const { return movie_; }
00163 };
00164
00165
00166
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