diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-04-17 00:08:56 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-04-17 00:08:56 +0000 |
commit | cce771679c6eabefe43b29982b9a8a573ab5b434 (patch) | |
tree | f5a48cb59e1182a950141e244ef7e5ba71a5b17b /mplayer.c | |
parent | 921a9c9f2d2d1d13c54b1e454ed1cf299814a1cd (diff) | |
download | mpv-cce771679c6eabefe43b29982b9a8a573ab5b434.tar.bz2 mpv-cce771679c6eabefe43b29982b9a8a573ab5b434.tar.xz |
sub control optimized
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@483 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mplayer.c')
-rw-r--r-- | mplayer.c | 91 |
1 files changed, 79 insertions, 12 deletions
@@ -94,26 +94,91 @@ int verbose=0; static current_sub=0; static subtitle* subtitles=NULL; +static int nosub_range_start=-1; +static int nosub_range_end=-1; -void find_sub(unsigned long key){ +void find_sub(int key){ int i,j; - if(current_sub<0 || current_sub>=sub_num) current_sub=0; - vo_sub=&subtitles[current_sub]; - if(key>=vo_sub->start && key<=vo_sub->end) return; // OK! + if(vo_sub){ + if(key>=vo_sub->start && key<=vo_sub->end) return; // OK! + } else { + if(key>nosub_range_start && key<nosub_range_end) return; // OK! + } + // sub changed! + +// printf("\r---- sub changed ----\n"); + + // check next sub. + if(current_sub>=0 && current_sub+1<sub_num){ + if(key>subtitles[current_sub].end && key<subtitles[current_sub+1].start){ + // no sub + nosub_range_start=subtitles[current_sub].end; + nosub_range_end=subtitles[current_sub+1].start; + vo_sub=NULL; + return; + } + // next sub? + ++current_sub; + vo_sub=&subtitles[current_sub]; + if(key>=vo_sub->start && key<=vo_sub->end) return; // OK! + } + +// printf("\r---- sub log search... ----\n"); + // use logarithmic search: i=0;j=sub_num-1; // printf("Searching %d in %d..%d\n",key,subtitles[i].start,subtitles[j].end); while(j>=i){ current_sub=(i+j+1)/2; - if(key<subtitles[current_sub].start) - j=current_sub-1; - else - if(key>subtitles[current_sub].end) - i=current_sub+1; - else break; // found! + vo_sub=&subtitles[current_sub]; + if(key<vo_sub->start) j=current_sub-1; + else if(key>vo_sub->end) i=current_sub+1; + else return; // found! } - vo_sub=&subtitles[current_sub]; - if(key>=vo_sub->start && key<=vo_sub->end) return; // OK! +// if(key>=vo_sub->start && key<=vo_sub->end) return; // OK! + + // check where are we... + if(key<vo_sub->start){ + if(current_sub<=0){ + // before the first sub + nosub_range_start=key-1; // tricky + nosub_range_end=vo_sub->start; +// printf("FIRST... key=%d end=%d \n",key,vo_sub->start); + vo_sub=NULL; + return; + } + --current_sub; + if(key>subtitles[current_sub].end && key<subtitles[current_sub+1].start){ + // no sub + nosub_range_start=subtitles[current_sub].end; + nosub_range_end=subtitles[current_sub+1].start; +// printf("No sub... 1 \n"); + vo_sub=NULL; + return; + } + printf("HEH???? "); + } else { + if(key<=vo_sub->end) printf("JAJJ! "); else + if(current_sub+1>=sub_num){ + // at the end? + nosub_range_start=vo_sub->end; + nosub_range_end=0x7FFFFFFF; // MAXINT +// printf("END!?\n"); + vo_sub=NULL; + return; + } else + if(key>subtitles[current_sub].end && key<subtitles[current_sub+1].start){ + // no sub + nosub_range_start=subtitles[current_sub].end; + nosub_range_end=subtitles[current_sub+1].start; +// printf("No sub... 2 \n"); + vo_sub=NULL; + return; + } + } + + printf("SUB ERROR: %d ? %d --- %d [%d] \n",key,vo_sub->start,vo_sub->end,current_sub); + vo_sub=NULL; // no sub here } @@ -1919,7 +1984,9 @@ switch(file_format){ // find sub if(subtitles){ if(sub_fps==0) sub_fps=sh_video->fps; + current_module="find_sub"; find_sub(sub_uses_time?(100*(v_pts+sub_delay)):((v_pts+sub_delay)*sub_fps)); // FIXME! frame counter... + current_module=NULL; } } |