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