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