Subversion Repositories Kolibri OS

Rev

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

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