Rev 3292 | 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 | #include |
3068 | serge | 11 | |
1696 | serge | 12 | |
2427 | Serge | 13 | extern int res_pause_btn_pressed[]; |
14 | |||
15 | |||
16 | extern int res_play_btn_pressed[]; |
||
17 | |||
18 | |||
2693 | Serge | 19 | extern volatile int sound_level_0; |
3068 | serge | 20 | extern volatile int sound_level_1; |
21 | |||
2427 | Serge | 22 | |
1696 | serge | 23 | { |
24 | AVPicture picture; |
||
2349 | Serge | 25 | double pts; |
1696 | serge | 26 | volatile int ready; |
27 | }vframe_t; |
||
28 | |||
29 | |||
2349 | Serge | 30 | volatile int frames_count = 0; |
3068 | serge | 31 | |
1696 | serge | 32 | |
2349 | Serge | 33 | |
1696 | serge | 34 | |
35 | int dfx = 0; |
||
36 | |||
37 | |||
2415 | Serge | 38 | |
2349 | Serge | 39 | |
1696 | serge | 40 | int height; |
41 | |||
42 | |||
43 | AVFrame *Frame; |
||
44 | |||
45 | |||
2349 | Serge | 46 | |
47 | |||
48 | |||
49 | |||
2693 | Serge | 50 | { |
51 | int i; |
||
52 | |||
2349 | Serge | 53 | |
2693 | Serge | 54 | { |
3248 | Serge | 55 | frames[i].pts = 0; |
2693 | Serge | 56 | frames[i].ready = 0; |
57 | }; |
||
58 | frames_count = 0; |
||
3068 | serge | 59 | vfx = 0; |
2693 | Serge | 60 | dfx = 0; |
61 | }; |
||
62 | |||
63 | |||
1696 | serge | 64 | { |
65 | int i; |
||
66 | |||
67 | |||
68 | height = ctx->height; |
||
69 | |||
70 | |||
2421 | Serge | 71 | |
1696 | serge | 72 | if ( Frame == NULL ) |
73 | { |
||
74 | printf("Cannot alloc video frame\n\r"); |
||
2349 | Serge | 75 | return 0; |
1696 | serge | 76 | }; |
77 | |||
78 | |||
2349 | Serge | 79 | { |
1696 | serge | 80 | int ret; |
2349 | Serge | 81 | |
1696 | serge | 82 | |
2349 | Serge | 83 | // ctx->width, ctx->height, ctx->pix_fmt ); |
84 | |||
1696 | serge | 85 | |
2349 | Serge | 86 | ctx->width, ctx->height); |
87 | if ( ret != 0 ) |
||
88 | { |
||
1696 | serge | 89 | printf("Cannot alloc video buffer\n\r"); |
2349 | Serge | 90 | return 0; |
91 | }; |
||
92 | |||
1696 | serge | 93 | |
2349 | Serge | 94 | frames[i].ready = 0; |
95 | }; |
||
1696 | serge | 96 | |
97 | |||
2349 | Serge | 98 | |
1696 | serge | 99 | |
2349 | Serge | 100 | return 1; |
1696 | serge | 101 | }; |
102 | |||
103 | |||
2349 | Serge | 104 | { |
1696 | serge | 105 | AVPacket pkt; |
2349 | Serge | 106 | double pts; |
1696 | serge | 107 | int frameFinished; |
2415 | Serge | 108 | double current_clock; |
2427 | Serge | 109 | |
1696 | serge | 110 | |
2349 | Serge | 111 | return -1; |
3068 | serge | 112 | |
1696 | serge | 113 | |
2349 | Serge | 114 | return 0; |
115 | |||
1696 | serge | 116 | |
3068 | serge | 117 | current_clock = -90.0 + get_master_clock(); |
2693 | Serge | 118 | |
1696 | serge | 119 | |
2427 | Serge | 120 | Frame->reordered_opaque != AV_NOPTS_VALUE) |
121 | pts = Frame->reordered_opaque; |
||
2693 | Serge | 122 | else if(pkt.dts != AV_NOPTS_VALUE) |
123 | pts= pkt.dts; |
||
2427 | Serge | 124 | else |
125 | pts= 0; |
||
126 | |||
3248 | Serge | 127 | |
128 | |||
2427 | Serge | 129 | */ |
3068 | serge | 130 | if( 1 /*pts > current_clock*/) |
2693 | Serge | 131 | { |
1696 | serge | 132 | frameFinished = 0; |
2427 | Serge | 133 | |
1696 | serge | 134 | |
2427 | Serge | 135 | |
1696 | serge | 136 | |
2427 | Serge | 137 | printf("video decoder error\n"); |
138 | |||
1696 | serge | 139 | |
2427 | Serge | 140 | { |
141 | AVPicture *dst_pic; |
||
142 | |||
143 | |||
144 | Frame->reordered_opaque != AV_NOPTS_VALUE) |
||
145 | pts = Frame->reordered_opaque; |
||
2693 | Serge | 146 | else if(pkt.dts != AV_NOPTS_VALUE) |
2427 | Serge | 147 | pts= pkt.dts; |
148 | else |
||
149 | pts= 0; |
||
150 | |||
151 | |||
2349 | Serge | 152 | // Frame, "best_effort_timestamp"); |
153 | |||
1696 | serge | 154 | |
2349 | Serge | 155 | // pts = 0; |
156 | |||
1696 | serge | 157 | |
2427 | Serge | 158 | |
2349 | Serge | 159 | |
2427 | Serge | 160 | |
2349 | Serge | 161 | |
2427 | Serge | 162 | (const uint8_t**)Frame->data, |
2415 | Serge | 163 | Frame->linesize, ctx->pix_fmt, ctx->width, ctx->height); |
2349 | Serge | 164 | |
165 | |||
2427 | Serge | 166 | // printf("pts %f\n", frames[dfx].pts); |
2693 | Serge | 167 | |
168 | |||
2427 | Serge | 169 | |
1696 | serge | 170 | |
2427 | Serge | 171 | dfx&= 3; |
172 | frames_count++; |
||
3068 | serge | 173 | }; |
2427 | Serge | 174 | }; |
1696 | serge | 175 | av_free_packet(&pkt); |
2349 | Serge | 176 | |
1696 | serge | 177 | |
2349 | Serge | 178 | } |
1696 | serge | 179 | |
180 | |||
2427 | Serge | 181 | extern volatile enum player_state decoder_state; |
3068 | serge | 182 | extern volatile enum player_state sound_state; |
183 | |||
184 | |||
2427 | Serge | 185 | |
1696 | serge | 186 | |
2693 | Serge | 187 | |
2415 | Serge | 188 | |
3068 | serge | 189 | { |
190 | window_t *win; |
||
3248 | Serge | 191 | |
192 | |||
3068 | serge | 193 | |
3248 | Serge | 194 | |
3068 | serge | 195 | |
3248 | Serge | 196 | |
3068 | serge | 197 | win->panel.play_btn->img_hilite = res_play_btn; |
198 | win->panel.play_btn->img_pressed = res_play_btn_pressed; |
||
199 | win->panel.prg->current = rewind_pos; |
||
200 | |||
3248 | Serge | 201 | |
3068 | serge | 202 | player_state = STOP; |
203 | decoder_state = PLAY_2_STOP; |
||
204 | sound_state = PLAY_2_STOP; |
||
205 | render_draw_client(main_render); |
||
206 | // printf("stop player\n"); |
||
207 | |||
3248 | Serge | 208 | |
3068 | serge | 209 | |
210 | |||
2415 | Serge | 211 | { |
1696 | serge | 212 | window_t *win; |
2415 | Serge | 213 | |
1696 | serge | 214 | |
2415 | Serge | 215 | |
1696 | serge | 216 | |
2415 | Serge | 217 | { |
1696 | serge | 218 | case MSG_SIZE: |
2415 | Serge | 219 | //printf("MSG_SIZE\n"); |
220 | if(main_render) |
||
3292 | Serge | 221 | { |
222 | render_adjust_size(main_render, win); |
||
223 | render_draw_client(main_render); |
||
224 | }; |
||
225 | break; |
||
1696 | serge | 226 | |
227 | |||
2415 | Serge | 228 | render_draw_client(main_render); |
229 | break; |
||
1696 | serge | 230 | |
231 | |||
2427 | Serge | 232 | |
3248 | Serge | 233 | |
2427 | Serge | 234 | { |
235 | win->panel.play_btn->img_default = res_pause_btn; |
||
2693 | Serge | 236 | win->panel.play_btn->img_hilite = res_pause_btn; |
237 | win->panel.play_btn->img_pressed = res_pause_btn_pressed; |
||
238 | send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0); |
||
3068 | serge | 239 | player_state = PLAY; |
240 | sound_state = PAUSE_2_PLAY; |
||
241 | |||
2427 | Serge | 242 | |
243 | else if(player_state == PLAY) |
||
244 | { |
||
245 | win->panel.play_btn->img_default = res_play_btn; |
||
2693 | Serge | 246 | win->panel.play_btn->img_hilite = res_play_btn; |
247 | win->panel.play_btn->img_pressed = res_play_btn_pressed; |
||
248 | send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0); |
||
3068 | serge | 249 | player_state = PAUSE; |
2427 | Serge | 250 | sound_state = PLAY_2_PAUSE; |
3068 | serge | 251 | } |
2427 | Serge | 252 | break; |
253 | |||
254 | |||
2415 | Serge | 255 | switch((short)arg1) |
256 | { |
||
257 | case ID_PLAY: |
||
2427 | Serge | 258 | if(player_state == PAUSE) |
259 | { |
||
260 | win->panel.play_btn->img_default = res_pause_btn; |
||
2693 | Serge | 261 | win->panel.play_btn->img_hilite = res_pause_btn; |
262 | win->panel.play_btn->img_pressed = res_pause_btn_pressed; |
||
263 | player_state = PLAY; |
||
3068 | serge | 264 | sound_state = PAUSE_2_PLAY; |
265 | } |
||
2693 | Serge | 266 | else if(player_state == PLAY) |
267 | { |
||
268 | win->panel.play_btn->img_default = res_play_btn; |
||
2427 | Serge | 269 | win->panel.play_btn->img_hilite = res_play_btn; |
270 | win->panel.play_btn->img_pressed = res_play_btn_pressed; |
||
271 | player_state = PAUSE; |
||
272 | sound_state = PLAY_2_PAUSE; |
||
3068 | serge | 273 | } |
2427 | Serge | 274 | else if(player_state == STOP) |
3068 | serge | 275 | { |
276 | win->panel.play_btn->img_default = res_pause_btn; |
||
277 | win->panel.play_btn->img_hilite = res_pause_btn; |
||
278 | win->panel.play_btn->img_pressed = res_pause_btn_pressed; |
||
279 | rewind_pos = 0; |
||
3248 | Serge | 280 | send_message(&win->panel.ctrl, MSG_PAINT, 0, 0); |
3068 | serge | 281 | player_state = PLAY; |
282 | decoder_state = PREPARE; |
||
283 | } |
||
284 | break; |
||
2427 | Serge | 285 | |
3248 | Serge | 286 | |
3068 | serge | 287 | player_stop(); |
288 | break; |
||
289 | |||
3248 | Serge | 290 | |
3068 | serge | 291 | if(player_state != REWIND) |
2693 | Serge | 292 | { |
293 | progress_t *prg = (progress_t*)arg2; |
||
294 | |||
3248 | Serge | 295 | |
3068 | serge | 296 | |
3248 | Serge | 297 | |
3068 | serge | 298 | player_state = REWIND; |
299 | decoder_state = REWIND; |
||
300 | sound_state = PLAY_2_STOP; |
||
301 | if(rewind_pos < prg->current) |
||
302 | { |
||
303 | prg->current = rewind_pos; |
||
304 | rewind_pos = -rewind_pos; |
||
305 | } |
||
306 | else |
||
307 | prg->current = rewind_pos; |
||
308 | |||
3248 | Serge | 309 | |
3068 | serge | 310 | win->panel.play_btn->img_hilite = res_pause_btn; |
311 | win->panel.play_btn->img_pressed = res_pause_btn_pressed; |
||
312 | send_message(&prg->ctrl, MSG_PAINT, 0, 0); |
||
313 | }; |
||
2693 | Serge | 314 | break; |
315 | |||
3248 | Serge | 316 | |
317 | { |
||
3068 | serge | 318 | slider_t *sld = (slider_t*)arg2; |
319 | int peak; |
||
320 | int level; |
||
321 | |||
3248 | Serge | 322 | |
3068 | serge | 323 | // level = (log2(peak+16384)*10000.0)/15 - 10000; |
324 | level = peak; |
||
325 | |||
3248 | Serge | 326 | |
3068 | serge | 327 | set_audio_volume(level, level); |
328 | send_message(&sld->ctrl, MSG_PAINT, 0, 0); |
||
329 | win->panel.lvl->vol = level; |
||
330 | } |
||
331 | |||
3248 | Serge | 332 | |
2427 | Serge | 333 | break; |
334 | } |
||
335 | break; |
||
2415 | Serge | 336 | |
1696 | serge | 337 | |
2415 | Serge | 338 | def_window_proc(ctrl,msg,arg1,arg2); |
339 | }; |
||
340 | return 0; |
||
341 | }; |
||
342 | |||
1696 | serge | 343 | |
2693 | Serge | 344 | |
345 | |||
2415 | Serge | 346 | { |
1696 | serge | 347 | progress_t *prg = main_render->win->panel.prg; |
3248 | Serge | 348 | level_t *lvl = main_render->win->panel.lvl; |
349 | |||
350 | |||
3068 | serge | 351 | double fdelay; /* milliseconds */ |
352 | |||
353 | |||
2427 | Serge | 354 | |
355 | |||
356 | { |
||
2415 | Serge | 357 | render->win->win_command = WIN_CLOSED; |
358 | return; |
||
359 | } |
||
2427 | Serge | 360 | else if(player_state == REWIND) |
3068 | serge | 361 | { |
362 | yield(); |
||
363 | return; |
||
3248 | Serge | 364 | } |
3068 | serge | 365 | else if (decoder_state == STOP && frames_count == 0 && |
366 | player_state != STOP) |
||
367 | { |
||
3248 | Serge | 368 | player_stop(); |
3068 | serge | 369 | } |
370 | else if(player_state != PLAY) |
||
2427 | Serge | 371 | { |
372 | yield(); |
||
373 | return; |
||
374 | }; |
||
2415 | Serge | 375 | |
1696 | serge | 376 | |
3068 | serge | 377 | |
2693 | Serge | 378 | if(frames[vfx].ready == 1 ) |
2415 | Serge | 379 | { |
1696 | serge | 380 | int sys_time; |
2693 | Serge | 381 | |
382 | |||
2415 | Serge | 383 | fdelay = (frames[vfx].pts - ctime); |
384 | |||
1696 | serge | 385 | |
2427 | Serge | 386 | // frames[vfx].pts, ctime, fdelay); |
2693 | Serge | 387 | |
2349 | Serge | 388 | |
2693 | Serge | 389 | { |
2415 | Serge | 390 | delay(1); |
2693 | Serge | 391 | // yield(); |
2427 | Serge | 392 | return; |
2421 | Serge | 393 | }; |
1696 | serge | 394 | |
2415 | Serge | 395 | |
2693 | Serge | 396 | fdelay = (frames[vfx].pts - ctime); |
397 | |||
398 | |||
399 | |||
400 | |||
401 | // printf("systime %d pts %f time %f delay %f\n", |
||
402 | // sys_time*10, frames[vfx].pts, ctime, fdelay); |
||
403 | |||
404 | |||
2415 | Serge | 405 | if(main_render->win->win_state != FULLSCREEN) |
3334 | Serge | 406 | { |
407 | prg->current = frames[vfx].pts*1000; |
||
408 | // printf("current %f\n", prg->current); |
||
3068 | serge | 409 | lvl->current = vfx & 1 ? sound_level_1 : sound_level_0; |
3334 | Serge | 410 | |
3248 | Serge | 411 | |
3334 | Serge | 412 | |
3248 | Serge | 413 | |
3334 | Serge | 414 | send_message(&lvl->ctrl, MSG_PAINT, 0, 0); |
415 | } |
||
416 | |||
3248 | Serge | 417 | |
3068 | serge | 418 | frames[vfx].ready = 0; |
2415 | Serge | 419 | vfx++; |
420 | vfx&= 3; |
||
421 | } |
||
2427 | Serge | 422 | else yield(); |
423 | |||
424 | |||
2693 | Serge | 425 | |
426 | |||
427 | { |
||
428 | ctime = get_master_clock(); |
||
429 | fdelay = (frames[vfx].pts - ctime); |
||
430 | |||
431 | |||
432 | // frames[vfx].pts, ctime, fdelay); |
||
433 | |||
434 | |||
435 | { |
||
436 | int next_vfx; |
||
437 | fdelay = 0; |
||
438 | next_vfx = (vfx+1) & 3; |
||
439 | if( frames[next_vfx].ready == 1 ) |
||
440 | { |
||
441 | if(frames[next_vfx].pts <= ctime) |
||
442 | { |
||
443 | frames[vfx].ready = 0; // skip this frame |
||
444 | vfx++; |
||
445 | vfx&= 3; |
||
446 | } |
||
447 | else |
||
448 | { |
||
449 | if( (frames[next_vfx].pts - ctime) < |
||
450 | ( ctime - frames[vfx].pts) ) |
||
451 | { |
||
452 | frames[vfx].ready = 0; // skip this frame |
||
453 | vfx++; |
||
454 | vfx&= 3; |
||
455 | fdelay = (frames[next_vfx].pts - ctime); |
||
456 | } |
||
457 | } |
||
458 | }; |
||
459 | }; |
||
460 | |||
461 | |||
462 | { |
||
463 | int val = fdelay; |
||
464 | printf("pts %f time %f delay %d\n", |
||
465 | frames[vfx].pts, ctime, val); |
||
466 | delay(val/10); |
||
467 | }; |
||
468 | |||
469 | |||
470 | fdelay = (frames[vfx].pts - ctime); |
||
471 | |||
472 | |||
473 | frames[vfx].pts, ctime, fdelay); |
||
474 | |||
475 | |||
476 | main_render->win->panel.prg->current = frames[vfx].pts; |
||
477 | // send_message(&render->win->panel.prg->ctrl, MSG_PAINT, 0, 0); |
||
478 | frames[vfx].ready = 0; |
||
479 | vfx++; |
||
480 | vfx&= 3; |
||
481 | } |
||
482 | else yield(); |
||
483 | #endif |
||
484 | |||
485 | |||
2415 | Serge | 486 | |
487 | |||
2427 | Serge | 488 | |
2415 | Serge | 489 | |
490 | |||
491 | { |
||
492 | AVCodecContext *ctx = param; |
||
3292 | Serge | 493 | window_t *MainWindow; |
494 | |||
495 | |||
2415 | Serge | 496 | |
497 | |||
498 | 10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc); |
||
3068 | serge | 499 | |
2415 | Serge | 500 | |
2693 | Serge | 501 | // printf("MainWindow %x\n", MainWindow); |
2415 | Serge | 502 | |
503 | |||
504 | |||
2693 | Serge | 505 | |
3292 | Serge | 506 | |
507 | |||
508 | if( main_render == NULL) |
||
509 | { |
||
510 | printf("Cannot create render\n\r"); |
||
511 | return 0; |
||
512 | }; |
||
513 | |||
514 | |||
2693 | Serge | 515 | player_state = PLAY; |
3068 | serge | 516 | |
2693 | Serge | 517 | |
2415 | Serge | 518 | |
519 | |||
3292 | Serge | 520 | fini_winlib(); |
3068 | serge | 521 | |
522 | |||
2427 | Serge | 523 | return 0; |
2349 | Serge | 524 | }; |
1696 | serge | 525 | |
526 | |||
2349 | Serge | 527 | |
528 | void draw_sw_picture(render_t *render, AVPicture *picture); |
||
529 | |||
530 | |||
3292 | Serge | 531 | { |
2349 | Serge | 532 | render_t *render; |
2415 | Serge | 533 | |
2349 | Serge | 534 | |
3292 | Serge | 535 | uint32_t s, sw, sh; |
536 | uint8_t state; |
||
537 | |||
538 | |||
2415 | Serge | 539 | |
2349 | Serge | 540 | |
2415 | Serge | 541 | memset(render, 0, sizeof(render_t)); |
542 | |||
543 | |||
3292 | Serge | 544 | |
2349 | Serge | 545 | |
3292 | Serge | 546 | render->ctx_height = ctx->height; |
547 | render->ctx_format = ctx->pix_fmt; |
||
548 | |||
549 | |||
2349 | Serge | 550 | render->caps = init_pixlib(flags); |
3248 | Serge | 551 | mutex_unlock(&driver_lock); |
2349 | Serge | 552 | |
3292 | Serge | 553 | |
554 | bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT; |
||
555 | |||
2349 | Serge | 556 | |
3292 | Serge | 557 | // right, bottom); |
558 | |||
559 | |||
560 | |||
561 | |||
562 | draw_h = right*render->ctx_height/render->ctx_width; |
||
563 | |||
564 | |||
565 | { |
||
566 | draw_w = right; |
||
567 | draw_h = right*render->ctx_height/render->ctx_width; |
||
568 | }; |
||
569 | |||
570 | |||
571 | { |
||
572 | draw_h = bottom; |
||
573 | draw_w = bottom*render->ctx_width/render->ctx_height; |
||
574 | }; |
||
575 | |||
576 | |||
577 | render->win_height = win->h-CAPTION_HEIGHT-PANEL_HEIGHT; |
||
578 | |||
579 | |||
580 | |||
581 | |||
582 | |||
2349 | Serge | 583 | { |
584 | render->bitmap[0].width = draw_w; |
||
3292 | Serge | 585 | render->bitmap[0].height = draw_h; |
586 | |||
587 | |||
588 | { |
||
589 | free(render); |
||
590 | return NULL; |
||
591 | } |
||
592 | render->draw = draw_sw_picture; |
||
2349 | Serge | 593 | } |
594 | else |
||
595 | { |
||
596 | int width, height, flags; |
||
3292 | Serge | 597 | int i; |
598 | |||
599 | |||
600 | { |
||
601 | sna_create_mask(); |
||
602 | |||
603 | |||
604 | height = render->ctx_height; |
||
605 | flags = HW_TEX_BLIT; |
||
606 | } |
||
607 | else |
||
608 | { |
||
609 | width = draw_w; |
||
610 | height = draw_h;; |
||
611 | flags = HW_BIT_BLIT; |
||
612 | } |
||
613 | |||
614 | |||
615 | { |
||
616 | render->bitmap[i].width = width; |
||
617 | render->bitmap[i].height = height; |
||
618 | render->bitmap[i].flags = flags; |
||
619 | |||
620 | |||
621 | { |
||
622 | player_state = CLOSED; |
||
623 | free(render); |
||
624 | return NULL; |
||
625 | }; |
||
626 | } |
||
627 | |||
628 | |||
629 | render->target = 0; |
||
2349 | Serge | 630 | render->draw = draw_hw_picture; |
631 | }; |
||
632 | |||
3292 | Serge | 633 | |
634 | render->caps==0 ? "software":"hardware", |
||
635 | render->ctx_width, render->ctx_height, |
||
636 | draw_w, draw_h); |
||
637 | |||
638 | |||
2349 | Serge | 639 | }; |
640 | |||
641 | |||
3292 | Serge | 642 | { |
2349 | Serge | 643 | |
3292 | Serge | 644 | |
645 | |||
646 | |||
647 | destroy_bitmap(&render->bitmap[1]); |
||
648 | |||
649 | |||
650 | }; |
||
651 | |||
652 | |||
653 | { |
||
654 | int i; |
||
2349 | Serge | 655 | |
656 | |||
2415 | Serge | 657 | render->rcvideo.l = 0; |
658 | render->rcvideo.t = 0; |
||
659 | render->rcvideo.r = width; |
||
660 | render->rcvideo.b = height; |
||
661 | |||
2349 | Serge | 662 | |
3068 | serge | 663 | |
664 | |||
2415 | Serge | 665 | { |
666 | int yoffs; |
||
667 | yoffs = (render->win_height-height)/2; |
||
668 | if(yoffs) |
||
669 | { |
||
670 | render->rctop.t = 0; |
||
671 | render->rctop.b = yoffs; |
||
672 | render->rcvideo.t = yoffs; |
||
673 | render->layout |= HAS_TOP; |
||
674 | } |
||
675 | |||
2349 | Serge | 676 | |
2415 | Serge | 677 | if(yoffs) |
678 | { |
||
679 | render->rcbottom.t = render->rcvideo.t+render->rcvideo.b; |
||
680 | render->rcbottom.b = yoffs; |
||
681 | render->layout |= HAS_BOTTOM; |
||
682 | } |
||
683 | } |
||
684 | |||
685 | |||
686 | { |
||
687 | int xoffs; |
||
688 | xoffs = (render->win_width-width)/2; |
||
689 | if(xoffs) |
||
690 | { |
||
691 | render->rcleft.r = xoffs; |
||
692 | render->rcvideo.l = xoffs; |
||
693 | render->layout |= HAS_LEFT; |
||
694 | } |
||
695 | xoffs = render->win_width-(render->rcvideo.l+render->rcvideo.r); |
||
696 | if(xoffs) |
||
697 | { |
||
698 | render->rcright.l = render->rcvideo.l+render->rcvideo.r; |
||
699 | render->rcright.r = xoffs; |
||
700 | render->layout |= HAS_RIGHT; |
||
701 | } |
||
702 | }; |
||
703 | }; |
||
2349 | Serge | 704 | |
705 | |||
2415 | Serge | 706 | { |
2349 | Serge | 707 | uint32_t right, bottom, new_w, new_h; |
708 | uint32_t s, sw, sh; |
||
709 | uint8_t state; |
||
710 | |||
711 | |||
3068 | serge | 712 | bottom = win->h; |
3334 | Serge | 713 | |
2349 | Serge | 714 | |
3334 | Serge | 715 | bottom-= CAPTION_HEIGHT+PANEL_HEIGHT; |
716 | |||
717 | |||
3068 | serge | 718 | // right, bottom); |
719 | |||
720 | |||
2415 | Serge | 721 | |
2349 | Serge | 722 | |
2415 | Serge | 723 | return; |
2349 | Serge | 724 | |
2415 | Serge | 725 | |
726 | return; |
||
2349 | Serge | 727 | |
728 | |||
729 | bottom == render->win_height) |
||
730 | return; |
||
731 | |||
732 | |||
3334 | Serge | 733 | |
734 | |||
2349 | Serge | 735 | new_h = right*render->ctx_height/render->ctx_width; |
736 | |||
737 | |||
3068 | serge | 738 | { |
739 | new_w = right; |
||
2349 | Serge | 740 | new_h = right*render->ctx_height/render->ctx_width; |
3068 | serge | 741 | }; |
742 | if(new_h > bottom) |
||
743 | { |
||
2349 | Serge | 744 | new_h = bottom; |
3068 | serge | 745 | new_w = bottom*render->ctx_width/render->ctx_height; |
746 | }; |
||
2349 | Serge | 747 | |
2415 | Serge | 748 | |
3334 | Serge | 749 | render->win_height = bottom; |
750 | render_set_size(render, new_w, new_h); |
||
2349 | Serge | 751 | |
3292 | Serge | 752 | |
753 | return; |
||
754 | |||
755 | |||
756 | render->bitmap[0].height = new_h; |
||
757 | resize_bitmap(&render->bitmap[0]); |
||
758 | |||
759 | |||
760 | { |
||
761 | render->bitmap[1].width = new_w; |
||
762 | render->bitmap[1].height = new_h; |
||
763 | resize_bitmap(&render->bitmap[1]); |
||
764 | }; |
||
765 | return; |
||
766 | }; |
||
2349 | Serge | 767 | |
768 | |||
769 | { |
||
770 | int dst_width, dst_height; |
||
771 | bitmap_t *bitmap; |
||
2415 | Serge | 772 | uint8_t *data[4]; |
773 | int linesize[4]; |
||
2349 | Serge | 774 | int ret; |
2415 | Serge | 775 | |
2349 | Serge | 776 | |
3292 | Serge | 777 | render->win->win_state == ROLLED) |
778 | return; |
||
2349 | Serge | 779 | |
780 | |||
781 | { |
||
782 | dst_width = render->ctx_width; |
||
783 | dst_height = render->ctx_height; |
||
784 | } |
||
785 | else |
||
786 | { |
||
787 | dst_width = render->rcvideo.r; |
||
3068 | serge | 788 | dst_height = render->rcvideo.b; |
789 | }; |
||
2349 | Serge | 790 | |
791 | |||
792 | render->ctx_width, render->ctx_height, render->ctx_format, |
||
793 | dst_width, dst_height, PIX_FMT_BGRA, |
||
794 | SWS_FAST_BILINEAR, NULL, NULL, NULL); |
||
795 | if(cvt_ctx == NULL) |
||
796 | { |
||
797 | printf("Cannot initialize the conversion context!\n"); |
||
798 | return ; |
||
799 | }; |
||
800 | |||
2415 | Serge | 801 | |
802 | |||
803 | |||
804 | if( ret != 0) |
||
805 | { |
||
806 | printf("Cannot lock bitmap!\n"); |
||
3068 | serge | 807 | return ; |
2415 | Serge | 808 | } |
809 | |||
810 | |||
2349 | Serge | 811 | data[0] = bitmap->data; |
2415 | Serge | 812 | data[1] = bitmap->data+1; |
813 | data[2] = bitmap->data+2; |
||
814 | data[3] = bitmap->data+3; |
||
815 | |||
2349 | Serge | 816 | |
2415 | Serge | 817 | linesize[1] = bitmap->pitch; |
818 | linesize[2] = bitmap->pitch; |
||
819 | linesize[3] = bitmap->pitch; |
||
820 | |||
2349 | Serge | 821 | |
822 | picture->linesize, 0, render->ctx_height, data, linesize); |
||
823 | // printf("sws_scale\n"); |
||
824 | |||
825 | |||
3334 | Serge | 826 | blit_bitmap(bitmap,render->rcvideo.l,render->rcvideo.t, |
827 | render->rcvideo.r, render->rcvideo.b); |
||
828 | else |
||
829 | blit_bitmap(bitmap, render->rcvideo.l, |
||
830 | CAPTION_HEIGHT+render->rcvideo.t, |
||
2421 | Serge | 831 | render->rcvideo.r, render->rcvideo.b); |
2415 | Serge | 832 | |
3334 | Serge | 833 | |
2427 | Serge | 834 | // printf("blit_bitmap\n"); |
2349 | Serge | 835 | |
836 | |||
2415 | Serge | 837 | |
3292 | Serge | 838 | render->target&= 1; |
839 | } |
||
2349 | Serge | 840 | |
841 | |||
842 | { |
||
843 | uint8_t *data[4]; |
||
844 | int linesize[4]; |
||
845 | |||
846 | |||
3292 | Serge | 847 | render->win->win_state == ROLLED) |
848 | return; |
||
2349 | Serge | 849 | |
850 | |||
851 | render->ctx_width, render->ctx_height, |
||
852 | render->ctx_format, |
||
853 | render->rcvideo.r, render->rcvideo.b, |
||
2415 | Serge | 854 | PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL); |
2349 | Serge | 855 | if(cvt_ctx == NULL) |
856 | { |
||
857 | printf("Cannot initialize the conversion context!\n"); |
||
858 | return ; |
||
859 | } |
||
860 | |||
861 | |||
3292 | Serge | 862 | |
863 | |||
2349 | Serge | 864 | data[1] = render->bitmap[0].data+1; |
865 | data[2] = render->bitmap[0].data+2; |
||
866 | data[3] = render->bitmap[0].data+3; |
||
867 | |||
868 | |||
869 | |||
870 | linesize[1] = render->bitmap[0].pitch; |
||
871 | linesize[2] = render->bitmap[0].pitch; |
||
872 | linesize[3] = render->bitmap[0].pitch; |
||
873 | |||
874 | |||
875 | picture->linesize, 0, render->ctx_height, data, linesize); |
||
876 | |||
877 | |||
3334 | Serge | 878 | blit_bitmap(&render->bitmap[0],render->rcvideo.l,render->rcvideo.t, |
879 | render->rcvideo.r, render->rcvideo.b); |
||
880 | else |
||
881 | blit_bitmap(&render->bitmap[0], render->rcvideo.l, |
||
882 | CAPTION_HEIGHT+render->rcvideo.t, |
||
883 | render->rcvideo.r, render->rcvideo.b); |
||
884 | |||
885 | |||
2427 | Serge | 886 | } |
2349 | Serge | 887 | |
888 | |||
2415 | Serge | 889 | { |
890 | int y; |
||
3334 | Serge | 891 | |
892 | |||
2415 | Serge | 893 | render->win_state == ROLLED ) |
3334 | Serge | 894 | return; |
2415 | Serge | 895 | if(render->win_state == FULLSCREEN) |
3334 | Serge | 896 | y = 0; |
897 | else |
||
898 | y = CAPTION_HEIGHT; |
||
899 | |||
900 | |||
3248 | Serge | 901 | { |
2427 | Serge | 902 | if(frames[vfx].ready == 1 ) |
2693 | Serge | 903 | main_render->draw(main_render, &frames[vfx].picture); |
904 | else |
||
905 | draw_bar(0, y, render->win_width, |
||
3334 | Serge | 906 | render->rcvideo.b, 0); |
2693 | Serge | 907 | } |
3068 | serge | 908 | else if( player_state == STOP ) |
909 | { |
||
910 | draw_bar(0,y, render->win_width, |
||
3334 | Serge | 911 | render->rcvideo.b, 0); |
3068 | serge | 912 | }; |
2427 | Serge | 913 | |
914 | |||
2415 | Serge | 915 | draw_bar(0, y, render->win_width, |
3334 | Serge | 916 | render->rctop.b, 0); |
2415 | Serge | 917 | if(render->layout & HAS_LEFT) |
918 | draw_bar(0, render->rcvideo.t+y, render->rcleft.r, |
||
3334 | Serge | 919 | render->rcvideo.b, 0); |
2415 | Serge | 920 | if(render->layout & HAS_RIGHT) |
921 | draw_bar(render->rcright.l, render->rcvideo.t+y, |
||
3334 | Serge | 922 | render->rcright.r, render->rcvideo.b, 0); |
2415 | Serge | 923 | if(render->layout & HAS_BOTTOM) |
924 | draw_bar(0, render->rcbottom.t+y, |
||
3334 | Serge | 925 | render->win_width, render->rcbottom.b, 0); |
2415 | Serge | 926 | }> |
927 | >=>>>>=>>> |
||
2349 | Serge | 928 |