00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008 #include "ImageSequenceMovieFile.h"
00009
00010 #include <vcl_iostream.h>
00011 #include <vil1/vil1_file_image.h>
00012 #include <oxp/ImageSequenceName.h>
00013
00014 struct ImageSequenceMovieFilePrivates {
00015 ImageSequenceMovieFilePrivates(const char* filepattern, int frame_index_to_search_for_extension):
00016 seqname(filepattern, frame_index_to_search_for_extension, 1, "r"),
00017 current_image_index(-1),
00018 base_index(frame_index_to_search_for_extension)
00019 {
00020 seqname.start_frame_ = 0;
00021 }
00022
00023 vil1_image get_image(int index) {
00024 if (!current_image || (current_image_index != index)) {
00025
00026 vcl_string newname = seqname.name(index);
00027 if (MovieFileInterface::verbose)
00028 vcl_cerr << "ImageSequenceMovieFile: Loading [" << newname << "]: ";
00029 current_image.load(newname.c_str(), MovieFileInterface::verbose ? vil1_file_image::laconic : vil1_file_image::silent);
00030 current_image_index = index;
00031 }
00032 return current_image;
00033 }
00034
00035 public:
00036 ImageSequenceName seqname;
00037 int current_image_index;
00038 vil1_file_image current_image;
00039 int base_index;
00040 };
00041
00042
00043 ImageSequenceMovieFile::ImageSequenceMovieFile(char const* filepattern, int frame_index_to_search_for_extension):
00044 p(new ImageSequenceMovieFilePrivates(filepattern, frame_index_to_search_for_extension))
00045 {
00046 }
00047
00048 ImageSequenceMovieFile::~ImageSequenceMovieFile()
00049 {
00050 delete p;
00051 }
00052
00053
00054 int ImageSequenceMovieFile::GetLength()
00055 {
00056 return p->seqname.n();
00057 }
00058
00059 vil1_image ImageSequenceMovieFile::GetImage(int frame_index)
00060 {
00061 return p->get_image(frame_index);
00062 }
00063
00064 int ImageSequenceMovieFile::GetSizeX(int frame_index)
00065 {
00066 return p->get_image(frame_index).width();
00067 }
00068
00069 int ImageSequenceMovieFile::GetSizeY(int frame_index)
00070 {
00071 return p->get_image(frame_index).height();
00072 }
00073
00074 int ImageSequenceMovieFile::GetBitsPixel()
00075 {
00076 vil1_image animage = p->current_image? vil1_image(p->current_image) : p->get_image(p->base_index);
00077 return animage.components() * animage.bits_per_component();
00078 }
00079
00080
00081 bool ImageSequenceMovieFile::IsInterlaced()
00082 {
00083 return false;
00084 }
00085
00086 bool ImageSequenceMovieFile::HasFrame(int frame_index)
00087 {
00088 return p->get_image(frame_index);
00089 }
00090
00091 bool ImageSequenceMovieFile::GetFrame(int frame_index, void* buffer)
00092 {
00093 vil1_image image = p->get_image(frame_index);
00094 image.get_section(buffer, 0, 0, image.width(), image.height());
00095 return true;
00096 }
00097
00098 bool ImageSequenceMovieFile::GetField(int field_index, void* buffer)
00099 {
00100 return GetFrame(field_index, buffer);
00101 }