Subversion Repositories Kolibri OS

Rev

Rev 2421 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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