Subversion Repositories Kolibri OS

Rev

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

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