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