00001
00002 #include "vidl_vil1_vob_frame_index.h"
00003
00004
00005
00006
00007
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
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
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
00082 if (f_actual)
00083 *f_actual = l[lo].frame;
00084 return l[lo].lba;
00085 }