Subversion Repositories Kolibri OS

Rev

Rev 2421 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2421 Rev 2427
Line 3... Line 3...
3
#include 
3
#include 
4
#include 
4
#include 
5
#include 
5
#include 
6
#include "system.h"
6
#include "system.h"
7
#include 
7
#include "../winlib/winlib.h"
8
#include "sound.h"
8
#include "sound.h"
9
#include "fplay.h"
9
#include "fplay.h"
10
 
10
 
Line 11... Line 11...
11
#define CAPTION_HEIGHT      24
11
#define CAPTION_HEIGHT      24
Line -... Line 12...
-
 
12
 
-
 
13
extern int res_pause_btn[];
-
 
14
extern int res_pause_btn_pressed[];
-
 
15
 
-
 
16
extern int res_play_btn[];
-
 
17
extern int res_play_btn_pressed[];
-
 
18
 
12
 
19
 
13
typedef struct
20
typedef struct
14
{
21
{
15
    AVPicture      picture;
22
    AVPicture      picture;
16
    double         pts;
23
    double         pts;
Line 96... Line 103...
96
{
103
{
97
    AVPacket   pkt;
104
    AVPacket   pkt;
98
    double     pts;
105
    double     pts;
99
    int frameFinished;
106
    int frameFinished;
100
 
107
    double current_clock;
-
 
108
 
Line 101... Line 109...
101
    if(frames[dfx].ready != 0 )
109
    if(frames[dfx].ready != 0 )
102
        return 1;
110
        return 1;
Line 103... Line 111...
103
 
111
 
104
    if( get_packet(qv, &pkt) == 0 )
112
    if( get_packet(qv, &pkt) == 0 )
Line -... Line 113...
-
 
113
        return 0;
-
 
114
 
-
 
115
    current_clock = -80.0 + get_master_clock();
-
 
116
 
-
 
117
    if( pkt.dts == AV_NOPTS_VALUE &&
-
 
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
 
-
 
125
    pts *= av_q2d(video_time_base)*1000.0;
-
 
126
 
105
        return 0;
127
    if( pts > current_clock)
Line 106... Line 128...
106
 
128
    {
Line 107... Line 129...
107
    frameFinished = 0;
129
        frameFinished = 0;
Line 114... Line 136...
114
    if(frameFinished)
136
        if(frameFinished)
115
    {
137
        {
116
        AVPicture *dst_pic;
138
            AVPicture *dst_pic;
Line 117... Line -...
117
 
-
 
118
 
139
 
119
        if( pkt.dts == AV_NOPTS_VALUE &&
140
            if( pkt.dts == AV_NOPTS_VALUE &&
120
            Frame->reordered_opaque != AV_NOPTS_VALUE)
141
                Frame->reordered_opaque != AV_NOPTS_VALUE)
121
        pts = Frame->reordered_opaque;
142
            pts = Frame->reordered_opaque;
122
        else if(pkt.dts != AV_NOPTS_VALUE)
143
            else if(pkt.dts != AV_NOPTS_VALUE)
Line 143... Line 164...
143
 
164
 
Line 144... Line 165...
144
        dfx++;
165
            dfx++;
145
        dfx&= 3;
166
            dfx&= 3;
146
    };
167
        };
-
 
168
    };
147
    av_free_packet(&pkt);
169
    av_free_packet(&pkt);
Line 148... Line 170...
148
 
170
 
149
    return 1;
171
    return 1;
Line 150... Line 172...
150
}
172
}
151
 
173
 
Line 152... Line 174...
152
extern volatile uint32_t status;
174
extern volatile enum player_state player_state;
153
rect_t     win_rect;
175
//rect_t     win_rect;
154
 
176
 
Line 169... Line 191...
169
        case MSG_DRAW_CLIENT:
191
        case MSG_DRAW_CLIENT:
170
            render_draw_client(main_render);
192
            render_draw_client(main_render);
171
            break;
193
            break;
Line -... Line 194...
-
 
194
 
-
 
195
        case MSG_LBTNDOWN:
-
 
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;
172
 
214
 
173
        case MSG_COMMAND:
215
        case MSG_COMMAND:
174
            switch((short)arg1)
216
            switch((short)arg1)
175
            {
217
            {
-
 
218
                case ID_PLAY:
-
 
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;
176
                case ID_CLOSE:
234
                default:
177
                    exit(0);
235
                    break;
178
            };
236
            }
Line 179... Line 237...
179
            break;
237
            break;
180
 
238
 
181
        default:
239
        default:
182
            def_window_proc(ctrl,msg,arg1,arg2);
240
            def_window_proc(ctrl,msg,arg1,arg2);
183
    };
241
    };
Line 184... Line 242...
184
    return 0;
242
    return 0;
185
};
243
};
186
 
244
 
187
void render_time(render_t *render)
245
void render_time(render_t *render)
Line -... Line 246...
-
 
246
{
-
 
247
    double ctime;            /*    milliseconds    */
188
{
248
    double fdelay;           /*    milliseconds    */
189
    double ctime;
249
 
190
    double fdelay;
250
//again:
191
 
251
 
-
 
252
    if(player_state == CLOSED)
-
 
253
    {
-
 
254
        render->win->win_command = WIN_CLOSED;
-
 
255
        return;
-
 
256
    }
192
    if(status == 0)
257
    else if(player_state != PLAY)
Line 193... Line 258...
193
    {
258
    {
194
        render->win->win_command = WIN_CLOSED;
259
        yield();
195
        return;
260
        return;
196
    };
261
    };
Line 197... Line 262...
197
 
262
 
198
    if(frames[vfx].ready == 1 )
263
    if(frames[vfx].ready == 1 )
Line 199... Line 264...
199
    {
264
    {
200
        ctime = get_master_clock();
-
 
201
        fdelay = (frames[vfx].pts - ctime);
-
 
202
 
-
 
203
//            printf("pts %f time %f delay %f\n",
-
 
204
//                    frames[vfx].pts, ctime, fdelay);
-
 
205
 
265
        ctime = get_master_clock();
206
        if(fdelay < 0.0 )
-
 
207
        {
-
 
208
            int  next_vfx;
-
 
209
            fdelay = 0;
-
 
210
            next_vfx = (vfx+1) & 3;
-
 
211
            if( frames[next_vfx].ready == 1 )
-
 
212
            {
-
 
213
                if(frames[next_vfx].pts <= ctime)
-
 
214
                {
-
 
215
                    frames[vfx].ready = 0;                  // skip this frame
-
 
216
                    vfx++;
266
        fdelay = (frames[vfx].pts - ctime);
217
                    vfx&= 3;
-
 
218
                }
-
 
219
                else
-
 
220
                {
-
 
221
                    if( (frames[next_vfx].pts - ctime) <
-
 
222
                        ( ctime - frames[vfx].pts) )
-
 
223
                    {
-
 
224
                        frames[vfx].ready = 0;                  // skip this frame
-
 
225
                        vfx++;
-
 
226
                        vfx&= 3;
-
 
227
                        fdelay = (frames[next_vfx].pts - ctime);
-
 
228
                    }
-
 
229
                }
267
 
230
            };
268
//        printf("pts %f time %f delay %f\n",
231
        };
269
 //               frames[vfx].pts, ctime, fdelay);
Line 232... Line 270...
232
 
270
 
233
        if(fdelay > 10.0)
271
        if(fdelay > 20.0)
234
        {
272
        {
235
           // delay( (uint32_t)(fdelay/10.0));
273
            delay(2);
236
            yield();
-
 
237
            return;
274
//            yield();
-
 
275
            return;
-
 
276
        };
-
 
277
 
-
 
278
        main_render->draw(main_render, &frames[vfx].picture);
-
 
279
        frames[vfx].ready = 0;
-
 
280
        vfx++;
Line 238... Line 281...
238
        };
281
        vfx&= 3;
Line 239... Line 282...
239
 
282
    }
240
        main_render->draw(main_render, &frames[vfx].picture);
283
    else yield();
241
        frames[vfx].ready = 0;
284
 
Line 242... Line 285...
242
        vfx++;
285
}
Line 243... Line 286...
243
        vfx&= 3;
286
 
244
    };
287
 
Line 245... Line 288...
245
}
288
 
Line 246... Line 289...
246
 
289
 
Line 247... Line 290...
247
extern char *movie_file;
290
extern char *movie_file;
248
 
291
 
Line 249... Line 292...
249
int video_thread(void *param)
292
int video_thread(void *param)
250
{
293
{
251
    window_t    *MainWindow;
294
    window_t    *MainWindow;
252
 
295
 
Line 253... Line 296...
253
    init_winlib();
296
    init_winlib();
Line 364... Line 407...
364
                render->bitmap[i].height = render->ctx_height;
407
                render->bitmap[i].height = render->ctx_height;
365
 
408
 
Line 366... Line 409...
366
                if( create_bitmap(&render->bitmap[i]) != 0 )
409
                if( create_bitmap(&render->bitmap[i]) != 0 )
367
                {
410
                {
368
                    status = 0;
411
                    player_state = CLOSED;
369
/*
412
/*
370
 *  Epic fail. Need  exit_thread() here
413
 *  Epic fail. Need  exit_thread() here
371
 *
414
 *
372
*/
415
*/
373
                    return 0;
416
                    return 0;
Line 403... Line 446...
403
    uint8_t  state;
446
    uint8_t  state;
404
 
447
 
Line 405... Line 448...
405
 
448
 
406
    right  = win->w;
449
    right  = win->w;
407
    bottom = win->h-CAPTION_HEIGHT;
450
    bottom = win->h-CAPTION_HEIGHT-75;
Line 408... Line 451...
408
    render->win_state  = win->win_state;
451
    render->win_state  = win->win_state;
409
 
452
 
Line 437... Line 480...
437
        new_h = 64*render->ctx_height/render->ctx_width;
480
        new_h = 64*render->ctx_height/render->ctx_width;
438
    };
481
    };
439
 
482
 
Line 440... Line 483...
440
    render->win_width  = win->w;
483
    render->win_width  = win->w;
441
    render->win_height = win->h-CAPTION_HEIGHT;
484
    render->win_height = win->h-CAPTION_HEIGHT-75;
442
    render_set_size(render, new_w, new_h);
485
    render_set_size(render, new_w, new_h);
443
};
486
};
Line 444... Line 487...
444
 
487
 
445
void draw_hw_picture(render_t *render, AVPicture *picture)
488
void draw_hw_picture(render_t *render, AVPicture *picture)
Line 449... Line 492...
449
    uint8_t    *data[4];
492
    uint8_t    *data[4];
450
    int      linesize[4];
493
    int      linesize[4];
451
    int ret;
494
    int ret;
452
 
495
 
Line -... Line 496...
-
 
496
    if(render->win_state == MINIMIZED ||
453
    if(render->win_state == ROLLED)
497
       render->win_state == ROLLED)
454
        return;
498
        return;
Line 455... Line 499...
455
 
499
 
456
    if(render->caps & HW_TEX_BLIT)
500
    if(render->caps & HW_TEX_BLIT)
457
    {
501
    {
Line 500... Line 544...
500
 
544
 
Line 501... Line 545...
501
    blit_bitmap(bitmap, render->rcvideo.l,
545
    blit_bitmap(bitmap, render->rcvideo.l,
502
                 CAPTION_HEIGHT+render->rcvideo.t,
546
                 CAPTION_HEIGHT+render->rcvideo.t,
503
                 render->rcvideo.r, render->rcvideo.b);
547
                 render->rcvideo.r, render->rcvideo.b);
-
 
548
    render->last_bitmap = bitmap;
504
//    printf("blit_bitmap\n");
549
//    printf("blit_bitmap\n");
Line 505... Line 550...
505
 
550
 
506
 
551
 
Line 544... Line 589...
544
 
589
 
Line 545... Line 590...
545
    blit_bitmap(&render->bitmap[0], render->rcvideo.l,
590
    blit_bitmap(&render->bitmap[0], render->rcvideo.l,
546
                render->rcvideo.t+CAPTION_HEIGHT,
591
                render->rcvideo.t+CAPTION_HEIGHT,
547
                render->rcvideo.r, render->rcvideo.b);
592
                render->rcvideo.r, render->rcvideo.b);
-
 
593
    render->last_bitmap = &render->bitmap[0];
548
}
594
}
Line 549... Line 595...
549
 
595
 
550
void render_draw_client(render_t *render)
596
void render_draw_client(render_t *render)
551
{
597
{
552
    if(render->win_state == MINIMIZED ||
598
    if(render->win_state == MINIMIZED ||
553
       render->win_state == ROLLED)
599
       render->win_state == ROLLED)
Line -... Line 600...
-
 
600
        return;
-
 
601
 
-
 
602
    if(player_state == PAUSE)
-
 
603
    {
-
 
604
        main_render->draw(main_render, &frames[vfx].picture);
554
        return;
605
    };
555
 
606
 
556
    if(render->layout & HAS_TOP)
607
    if(render->layout & HAS_TOP)
557
        draw_bar(0, CAPTION_HEIGHT, render->win_width,
608
        draw_bar(0, CAPTION_HEIGHT, render->win_width,
558
                 render->rctop.b, 0);
609
                 render->rctop.b, 0);
Line 567... Line 618...
567
                 render->win_width, render->rcbottom.b, 0);
618
                 render->win_width, render->rcbottom.b, 0);
568
}
619
}
569
>
620
Line -... Line 621...
-
 
621
-
 
622
-
 
623