Rev 2421 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1696 | serge | 1 | |
2 | #include |
||
3 | #include |
||
4 | #include |
||
5 | #include |
||
2415 | Serge | 6 | #include "system.h" |
7 | #include "../winlib/winlib.h" |
||
2427 | Serge | 8 | #include "sound.h" |
2349 | Serge | 9 | #include "fplay.h" |
1696 | serge | 10 | |
11 | |||
2421 | Serge | 12 | |
1696 | serge | 13 | |
2427 | Serge | 14 | extern int res_pause_btn_pressed[]; |
15 | |||
16 | |||
17 | extern int res_play_btn_pressed[]; |
||
18 | |||
19 | |||
20 | |||
1696 | serge | 21 | { |
22 | AVPicture picture; |
||
2349 | Serge | 23 | double pts; |
1696 | serge | 24 | volatile int ready; |
25 | }vframe_t; |
||
26 | |||
27 | |||
2349 | Serge | 28 | |
1696 | serge | 29 | |
2349 | Serge | 30 | |
1696 | serge | 31 | |
32 | int dfx = 0; |
||
33 | |||
34 | |||
2415 | Serge | 35 | |
2349 | Serge | 36 | |
1696 | serge | 37 | int height; |
38 | |||
39 | |||
40 | AVFrame *Frame; |
||
41 | |||
42 | |||
2349 | Serge | 43 | |
44 | |||
45 | |||
46 | |||
47 | |||
1696 | serge | 48 | { |
49 | int i; |
||
50 | |||
51 | |||
52 | height = ctx->height; |
||
53 | |||
54 | |||
2421 | Serge | 55 | |
1696 | serge | 56 | |
57 | |||
2415 | Serge | 58 | |
2349 | Serge | 59 | |
2415 | Serge | 60 | ctx->pix_fmt, HW_BIT_BLIT|HW_TEX_BLIT); |
2349 | Serge | 61 | // render = create_render(ctx->width, ctx->height, |
2415 | Serge | 62 | // ctx->pix_fmt, 0); |
63 | // |
||
64 | if( main_render == NULL) |
||
65 | { |
||
2349 | Serge | 66 | printf("Cannot create render\n\r"); |
67 | return 0; |
||
68 | }; |
||
69 | |||
70 | |||
1696 | serge | 71 | if ( Frame == NULL ) |
72 | { |
||
73 | printf("Cannot alloc video frame\n\r"); |
||
2349 | Serge | 74 | return 0; |
1696 | serge | 75 | }; |
76 | |||
77 | |||
2349 | Serge | 78 | { |
1696 | serge | 79 | int ret; |
2349 | Serge | 80 | |
1696 | serge | 81 | |
2349 | Serge | 82 | // ctx->width, ctx->height, ctx->pix_fmt ); |
83 | |||
1696 | serge | 84 | |
2349 | Serge | 85 | ctx->width, ctx->height); |
86 | if ( ret != 0 ) |
||
87 | { |
||
1696 | serge | 88 | printf("Cannot alloc video buffer\n\r"); |
2349 | Serge | 89 | return 0; |
90 | }; |
||
91 | |||
1696 | serge | 92 | |
2349 | Serge | 93 | frames[i].ready = 0; |
94 | }; |
||
1696 | serge | 95 | |
96 | |||
2349 | Serge | 97 | |
1696 | serge | 98 | |
2349 | Serge | 99 | return 1; |
1696 | serge | 100 | }; |
101 | |||
102 | |||
2349 | Serge | 103 | { |
1696 | serge | 104 | AVPacket pkt; |
2349 | Serge | 105 | double pts; |
1696 | serge | 106 | int frameFinished; |
2415 | Serge | 107 | double current_clock; |
2427 | Serge | 108 | |
1696 | serge | 109 | |
2349 | Serge | 110 | return 1; |
111 | |||
1696 | serge | 112 | |
2349 | Serge | 113 | return 0; |
114 | |||
1696 | serge | 115 | |
2427 | Serge | 116 | |
1696 | serge | 117 | |
2427 | Serge | 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 | |||
1696 | serge | 125 | |
2427 | Serge | 126 | |
2349 | Serge | 127 | |
2427 | Serge | 128 | { |
1696 | serge | 129 | frameFinished = 0; |
2427 | Serge | 130 | |
1696 | serge | 131 | |
2427 | Serge | 132 | |
1696 | serge | 133 | |
2427 | Serge | 134 | printf("video decoder error\n"); |
135 | |||
1696 | serge | 136 | |
2427 | Serge | 137 | { |
138 | AVPicture *dst_pic; |
||
139 | |||
140 | |||
141 | Frame->reordered_opaque != AV_NOPTS_VALUE) |
||
142 | pts = Frame->reordered_opaque; |
||
143 | else if(pkt.dts != AV_NOPTS_VALUE) |
||
144 | pts= pkt.dts; |
||
145 | else |
||
146 | pts= 0; |
||
147 | |||
148 | |||
2349 | Serge | 149 | // Frame, "best_effort_timestamp"); |
150 | |||
1696 | serge | 151 | |
2349 | Serge | 152 | // pts = 0; |
153 | |||
1696 | serge | 154 | |
2427 | Serge | 155 | |
2349 | Serge | 156 | |
2427 | Serge | 157 | |
2349 | Serge | 158 | |
2427 | Serge | 159 | (const uint8_t**)Frame->data, |
2415 | Serge | 160 | Frame->linesize, ctx->pix_fmt, ctx->width, ctx->height); |
2349 | Serge | 161 | |
162 | |||
2427 | Serge | 163 | frames[dfx].ready = 1; |
164 | |||
1696 | serge | 165 | |
2427 | Serge | 166 | dfx&= 3; |
167 | }; |
||
168 | }; |
||
1696 | serge | 169 | av_free_packet(&pkt); |
2349 | Serge | 170 | |
1696 | serge | 171 | |
2349 | Serge | 172 | } |
1696 | serge | 173 | |
174 | |||
2427 | Serge | 175 | //rect_t win_rect; |
176 | |||
1696 | serge | 177 | |
2415 | Serge | 178 | |
179 | { |
||
1696 | serge | 180 | window_t *win; |
2415 | Serge | 181 | |
1696 | serge | 182 | |
2415 | Serge | 183 | |
1696 | serge | 184 | |
2415 | Serge | 185 | { |
1696 | serge | 186 | case MSG_SIZE: |
2415 | Serge | 187 | //printf("MSG_SIZE\n"); |
188 | render_adjust_size(main_render, win); |
||
189 | break; |
||
1696 | serge | 190 | |
191 | |||
2415 | Serge | 192 | render_draw_client(main_render); |
193 | break; |
||
1696 | serge | 194 | |
195 | |||
2427 | Serge | 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; |
||
214 | |||
215 | |||
2415 | Serge | 216 | switch((short)arg1) |
217 | { |
||
218 | case ID_PLAY: |
||
2427 | Serge | 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; |
||
234 | default: |
||
235 | break; |
||
236 | } |
||
237 | break; |
||
2415 | Serge | 238 | |
1696 | serge | 239 | |
2415 | Serge | 240 | def_window_proc(ctrl,msg,arg1,arg2); |
241 | }; |
||
242 | return 0; |
||
243 | }; |
||
244 | |||
1696 | serge | 245 | |
2415 | Serge | 246 | { |
1696 | serge | 247 | double ctime; /* milliseconds */ |
2427 | Serge | 248 | double fdelay; /* milliseconds */ |
249 | |||
1696 | serge | 250 | |
2427 | Serge | 251 | |
252 | |||
253 | { |
||
2415 | Serge | 254 | render->win->win_command = WIN_CLOSED; |
255 | return; |
||
256 | } |
||
2427 | Serge | 257 | else if(player_state != PLAY) |
258 | { |
||
259 | yield(); |
||
260 | return; |
||
261 | }; |
||
2415 | Serge | 262 | |
1696 | serge | 263 | |
2415 | Serge | 264 | { |
1696 | serge | 265 | ctime = get_master_clock(); |
2415 | Serge | 266 | fdelay = (frames[vfx].pts - ctime); |
267 | |||
1696 | serge | 268 | |
2427 | Serge | 269 | // frames[vfx].pts, ctime, fdelay); |
270 | |||
2349 | Serge | 271 | |
2427 | Serge | 272 | { |
2415 | Serge | 273 | delay(2); |
2427 | Serge | 274 | // yield(); |
275 | return; |
||
2421 | Serge | 276 | }; |
1696 | serge | 277 | |
2415 | Serge | 278 | |
279 | frames[vfx].ready = 0; |
||
280 | vfx++; |
||
281 | vfx&= 3; |
||
282 | } |
||
2427 | Serge | 283 | else yield(); |
284 | |||
285 | |||
2415 | Serge | 286 | |
287 | |||
2427 | Serge | 288 | |
289 | |||
290 | |||
2415 | Serge | 291 | |
292 | |||
293 | { |
||
294 | window_t *MainWindow; |
||
295 | |||
296 | |||
297 | |||
298 | |||
299 | 10,10,width,height+29+75,MainWindowProc); |
||
2427 | Serge | 300 | |
2415 | Serge | 301 | |
302 | |||
303 | |||
304 | |||
305 | |||
306 | run_render(MainWindow, main_render); |
||
307 | |||
308 | |||
309 | player_state = CLOSED; |
||
2427 | Serge | 310 | return 0; |
2349 | Serge | 311 | }; |
1696 | serge | 312 | |
313 | |||
2349 | Serge | 314 | |
315 | void draw_sw_picture(render_t *render, AVPicture *picture); |
||
316 | |||
317 | |||
318 | uint32_t ctx_format, uint32_t flags) |
||
319 | { |
||
320 | render_t *render; |
||
2415 | Serge | 321 | |
2349 | Serge | 322 | |
2415 | Serge | 323 | |
2349 | Serge | 324 | |
2415 | Serge | 325 | memset(render, 0, sizeof(render_t)); |
326 | |||
327 | |||
2349 | Serge | 328 | render->ctx_height = height; |
329 | render->ctx_format = ctx_format; |
||
330 | |||
331 | |||
332 | render->caps = InitPixlib(flags); |
||
333 | mutex_unlock(&driver_lock); |
||
334 | |||
335 | |||
336 | { |
||
337 | printf("FPlay render engine: Hardware acceleration disabled\n"); |
||
338 | render->draw = draw_sw_picture; |
||
339 | } |
||
340 | else |
||
341 | { |
||
342 | render->target = 0; |
||
343 | render->draw = draw_hw_picture; |
||
344 | }; |
||
345 | |||
346 | |||
347 | return render; |
||
348 | }; |
||
349 | |||
350 | |||
351 | { |
||
352 | int i; |
||
353 | |||
354 | |||
2415 | Serge | 355 | render->rcvideo.l = 0; |
356 | render->rcvideo.t = 0; |
||
357 | render->rcvideo.r = width; |
||
358 | render->rcvideo.b = height; |
||
359 | |||
2349 | Serge | 360 | |
2415 | Serge | 361 | { |
362 | int yoffs; |
||
363 | yoffs = (render->win_height-height)/2; |
||
364 | if(yoffs) |
||
365 | { |
||
366 | render->rctop.t = 0; |
||
367 | render->rctop.b = yoffs; |
||
368 | render->rcvideo.t = yoffs; |
||
369 | render->layout |= HAS_TOP; |
||
370 | } |
||
371 | |||
2349 | Serge | 372 | |
2415 | Serge | 373 | if(yoffs) |
374 | { |
||
375 | render->rcbottom.t = render->rcvideo.t+render->rcvideo.b; |
||
376 | render->rcbottom.b = yoffs; |
||
377 | render->layout |= HAS_BOTTOM; |
||
378 | } |
||
379 | } |
||
380 | |||
381 | |||
382 | { |
||
383 | int xoffs; |
||
384 | xoffs = (render->win_width-width)/2; |
||
385 | if(xoffs) |
||
386 | { |
||
387 | render->rcleft.r = xoffs; |
||
388 | render->rcvideo.l = xoffs; |
||
389 | render->layout |= HAS_LEFT; |
||
390 | } |
||
391 | xoffs = render->win_width-(render->rcvideo.l+render->rcvideo.r); |
||
392 | if(xoffs) |
||
393 | { |
||
394 | render->rcright.l = render->rcvideo.l+render->rcvideo.r; |
||
395 | render->rcright.r = xoffs; |
||
396 | render->layout |= HAS_RIGHT; |
||
397 | } |
||
398 | }; |
||
399 | |||
400 | |||
2349 | Serge | 401 | { |
402 | if(render->caps & HW_TEX_BLIT) |
||
403 | { |
||
404 | for( i=0; i < 4; i++) |
||
405 | { |
||
406 | render->bitmap[i].width = render->ctx_width; |
||
407 | render->bitmap[i].height = render->ctx_height; |
||
408 | |||
409 | |||
410 | { |
||
411 | player_state = CLOSED; |
||
2427 | Serge | 412 | /* |
2349 | Serge | 413 | * Epic fail. Need exit_thread() here |
414 | * |
||
415 | */ |
||
416 | return 0; |
||
417 | }; |
||
418 | } |
||
419 | } |
||
420 | else |
||
421 | { |
||
422 | render->bitmap[0].width = width; |
||
423 | render->bitmap[0].height = height; |
||
424 | |||
425 | |||
426 | return 0; |
||
427 | }; |
||
428 | render->state = INIT; |
||
429 | return 0; |
||
430 | }; |
||
431 | |||
432 | |||
433 | return 0; |
||
434 | |||
435 | |||
436 | render->bitmap[0].height = height; |
||
437 | resize_bitmap(&render->bitmap[0]); |
||
438 | |||
439 | |||
440 | }; |
||
441 | |||
442 | |||
2415 | Serge | 443 | { |
2349 | Serge | 444 | uint32_t right, bottom, new_w, new_h; |
445 | uint32_t s, sw, sh; |
||
446 | uint8_t state; |
||
447 | |||
448 | |||
449 | |||
2415 | Serge | 450 | bottom = win->h-CAPTION_HEIGHT-75; |
2427 | Serge | 451 | render->win_state = win->win_state; |
2415 | Serge | 452 | |
2349 | Serge | 453 | |
2415 | Serge | 454 | return; |
2349 | Serge | 455 | |
2415 | Serge | 456 | |
457 | return; |
||
2349 | Serge | 458 | |
459 | |||
460 | bottom == render->win_height) |
||
461 | return; |
||
462 | |||
463 | |||
464 | new_h = right*render->ctx_height/render->ctx_width; |
||
465 | |||
466 | |||
467 | |||
468 | |||
469 | sw = right * new_h; |
||
470 | sh = bottom * new_w; |
||
471 | |||
472 | |||
473 | new_h = bottom; |
||
474 | else |
||
475 | new_w = right; |
||
476 | |||
477 | |||
478 | { |
||
479 | new_w = 64; |
||
480 | new_h = 64*render->ctx_height/render->ctx_width; |
||
481 | }; |
||
482 | |||
2415 | Serge | 483 | |
484 | render->win_height = win->h-CAPTION_HEIGHT-75; |
||
2427 | Serge | 485 | render_set_size(render, new_w, new_h); |
2349 | Serge | 486 | }; |
487 | |||
488 | |||
489 | { |
||
490 | int dst_width, dst_height; |
||
491 | bitmap_t *bitmap; |
||
2415 | Serge | 492 | uint8_t *data[4]; |
493 | int linesize[4]; |
||
2349 | Serge | 494 | int ret; |
2415 | Serge | 495 | |
2349 | Serge | 496 | |
2427 | Serge | 497 | render->win_state == ROLLED) |
498 | return; |
||
2349 | Serge | 499 | |
500 | |||
501 | { |
||
502 | dst_width = render->ctx_width; |
||
503 | dst_height = render->ctx_height; |
||
504 | } |
||
505 | else |
||
506 | { |
||
507 | dst_width = render->win_width; |
||
508 | dst_height = render->win_height; |
||
509 | }; |
||
510 | |||
511 | |||
512 | render->ctx_width, render->ctx_height, render->ctx_format, |
||
513 | dst_width, dst_height, PIX_FMT_BGRA, |
||
514 | SWS_FAST_BILINEAR, NULL, NULL, NULL); |
||
515 | if(cvt_ctx == NULL) |
||
516 | { |
||
517 | printf("Cannot initialize the conversion context!\n"); |
||
518 | return ; |
||
519 | }; |
||
520 | |||
2415 | Serge | 521 | |
522 | |||
523 | |||
524 | if( ret != 0) |
||
525 | { |
||
526 | printf("Cannot lock the bitmap!\n"); |
||
527 | return ; |
||
528 | } |
||
529 | |||
530 | |||
2349 | Serge | 531 | data[0] = bitmap->data; |
2415 | Serge | 532 | data[1] = bitmap->data+1; |
533 | data[2] = bitmap->data+2; |
||
534 | data[3] = bitmap->data+3; |
||
535 | |||
2349 | Serge | 536 | |
2415 | Serge | 537 | linesize[1] = bitmap->pitch; |
538 | linesize[2] = bitmap->pitch; |
||
539 | linesize[3] = bitmap->pitch; |
||
540 | |||
2349 | Serge | 541 | |
542 | picture->linesize, 0, render->ctx_height, data, linesize); |
||
543 | // printf("sws_scale\n"); |
||
544 | |||
545 | |||
2415 | Serge | 546 | CAPTION_HEIGHT+render->rcvideo.t, |
2421 | Serge | 547 | render->rcvideo.r, render->rcvideo.b); |
2415 | Serge | 548 | render->last_bitmap = bitmap; |
2427 | Serge | 549 | // printf("blit_bitmap\n"); |
2349 | Serge | 550 | |
551 | |||
2415 | Serge | 552 | |
2349 | Serge | 553 | render->target&= 3; |
554 | } |
||
555 | |||
556 | |||
557 | { |
||
558 | uint8_t *data[4]; |
||
559 | int linesize[4]; |
||
560 | |||
561 | |||
2415 | Serge | 562 | render->win_state == ROLLED) |
563 | return; |
||
2349 | Serge | 564 | |
565 | |||
566 | render->ctx_width, render->ctx_height, |
||
567 | render->ctx_format, |
||
568 | render->rcvideo.r, render->rcvideo.b, |
||
2415 | Serge | 569 | PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL); |
2349 | Serge | 570 | if(cvt_ctx == NULL) |
571 | { |
||
572 | printf("Cannot initialize the conversion context!\n"); |
||
573 | return ; |
||
574 | } |
||
575 | |||
576 | |||
577 | data[1] = render->bitmap[0].data+1; |
||
578 | data[2] = render->bitmap[0].data+2; |
||
579 | data[3] = render->bitmap[0].data+3; |
||
580 | |||
581 | |||
582 | |||
583 | linesize[1] = render->bitmap[0].pitch; |
||
584 | linesize[2] = render->bitmap[0].pitch; |
||
585 | linesize[3] = render->bitmap[0].pitch; |
||
586 | |||
587 | |||
588 | picture->linesize, 0, render->ctx_height, data, linesize); |
||
589 | |||
590 | |||
2415 | Serge | 591 | render->rcvideo.t+CAPTION_HEIGHT, |
2421 | Serge | 592 | render->rcvideo.r, render->rcvideo.b); |
2415 | Serge | 593 | render->last_bitmap = &render->bitmap[0]; |
2427 | Serge | 594 | } |
2349 | Serge | 595 | |
596 | |||
2415 | Serge | 597 | { |
598 | if(render->win_state == MINIMIZED || |
||
599 | render->win_state == ROLLED) |
||
600 | return; |
||
601 | |||
2349 | Serge | 602 | |
2427 | Serge | 603 | { |
604 | main_render->draw(main_render, &frames[vfx].picture); |
||
605 | }; |
||
606 | |||
607 | |||
2415 | Serge | 608 | draw_bar(0, CAPTION_HEIGHT, render->win_width, |
2421 | Serge | 609 | render->rctop.b, 0); |
2415 | Serge | 610 | if(render->layout & HAS_LEFT) |
611 | draw_bar(0, render->rcvideo.t+CAPTION_HEIGHT, render->rcleft.r, |
||
2421 | Serge | 612 | render->rcvideo.b, 0); |
2415 | Serge | 613 | if(render->layout & HAS_RIGHT) |
614 | draw_bar(render->rcright.l, render->rcvideo.t+CAPTION_HEIGHT, |
||
2421 | Serge | 615 | render->rcright.r, render->rcvideo.b, 0); |
2415 | Serge | 616 | if(render->layout & HAS_BOTTOM) |
617 | draw_bar(0, render->rcbottom.t+CAPTION_HEIGHT, |
||
2421 | Serge | 618 | render->win_width, render->rcbottom.b, 0); |
2415 | Serge | 619 | }>>=>> |
620 |