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