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