00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008 #include "MovieFile.h"
00009
00010 #include <vcl_fstream.h>
00011 #include <oxp/oxp_vidl_moviefile.h>
00012 #include <oxp/ImageSequenceMovieFile.h>
00013 #include <oxp/oxp_parse_seqname.h>
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 MovieFile::MovieFile(char const* filename, int start, int step, int end):
00026 filename_(filename),
00027 start_(start),
00028 step_(step),
00029 end_(end),
00030 qt(0),
00031 tmp_buf_(0)
00032 {
00033 oxp_parse_seqname range(filename);
00034 vcl_string fn = range.filename_;
00035 if (range.start_ != -1) start_ = range.start_;
00036 if (range.step_ != -1) step_ = range.step_;
00037 if (range.end_ != -1) end_ = range.end_;
00038
00039
00040 vcl_ifstream fd(fn.c_str(), vcl_ios_in);
00041 if (fd.good())
00042 {
00043 qt = new oxp_vidl_moviefile(fn.c_str());
00044 }
00045 else
00046 {
00047 qt = new ImageSequenceMovieFile(fn.c_str(), start_);
00048 }
00049 }
00050
00051
00052 MovieFile::~MovieFile()
00053 {
00054 delete tmp_buf_;
00055 delete qt;
00056 }
00057
00058 int MovieFile::index(int f)
00059 {
00060 return start_ + f * step_;
00061 }
00062
00063 int MovieFile::GetLength()
00064 {
00065 return qt->GetLength();
00066 }
00067
00068 int MovieFile::GetNumFrames()
00069 {
00070
00071 if (end_ == -1) {
00072 vcl_cerr << "MovieFile: probing ";
00073 int i;
00074 for (i = 0; GetImage(i); ++i)
00075 ;
00076 --i;
00077 end_ = start_ + i * step_;
00078 vcl_cerr << " done\n";
00079 }
00080 return (end_ - start_) / step_ + 1;
00081 }
00082
00083 vil1_image MovieFile::GetImage(int frame_index)
00084 {
00085 return qt->GetImage(index(frame_index));
00086 }
00087
00088 int MovieFile::GetSizeX(int frame_index)
00089 {
00090 return qt->GetSizeX(index(frame_index));
00091 }
00092
00093 int MovieFile::GetSizeY(int frame_index)
00094 {
00095 return qt->GetSizeY(index(frame_index));
00096 }
00097
00098 int MovieFile::GetBitsPixel()
00099 {
00100 return qt->GetBitsPixel();
00101 }
00102
00103 bool MovieFile::HasFrame(int frame_index)
00104 {
00105 return qt->HasFrame(index(frame_index));
00106 }
00107
00108 void MovieFile::GetFrame(int frame_index, vil1_memory_image_of<vil1_rgb<unsigned char> >& frame)
00109 {
00110 int sx = GetSizeX(frame_index);
00111 int sy = GetSizeY(frame_index);
00112 frame.resize(sx,sy);
00113 GetFrame(frame_index, (vil1_rgb<unsigned char> *)frame.get_buffer());
00114 }
00115
00116 void MovieFile::GetFrame(int frame_index, vil1_memory_image_of<vxl_byte>& frame)
00117 {
00118 int sx = GetSizeX(frame_index);
00119 int sy = GetSizeY(frame_index);
00120 frame.resize(sx,sy);
00121 GetFrame(frame_index, (vxl_byte*)frame.get_buffer());
00122 }
00123
00124 void MovieFile::GetFrameRGB(int frame_index, vxl_byte* frame)
00125 {
00126 GetFrame(frame_index, (vil1_rgb<unsigned char> *)frame);
00127 }
00128
00129 void MovieFile::GetFrame(int frame_index, vil1_rgb<unsigned char> * frame)
00130 {
00131 if (qt->GetBitsPixel() == 24)
00132 qt->GetFrame(index(frame_index), frame);
00133 else {
00134
00135 qt->GetFrame(index(frame_index), frame);
00136 int sx = GetSizeX((frame_index));
00137 int sy = GetSizeY((frame_index));
00138 int size = sx * sy;
00139 vxl_byte* base = (vxl_byte*)frame;
00140 vxl_byte* rgb_ptr = base + size*3;
00141 vxl_byte* gray_ptr = base + size;
00142 do {
00143 --gray_ptr;
00144 *--rgb_ptr = *gray_ptr;
00145 *--rgb_ptr = *gray_ptr;
00146 *--rgb_ptr = *gray_ptr;
00147 } while (gray_ptr != base);
00148 }
00149 }
00150
00151 void MovieFile::GetFrame(int frame_index, vxl_byte* frame)
00152 {
00153 if (qt->GetBitsPixel() == 8) {
00154
00155 qt->GetFrame(index(frame_index), frame);
00156 } else {
00157 int sx = GetSizeX((frame_index));
00158 int sy = GetSizeY((frame_index));
00159
00160
00161 if (!tmp_buf_)
00162 tmp_buf_ = new vil1_memory_image_of<vil1_rgb<unsigned char> >(sx, sy);
00163 else
00164 tmp_buf_->resize(sx, sy);
00165
00166 qt->GetFrame(index(frame_index), (vxl_byte*)tmp_buf_->get_buffer());
00167 int size = sx * sy;
00168 vil1_rgb<unsigned char> * rgb_ptr = (vil1_rgb<unsigned char> *)tmp_buf_->get_buffer();
00169 vxl_byte* gray_ptr = frame;
00170 for (int i = 0; i < size; ++i)
00171 *gray_ptr++ = rgb_ptr++->grey();
00172 }
00173 }