+int IndexState::read_markers(char *index_dir, char *file_path)
+{
+ int ret = 0;
+ marker_lock->lock("IndexState::read_markers");
+ if( marker_status == MARKERS_NOTTESTED ) {
+ char src_path[BCTEXTLEN], marker_path[BCTEXTLEN];
+ IndexFile::get_index_filename(src_path, index_dir, marker_path, file_path, ".mkr");
+ FILE *fp = fopen(marker_path, "rb");
+ int vsz = strlen(MARKER_MAGIC_VERSION);
+ char version[vsz];
+ if( fp && fread(version, vsz, 1, fp) ) {
+ if( memcmp(version, MARKER_MAGIC_VERSION, vsz) ) {
+ eprintf(_("IndexState::read_markers marker file version mismatched\n: %s\n"),
+ marker_path);
+ return 1;
+ }
+ ret = read_marks(fp);
+ if( !ret ) marker_status = MARKERS_READY;
+ fclose(fp);
+ }
+ }
+ marker_lock->unlock();
+ return ret;
+}
+
+int IndexState::read_marks(FILE *fp)
+{
+ reset_markers();
+ int vid_size = 0;
+ if( !fread(&vid_size, sizeof(vid_size), 1, fp) ) return 1;
+ add_video_markers(vid_size);
+ for( int vidx=0; vidx<vid_size; ++vidx ) {
+ int count = 0;
+ if( !fread(&count, sizeof(count), 1, fp) ) return 1;
+ IndexMarks &marks = *video_markers[vidx];
+ marks.allocate(count);
+ int len = fread(&marks[0], sizeof(marks[0]), count, fp);
+ if( len != count ) return 1;
+ marks.total = count;
+ }
+ int aud_size = 0;
+ if( !fread(&aud_size, sizeof(aud_size), 1, fp) ) return 1;
+ add_audio_markers(aud_size);
+ for( int aidx=0; aidx<aud_size; ++aidx ) {
+ int count = 0;
+ if( !fread(&count, sizeof(count), 1, fp) ) return 1;
+ IndexMarks &marks = *audio_markers[aidx];
+ marks.allocate(count);
+ int len = fread(&marks[0], sizeof(marks[0]), count, fp);
+ if( len != count ) return 1;
+ marks.total = count;
+ }
+ return 0;
+}
+
+int IndexState::create_index(const char *index_path, Asset *asset)
+{
+ index_entries.remove_all_objects();
+ int channels = index_channels.size();
+ int64_t offset = 0;
+ for( int ch=0; ch<channels; ++ch ) {
+ IndexChannel *chn = index_channels[ch];
+ float *bfr = (float *)chn->bfr;
+ int64_t size = 2 * chn->used();
+ add_index_entry(bfr, offset, size);
+ offset += size;
+ }
+
+ write_markers(index_path);
+ return write_index(index_path, asset, index_zoom, index_bytes);
+}
+