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