Rev 2421 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2421 | Rev 2427 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | #include |
3 | #include |
4 | #include |
4 | #include |
5 | #include |
5 | #include |
6 | #include "system.h" |
6 | #include "system.h" |
7 | #include |
7 | #include "../winlib/winlib.h" |
8 | #include "sound.h" |
8 | #include "sound.h" |
9 | #include "fplay.h" |
9 | #include "fplay.h" |
10 | 10 | ||
Line 11... | Line 11... | ||
11 | #define CAPTION_HEIGHT 24 |
11 | #define CAPTION_HEIGHT 24 |
Line -... | Line 12... | ||
- | 12 | ||
- | 13 | extern int res_pause_btn[]; |
|
- | 14 | extern int res_pause_btn_pressed[]; |
|
- | 15 | ||
- | 16 | extern int res_play_btn[]; |
|
- | 17 | extern int res_play_btn_pressed[]; |
|
- | 18 | ||
12 | 19 | ||
13 | typedef struct |
20 | typedef struct |
14 | { |
21 | { |
15 | AVPicture picture; |
22 | AVPicture picture; |
16 | double pts; |
23 | double pts; |
Line 96... | Line 103... | ||
96 | { |
103 | { |
97 | AVPacket pkt; |
104 | AVPacket pkt; |
98 | double pts; |
105 | double pts; |
99 | int frameFinished; |
106 | int frameFinished; |
100 | 107 | double current_clock; |
|
- | 108 | ||
Line 101... | Line 109... | ||
101 | if(frames[dfx].ready != 0 ) |
109 | if(frames[dfx].ready != 0 ) |
102 | return 1; |
110 | return 1; |
Line 103... | Line 111... | ||
103 | 111 | ||
104 | if( get_packet(qv, &pkt) == 0 ) |
112 | if( get_packet(qv, &pkt) == 0 ) |
Line -... | Line 113... | ||
- | 113 | return 0; |
|
- | 114 | ||
- | 115 | current_clock = -80.0 + get_master_clock(); |
|
- | 116 | ||
- | 117 | if( pkt.dts == AV_NOPTS_VALUE && |
|
- | 118 | Frame->reordered_opaque != AV_NOPTS_VALUE) |
|
- | 119 | pts = Frame->reordered_opaque; |
|
- | 120 | else if(pkt.dts != AV_NOPTS_VALUE) |
|
- | 121 | pts= pkt.dts; |
|
- | 122 | else |
|
- | 123 | pts= 0; |
|
- | 124 | ||
- | 125 | pts *= av_q2d(video_time_base)*1000.0; |
|
- | 126 | ||
105 | return 0; |
127 | if( pts > current_clock) |
Line 106... | Line 128... | ||
106 | 128 | { |
|
Line 107... | Line 129... | ||
107 | frameFinished = 0; |
129 | frameFinished = 0; |
Line 114... | Line 136... | ||
114 | if(frameFinished) |
136 | if(frameFinished) |
115 | { |
137 | { |
116 | AVPicture *dst_pic; |
138 | AVPicture *dst_pic; |
Line 117... | Line -... | ||
117 | - | ||
118 | 139 | ||
119 | if( pkt.dts == AV_NOPTS_VALUE && |
140 | if( pkt.dts == AV_NOPTS_VALUE && |
120 | Frame->reordered_opaque != AV_NOPTS_VALUE) |
141 | Frame->reordered_opaque != AV_NOPTS_VALUE) |
121 | pts = Frame->reordered_opaque; |
142 | pts = Frame->reordered_opaque; |
122 | else if(pkt.dts != AV_NOPTS_VALUE) |
143 | else if(pkt.dts != AV_NOPTS_VALUE) |
Line 143... | Line 164... | ||
143 | 164 | ||
Line 144... | Line 165... | ||
144 | dfx++; |
165 | dfx++; |
145 | dfx&= 3; |
166 | dfx&= 3; |
146 | }; |
167 | }; |
- | 168 | }; |
|
147 | av_free_packet(&pkt); |
169 | av_free_packet(&pkt); |
Line 148... | Line 170... | ||
148 | 170 | ||
149 | return 1; |
171 | return 1; |
Line 150... | Line 172... | ||
150 | } |
172 | } |
151 | 173 | ||
Line 152... | Line 174... | ||
152 | extern volatile uint32_t status; |
174 | extern volatile enum player_state player_state; |
153 | rect_t win_rect; |
175 | //rect_t win_rect; |
154 | 176 | ||
Line 169... | Line 191... | ||
169 | case MSG_DRAW_CLIENT: |
191 | case MSG_DRAW_CLIENT: |
170 | render_draw_client(main_render); |
192 | render_draw_client(main_render); |
171 | break; |
193 | break; |
Line -... | Line 194... | ||
- | 194 | ||
- | 195 | case MSG_LBTNDOWN: |
|
- | 196 | if(player_state == PAUSE) |
|
- | 197 | { |
|
- | 198 | win->panel.play_btn->img_default = res_play_btn; |
|
- | 199 | win->panel.play_btn->img_hilite = res_play_btn; |
|
- | 200 | win->panel.play_btn->img_pressed = res_play_btn_pressed; |
|
- | 201 | send_message(win->panel.play_btn, MSG_PAINT, 0, 0); |
|
- | 202 | player_state = PLAY_RESTART; |
|
- | 203 | ||
- | 204 | } |
|
- | 205 | else if(player_state == PLAY) |
|
- | 206 | { |
|
- | 207 | win->panel.play_btn->img_default = res_pause_btn; |
|
- | 208 | win->panel.play_btn->img_hilite = res_pause_btn; |
|
- | 209 | win->panel.play_btn->img_pressed = res_pause_btn_pressed; |
|
- | 210 | send_message(win->panel.play_btn, MSG_PAINT, 0, 0); |
|
- | 211 | player_state = PAUSE; |
|
- | 212 | } |
|
- | 213 | break; |
|
172 | 214 | ||
173 | case MSG_COMMAND: |
215 | case MSG_COMMAND: |
174 | switch((short)arg1) |
216 | switch((short)arg1) |
175 | { |
217 | { |
- | 218 | case ID_PLAY: |
|
- | 219 | if(player_state == PAUSE) |
|
- | 220 | { |
|
- | 221 | win->panel.play_btn->img_default = res_play_btn; |
|
- | 222 | win->panel.play_btn->img_hilite = res_play_btn; |
|
- | 223 | win->panel.play_btn->img_pressed = res_play_btn_pressed; |
|
- | 224 | player_state = PLAY_RESTART; |
|
- | 225 | } |
|
- | 226 | else if(player_state == PLAY) |
|
- | 227 | { |
|
- | 228 | win->panel.play_btn->img_default = res_pause_btn; |
|
- | 229 | win->panel.play_btn->img_hilite = res_pause_btn; |
|
- | 230 | win->panel.play_btn->img_pressed = res_pause_btn_pressed; |
|
- | 231 | player_state = PAUSE; |
|
- | 232 | } |
|
- | 233 | break; |
|
176 | case ID_CLOSE: |
234 | default: |
177 | exit(0); |
235 | break; |
178 | }; |
236 | } |
Line 179... | Line 237... | ||
179 | break; |
237 | break; |
180 | 238 | ||
181 | default: |
239 | default: |
182 | def_window_proc(ctrl,msg,arg1,arg2); |
240 | def_window_proc(ctrl,msg,arg1,arg2); |
183 | }; |
241 | }; |
Line 184... | Line 242... | ||
184 | return 0; |
242 | return 0; |
185 | }; |
243 | }; |
186 | 244 | ||
187 | void render_time(render_t *render) |
245 | void render_time(render_t *render) |
Line -... | Line 246... | ||
- | 246 | { |
|
- | 247 | double ctime; /* milliseconds */ |
|
188 | { |
248 | double fdelay; /* milliseconds */ |
189 | double ctime; |
249 | |
190 | double fdelay; |
250 | //again: |
191 | 251 | ||
- | 252 | if(player_state == CLOSED) |
|
- | 253 | { |
|
- | 254 | render->win->win_command = WIN_CLOSED; |
|
- | 255 | return; |
|
- | 256 | } |
|
192 | if(status == 0) |
257 | else if(player_state != PLAY) |
Line 193... | Line 258... | ||
193 | { |
258 | { |
194 | render->win->win_command = WIN_CLOSED; |
259 | yield(); |
195 | return; |
260 | return; |
196 | }; |
261 | }; |
Line 197... | Line 262... | ||
197 | 262 | ||
198 | if(frames[vfx].ready == 1 ) |
263 | if(frames[vfx].ready == 1 ) |
Line 199... | Line 264... | ||
199 | { |
264 | { |
200 | ctime = get_master_clock(); |
- | |
201 | fdelay = (frames[vfx].pts - ctime); |
- | |
202 | - | ||
203 | // printf("pts %f time %f delay %f\n", |
- | |
204 | // frames[vfx].pts, ctime, fdelay); |
- | |
205 | 265 | ctime = get_master_clock(); |
|
206 | if(fdelay < 0.0 ) |
- | |
207 | { |
- | |
208 | int next_vfx; |
- | |
209 | fdelay = 0; |
- | |
210 | next_vfx = (vfx+1) & 3; |
- | |
211 | if( frames[next_vfx].ready == 1 ) |
- | |
212 | { |
- | |
213 | if(frames[next_vfx].pts <= ctime) |
- | |
214 | { |
- | |
215 | frames[vfx].ready = 0; // skip this frame |
- | |
216 | vfx++; |
266 | fdelay = (frames[vfx].pts - ctime); |
217 | vfx&= 3; |
- | |
218 | } |
- | |
219 | else |
- | |
220 | { |
- | |
221 | if( (frames[next_vfx].pts - ctime) < |
- | |
222 | ( ctime - frames[vfx].pts) ) |
- | |
223 | { |
- | |
224 | frames[vfx].ready = 0; // skip this frame |
- | |
225 | vfx++; |
- | |
226 | vfx&= 3; |
- | |
227 | fdelay = (frames[next_vfx].pts - ctime); |
- | |
228 | } |
- | |
229 | } |
267 | |
230 | }; |
268 | // printf("pts %f time %f delay %f\n", |
231 | }; |
269 | // frames[vfx].pts, ctime, fdelay); |
Line 232... | Line 270... | ||
232 | 270 | ||
233 | if(fdelay > 10.0) |
271 | if(fdelay > 20.0) |
234 | { |
272 | { |
235 | // delay( (uint32_t)(fdelay/10.0)); |
273 | delay(2); |
236 | yield(); |
- | |
237 | return; |
274 | // yield(); |
- | 275 | return; |
|
- | 276 | }; |
|
- | 277 | ||
- | 278 | main_render->draw(main_render, &frames[vfx].picture); |
|
- | 279 | frames[vfx].ready = 0; |
|
- | 280 | vfx++; |
|
Line 238... | Line 281... | ||
238 | }; |
281 | vfx&= 3; |
Line 239... | Line 282... | ||
239 | 282 | } |
|
240 | main_render->draw(main_render, &frames[vfx].picture); |
283 | else yield(); |
241 | frames[vfx].ready = 0; |
284 | |
Line 242... | Line 285... | ||
242 | vfx++; |
285 | } |
Line 243... | Line 286... | ||
243 | vfx&= 3; |
286 | |
244 | }; |
287 | |
Line 245... | Line 288... | ||
245 | } |
288 | |
Line 246... | Line 289... | ||
246 | 289 | ||
Line 247... | Line 290... | ||
247 | extern char *movie_file; |
290 | extern char *movie_file; |
248 | 291 | ||
Line 249... | Line 292... | ||
249 | int video_thread(void *param) |
292 | int video_thread(void *param) |
250 | { |
293 | { |
251 | window_t *MainWindow; |
294 | window_t *MainWindow; |
252 | 295 | ||
Line 253... | Line 296... | ||
253 | init_winlib(); |
296 | init_winlib(); |
Line 364... | Line 407... | ||
364 | render->bitmap[i].height = render->ctx_height; |
407 | render->bitmap[i].height = render->ctx_height; |
365 | 408 | ||
Line 366... | Line 409... | ||
366 | if( create_bitmap(&render->bitmap[i]) != 0 ) |
409 | if( create_bitmap(&render->bitmap[i]) != 0 ) |
367 | { |
410 | { |
368 | status = 0; |
411 | player_state = CLOSED; |
369 | /* |
412 | /* |
370 | * Epic fail. Need exit_thread() here |
413 | * Epic fail. Need exit_thread() here |
371 | * |
414 | * |
372 | */ |
415 | */ |
373 | return 0; |
416 | return 0; |
Line 403... | Line 446... | ||
403 | uint8_t state; |
446 | uint8_t state; |
404 | 447 | ||
Line 405... | Line 448... | ||
405 | 448 | ||
406 | right = win->w; |
449 | right = win->w; |
407 | bottom = win->h-CAPTION_HEIGHT; |
450 | bottom = win->h-CAPTION_HEIGHT-75; |
Line 408... | Line 451... | ||
408 | render->win_state = win->win_state; |
451 | render->win_state = win->win_state; |
409 | 452 | ||
Line 437... | Line 480... | ||
437 | new_h = 64*render->ctx_height/render->ctx_width; |
480 | new_h = 64*render->ctx_height/render->ctx_width; |
438 | }; |
481 | }; |
439 | 482 | ||
Line 440... | Line 483... | ||
440 | render->win_width = win->w; |
483 | render->win_width = win->w; |
441 | render->win_height = win->h-CAPTION_HEIGHT; |
484 | render->win_height = win->h-CAPTION_HEIGHT-75; |
442 | render_set_size(render, new_w, new_h); |
485 | render_set_size(render, new_w, new_h); |
443 | }; |
486 | }; |
Line 444... | Line 487... | ||
444 | 487 | ||
445 | void draw_hw_picture(render_t *render, AVPicture *picture) |
488 | void draw_hw_picture(render_t *render, AVPicture *picture) |
Line 449... | Line 492... | ||
449 | uint8_t *data[4]; |
492 | uint8_t *data[4]; |
450 | int linesize[4]; |
493 | int linesize[4]; |
451 | int ret; |
494 | int ret; |
452 | 495 | ||
Line -... | Line 496... | ||
- | 496 | if(render->win_state == MINIMIZED || |
|
453 | if(render->win_state == ROLLED) |
497 | render->win_state == ROLLED) |
454 | return; |
498 | return; |
Line 455... | Line 499... | ||
455 | 499 | ||
456 | if(render->caps & HW_TEX_BLIT) |
500 | if(render->caps & HW_TEX_BLIT) |
457 | { |
501 | { |
Line 500... | Line 544... | ||
500 | 544 | ||
Line 501... | Line 545... | ||
501 | blit_bitmap(bitmap, render->rcvideo.l, |
545 | blit_bitmap(bitmap, render->rcvideo.l, |
502 | CAPTION_HEIGHT+render->rcvideo.t, |
546 | CAPTION_HEIGHT+render->rcvideo.t, |
503 | render->rcvideo.r, render->rcvideo.b); |
547 | render->rcvideo.r, render->rcvideo.b); |
- | 548 | render->last_bitmap = bitmap; |
|
504 | // printf("blit_bitmap\n"); |
549 | // printf("blit_bitmap\n"); |
Line 505... | Line 550... | ||
505 | 550 | ||
506 | 551 | ||
Line 544... | Line 589... | ||
544 | 589 | ||
Line 545... | Line 590... | ||
545 | blit_bitmap(&render->bitmap[0], render->rcvideo.l, |
590 | blit_bitmap(&render->bitmap[0], render->rcvideo.l, |
546 | render->rcvideo.t+CAPTION_HEIGHT, |
591 | render->rcvideo.t+CAPTION_HEIGHT, |
547 | render->rcvideo.r, render->rcvideo.b); |
592 | render->rcvideo.r, render->rcvideo.b); |
- | 593 | render->last_bitmap = &render->bitmap[0]; |
|
548 | } |
594 | } |
Line 549... | Line 595... | ||
549 | 595 | ||
550 | void render_draw_client(render_t *render) |
596 | void render_draw_client(render_t *render) |
551 | { |
597 | { |
552 | if(render->win_state == MINIMIZED || |
598 | if(render->win_state == MINIMIZED || |
553 | render->win_state == ROLLED) |
599 | render->win_state == ROLLED) |
Line -... | Line 600... | ||
- | 600 | return; |
|
- | 601 | ||
- | 602 | if(player_state == PAUSE) |
|
- | 603 | { |
|
- | 604 | main_render->draw(main_render, &frames[vfx].picture); |
|
554 | return; |
605 | }; |
555 | 606 | ||
556 | if(render->layout & HAS_TOP) |
607 | if(render->layout & HAS_TOP) |
557 | draw_bar(0, CAPTION_HEIGHT, render->win_width, |
608 | draw_bar(0, CAPTION_HEIGHT, render->win_width, |
558 | render->rctop.b, 0); |
609 | render->rctop.b, 0); |
Line 567... | Line 618... | ||
567 | render->win_width, render->rcbottom.b, 0); |
618 | render->win_width, render->rcbottom.b, 0); |
568 | }>> |
619 | }>>=>> |
569 | >=>>=>> |
620 | |
Line -... | Line 621... | ||
- | 621 | ||
- | 622 | ||
- | 623 |