Subversion Repositories Kolibri OS

Rev

Rev 3292 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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