Subversion Repositories Kolibri OS

Rev

Rev 6118 | Rev 6133 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6118 Rev 6121
1
#include 
1
#include 
2
#include 
2
#include 
3
#include 
3
#include 
4
#include 
4
#include 
5
#include 
5
#include 
6
#include 
6
#include 
7
#include 
7
#include 
8
#include 
8
#include 
9
 
9
 
10
#include "winlib/winlib.h"
10
#include "winlib/winlib.h"
11
#include "fplay.h"
11
#include "fplay.h"
12
 
12
 
13
int fplay_blit_bitmap(bitmap_t *bitmap, int dst_x, int dst_y,int w, int h);
-
 
14
 
-
 
15
extern int res_pause_btn[];
13
extern int res_pause_btn[];
16
extern int res_pause_btn_pressed[];
14
extern int res_pause_btn_pressed[];
17
 
15
 
18
extern int res_play_btn[];
16
extern int res_play_btn[];
19
extern int res_play_btn_pressed[];
17
extern int res_play_btn_pressed[];
20
 
18
 
21
extern int64_t stream_duration;
19
extern int64_t stream_duration;
22
extern volatile int sound_level_0;
20
extern volatile int sound_level_0;
23
extern volatile int sound_level_1;
21
extern volatile int sound_level_1;
24
 
22
 
25
typedef struct
-
 
26
{
-
 
27
    AVPicture      picture;
-
 
28
    double         pts;
-
 
29
    volatile int   ready;
-
 
30
}vframe_t;
-
 
31
 
-
 
32
vframe_t           frames[4];
-
 
33
volatile int      frames_count = 0;
23
volatile int frames_count = 0;
34
 
24
 
35
struct SwsContext *cvt_ctx = NULL;
25
struct SwsContext *cvt_ctx = NULL;
36
 
26
 
37
 
27
 
38
render_t   *main_render;
28
render_t   *main_render;
39
 
29
 
40
int width;
30
int width;
41
int height;
31
int height;
42
 
32
 
43
AVRational video_time_base;
33
AVRational video_time_base;
44
AVFrame  *Frame;
34
AVFrame  *Frame;
45
 
35
 
46
void get_client_rect(rect_t *rc);
36
void get_client_rect(rect_t *rc);
47
 
37
 
48
void flush_video(vst_t *vst)
38
void flush_video(vst_t *vst)
49
{
39
{
50
    int i;
40
    int i;
51
 
41
 
52
    for(i = 0; i < 4; i++)
42
    for(i = 0; i < 4; i++)
53
    {
43
    {
54
        frames[i].pts    = 0;
44
        vst->vframe[i].pts   = 0;
55
        frames[i].ready  = 0;
45
        vst->vframe[i].ready = 0;
56
    };
46
    };
57
    vst->vfx = 0;
47
    vst->vfx = 0;
58
    vst->dfx = 0;
48
    vst->dfx = 0;
59
    frames_count = 0;
49
    frames_count = 0;
60
};
50
};
61
 
51
 
62
int init_video(vst_t *vst)
52
int init_video(vst_t *vst)
63
{
53
{
64
    int        i;
54
    int        i;
65
 
55
 
66
    width  = vst->vCtx->width;
56
    width  = vst->vCtx->width;
67
    height = vst->vCtx->height;
57
    height = vst->vCtx->height;
68
 
58
 
69
    Frame = av_frame_alloc();
59
    Frame = av_frame_alloc();
70
    if ( Frame == NULL )
60
    if ( Frame == NULL )
71
    {
61
    {
72
        printf("Cannot alloc video frame\n\r");
62
        printf("Cannot alloc video frame\n\r");
73
        return 0;
63
        return 0;
74
    };
64
    };
75
 
65
 
76
    for( i=0; i < 4; i++)
-
 
77
    {
-
 
78
        int ret;
-
 
79
 
-
 
80
        ret = avpicture_alloc(&frames[i].picture, vst->vCtx->pix_fmt,
-
 
81
                               vst->vCtx->width, vst->vCtx->height);
-
 
82
        if ( ret != 0 )
-
 
83
        {
-
 
84
            printf("Cannot alloc video buffer\n\r");
-
 
85
            return 0;
-
 
86
        };
-
 
87
 
-
 
88
        frames[i].pts    = 0;
-
 
89
        frames[i].ready  = 0;
-
 
90
    };
-
 
91
 
-
 
92
    create_thread(video_thread, vst, 1024*1024);
66
    create_thread(video_thread, vst, 1024*1024);
93
 
67
 
94
    delay(50);
68
    delay(50);
95
    return 1;
69
    return 1;
96
};
70
};
97
 
71
 
98
int decode_video(vst_t* vst)
72
int decode_video(vst_t* vst)
99
{
73
{
100
    AVPacket   pkt;
74
    AVPacket   pkt;
101
    double     pts;
75
    double     pts;
102
    int frameFinished;
76
    int frameFinished;
103
    double current_clock;
77
    double current_clock;
104
 
78
 
105
    if(frames[vst->dfx].ready != 0 )
79
    if(vst->vframe[vst->dfx].ready != 0 )
106
        return -1;
80
        return -1;
107
 
81
 
108
    if( get_packet(&vst->q_video, &pkt) == 0 )
82
    if( get_packet(&vst->q_video, &pkt) == 0 )
109
        return 0;
83
        return 0;
110
 
84
 
111
/*
85
/*
112
    current_clock = -90.0 + get_master_clock();
86
    current_clock = -90.0 + get_master_clock();
113
 
87
 
114
    if( pkt.dts == AV_NOPTS_VALUE &&
88
    if( pkt.dts == AV_NOPTS_VALUE &&
115
        Frame->reordered_opaque != AV_NOPTS_VALUE)
89
        Frame->reordered_opaque != AV_NOPTS_VALUE)
116
        pts = Frame->reordered_opaque;
90
        pts = Frame->reordered_opaque;
117
    else if(pkt.dts != AV_NOPTS_VALUE)
91
    else if(pkt.dts != AV_NOPTS_VALUE)
118
        pts= pkt.dts;
92
        pts= pkt.dts;
119
    else
93
    else
120
        pts= 0;
94
        pts= 0;
121
 
95
 
122
 
96
 
123
    pts *= av_q2d(video_time_base)*1000.0;
97
    pts *= av_q2d(video_time_base)*1000.0;
124
*/
98
*/
125
    if( 1 /*pts > current_clock*/)
99
    if( 1 /*pts > current_clock*/)
126
    {
100
    {
127
        frameFinished = 0;
101
        frameFinished = 0;
128
 
102
 
129
        vst->vCtx->reordered_opaque = pkt.pts;
103
        vst->vCtx->reordered_opaque = pkt.pts;
130
 
104
 
131
        mutex_lock(&vst->gpu_lock);
105
        mutex_lock(&vst->gpu_lock);
132
 
106
 
133
        if(avcodec_decode_video2(vst->vCtx, Frame, &frameFinished, &pkt) <= 0)
107
        if(avcodec_decode_video2(vst->vCtx, Frame, &frameFinished, &pkt) <= 0)
134
            printf("video decoder error\n");
108
            printf("video decoder error\n");
135
 
109
 
136
        if(frameFinished)
110
        if(frameFinished)
137
        {
111
        {
138
            AVPicture *dst_pic;
112
            AVPicture *dst_pic;
139
 
113
 
140
            if( pkt.dts == AV_NOPTS_VALUE &&
114
            if( pkt.dts == AV_NOPTS_VALUE &&
141
                Frame->reordered_opaque != AV_NOPTS_VALUE)
115
                Frame->reordered_opaque != AV_NOPTS_VALUE)
142
                pts = Frame->reordered_opaque;
116
                pts = Frame->reordered_opaque;
143
            else if(pkt.dts != AV_NOPTS_VALUE)
117
            else if(pkt.dts != AV_NOPTS_VALUE)
144
                pts = pkt.dts;
118
                pts = pkt.dts;
145
            else
119
            else
146
                pts = 0;
120
                pts = 0;
147
 
121
 
148
            pts *= av_q2d(video_time_base);
122
            pts *= av_q2d(video_time_base);
149
 
123
 
150
            dst_pic = &frames[vst->dfx].picture;
124
            dst_pic = &vst->vframe[vst->dfx].picture;
-
 
125
 
151
 
126
            if(vst->hwdec == 0)
152
            av_image_copy(dst_pic->data, dst_pic->linesize,
127
                av_image_copy(dst_pic->data, dst_pic->linesize,
153
                      (const uint8_t**)Frame->data,
128
                              (const uint8_t**)Frame->data,
154
                      Frame->linesize, vst->vCtx->pix_fmt, vst->vCtx->width, vst->vCtx->height);
129
                              Frame->linesize, vst->vCtx->pix_fmt, vst->vCtx->width, vst->vCtx->height);
155
 
130
            else
-
 
131
                va_convert_picture(vst, vst->vCtx->width, vst->vCtx->height, dst_pic);
-
 
132
 
156
            frames[vst->dfx].pts = pts*1000.0;
133
            vst->vframe[vst->dfx].pts = pts*1000.0;
157
 
-
 
158
            frames[vst->dfx].ready = 1;
134
            vst->vframe[vst->dfx].ready = 1;
159
 
-
 
160
            vst->dfx = (vst->dfx + 1) & 3;
135
            vst->dfx = (vst->dfx + 1) & 3;
161
            frames_count++;
136
            frames_count++;
162
        };
137
        };
163
        mutex_unlock(&vst->gpu_lock);
138
        mutex_unlock(&vst->gpu_lock);
164
 
139
 
165
    };
140
    };
166
    av_free_packet(&pkt);
141
    av_free_packet(&pkt);
167
 
142
 
168
    return 1;
143
    return 1;
169
}
144
}
170
 
145
 
171
extern volatile enum player_state player_state;
146
extern volatile enum player_state player_state;
172
extern volatile enum player_state decoder_state;
147
extern volatile enum player_state decoder_state;
173
extern volatile enum player_state sound_state;
148
extern volatile enum player_state sound_state;
174
 
149
 
175
extern int64_t rewind_pos;
150
extern int64_t rewind_pos;
176
 
151
 
177
static void player_stop()
152
static void player_stop()
178
{
153
{
179
    window_t  *win;
154
    window_t  *win;
180
 
155
 
181
    win = main_render->win;
156
    win = main_render->win;
182
 
157
 
183
    rewind_pos = 0;
158
    rewind_pos = 0;
184
 
159
 
185
    win->panel.play_btn->img_default    = res_play_btn;
160
    win->panel.play_btn->img_default    = res_play_btn;
186
    win->panel.play_btn->img_hilite     = res_play_btn;
161
    win->panel.play_btn->img_hilite     = res_play_btn;
187
    win->panel.play_btn->img_pressed    = res_play_btn_pressed;
162
    win->panel.play_btn->img_pressed    = res_play_btn_pressed;
188
    win->panel.prg->current             = rewind_pos;
163
    win->panel.prg->current             = rewind_pos;
189
 
164
 
190
    send_message(&win->panel.ctrl, MSG_PAINT, 0, 0);
165
    send_message(&win->panel.ctrl, MSG_PAINT, 0, 0);
191
    player_state = STOP;
166
    player_state = STOP;
192
    decoder_state = PLAY_2_STOP;
167
    decoder_state = PLAY_2_STOP;
193
    sound_state = PLAY_2_STOP;
168
    sound_state = PLAY_2_STOP;
194
    render_draw_client(main_render);
169
    render_draw_client(main_render);
195
};
170
};
196
 
171
 
197
int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2)
172
int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2)
198
{
173
{
199
    window_t  *win = (window_t*)ctrl;
174
    window_t  *win = (window_t*)ctrl;
200
    static int spc_down = 0;
175
    static int spc_down = 0;
201
    static int ent_down = 0;
176
    static int ent_down = 0;
202
 
177
 
203
    switch(msg)
178
    switch(msg)
204
    {
179
    {
205
        case MSG_SIZE:
180
        case MSG_SIZE:
206
            if(main_render)
181
            if(main_render)
207
            {
182
            {
208
                render_adjust_size(main_render, win);
183
                render_adjust_size(main_render, win);
209
                render_draw_client(main_render);
184
                render_draw_client(main_render);
210
            };
185
            };
211
            break;
186
            break;
212
 
187
 
213
        case MSG_KEY:
188
        case MSG_KEY:
214
            switch((short)arg2)
189
            switch((short)arg2)
215
            {
190
            {
216
                case 0x39:
191
                case 0x39:
217
                    if(spc_down == 0)
192
                    if(spc_down == 0)
218
                    {
193
                    {
219
                        spc_down = 1;
194
                        spc_down = 1;
220
                        send_message(win, MSG_LBTNDOWN, 0, 0);
195
                        send_message(win, MSG_LBTNDOWN, 0, 0);
221
                    }
196
                    }
222
                    break;
197
                    break;
223
 
198
 
224
                case 0xB9:
199
                case 0xB9:
225
                    spc_down = 0;
200
                    spc_down = 0;
226
                    break;
201
                    break;
227
 
202
 
228
                case 0x1C:
203
                case 0x1C:
229
                    if(ent_down == 0)
204
                    if(ent_down == 0)
230
                    {
205
                    {
231
                        int screensize;
206
                        int screensize;
232
                        if(win->win_state == NORMAL)
207
                        if(win->win_state == NORMAL)
233
                        {
208
                        {
234
                            win->saved = win->rc;
209
                            win->saved = win->rc;
235
                            win->saved_state = win->win_state;
210
                            win->saved_state = win->win_state;
236
 
211
 
237
                            screensize = GetScreenSize();
212
                            screensize = GetScreenSize();
238
                            __asm__ __volatile__(
213
                            __asm__ __volatile__(
239
                            "int $0x40"
214
                            "int $0x40"
240
                            ::"a"(67), "b"(0), "c"(0),
215
                            ::"a"(67), "b"(0), "c"(0),
241
                            "d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) );
216
                            "d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) );
242
                            win->win_state = FULLSCREEN;
217
                            win->win_state = FULLSCREEN;
243
                            window_update_layout(win);
218
                            window_update_layout(win);
244
                        }
219
                        }
245
                        else if(win->win_state == FULLSCREEN)
220
                        else if(win->win_state == FULLSCREEN)
246
                        {
221
                        {
247
                            __asm__ __volatile__(
222
                            __asm__ __volatile__(
248
                            "int $0x40"
223
                            "int $0x40"
249
                            ::"a"(67), "b"(win->saved.l), "c"(win->saved.t),
224
                            ::"a"(67), "b"(win->saved.l), "c"(win->saved.t),
250
                            "d"(win->saved.r-win->saved.l-1),"S"(win->saved.b-win->saved.t-1));
225
                            "d"(win->saved.r-win->saved.l-1),"S"(win->saved.b-win->saved.t-1));
251
                            win->win_state = win->saved_state;
226
                            win->win_state = win->saved_state;
252
                            window_update_layout(win);
227
                            window_update_layout(win);
253
//                            if(win->saved_state == MAXIMIZED)
228
//                            if(win->saved_state == MAXIMIZED)
254
//                            {
229
//                            {
255
//                                blit_caption(&win->caption);
230
//                                blit_caption(&win->caption);
256
//                                blit_panel(&win->panel);
231
//                                blit_panel(&win->panel);
257
//                            }
232
//                            }
258
                        }
233
                        }
259
                        ent_down = 1;
234
                        ent_down = 1;
260
                    };
235
                    };
261
                    break;
236
                    break;
262
 
237
 
263
                case 0x9C:
238
                case 0x9C:
264
                    ent_down = 0;
239
                    ent_down = 0;
265
                    break;
240
                    break;
266
            };
241
            };
267
 
242
 
268
        case MSG_DRAW_CLIENT:
243
        case MSG_DRAW_CLIENT:
269
            if(main_render)
244
            if(main_render)
270
            {
245
            {
271
                render_draw_client(main_render);
246
                render_draw_client(main_render);
272
            };
247
            };
273
            break;
248
            break;
274
 
249
 
275
        case MSG_LBTNDOWN:
250
        case MSG_LBTNDOWN:
276
 
251
 
277
            if(player_state == PAUSE)
252
            if(player_state == PAUSE)
278
            {
253
            {
279
                win->panel.play_btn->img_default = res_pause_btn;
254
                win->panel.play_btn->img_default = res_pause_btn;
280
                win->panel.play_btn->img_hilite  = res_pause_btn;
255
                win->panel.play_btn->img_hilite  = res_pause_btn;
281
                win->panel.play_btn->img_pressed = res_pause_btn_pressed;
256
                win->panel.play_btn->img_pressed = res_pause_btn_pressed;
282
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
257
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
283
                player_state = PLAY;
258
                player_state = PLAY;
284
                sound_state  = PAUSE_2_PLAY;
259
                sound_state  = PAUSE_2_PLAY;
285
 
260
 
286
            }
261
            }
287
            else if(player_state == PLAY)
262
            else if(player_state == PLAY)
288
            {
263
            {
289
                win->panel.play_btn->img_default = res_play_btn;
264
                win->panel.play_btn->img_default = res_play_btn;
290
                win->panel.play_btn->img_hilite  = res_play_btn;
265
                win->panel.play_btn->img_hilite  = res_play_btn;
291
                win->panel.play_btn->img_pressed = res_play_btn_pressed;
266
                win->panel.play_btn->img_pressed = res_play_btn_pressed;
292
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
267
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
293
                player_state = PAUSE;
268
                player_state = PAUSE;
294
                sound_state  = PLAY_2_PAUSE;
269
                sound_state  = PLAY_2_PAUSE;
295
            }
270
            }
296
            break;
271
            break;
297
 
272
 
298
        case MSG_COMMAND:
273
        case MSG_COMMAND:
299
            switch((short)arg1)
274
            switch((short)arg1)
300
            {
275
            {
301
                case ID_PLAY:
276
                case ID_PLAY:
302
                    if(player_state == PAUSE)
277
                    if(player_state == PAUSE)
303
                    {
278
                    {
304
                        win->panel.play_btn->img_default  = res_pause_btn;
279
                        win->panel.play_btn->img_default  = res_pause_btn;
305
                        win->panel.play_btn->img_hilite   = res_pause_btn;
280
                        win->panel.play_btn->img_hilite   = res_pause_btn;
306
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
281
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
307
                        player_state = PLAY;
282
                        player_state = PLAY;
308
                        sound_state = PAUSE_2_PLAY;
283
                        sound_state = PAUSE_2_PLAY;
309
                    }
284
                    }
310
                    else if(player_state == PLAY)
285
                    else if(player_state == PLAY)
311
                    {
286
                    {
312
                        win->panel.play_btn->img_default = res_play_btn;
287
                        win->panel.play_btn->img_default = res_play_btn;
313
                        win->panel.play_btn->img_hilite  = res_play_btn;
288
                        win->panel.play_btn->img_hilite  = res_play_btn;
314
                        win->panel.play_btn->img_pressed  = res_play_btn_pressed;
289
                        win->panel.play_btn->img_pressed  = res_play_btn_pressed;
315
                        player_state = PAUSE;
290
                        player_state = PAUSE;
316
                        sound_state  = PLAY_2_PAUSE;
291
                        sound_state  = PLAY_2_PAUSE;
317
                    }
292
                    }
318
                    else if(player_state == STOP)
293
                    else if(player_state == STOP)
319
                    {
294
                    {
320
                        win->panel.play_btn->img_default  = res_pause_btn;
295
                        win->panel.play_btn->img_default  = res_pause_btn;
321
                        win->panel.play_btn->img_hilite   = res_pause_btn;
296
                        win->panel.play_btn->img_hilite   = res_pause_btn;
322
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
297
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
323
                        rewind_pos = 0;
298
                        rewind_pos = 0;
324
                        send_message(&win->panel.ctrl, MSG_PAINT, 0, 0);
299
                        send_message(&win->panel.ctrl, MSG_PAINT, 0, 0);
325
                        player_state = PLAY;
300
                        player_state = PLAY;
326
                        decoder_state = PREPARE;
301
                        decoder_state = PREPARE;
327
                    }
302
                    }
328
                    break;
303
                    break;
329
 
304
 
330
                case ID_STOP:
305
                case ID_STOP:
331
                    player_stop();
306
                    player_stop();
332
                    break;
307
                    break;
333
 
308
 
334
                case ID_PROGRESS:
309
                case ID_PROGRESS:
335
                    if(player_state != REWIND)
310
                    if(player_state != REWIND)
336
                    {
311
                    {
337
                        progress_t *prg = (progress_t*)arg2;
312
                        progress_t *prg = (progress_t*)arg2;
338
 
313
 
339
                        rewind_pos = (prg->max - prg->min)*prg->pos/prg->ctrl.w;
314
                        rewind_pos = (prg->max - prg->min)*prg->pos/prg->ctrl.w;
340
 
315
 
341
                        player_state  = REWIND;
316
                        player_state  = REWIND;
342
                        decoder_state = REWIND;
317
                        decoder_state = REWIND;
343
                        sound_state   = PLAY_2_STOP;
318
                        sound_state   = PLAY_2_STOP;
344
                        if(rewind_pos < prg->current)
319
                        if(rewind_pos < prg->current)
345
                        {
320
                        {
346
                            prg->current  = rewind_pos;
321
                            prg->current  = rewind_pos;
347
                            rewind_pos = -rewind_pos;
322
                            rewind_pos = -rewind_pos;
348
                        }
323
                        }
349
                        else
324
                        else
350
                            prg->current  = rewind_pos;
325
                            prg->current  = rewind_pos;
351
 
326
 
352
                        win->panel.play_btn->img_default  = res_pause_btn;
327
                        win->panel.play_btn->img_default  = res_pause_btn;
353
                        win->panel.play_btn->img_hilite   = res_pause_btn;
328
                        win->panel.play_btn->img_hilite   = res_pause_btn;
354
                        win->panel.play_btn->img_pressed  = res_pause_btn_pressed;
329
                        win->panel.play_btn->img_pressed  = res_pause_btn_pressed;
355
                        send_message(&prg->ctrl, MSG_PAINT, 0, 0);
330
                        send_message(&prg->ctrl, MSG_PAINT, 0, 0);
356
                    };
331
                    };
357
                    break;
332
                    break;
358
 
333
 
359
                case ID_VOL_CTRL:
334
                case ID_VOL_CTRL:
360
                {
335
                {
361
                    slider_t *sld = (slider_t*)arg2;
336
                    slider_t *sld = (slider_t*)arg2;
362
                    int      peak;
337
                    int      peak;
363
                    int      level;
338
                    int      level;
364
 
339
 
365
                    peak = sld->min + sld->pos * (sld->max - sld->min)/(96);
340
                    peak = sld->min + sld->pos * (sld->max - sld->min)/(96);
366
                    level =  peak;
341
                    level =  peak;
367
 
342
 
368
                    set_audio_volume(level, level);
343
                    set_audio_volume(level, level);
369
                    send_message(&sld->ctrl, MSG_PAINT, 0, 0);
344
                    send_message(&sld->ctrl, MSG_PAINT, 0, 0);
370
                    win->panel.lvl->vol = level;
345
                    win->panel.lvl->vol = level;
371
                }
346
                }
372
 
347
 
373
                default:
348
                default:
374
                    break;
349
                    break;
375
            }
350
            }
376
            break;
351
            break;
377
 
352
 
378
        default:
353
        default:
379
            def_window_proc(ctrl,msg,arg1,arg2);
354
            def_window_proc(ctrl,msg,arg1,arg2);
380
    };
355
    };
381
    return 0;
356
    return 0;
382
};
357
};
383
 
358
 
384
#define VERSION_A     1
359
#define VERSION_A     1
385
 
360
 
386
void render_time(render_t *render)
361
void render_time(render_t *render)
387
{
362
{
388
    progress_t *prg = main_render->win->panel.prg;
363
    progress_t *prg = main_render->win->panel.prg;
389
    level_t    *lvl = main_render->win->panel.lvl;
364
    level_t    *lvl = main_render->win->panel.lvl;
390
    vst_t      *vst = main_render->vst;
365
    vst_t      *vst = main_render->vst;
391
    double      ctime;            /*    milliseconds    */
366
    double      ctime;            /*    milliseconds    */
392
    double      fdelay;           /*    milliseconds    */
367
    double      fdelay;           /*    milliseconds    */
393
 
368
 
394
//again:
369
//again:
395
 
370
 
396
    if(player_state == CLOSED)
371
    if(player_state == CLOSED)
397
    {
372
    {
398
        render->win->win_command = WIN_CLOSED;
373
        render->win->win_command = WIN_CLOSED;
399
        return;
374
        return;
400
    }
375
    }
401
    else if((player_state == PAUSE) || (player_state == REWIND))
376
    else if((player_state == PAUSE) || (player_state == REWIND))
402
    {
377
    {
403
        delay(1);
378
        delay(1);
404
        return;
379
        return;
405
    }
380
    }
406
    else if (decoder_state == STOP && frames_count  == 0 &&
381
    else if (decoder_state == STOP && frames_count  == 0 &&
407
              player_state  != STOP)
382
              player_state  != STOP)
408
    {
383
    {
409
        player_stop();
384
        player_stop();
410
    }
385
    }
411
    else if(player_state != PLAY)
386
    else if(player_state != PLAY)
412
    {
387
    {
413
        delay(1);
388
        delay(1);
414
        return;
389
        return;
415
    };
390
    };
416
 
391
 
417
 
392
 
418
#ifdef VERSION_A
393
#ifdef VERSION_A
419
    if(frames[vst->vfx].ready == 1 )
394
    if(vst->vframe[vst->vfx].ready == 1 )
420
    {
395
    {
421
        int sys_time;
396
        int sys_time;
422
 
397
 
423
        ctime = get_master_clock();
398
        ctime = get_master_clock();
424
        fdelay = (frames[vst->vfx].pts - ctime);
399
        fdelay = (vst->vframe[vst->vfx].pts - ctime);
425
 
400
 
426
//        printf("pts %f time %f delay %f\n",
401
//        printf("pts %f time %f delay %f\n",
427
//                frames[vfx].pts, ctime, fdelay);
402
//                frames[vfx].pts, ctime, fdelay);
428
 
403
 
429
        if(fdelay > 15.0)
404
        if(fdelay > 15.0)
430
        {
405
        {
431
            delay((int)fdelay/10);
406
            delay((int)fdelay/10);
432
        //    return;
407
        //    return;
433
        };
408
        };
434
#if 0
409
#if 0
435
        ctime = get_master_clock();
410
        ctime = get_master_clock();
436
        fdelay = (frames[vst->vfx].pts - ctime);
411
        fdelay = (vst->vframe[vst->vfx].pts - ctime);
437
 
412
 
438
//        while(fdelay > 0)
413
//        while(fdelay > 0)
439
//        {
414
//        {
440
//            yield();
415
//            yield();
441
//            ctime = get_master_clock();
416
//            ctime = get_master_clock();
442
//            fdelay = (frames[vfx].pts - ctime);
417
//            fdelay = (frames[vfx].pts - ctime);
443
//        }
418
//        }
444
 
419
 
445
//        sys_time = get_tick_count();
420
//        sys_time = get_tick_count();
446
 
421
 
447
//        if(fdelay < 0)
422
//        if(fdelay < 0)
448
//            printf("systime %d pts %f time %f delay %f\n",
423
//            printf("systime %d pts %f time %f delay %f\n",
449
//                    sys_time*10, frames[vfx].pts, ctime, fdelay);
424
//                    sys_time*10, frames[vfx].pts, ctime, fdelay);
450
 
425
 
451
        printf("pts %f time %f delay %f\n",
426
        printf("pts %f time %f delay %f\n",
452
                frames[vfx].pts, ctime, fdelay);
427
                vst->vframe[vst->vfx].pts, ctime, fdelay);
453
        printf("video cache %d audio cache %d\n", q_video.size/1024, q_audio.size/1024);
428
        printf("video cache %d audio cache %d\n", q_video.size/1024, q_audio.size/1024);
454
#endif
429
#endif
455
 
430
 
456
        main_render->draw(main_render, &frames[vst->vfx].picture);
431
        main_render->draw(main_render, &vst->vframe[vst->vfx].picture);
457
        if(main_render->win->win_state != FULLSCREEN)
432
        if(main_render->win->win_state != FULLSCREEN)
458
        {
433
        {
459
            prg->current = frames[vst->vfx].pts*1000;
434
            prg->current = vst->vframe[vst->vfx].pts*1000;
460
//        printf("current %f\n", prg->current);
435
//        printf("current %f\n", prg->current);
461
            lvl->current = vst->vfx & 1 ? sound_level_1 : sound_level_0;
436
            lvl->current = vst->vfx & 1 ? sound_level_1 : sound_level_0;
462
 
437
 
463
            send_message(&prg->ctrl, PRG_PROGRESS, 0, 0);
438
            send_message(&prg->ctrl, PRG_PROGRESS, 0, 0);
464
 
439
 
465
            if(main_render->win->panel.layout)
440
            if(main_render->win->panel.layout)
466
                send_message(&lvl->ctrl, MSG_PAINT, 0, 0);
441
                send_message(&lvl->ctrl, MSG_PAINT, 0, 0);
467
        }
442
        }
468
 
443
 
469
        frames_count--;
444
        frames_count--;
470
        frames[vst->vfx].ready = 0;
445
        vst->vframe[vst->vfx].ready = 0;
471
        vst->vfx = (vst->vfx + 1) & 3;
446
        vst->vfx = (vst->vfx + 1) & 3;
472
    }
447
    }
473
    else delay(1);
448
    else delay(1);
474
 
449
 
475
#else
450
#else
476
 
451
 
477
    if(frames[vfx].ready == 1 )
452
    if(vst->vframe[vfx].ready == 1 )
478
    {
453
    {
479
        ctime = get_master_clock();
454
        ctime = get_master_clock();
480
        fdelay = (frames[vst->vfx].pts - ctime);
455
        fdelay = (vst->vrame[vst->vfx].pts - ctime);
481
 
456
 
482
//            printf("pts %f time %f delay %f\n",
457
//            printf("pts %f time %f delay %f\n",
483
//                    frames[vfx].pts, ctime, fdelay);
458
//                    frames[vfx].pts, ctime, fdelay);
484
 
459
 
485
        if(fdelay < 0.0 )
460
        if(fdelay < 0.0 )
486
        {
461
        {
487
            int  next_vfx;
462
            int  next_vfx;
488
            fdelay = 0;
463
            fdelay = 0;
489
            next_vfx = (vst->vfx+1) & 3;
464
            next_vfx = (vst->vfx+1) & 3;
490
            if( frames[next_vfx].ready == 1 )
465
            if( vst->vrame[next_vfx].ready == 1 )
491
            {
466
            {
492
                if(frames[next_vfx].pts <= ctime)
467
                if(vst->vrame[next_vfx].pts <= ctime)
493
                {
468
                {
494
                    frames[vst->vfx].ready = 0;                  // skip this frame
469
                    vst->vrame[vst->vfx].ready = 0;                  // skip this frame
495
                    vst->vfx = (vst->vfx + 1) & 3;
470
                    vst->vfx = (vst->vfx + 1) & 3;
496
                }
471
                }
497
                else
472
                else
498
                {
473
                {
499
                    if( (frames[next_vfx].pts - ctime) <
474
                    if( (vst->vrame[next_vfx].pts - ctime) <
500
                        ( ctime - frames[vst->vfx].pts) )
475
                        ( ctime - frames[vst->vfx].pts) )
501
                    {
476
                    {
502
                        frames[vst->vfx].ready = 0;                  // skip this frame
477
                        vst->vrame[vst->vfx].ready = 0;                  // skip this frame
503
                        vst->vfx = (vst->vfx + 1) & 3;
478
                        vst->vfx = (vst->vfx + 1) & 3;
504
                        fdelay = (frames[next_vfx].pts - ctime);
479
                        fdelay = (vst->vrame[next_vfx].pts - ctime);
505
                    }
480
                    }
506
                }
481
                }
507
            };
482
            };
508
        };
483
        };
509
 
484
 
510
        if(fdelay > 10.0)
485
        if(fdelay > 10.0)
511
        {
486
        {
512
           int val = fdelay;
487
           int val = fdelay;
513
           printf("pts %f time %f delay %d\n",
488
           printf("pts %f time %f delay %d\n",
514
                   frames[vst->vfx].pts, ctime, val);
489
                   vst->vrame[vst->vfx].pts, ctime, val);
515
           delay(val/10);
490
           delay(val/10);
516
        };
491
        };
517
 
492
 
518
        ctime = get_master_clock();
493
        ctime = get_master_clock();
519
        fdelay = (frames[vst->vfx].pts - ctime);
494
        fdelay = (vst->vrame[vst->vfx].pts - ctime);
520
 
495
 
521
        printf("pts %f time %f delay %f\n",
496
        printf("pts %f time %f delay %f\n",
522
                frames[vst->vfx].pts, ctime, fdelay);
497
                vst->vrame[vst->vfx].pts, ctime, fdelay);
523
 
498
 
524
        main_render->draw(main_render, &frames[vfx].picture);
499
        main_render->draw(main_render, &vst->vrame[vfx].picture);
525
        main_render->win->panel.prg->current = frames[vfx].pts;
500
        main_render->win->panel.prg->current = vst->vrame[vfx].pts;
526
//        send_message(&render->win->panel.prg->ctrl, MSG_PAINT, 0, 0);
501
//        send_message(&render->win->panel.prg->ctrl, MSG_PAINT, 0, 0);
527
        frames[vst->vfx].ready = 0;
502
        vst->vrame[vst->vfx].ready = 0;
528
        vst->vfx = (vst->vfx + 1) & 3;
503
        vst->vfx = (vst->vfx + 1) & 3;
529
    }
504
    }
530
    else yield();
505
    else yield();
531
#endif
506
#endif
532
 
507
 
533
}
508
}
534
 
509
 
535
 
510
 
536
extern char *movie_file;
511
extern char *movie_file;
537
 
512
 
538
int video_thread(void *param)
513
int video_thread(void *param)
539
{
514
{
540
    vst_t *vst = param;
515
    vst_t *vst = param;
541
    window_t  *MainWindow;
516
    window_t  *MainWindow;
542
 
517
 
543
    init_winlib();
518
    init_winlib();
544
 
519
 
545
    MainWindow = create_window(movie_file,0,
520
    MainWindow = create_window(movie_file,0,
546
                               10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc);
521
                               10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc);
547
 
522
 
548
    MainWindow->panel.prg->max = stream_duration;
523
    MainWindow->panel.prg->max = stream_duration;
549
 
524
 
550
    show_window(MainWindow, NORMAL);
525
    show_window(MainWindow, NORMAL);
551
 
526
 
552
    main_render = create_render(vst, MainWindow, HW_TEX_BLIT|HW_BIT_BLIT);
527
    main_render = create_render(vst, MainWindow, HW_TEX_BLIT|HW_BIT_BLIT);
553
    if( main_render == NULL)
528
    if( main_render == NULL)
554
    {
529
    {
555
        printf("Cannot create render\n\r");
530
        printf("Cannot create render\n\r");
556
        return 0;
531
        return 0;
557
    };
532
    };
558
 
533
 
559
    __sync_or_and_fetch(&threads_running,VIDEO_THREAD);
534
    __sync_or_and_fetch(&threads_running,VIDEO_THREAD);
560
 
535
 
561
    render_draw_client(main_render);
536
    render_draw_client(main_render);
562
    player_state = PLAY;
537
    player_state = PLAY;
563
 
538
 
564
    run_render(MainWindow, main_render);
539
    run_render(MainWindow, main_render);
565
 
540
 
566
    __sync_and_and_fetch(&threads_running,~VIDEO_THREAD);
541
    __sync_and_and_fetch(&threads_running,~VIDEO_THREAD);
567
 
542
 
568
    destroy_render(main_render);
543
    destroy_render(main_render);
569
    fini_winlib();
544
    fini_winlib();
570
    player_state = CLOSED;
545
    player_state = CLOSED;
571
    return 0;
546
    return 0;
572
};
547
};
573
 
548
 
574
 
549
 
575
void draw_hw_picture(render_t *render, AVPicture *picture);
550
void draw_hw_picture(render_t *render, AVPicture *picture);
576
void draw_sw_picture(render_t *render, AVPicture *picture);
551
void draw_sw_picture(render_t *render, AVPicture *picture);
577
 
552
 
578
render_t *create_render(vst_t *vst, window_t *win, uint32_t flags)
553
render_t *create_render(vst_t *vst, window_t *win, uint32_t flags)
579
{
554
{
580
    render_t *render;
555
    render_t *render;
581
 
556
 
582
    uint32_t right, bottom, draw_w, draw_h;
557
    uint32_t right, bottom, draw_w, draw_h;
583
    uint32_t s, sw, sh;
558
    uint32_t s, sw, sh;
584
    uint8_t  state;
559
    uint8_t  state;
585
 
560
 
586
//    __asm__ __volatile__("int3");
561
//    __asm__ __volatile__("int3");
587
 
562
 
588
    render = (render_t*)malloc(sizeof(render_t));
563
    render = (render_t*)malloc(sizeof(render_t));
589
    memset(render, 0, sizeof(render_t));
564
    memset(render, 0, sizeof(render_t));
590
 
565
 
591
    render->vst = vst;
566
    render->vst = vst;
592
    render->win = win;
567
    render->win = win;
593
 
568
 
594
    render->ctx_width  = vst->vCtx->width;
569
    render->ctx_width  = vst->vCtx->width;
595
    render->ctx_height = vst->vCtx->height;
570
    render->ctx_height = vst->vCtx->height;
596
    render->ctx_format = vst->vCtx->pix_fmt;
571
    render->ctx_format = vst->vCtx->pix_fmt;
597
 
572
 
598
    render->caps = pxInit(1);
573
    render->caps = pxInit(1);
599
 
574
 
600
    right  = win->w;
575
    right  = win->w;
601
    bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
576
    bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
602
 
577
 
603
    printf("window width %d height %d\n",
578
    printf("window width %d height %d\n",
604
                    right, bottom);
579
                    right, bottom);
605
 
580
 
606
    render->win_state  = win->win_state;
581
    render->win_state  = win->win_state;
607
 
582
 
608
    draw_w = bottom*render->ctx_width/render->ctx_height;
583
    draw_w = bottom*render->ctx_width/render->ctx_height;
609
    draw_h = right*render->ctx_height/render->ctx_width;
584
    draw_h = right*render->ctx_height/render->ctx_width;
610
 
585
 
611
    if(draw_w > right)
586
    if(draw_w > right)
612
    {
587
    {
613
        draw_w = right;
588
        draw_w = right;
614
        draw_h = right*render->ctx_height/render->ctx_width;
589
        draw_h = right*render->ctx_height/render->ctx_width;
615
    };
590
    };
616
 
591
 
617
    if(draw_h > bottom)
592
    if(draw_h > bottom)
618
    {
593
    {
619
        draw_h = bottom;
594
        draw_h = bottom;
620
        draw_w = bottom*render->ctx_width/render->ctx_height;
595
        draw_w = bottom*render->ctx_width/render->ctx_height;
621
    };
596
    };
622
 
597
 
623
    render->win_width  = win->w;
598
    render->win_width  = win->w;
624
    render->win_height = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
599
    render->win_height = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
625
 
600
 
626
    render_set_size(render, draw_w, draw_h);
601
    render_set_size(render, draw_w, draw_h);
627
 
602
 
628
    pxCreateClient(0, CAPTION_HEIGHT, right, bottom);
603
    pxCreateClient(0, CAPTION_HEIGHT, right, bottom);
629
 
604
 
630
    if(render->caps==0)
605
    if(render->caps==0)
631
    {
606
    {
632
        render->bitmap[0] = pxCreateBitmap(draw_w, draw_h);
607
        render->bitmap[0] = pxCreateBitmap(draw_w, draw_h);
633
        if(render->bitmap[0] == NULL)
608
        if(render->bitmap[0] == NULL)
634
        {
609
        {
635
            free(render);
610
            free(render);
636
            return NULL;
611
            return NULL;
637
        }
612
        }
638
        render->draw = draw_sw_picture;
613
        render->draw = draw_sw_picture;
639
    }
614
    }
640
    else
615
    else
641
    {
616
    {
642
        int width, height;
617
        int width, height;
643
        int i;
618
        int i;
644
 
619
 
645
        if(render->caps & HW_TEX_BLIT)
620
        if(render->caps & HW_TEX_BLIT)
646
        {
621
        {
647
            width  = render->ctx_width;
622
            width  = render->ctx_width;
648
            height = render->ctx_height;
623
            height = render->ctx_height;
649
        }
624
        }
650
        else
625
        else
651
        {
626
        {
652
            width  = draw_w;
627
            width  = draw_w;
653
            height = draw_h;;
628
            height = draw_h;;
654
        }
629
        }
655
 
630
 
656
        for( i=0; i < 2; i++)
631
        for( i=0; i < 2; i++)
657
        {
632
        {
658
            render->bitmap[i] = pxCreateBitmap(width, height);
633
            render->bitmap[i] = pxCreateBitmap(width, height);
659
            if( render->bitmap[i] == NULL )
634
            if( render->bitmap[i] == NULL )
660
            {
635
            {
661
                player_state = CLOSED;
636
                player_state = CLOSED;
662
                free(render);
637
                free(render);
663
                return NULL;
638
                return NULL;
664
            };
639
            };
665
        }
640
        }
666
 
641
 
667
        render->state = INIT;
642
        render->state = INIT;
668
        render->target = 0;
643
        render->target = 0;
669
        render->draw   = draw_hw_picture;
644
        render->draw   = draw_hw_picture;
670
    };
645
    };
671
 
646
 
672
    printf("FPlay %s render engine: context %dx%d picture %dx%d\n",
647
    printf("FPlay %s render engine: context %dx%d picture %dx%d\n",
673
           render->caps & HW_TEX_BLIT ? "hw_tex_blit":
648
           render->caps & HW_TEX_BLIT ? "hw_tex_blit":
674
           render->caps & HW_BIT_BLIT ? "hw_bit_blit":"software",
649
           render->caps & HW_BIT_BLIT ? "hw_bit_blit":"software",
675
           render->ctx_width, render->ctx_height,
650
           render->ctx_width, render->ctx_height,
676
           draw_w, draw_h);
651
           draw_w, draw_h);
677
 
652
 
678
    return render;
653
    return render;
679
};
654
};
680
 
655
 
681
void destroy_render(render_t *render)
656
void destroy_render(render_t *render)
682
{
657
{
683
 
658
 
684
    pxDestroyBitmap(render->bitmap[0]);
659
    pxDestroyBitmap(render->bitmap[0]);
685
 
660
 
686
    if(render->caps & (HW_BIT_BLIT|HW_TEX_BLIT))          /* hw blitter */
661
    if(render->caps & (HW_BIT_BLIT|HW_TEX_BLIT))          /* hw blitter */
687
        pxDestroyBitmap(render->bitmap[1]);
662
        pxDestroyBitmap(render->bitmap[1]);
688
 
663
 
689
    pxFini();
664
    pxFini();
690
};
665
};
691
 
666
 
692
void render_set_size(render_t *render, int width, int height)
667
void render_set_size(render_t *render, int width, int height)
693
{
668
{
694
    int i;
669
    int i;
695
 
670
 
696
    render->layout = 0;
671
    render->layout = 0;
697
    render->rcvideo.l = 0;
672
    render->rcvideo.l = 0;
698
    render->rcvideo.t = 0;
673
    render->rcvideo.t = 0;
699
    render->rcvideo.r = width;
674
    render->rcvideo.r = width;
700
    render->rcvideo.b = height;
675
    render->rcvideo.b = height;
701
 
676
 
702
//    printf("render width %d height %d\n",width, height);
677
//    printf("render width %d height %d\n",width, height);
703
 
678
 
704
    if( render->win_height > height )
679
    if( render->win_height > height )
705
    {
680
    {
706
        int yoffs;
681
        int yoffs;
707
        yoffs = (render->win_height-height)/2;
682
        yoffs = (render->win_height-height)/2;
708
        if(yoffs)
683
        if(yoffs)
709
        {
684
        {
710
            render->rctop.t = 0;
685
            render->rctop.t = 0;
711
            render->rctop.b = yoffs;
686
            render->rctop.b = yoffs;
712
            render->rcvideo.t  = yoffs;
687
            render->rcvideo.t  = yoffs;
713
            render->layout |= HAS_TOP;
688
            render->layout |= HAS_TOP;
714
        }
689
        }
715
 
690
 
716
        yoffs = render->win_height-(render->rcvideo.t+render->rcvideo.b);
691
        yoffs = render->win_height-(render->rcvideo.t+render->rcvideo.b);
717
        if(yoffs)
692
        if(yoffs)
718
        {
693
        {
719
            render->rcbottom.t = render->rcvideo.t+render->rcvideo.b;
694
            render->rcbottom.t = render->rcvideo.t+render->rcvideo.b;
720
            render->rcbottom.b = yoffs;
695
            render->rcbottom.b = yoffs;
721
            render->layout |= HAS_BOTTOM;
696
            render->layout |= HAS_BOTTOM;
722
        }
697
        }
723
    }
698
    }
724
 
699
 
725
    if( render->win_width > width )
700
    if( render->win_width > width )
726
    {
701
    {
727
        int xoffs;
702
        int xoffs;
728
        xoffs = (render->win_width-width)/2;
703
        xoffs = (render->win_width-width)/2;
729
        if(xoffs)
704
        if(xoffs)
730
        {
705
        {
731
            render->rcleft.r  = xoffs;
706
            render->rcleft.r  = xoffs;
732
            render->rcvideo.l = xoffs;
707
            render->rcvideo.l = xoffs;
733
            render->layout |= HAS_LEFT;
708
            render->layout |= HAS_LEFT;
734
        }
709
        }
735
        xoffs = render->win_width-(render->rcvideo.l+render->rcvideo.r);
710
        xoffs = render->win_width-(render->rcvideo.l+render->rcvideo.r);
736
        if(xoffs)
711
        if(xoffs)
737
        {
712
        {
738
            render->rcright.l = render->rcvideo.l+render->rcvideo.r;
713
            render->rcright.l = render->rcvideo.l+render->rcvideo.r;
739
            render->rcright.r = xoffs;
714
            render->rcright.r = xoffs;
740
            render->layout |= HAS_RIGHT;
715
            render->layout |= HAS_RIGHT;
741
        }
716
        }
742
    };
717
    };
743
};
718
};
744
 
719
 
745
void render_adjust_size(render_t *render, window_t *win)
720
void render_adjust_size(render_t *render, window_t *win)
746
{
721
{
747
    uint32_t right, bottom, new_w, new_h;
722
    uint32_t right, bottom, new_w, new_h;
748
    uint32_t s, sw, sh;
723
    uint32_t s, sw, sh;
749
    uint8_t  state;
724
    uint8_t  state;
750
 
725
 
751
    right  = win->w;
726
    right  = win->w;
752
    bottom = win->h;
727
    bottom = win->h;
753
 
728
 
754
    if(win->win_state != FULLSCREEN)
729
    if(win->win_state != FULLSCREEN)
755
        bottom-= CAPTION_HEIGHT+PANEL_HEIGHT;
730
        bottom-= CAPTION_HEIGHT+PANEL_HEIGHT;
756
 
731
 
757
 //   printf("window width %d height %d\n",
732
 //   printf("window width %d height %d\n",
758
 //                   right, bottom);
733
 //                   right, bottom);
759
 
734
 
760
    render->win_state  = win->win_state;
735
    render->win_state  = win->win_state;
761
 
736
 
762
    if(render->win_state == MINIMIZED)
737
    if(render->win_state == MINIMIZED)
763
        return;
738
        return;
764
 
739
 
765
    if(render->win_state == ROLLED)
740
    if(render->win_state == ROLLED)
766
        return;
741
        return;
767
 
742
 
768
    if( right  == render->win_width &&
743
    if( right  == render->win_width &&
769
        bottom == render->win_height)
744
        bottom == render->win_height)
770
        return;
745
        return;
771
 
746
 
772
//    printf("%s r: %d b: %d\n", __FUNCTION__, right, bottom);
747
//    printf("%s r: %d b: %d\n", __FUNCTION__, right, bottom);
773
 
748
 
774
    new_w = bottom*render->ctx_width/render->ctx_height;
749
    new_w = bottom*render->ctx_width/render->ctx_height;
775
    new_h = right*render->ctx_height/render->ctx_width;
750
    new_h = right*render->ctx_height/render->ctx_width;
776
 
751
 
777
    if(new_w > right)
752
    if(new_w > right)
778
    {
753
    {
779
        new_w = right;
754
        new_w = right;
780
        new_h = right*render->ctx_height/render->ctx_width;
755
        new_h = right*render->ctx_height/render->ctx_width;
781
    };
756
    };
782
    if(new_h > bottom)
757
    if(new_h > bottom)
783
    {
758
    {
784
        new_h = bottom;
759
        new_h = bottom;
785
        new_w = bottom*render->ctx_width/render->ctx_height;
760
        new_w = bottom*render->ctx_width/render->ctx_height;
786
    };
761
    };
787
 
762
 
788
    render->win_width  = right;
763
    render->win_width  = right;
789
    render->win_height = bottom;
764
    render->win_height = bottom;
790
    render_set_size(render, new_w, new_h);
765
    render_set_size(render, new_w, new_h);
791
 
766
 
792
    if(render->caps & HW_TEX_BLIT)          /*  hw scaler  */
767
    if(render->caps & HW_TEX_BLIT)          /*  hw scaler  */
793
    {
768
    {
794
        if(render->win->win_state == FULLSCREEN)
769
        if(render->win->win_state == FULLSCREEN)
795
            pxResizeClient(render->rcvideo.l, render->rcvideo.t, new_w, new_h);
770
            pxResizeClient(render->rcvideo.l, render->rcvideo.t, new_w, new_h);
796
        else
771
        else
797
            pxResizeClient(render->rcvideo.l, render->rcvideo.t+CAPTION_HEIGHT, new_w, new_h);
772
            pxResizeClient(render->rcvideo.l, render->rcvideo.t+CAPTION_HEIGHT, new_w, new_h);
798
 
773
 
799
        return;
774
        return;
800
    };
775
    };
801
 
776
 
802
    pxResizeBitmap(render->bitmap[0], new_w, new_h);
777
    pxResizeBitmap(render->bitmap[0], new_w, new_h);
803
 
778
 
804
    if(render->caps & HW_BIT_BLIT)          /* hw blitter */
779
    if(render->caps & HW_BIT_BLIT)          /* hw blitter */
805
        pxResizeBitmap(render->bitmap[1], new_w, new_h);
780
        pxResizeBitmap(render->bitmap[1], new_w, new_h);
806
 
781
 
807
    return;
782
    return;
808
};
783
};
809
 
784
 
810
void draw_hw_picture(render_t *render, AVPicture *picture)
785
void draw_hw_picture(render_t *render, AVPicture *picture)
811
{
786
{
812
    int       dst_width;
787
    int       dst_width;
813
    int       dst_height;
788
    int       dst_height;
814
    bitmap_t *bitmap;
789
    bitmap_t *bitmap;
815
    uint8_t  *bitmap_data;
790
    uint8_t  *bitmap_data;
816
    uint32_t  bitmap_pitch;
791
    uint32_t  bitmap_pitch;
817
    uint8_t  *data[4];
792
    uint8_t  *data[4];
818
    int       linesize[4];
793
    int       linesize[4];
819
 
794
    enum AVPixelFormat format;
-
 
795
 
820
    if(render->win->win_state == MINIMIZED ||
796
    if(render->win->win_state == MINIMIZED ||
821
       render->win->win_state == ROLLED)
797
       render->win->win_state == ROLLED)
822
        return;
798
        return;
823
 
799
 
824
    if(render->caps & HW_TEX_BLIT)
800
    if(render->caps & HW_TEX_BLIT)
825
    {
801
    {
826
        dst_width  = render->ctx_width;
802
        dst_width  = render->ctx_width;
827
        dst_height = render->ctx_height;
803
        dst_height = render->ctx_height;
828
    }
804
    }
829
    else
805
    else
830
    {
806
    {
831
        dst_width  = render->rcvideo.r;
807
        dst_width  = render->rcvideo.r;
832
        dst_height = render->rcvideo.b;
808
        dst_height = render->rcvideo.b;
833
    };
809
    };
834
 
810
 
-
 
811
	format = render->vst->hwdec == 0 ? render->ctx_format : AV_PIX_FMT_BGRA
835
    cvt_ctx = sws_getCachedContext(cvt_ctx,
812
    cvt_ctx = sws_getCachedContext(cvt_ctx,
836
              render->ctx_width, render->ctx_height, render->ctx_format,
813
              render->ctx_width, render->ctx_height, format,
837
              dst_width, dst_height, AV_PIX_FMT_BGRA,
814
              dst_width, dst_height, AV_PIX_FMT_BGRA,
838
              SWS_FAST_BILINEAR, NULL, NULL, NULL);
815
              SWS_FAST_BILINEAR, NULL, NULL, NULL);
839
    if(cvt_ctx == NULL)
816
    if(cvt_ctx == NULL)
840
    {
817
    {
841
        printf("Cannot initialize the conversion context!\n");
818
        printf("Cannot initialize the conversion context!\n");
842
        return ;
819
        return ;
843
    };
820
    };
844
 
821
 
845
    bitmap = render->bitmap[render->target];
822
    bitmap = render->bitmap[render->target];
846
 
823
 
847
    bitmap_data = pxLockBitmap(bitmap, &bitmap_pitch);
824
    bitmap_data = pxLockBitmap(bitmap, &bitmap_pitch);
848
    if( bitmap_data == NULL)
825
    if( bitmap_data == NULL)
849
    {
826
    {
850
        printf("Cannot lock bitmap!\n");
827
        printf("Cannot lock bitmap!\n");
851
        return ;
828
        return ;
852
    }
829
    }
853
 
830
 
854
//    printf("sws_getCachedContext\n");
831
//    printf("sws_getCachedContext\n");
855
    data[0] = bitmap_data;
832
    data[0] = bitmap_data;
856
    data[1] = bitmap_data+1;
833
    data[1] = bitmap_data+1;
857
    data[2] = bitmap_data+2;
834
    data[2] = bitmap_data+2;
858
    data[3] = bitmap_data+3;
835
    data[3] = bitmap_data+3;
859
 
836
 
860
    linesize[0] = bitmap_pitch;
837
    linesize[0] = bitmap_pitch;
861
    linesize[1] = bitmap_pitch;
838
    linesize[1] = bitmap_pitch;
862
    linesize[2] = bitmap_pitch;
839
    linesize[2] = bitmap_pitch;
863
    linesize[3] = bitmap_pitch;
840
    linesize[3] = bitmap_pitch;
864
 
841
 
865
    sws_scale(cvt_ctx, (const uint8_t* const *)picture->data,
842
    sws_scale(cvt_ctx, (const uint8_t* const *)picture->data,
866
              picture->linesize, 0, render->ctx_height, data, linesize);
843
              picture->linesize, 0, render->ctx_height, data, linesize);
867
//    printf("sws_scale\n");
844
//    printf("sws_scale\n");
868
 
845
 
869
    mutex_lock(&render->vst->gpu_lock);
846
    mutex_lock(&render->vst->gpu_lock);
870
 
847
 
871
    if(render->caps & HW_TEX_BLIT)
848
    if(render->caps & HW_TEX_BLIT)
872
    {
849
    {
873
 
850
 
874
        if(render->win->win_state == FULLSCREEN)
851
        if(render->win->win_state == FULLSCREEN)
875
            pxBlitBitmap(bitmap,render->rcvideo.l,render->rcvideo.t,
852
            pxBlitBitmap(bitmap,render->rcvideo.l,render->rcvideo.t,
876
                 render->rcvideo.r, render->rcvideo.b,0,0);
853
                 render->rcvideo.r, render->rcvideo.b,0,0);
877
        else
854
        else
878
            pxBlitBitmap(bitmap, render->rcvideo.l,
855
            pxBlitBitmap(bitmap, render->rcvideo.l,
879
                    CAPTION_HEIGHT+render->rcvideo.t,
856
                    CAPTION_HEIGHT+render->rcvideo.t,
880
                    render->rcvideo.r, render->rcvideo.b,0,0);
857
                    render->rcvideo.r, render->rcvideo.b,0,0);
881
    }
858
    }
882
    else
859
    else
883
    {
860
    {
884
        if(render->win->win_state == FULLSCREEN)
861
        if(render->win->win_state == FULLSCREEN)
885
            pxBlitBitmap(bitmap,render->rcvideo.l,render->rcvideo.t,
862
            pxBlitBitmap(bitmap,render->rcvideo.l,render->rcvideo.t,
886
                    render->rcvideo.r, render->rcvideo.b, 0,0);
863
                    render->rcvideo.r, render->rcvideo.b, 0,0);
887
        else
864
        else
888
            pxBlitBitmap(bitmap, render->rcvideo.l,
865
            pxBlitBitmap(bitmap, render->rcvideo.l,
889
                    CAPTION_HEIGHT+render->rcvideo.t,
866
                    CAPTION_HEIGHT+render->rcvideo.t,
890
                    render->rcvideo.r, render->rcvideo.b, 0, 0);
867
                    render->rcvideo.r, render->rcvideo.b, 0, 0);
891
    };
868
    };
892
    mutex_unlock(&render->vst->gpu_lock);
869
    mutex_unlock(&render->vst->gpu_lock);
893
 
870
 
894
    render->last_bitmap = bitmap;
871
    render->last_bitmap = bitmap;
895
    render->target++;
872
    render->target++;
896
    render->target&= 1;
873
    render->target&= 1;
897
}
874
}
898
 
875
 
899
void draw_sw_picture(render_t *render, AVPicture *picture)
876
void draw_sw_picture(render_t *render, AVPicture *picture)
900
{
877
{
901
    uint8_t  *bitmap_data;
878
    uint8_t  *bitmap_data;
902
    uint32_t  bitmap_pitch;
879
    uint32_t  bitmap_pitch;
903
    uint8_t  *data[4];
880
    uint8_t  *data[4];
904
    int      linesize[4];
881
    int      linesize[4];
905
 
882
 
906
    if(render->win->win_state == MINIMIZED ||
883
    if(render->win->win_state == MINIMIZED ||
907
       render->win->win_state == ROLLED)
884
       render->win->win_state == ROLLED)
908
        return;
885
        return;
909
 
886
 
910
    cvt_ctx = sws_getCachedContext(cvt_ctx,
887
    cvt_ctx = sws_getCachedContext(cvt_ctx,
911
              render->ctx_width, render->ctx_height,
888
              render->ctx_width, render->ctx_height,
912
              render->ctx_format,
889
              render->ctx_format,
913
              render->rcvideo.r, render->rcvideo.b,
890
              render->rcvideo.r, render->rcvideo.b,
914
              AV_PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL);
891
              AV_PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL);
915
    if(cvt_ctx == NULL)
892
    if(cvt_ctx == NULL)
916
    {
893
    {
917
        printf("Cannot initialize the conversion context!\n");
894
        printf("Cannot initialize the conversion context!\n");
918
        return ;
895
        return ;
919
    }
896
    }
920
 
897
 
921
    bitmap_data = pxLockBitmap(render->bitmap[0],&bitmap_pitch);
898
    bitmap_data = pxLockBitmap(render->bitmap[0],&bitmap_pitch);
922
 
899
 
923
    data[0] = bitmap_data;
900
    data[0] = bitmap_data;
924
    data[1] = bitmap_data+1;
901
    data[1] = bitmap_data+1;
925
    data[2] = bitmap_data+2;
902
    data[2] = bitmap_data+2;
926
    data[3] = bitmap_data+3;
903
    data[3] = bitmap_data+3;
927
 
904
 
928
    linesize[0] = bitmap_pitch;
905
    linesize[0] = bitmap_pitch;
929
    linesize[1] = bitmap_pitch;
906
    linesize[1] = bitmap_pitch;
930
    linesize[2] = bitmap_pitch;
907
    linesize[2] = bitmap_pitch;
931
    linesize[3] = bitmap_pitch;
908
    linesize[3] = bitmap_pitch;
932
 
909
 
933
     sws_scale(cvt_ctx, (const uint8_t* const *)picture->data,
910
     sws_scale(cvt_ctx, (const uint8_t* const *)picture->data,
934
              picture->linesize, 0, render->ctx_height, data, linesize);
911
              picture->linesize, 0, render->ctx_height, data, linesize);
935
 
912
 
936
    if(render->win->win_state == FULLSCREEN)
913
    if(render->win->win_state == FULLSCREEN)
937
        pxBlitBitmap(render->bitmap[0],render->rcvideo.l,render->rcvideo.t,
914
        pxBlitBitmap(render->bitmap[0],render->rcvideo.l,render->rcvideo.t,
938
                 render->rcvideo.r, render->rcvideo.b,0,0);
915
                 render->rcvideo.r, render->rcvideo.b,0,0);
939
    else
916
    else
940
        pxBlitBitmap(render->bitmap[0], render->rcvideo.l,
917
        pxBlitBitmap(render->bitmap[0], render->rcvideo.l,
941
                 CAPTION_HEIGHT+render->rcvideo.t,
918
                 CAPTION_HEIGHT+render->rcvideo.t,
942
                 render->rcvideo.r, render->rcvideo.b,0,0);
919
                 render->rcvideo.r, render->rcvideo.b,0,0);
943
 
920
 
944
    render->last_bitmap = render->bitmap[0];
921
    render->last_bitmap = render->bitmap[0];
945
}
922
}
946
 
923
 
947
void render_draw_client(render_t *render)
924
void render_draw_client(render_t *render)
948
{
925
{
949
    vst_t *vst = render->vst;
926
    vst_t *vst = render->vst;
950
    int y;
927
    int y;
951
 
928
 
952
    if(render->win_state == MINIMIZED ||
929
    if(render->win_state == MINIMIZED ||
953
       render->win_state == ROLLED )
930
       render->win_state == ROLLED )
954
        return;
931
        return;
955
    if(render->win_state == FULLSCREEN)
932
    if(render->win_state == FULLSCREEN)
956
        y = 0;
933
        y = 0;
957
    else
934
    else
958
        y = CAPTION_HEIGHT;
935
        y = CAPTION_HEIGHT;
959
 
936
 
960
    if(player_state == PAUSE)
937
    if(player_state == PAUSE)
961
    {
938
    {
962
         if(frames[vst->vfx].ready == 1 )
939
         if(vst->vframe[vst->vfx].ready == 1 )
963
            main_render->draw(main_render, &frames[vst->vfx].picture);
940
            main_render->draw(main_render, &vst->vframe[vst->vfx].picture);
964
         else
941
         else
965
            draw_bar(0, y, render->win_width,
942
            draw_bar(0, y, render->win_width,
966
                 render->rcvideo.b, 0);
943
                 render->rcvideo.b, 0);
967
    }
944
    }
968
    else if( player_state == STOP )
945
    else if( player_state == STOP )
969
    {
946
    {
970
        draw_bar(0,y, render->win_width,
947
        draw_bar(0,y, render->win_width,
971
                 render->rcvideo.b, 0);
948
                 render->rcvideo.b, 0);
972
    };
949
    };
973
 
950
 
974
    if(render->layout & HAS_TOP)
951
    if(render->layout & HAS_TOP)
975
        draw_bar(0, y, render->win_width,
952
        draw_bar(0, y, render->win_width,
976
                 render->rctop.b, 0);
953
                 render->rctop.b, 0);
977
    if(render->layout & HAS_LEFT)
954
    if(render->layout & HAS_LEFT)
978
        draw_bar(0, render->rcvideo.t+y, render->rcleft.r,
955
        draw_bar(0, render->rcvideo.t+y, render->rcleft.r,
979
                 render->rcvideo.b, 0);
956
                 render->rcvideo.b, 0);
980
    if(render->layout & HAS_RIGHT)
957
    if(render->layout & HAS_RIGHT)
981
        draw_bar(render->rcright.l, render->rcvideo.t+y,
958
        draw_bar(render->rcright.l, render->rcvideo.t+y,
982
                 render->rcright.r, render->rcvideo.b, 0);
959
                 render->rcright.r, render->rcvideo.b, 0);
983
    if(render->layout & HAS_BOTTOM)
960
    if(render->layout & HAS_BOTTOM)
984
        draw_bar(0, render->rcbottom.t+y,
961
        draw_bar(0, render->rcbottom.t+y,
985
                 render->win_width, render->rcbottom.b, 0);
962
                 render->win_width, render->rcbottom.b, 0);
986
}
963
}
987
>
964
>