Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

MovieFile.cxx

Go to the documentation of this file.
00001 // This is oxl/oxp/MovieFile.cxx
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005 //:
00006 //  \file
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 //: The moviefile constructor takes the given filename, and opens it at a movie file.
00018 //  The possible values for filename are:
00019 //  - blah.mv                The name of an SGI movie file.
00020 //  - blah.###.jpg           The pattern for an image sequence.
00021 //  - blah                   Assumed to be the basename of a pattern such as
00022 //                           blah.###.extension.   Various default extensions
00023 //                           are searched for using blah.{start}.{ext} until
00024 //                           one matches.
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   // Attempt to open for reading.  need ios_in as it includes nocreate on windows...
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 // Destructor
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   // Probe...
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     // Grab gray into first part and splay out into rgb
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     // Grab gray directly
00155     qt->GetFrame(index(frame_index), frame);
00156   } else {
00157     int sx = GetSizeX((frame_index));
00158     int sy = GetSizeY((frame_index));
00159 
00160     // Grab colour into temp buffer
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 }

Generated on Thu Jan 10 14:46:06 2008 for contrib/oxl/oxp by  doxygen 1.4.4