Subversion Repositories Kolibri OS

Rev

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

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