1
//**************************************************************************//
3
//**************************************************************************//
11
#include "libvo/video_out.h"
12
#include "libvo/sub.h"
13
#include "subreader.h"
18
static int current_sub=0;
20
//static subtitle* subtitles=NULL;
21
static int nosub_range_start=-1;
22
static int nosub_range_end=-1;
24
extern float sub_delay;
27
void step_sub(sub_data *subd, float pts, int movement) {
31
if (subd == NULL) return;
32
subs = subd->subtitles;
33
key = (pts+sub_delay) * (subd->sub_uses_time ? 100 : sub_fps);
35
/* Tell the OSD subsystem that the OSD contents will change soon */
36
vo_osd_changed(OSDTYPE_SUBTITLE);
38
/* If we are moving forward, don't count the next (current) subtitle
39
* if we haven't displayed it yet. Same when moving other direction.
41
if (movement > 0 && key < subs[current_sub].start)
43
if (movement < 0 && key >= subs[current_sub].end)
46
/* Never move beyond first or last subtitle. */
47
if (current_sub+movement < 0)
48
movement = 0-current_sub;
49
if (current_sub+movement >= subd->sub_num)
50
movement = subd->sub_num - current_sub - 1;
52
current_sub += movement;
53
sub_delay = subs[current_sub].start / (subd->sub_uses_time ? 100 : sub_fps) - pts;
56
void find_sub(sub_data* subd,int key){
60
if ( !subd || subd->sub_num == 0) return;
61
subs = subd->subtitles;
64
if(key>=vo_sub->start && key<=vo_sub->end) return; // OK!
66
if(key>nosub_range_start && key<nosub_range_end) return; // OK!
70
/* Tell the OSD subsystem that the OSD contents will change soon */
71
vo_osd_changed(OSDTYPE_SUBTITLE);
74
vo_sub=NULL; // no sub here
78
// printf("\r---- sub changed ----\n");
81
if(current_sub>=0 && current_sub+1 < subd->sub_num){
82
if(key>subs[current_sub].end && key<subs[current_sub+1].start){
84
nosub_range_start=subs[current_sub].end;
85
nosub_range_end=subs[current_sub+1].start;
91
vo_sub=&subs[current_sub];
92
if(key>=vo_sub->start && key<=vo_sub->end) return; // OK!
95
// printf("\r---- sub log search... ----\n");
97
// use logarithmic search:
99
j = subd->sub_num - 1;
100
// printf("Searching %d in %d..%d\n",key,subs[i].start,subs[j].end);
102
current_sub=(i+j+1)/2;
103
vo_sub=&subs[current_sub];
104
if(key<vo_sub->start) j=current_sub-1;
105
else if(key>vo_sub->end) i=current_sub+1;
106
else return; // found!
108
// if(key>=vo_sub->start && key<=vo_sub->end) return; // OK!
110
// check where are we...
111
if(key<vo_sub->start){
113
// before the first sub
114
nosub_range_start=key-1; // tricky
115
nosub_range_end=vo_sub->start;
116
// printf("FIRST... key=%d end=%d \n",key,vo_sub->start);
121
if(key>subs[current_sub].end && key<subs[current_sub+1].start){
123
nosub_range_start=subs[current_sub].end;
124
nosub_range_end=subs[current_sub+1].start;
125
// printf("No sub... 1 \n");
131
if(key<=vo_sub->end) printf("JAJJ! "); else
132
if(current_sub+1 >= subd->sub_num){
134
nosub_range_start=vo_sub->end;
135
nosub_range_end=0x7FFFFFFF; // MAXINT
136
// printf("END!?\n");
140
if(key>subs[current_sub].end && key<subs[current_sub+1].start){
142
nosub_range_start=subs[current_sub].end;
143
nosub_range_end=subs[current_sub+1].start;
144
// printf("No sub... 2 \n");
150
mp_msg(MSGT_FIXME,MSGL_FIXME,"SUB ERROR: %d ? %d --- %d [%d] \n",key,(int)vo_sub->start,(int)vo_sub->end,current_sub);
152
vo_sub=NULL; // no sub here