Subversion Repositories Kolibri OS

Rev

Rev 1696 | 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 "sound.h"
2349 Serge 6
#include "fplay.h"
1696 serge 7
8
 
9
 
10
{
11
    AVPicture      picture;
2349 Serge 12
    double         pts;
1696 serge 13
    volatile int   ready;
14
}vframe_t;
15
16
 
2349 Serge 17
1696 serge 18
 
2349 Serge 19
1696 serge 20
 
21
int dfx    = 0;
22
23
 
2349 Serge 24
25
 
1696 serge 26
int height;
27
28
 
29
AVFrame  *Frame;
30
31
 
2349 Serge 32
33
 
34
35
 
36
 
1696 serge 37
{
38
    int        i;
39
40
 
41
    height = ctx->height;
42
43
 
44
45
 
2349 Serge 46
47
 
48
                           ctx->pix_fmt, HW_BIT_BLIT|HW_TEX_BLIT);
49
    if( render == NULL)
50
    {
51
        printf("Cannot create render\n\r");
52
        return 0;
53
    };
54
55
 
1696 serge 56
    if ( Frame == NULL )
57
    {
58
        printf("Cannot alloc video frame\n\r");
2349 Serge 59
        return 0;
1696 serge 60
    };
61
62
 
2349 Serge 63
    {
1696 serge 64
        int ret;
2349 Serge 65
1696 serge 66
 
2349 Serge 67
//                   ctx->width, ctx->height, ctx->pix_fmt );
68
1696 serge 69
 
2349 Serge 70
                               ctx->width, ctx->height);
71
        if ( ret != 0 )
72
        {
1696 serge 73
            printf("Cannot alloc video buffer\n\r");
2349 Serge 74
            return 0;
75
        };
76
1696 serge 77
 
2349 Serge 78
        frames[i].ready  = 0;
79
    };
1696 serge 80
81
 
2349 Serge 82
1696 serge 83
 
2349 Serge 84
    return 1;
1696 serge 85
};
86
87
 
88
static int frame_count;
2349 Serge 89
1696 serge 90
 
2349 Serge 91
{
1696 serge 92
    AVPacket   pkt;
2349 Serge 93
    double     pts;
1696 serge 94
    double av_time;
95
96
 
2349 Serge 97
        return 1;
98
1696 serge 99
 
2349 Serge 100
        return 0;
101
1696 serge 102
 
2349 Serge 103
1696 serge 104
 
2349 Serge 105
1696 serge 106
 
2349 Serge 107
        printf("video decoder error\n");
108
109
 
1696 serge 110
    {
111
        AVPicture *dst_pic;
2349 Serge 112
1696 serge 113
 
114
 
2349 Serge 115
            Frame->reordered_opaque != AV_NOPTS_VALUE)
116
        pts = Frame->reordered_opaque;
117
        else if(pkt.dts != AV_NOPTS_VALUE)
118
            pts= pkt.dts;
119
        else
120
            pts= 0;
121
1696 serge 122
 
2349 Serge 123
//                                Frame, "best_effort_timestamp");
124
1696 serge 125
 
2349 Serge 126
//            pts = 0;
127
1696 serge 128
 
2349 Serge 129
130
 
131
132
 
133
                      Frame->linesize, ctx->pix_fmt, ctx->width, ctx->height);
134
135
 
1696 serge 136
        frames[dfx].ready = 1;
137
138
 
139
        dfx&= 3;
2349 Serge 140
    };
1696 serge 141
    av_free_packet(&pkt);
2349 Serge 142
1696 serge 143
 
2349 Serge 144
}
1696 serge 145
146
 
147
rect_t     win_rect;
2349 Serge 148
1696 serge 149
 
2349 Serge 150
{
1696 serge 151
    int ev;
152
153
 
154
155
 
156
    {
157
       case 1:
2349 Serge 158
            render_adjust_size(render);
159
            BeginDraw();
160
            DrawWindow(0,0,0,0, NULL, 0x000000,0x73);
161
            EndDraw();
162
            break;
1696 serge 163
164
 
165
            if(get_os_button()==1)
166
                status = 0;
167
            break;
168
    };
169
    return 1;
170
}
171
172
 
173
 
2349 Serge 174
1696 serge 175
 
2349 Serge 176
{
1696 serge 177
    rect_t rc;
2349 Serge 178
    AVCodecContext *ctx = param;
179
1696 serge 180
 
2349 Serge 181
    DrawWindow(10, 10, width+9, height+26, movie_file, 0x000000,0x73);
182
    EndDraw();
183
1696 serge 184
 
2349 Serge 185
1696 serge 186
 
187
    {
188
        double ctime;
189
        double fdelay;
190
191
 
192
193
 
194
        {
195
            ctime = get_master_clock();
196
            fdelay = (frames[vfx].pts - ctime);
197
198
 
2349 Serge 199
//                    frames[vfx].pts, ctime, fdelay);
200
201
 
1696 serge 202
            {
203
                int  next_vfx;
204
                fdelay = 0;
205
                next_vfx = (vfx+1) & 3;
2349 Serge 206
                if( frames[next_vfx].ready == 1 )
1696 serge 207
                {
208
                    if(frames[next_vfx].pts <= ctime)
209
                    {
210
                        frames[vfx].ready = 0;                  // skip this frame
211
                        vfx++;
212
                        vfx&= 3;
2349 Serge 213
                     }
1696 serge 214
                    else
215
                    {
216
                        if( (frames[next_vfx].pts - ctime) <
217
                            ( ctime - frames[vfx].pts) )
218
                        {
219
                            frames[vfx].ready = 0;                  // skip this frame
220
                            vfx++;
221
                            vfx&= 3;
2349 Serge 222
                            fdelay = (frames[next_vfx].pts - ctime);
1696 serge 223
                        }
224
                    }
225
                };
226
            };
227
228
 
229
            {
230
                delay( (uint32_t)(fdelay/10.0));
231
            };
232
233
 
2349 Serge 234
//                    frames[vfx].frame->linesize[0]);
235
            render->draw(render, &frames[vfx].picture);
236
            frames[vfx].ready = 0;
1696 serge 237
            vfx++;
238
            vfx&= 3;
2349 Serge 239
        }
1696 serge 240
        else
241
        {
242
            yield();
243
        };
244
    };
245
    return 0;
2349 Serge 246
};
1696 serge 247
248
 
2349 Serge 249
 
250
void draw_sw_picture(render_t *render, AVPicture *picture);
251
252
 
253
                        uint32_t ctx_format, uint32_t flags)
254
{
255
    render_t *ren;
256
257
 
258
    memset(ren, 0, sizeof(*ren));
259
260
 
261
    render->ctx_height = height;
262
    render->ctx_format = ctx_format;
263
264
 
265
    render->caps = InitPixlib(flags);
266
    mutex_unlock(&driver_lock);
267
268
 
269
    {
270
        printf("FPlay render engine: Hardware acceleration disabled\n");
271
        render->draw = draw_sw_picture;
272
    }
273
    else
274
    {
275
        render->target = 0;
276
        render->draw   = draw_hw_picture;
277
    };
278
279
 
280
    return render;
281
};
282
283
 
284
{
285
    int i;
286
287
 
288
    render->win_height = height;
289
    render->win_state = NORMAL;
290
291
 
292
293
 
294
    {
295
        if(render->caps & HW_TEX_BLIT)
296
        {
297
            for( i=0; i < 4; i++)
298
            {
299
                render->bitmap[i].width  = render->ctx_width;
300
                render->bitmap[i].height = render->ctx_height;
301
302
 
303
                {
304
                    status = 0;
305
/*
306
 *  Epic fail. Need  exit_thread() here
307
 *
308
*/
309
                    return 0;
310
                };
311
            }
312
        }
313
        else
314
        {
315
            render->bitmap[0].width  = width;
316
            render->bitmap[0].height = height;
317
318
 
319
                return 0;
320
        };
321
        render->state = INIT;
322
        return 0;
323
    };
324
325
 
326
        return 0;
327
328
 
329
    render->bitmap[0].height = height;
330
    resize_bitmap(&render->bitmap[0]);
331
332
 
333
};
334
335
 
336
{
337
    char proc_info[1024];
338
339
 
340
    uint32_t s, sw, sh;
341
    uint8_t  state;
342
343
 
344
345
 
346
    bottom = *(uint32_t*)(proc_info+66)+1;
347
    state  = *(uint8_t*)(proc_info+70);
348
349
 
350
    {   render->win_state = MINIMIZED;
351
        return;
352
    }
353
    if(state & 4)
354
    {
355
        render->win_state = ROLLED;
356
        return;
357
    };
358
359
 
360
361
 
362
        bottom == render->win_height)
363
        return;
364
365
 
366
    new_h = right*render->ctx_height/render->ctx_width;
367
368
 
369
//    printf("new_w %d new_h %d\n", new_w, new_h);
370
371
 
372
    sw = right * new_h;
373
    sh = bottom * new_w;
374
375
 
376
        new_h = bottom;
377
    else
378
        new_w = right;
379
380
 
381
    {
382
        new_w = 64;
383
        new_h = 64*render->ctx_height/render->ctx_width;
384
    };
385
    __asm__ __volatile__(
386
    "int $0x40"
387
     ::"a"(67), "b"(-1), "c"(-1),
388
     "d"(new_w+9),"S"(new_h+26)
389
     :"memory" );
390
    render_set_size(render, new_w, new_h);
391
392
 
393
394
 
395
{
396
    int      dst_width, dst_height;
397
    uint8_t     *data[4];
398
    int      linesize[4];
399
400
 
401
        return;
402
403
 
404
    {
405
        dst_width  = render->ctx_width;
406
        dst_height = render->ctx_height;
407
    }
408
    else
409
    {
410
        dst_width  = render->win_width;
411
        dst_height = render->win_height;
412
    };
413
414
 
415
              render->ctx_width, render->ctx_height, render->ctx_format,
416
              dst_width, dst_height, PIX_FMT_BGRA,
417
              SWS_FAST_BILINEAR, NULL, NULL, NULL);
418
    if(cvt_ctx == NULL)
419
    {
420
        printf("Cannot initialize the conversion context!\n");
421
        return ;
422
    };
423
//    printf("sws_getCachedContext\n");
424
    data[0] = render->bitmap[render->target].data;
425
    data[1] = render->bitmap[render->target].data+1;
426
    data[2] = render->bitmap[render->target].data+2;
427
    data[3] = render->bitmap[render->target].data+3;
428
429
 
430
    linesize[1] = render->bitmap[render->target].pitch;
431
    linesize[2] = render->bitmap[render->target].pitch;
432
    linesize[3] = render->bitmap[render->target].pitch;
433
434
 
435
              picture->linesize, 0, render->ctx_height, data, linesize);
436
//    printf("sws_scale\n");
437
438
 
439
                 render->win_width, render->win_height);
440
//    printf("blit_bitmap\n");
441
442
 
443
    render->target++;
444
    render->target&= 3;
445
}
446
447
 
448
{
449
    uint8_t     *data[4];
450
    int      linesize[4];
451
452
 
453
        return;
454
455
 
456
              render->ctx_width, render->ctx_height,
457
              render->ctx_format,
458
              render->win_width, render->win_height,
459
              PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL);
460
    if(cvt_ctx == NULL)
461
    {
462
        printf("Cannot initialize the conversion context!\n");
463
        return ;
464
    }
465
466
 
467
    data[1] = render->bitmap[0].data+1;
468
    data[2] = render->bitmap[0].data+2;
469
    data[3] = render->bitmap[0].data+3;
470
471
 
472
 
473
    linesize[1] = render->bitmap[0].pitch;
474
    linesize[2] = render->bitmap[0].pitch;
475
    linesize[3] = render->bitmap[0].pitch;
476
477
 
478
              picture->linesize, 0, render->ctx_height, data, linesize);
479
480
 
481
                render->win_width, render->win_height);
482
}
483
>
484