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