core/vidl_vil1/vidl_vil1_vob_frame_index.cxx

Go to the documentation of this file.
00001 // This is core/vidl_vil1/vidl_vil1_vob_frame_index.cxx
00002 #include "vidl_vil1_vob_frame_index.h"
00003 //
00004 // this file has been copied from oxl/oxp
00005 // author:  AWF
00006 // copied by l.e.galup
00007 // 10-18-02
00008 
00009 #include <vcl_cassert.h>
00010 #include <vcl_cstdio.h>
00011 #include <vcl_fstream.h>
00012 #include <vul/vul_awk.h>
00013 
00014 bool vidl_vil1_vob_frame_index::load(vcl_string const& filename)
00015 {
00016   vcl_vector<vidl_vil1_vob_frame_index_entry> tmp;
00017 
00018   vcl_ifstream f(filename.c_str(), vcl_ios_binary);
00019   if (!f.good())
00020   {
00021     vcl_cerr << "vidl_vil1_vob_frame_index: Cannot read IDX file ["<< filename <<"]\n";
00022     return false;
00023   }
00024   vul_awk awk(f);
00025   vcl_string tag(awk[0]);
00026   const int MPEG_IDX = 1;
00027   const int LBA = 2;
00028   int idx_type = 0;
00029   if (tag == "MPEG_IDX") 
00030     idx_type = MPEG_IDX;
00031   else if (tag == "LBA")
00032     idx_type = LBA;
00033   else
00034     vcl_cerr << "vidl_vil1_vob_frame_index: WARNING: unknown type [" << awk[0] << "]\n";
00035 
00036   for (int frame=0; awk; ++awk, ++frame)
00037   {
00038     // Skip comment and ----- lines
00039     vidl_vil1_vob_frame_index_entry e;
00040     if (idx_type == LBA && vcl_sscanf(awk.line(), " %x | %d", &e.lba, &e.frame) == 2)
00041       tmp.push_back(e);
00042     int dummy;
00043     if (idx_type == MPEG_IDX && vcl_sscanf(awk.line(), " %x %x", &e.lba, &dummy) == 2)
00044     {
00045       e.frame = frame;
00046       tmp.push_back(e);
00047     }
00048   }
00049   l = tmp;
00050 
00051   // assert that l is sorted by frame
00052   for (unsigned int i = 0; i+1 < l.size(); ++i)
00053     assert(l[i+1].frame > l[i].frame);
00054   vcl_cerr << "Loaded " << l.size() << " entries from [" << filename << "]\n";
00055   if (l.size() == 0)
00056     vcl_cerr << "WARNING: No index entries -- all seeks from start\n";
00057   return true;
00058 }
00059 
00060 int vidl_vil1_vob_frame_index::frame_to_lba_of_prev_I_frame(int f, int* f_actual)
00061 {
00062   int lo = 0;
00063   int hi = l.size()-1;
00064   if (hi < 0 || f < l[lo].frame || f > l[hi].frame) {
00065     vcl_cerr << "urk: frame " << f << " out of IDX range\n";
00066     return -1;
00067   }
00068   while (lo < hi-1)
00069   {
00070     int half = (lo + hi) / 2;
00071     int f_half = l[half].frame;
00072     if (f < f_half)
00073       hi = half;
00074     else if (f > f_half)
00075       lo = half;
00076     else {
00077       lo = half;
00078       break;
00079     }
00080   }
00081   // vcl_fprintf(stderr, "vidl_vil1_vob_frame_index: [%5d %5d] -> [%5d %5d]\n", lo, hi, l[lo].frame, l[hi].frame);
00082   if (f_actual)
00083     *f_actual = l[lo].frame;
00084   return l[lo].lba;
00085 }

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