Subversion Repositories Kolibri OS

Rev

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