Subversion Repositories Kolibri OS

Rev

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

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