Mercurial > mplayer.hg
annotate libmenu/vf_menu.c @ 23510:a6c619ee9d30
Teletext support for tv:// (v4l and v4l2 only)
modified patch from Otvos Attila oattila at chello dot hu
Module uses zvbi library for all low-level VBI operations (like I/O with vbi
device, converting vbi pages into usefull vbi_page stuctures, rendering them
into RGB32 images).
All teletext related stuff (except properties, slave commands and rendering
osd in text mode or RGB32 rendered teletext pages in spu mode) is implemented
in tvi_vbi.c
New properties:
teletext_page - switching between pages
teletext_mode - switch between on/off/opaque/transparent modes
teletext_format - (currently read-only) allows to get format info
(black/white,gray,text)
teletext_half_page - trivial zooming (displaying top/bottom half of teletext
page)
New slave commands:
teletext_add_dec - user interface for jumping to any page by editing page number
interactively
teletext_go_link - goes though links, specified on current page
author | voroshil |
---|---|
date | Sun, 10 Jun 2007 00:06:12 +0000 |
parents | 973e53dc7df5 |
children | 8572d2ef5263 |
rev | line source |
---|---|
8197 | 1 |
16862 | 2 #include "config.h" |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
3 #include "mp_msg.h" |
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
4 #include "help_mp.h" |
8197 | 5 |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 #include <string.h> | |
9 | |
8623
440301fef3fe
Added/reordered #includes to silence warnings about "implicit declaration".
rathann
parents:
8251
diff
changeset
|
10 #ifdef HAVE_MALLOC_H |
440301fef3fe
Added/reordered #includes to silence warnings about "implicit declaration".
rathann
parents:
8251
diff
changeset
|
11 #include <malloc.h> |
440301fef3fe
Added/reordered #includes to silence warnings about "implicit declaration".
rathann
parents:
8251
diff
changeset
|
12 #endif |
8197 | 13 |
23338
2a66d95355f0
add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents:
22284
diff
changeset
|
14 #include "mplayer.h" |
16862 | 15 #include "mp_msg.h" |
8197 | 16 |
16862 | 17 #include "libmpcodecs/img_format.h" |
18 #include "libmpcodecs/mp_image.h" | |
19 #include "libmpcodecs/vf.h" | |
8197 | 20 |
16862 | 21 #include "libvo/fastmemcpy.h" |
22 #include "libvo/video_out.h" | |
23 #include "libvo/font_load.h" | |
24 #include "input/input.h" | |
25 #include "m_struct.h" | |
8197 | 26 #include "menu.h" |
22284 | 27 #include "access_mpcontext.h" |
8197 | 28 |
29 | |
30 static struct vf_priv_s* st_priv = NULL; | |
31 | |
32 static mp_image_t* pause_mpi = NULL; | |
33 static int go2pause = 0; | |
13344
0d96af97ec00
option to display menu at startup, patch by Aurelien Jacobs <aurel at gnuage.org>
faust3
parents:
10397
diff
changeset
|
34 /// if nonzero display menu at startup |
13528 | 35 int attribute_used menu_startup = 0; |
8197 | 36 |
37 struct vf_priv_s { | |
38 menu_t* root; | |
39 menu_t* current; | |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
40 int passthrough; |
8197 | 41 }; |
42 | |
17908 | 43 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts); |
8197 | 44 |
45 static mp_image_t* alloc_mpi(int w, int h, uint32_t fmt) { | |
46 mp_image_t* mpi = new_mp_image(w,h); | |
47 | |
48 mp_image_setfmt(mpi,fmt); | |
49 // IF09 - allocate space for 4. plane delta info - unused | |
50 if (mpi->imgfmt == IMGFMT_IF09) | |
51 { | |
52 mpi->planes[0]=memalign(64, mpi->bpp*mpi->width*(mpi->height+2)/8+ | |
53 mpi->chroma_width*mpi->chroma_height); | |
54 /* delta table, just for fun ;) */ | |
55 mpi->planes[3]=mpi->planes[0]+2*(mpi->chroma_width*mpi->chroma_height); | |
56 } | |
57 else | |
58 mpi->planes[0]=memalign(64, mpi->bpp*mpi->width*(mpi->height+2)/8); | |
59 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
60 // YV12/I420/YVU9/IF09. feel free to add other planar formats here... | |
61 if(!mpi->stride[0]) mpi->stride[0]=mpi->width; | |
62 if(!mpi->stride[1]) mpi->stride[1]=mpi->stride[2]=mpi->chroma_width; | |
63 if(mpi->flags&MP_IMGFLAG_SWAPPED){ | |
64 // I420/IYUV (Y,U,V) | |
65 mpi->planes[1]=mpi->planes[0]+mpi->width*mpi->height; | |
66 mpi->planes[2]=mpi->planes[1]+mpi->chroma_width*mpi->chroma_height; | |
67 } else { | |
68 // YV12,YVU9,IF09 (Y,V,U) | |
69 mpi->planes[2]=mpi->planes[0]+mpi->width*mpi->height; | |
70 mpi->planes[1]=mpi->planes[2]+mpi->chroma_width*mpi->chroma_height; | |
71 } | |
72 } else { | |
73 if(!mpi->stride[0]) mpi->stride[0]=mpi->width*mpi->bpp/8; | |
74 } | |
75 mpi->flags|=MP_IMGFLAG_ALLOCATED; | |
76 | |
77 return mpi; | |
78 } | |
79 | |
80 void vf_menu_pause_update(struct vf_instance_s* vf) { | |
22284 | 81 vo_functions_t *video_out = mpctx_get_video_out(vf->priv->current->ctx); |
8197 | 82 if(pause_mpi) { |
17908 | 83 put_image(vf,pause_mpi, MP_NOPTS_VALUE); |
8197 | 84 // Don't draw the osd atm |
85 //vf->control(vf,VFCTRL_DRAW_OSD,NULL); | |
86 video_out->flip_page(); | |
87 } | |
88 } | |
89 | |
90 static int cmd_filter(mp_cmd_t* cmd, int paused, struct vf_priv_s * priv) { | |
91 | |
92 switch(cmd->id) { | |
93 case MP_CMD_PAUSE : | |
21818 | 94 #if 0 // http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2003-March/017286.html |
8197 | 95 if(!paused && !go2pause) { // Initial pause cmd -> wait the next put_image |
96 go2pause = 1; | |
97 return 1; | |
98 } | |
9903
7d70e56f317a
10l fix by Vladimir Mosgalin <mosgalin@VM10124.spb.edu>
alex
parents:
9755
diff
changeset
|
99 #endif |
8197 | 100 if(go2pause == 2) // Msg resent by put_image after saving the image |
101 go2pause = 0; | |
102 break; | |
103 case MP_CMD_MENU : { // Convert txt cmd from the users into libmenu stuff | |
104 char* arg = cmd->args[0].v.s; | |
105 | |
19489 | 106 if(!priv->current->show && !(strcmp(arg,"hide") == 0) ) |
8197 | 107 priv->current->show = 1; |
108 else if(strcmp(arg,"up") == 0) | |
109 menu_read_cmd(priv->current,MENU_CMD_UP); | |
110 else if(strcmp(arg,"down") == 0) | |
111 menu_read_cmd(priv->current,MENU_CMD_DOWN); | |
17945
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
112 else if(strcmp(arg,"left") == 0) |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
113 menu_read_cmd(priv->current,MENU_CMD_LEFT); |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
114 else if(strcmp(arg,"right") == 0) |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
115 menu_read_cmd(priv->current,MENU_CMD_RIGHT); |
8197 | 116 else if(strcmp(arg,"ok") == 0) |
117 menu_read_cmd(priv->current,MENU_CMD_OK); | |
118 else if(strcmp(arg,"cancel") == 0) | |
119 menu_read_cmd(priv->current,MENU_CMD_CANCEL); | |
19489 | 120 else if(strcmp(arg,"hide") == 0 || strcmp(arg,"toggle") == 0) |
8197 | 121 priv->current->show = 0; |
122 else | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
123 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_UnknownMenuCommand,arg); |
8197 | 124 return 1; |
125 } | |
126 case MP_CMD_SET_MENU : { | |
127 char* menu = cmd->args[0].v.s; | |
128 menu_t* l = priv->current; | |
129 priv->current = menu_open(menu); | |
130 if(!priv->current) { | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
131 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_FailedToOpenMenu,menu); |
8197 | 132 priv->current = l; |
133 priv->current->show = 0; | |
134 } else { | |
135 priv->current->show = 1; | |
136 priv->current->parent = l; | |
137 } | |
138 return 1; | |
139 } | |
140 } | |
141 return 0; | |
142 } | |
143 | |
144 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){ | |
145 mp_image_t *dmpi; | |
146 | |
147 if(mpi->type == MP_IMGTYPE_TEMP && (!(mpi->flags&MP_IMGFLAG_PRESERVE)) ) { | |
148 dmpi = vf_get_image(vf->next,mpi->imgfmt,mpi->type, mpi->flags, mpi->w, mpi->h); | |
23458
973e53dc7df5
Do not use fast_memcpy for small size copy, esp. when the size is constant
reimar
parents:
23457
diff
changeset
|
149 memcpy(mpi->planes,dmpi->planes,MP_MAX_PLANES*sizeof(unsigned char*)); |
973e53dc7df5
Do not use fast_memcpy for small size copy, esp. when the size is constant
reimar
parents:
23457
diff
changeset
|
150 memcpy(mpi->stride,dmpi->stride,MP_MAX_PLANES*sizeof(unsigned int)); |
8197 | 151 mpi->flags|=MP_IMGFLAG_DIRECT; |
152 mpi->priv=(void*)dmpi; | |
153 return; | |
154 } | |
155 } | |
156 | |
157 static void key_cb(int code) { | |
158 menu_read_key(st_priv->current,code); | |
159 } | |
160 | |
161 | |
162 | |
163 inline static void copy_mpi(mp_image_t *dmpi, mp_image_t *mpi) { | |
164 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
165 memcpy_pic(dmpi->planes[0],mpi->planes[0], mpi->w, mpi->h, | |
166 dmpi->stride[0],mpi->stride[0]); | |
167 memcpy_pic(dmpi->planes[1],mpi->planes[1], mpi->chroma_width, mpi->chroma_height, | |
168 dmpi->stride[1],mpi->stride[1]); | |
169 memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->chroma_width, mpi->chroma_height, | |
170 dmpi->stride[2],mpi->stride[2]); | |
171 } else { | |
172 memcpy_pic(dmpi->planes[0],mpi->planes[0], | |
173 mpi->w*(dmpi->bpp/8), mpi->h, | |
174 dmpi->stride[0],mpi->stride[0]); | |
175 } | |
176 } | |
177 | |
178 | |
179 | |
17908 | 180 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
8197 | 181 mp_image_t *dmpi = NULL; |
182 | |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
183 if (vf->priv->passthrough) { |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
184 dmpi=vf_get_image(vf->next, IMGFMT_MPEGPES, MP_IMGTYPE_EXPORT, |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
185 0, mpi->w, mpi->h); |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
186 dmpi->planes[0]=mpi->planes[0]; |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
187 return vf_next_put_image(vf,dmpi, pts); |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
188 } |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
189 |
8251 | 190 if(vf->priv->current->show |
191 || (vf->priv->current->parent && vf->priv->current->parent->show)) { | |
8197 | 192 // Close all menu who requested it |
193 while(vf->priv->current->cl && vf->priv->current != vf->priv->root) { | |
194 menu_t* m = vf->priv->current; | |
195 vf->priv->current = m->parent ? m->parent : vf->priv->root; | |
196 menu_close(m); | |
197 } | |
198 | |
199 // Step 1 : save the picture | |
200 while(go2pause == 1) { | |
201 static char delay = 0; // Hack : wait the 2 frame to be sure to show the right picture | |
202 delay ^= 1; // after a seek | |
203 if(!delay) break; | |
204 | |
205 if(pause_mpi && (mpi->w != pause_mpi->w || mpi->h != pause_mpi->h || | |
206 mpi->imgfmt != pause_mpi->imgfmt)) { | |
207 free_mp_image(pause_mpi); | |
208 pause_mpi = NULL; | |
209 } | |
210 if(!pause_mpi) | |
211 pause_mpi = alloc_mpi(mpi->w,mpi->h,mpi->imgfmt); | |
212 copy_mpi(pause_mpi,mpi); | |
213 mp_input_queue_cmd(mp_input_parse_cmd("pause")); | |
214 go2pause = 2; | |
215 break; | |
216 } | |
217 | |
218 // Grab // Ungrab the keys | |
219 if(!mp_input_key_cb && vf->priv->current->show) | |
220 mp_input_key_cb = key_cb; | |
221 if(mp_input_key_cb && !vf->priv->current->show) | |
222 mp_input_key_cb = NULL; | |
223 | |
224 if(mpi->flags&MP_IMGFLAG_DIRECT) | |
225 dmpi = mpi->priv; | |
226 else { | |
227 dmpi = vf_get_image(vf->next,mpi->imgfmt, | |
228 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, | |
229 mpi->w,mpi->h); | |
230 copy_mpi(dmpi,mpi); | |
231 } | |
232 menu_draw(vf->priv->current,dmpi); | |
233 | |
8244
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
234 } else { |
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
235 if(mp_input_key_cb) |
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
236 mp_input_key_cb = NULL; |
21924
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
237 |
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
238 if(mpi->flags&MP_IMGFLAG_DIRECT) |
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
239 dmpi = mpi->priv; |
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
240 else { |
21925 | 241 dmpi = vf_get_image(vf->next,mpi->imgfmt, |
242 MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, | |
243 mpi->w,mpi->h); | |
8244
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
244 |
21925 | 245 dmpi->stride[0] = mpi->stride[0]; |
246 dmpi->stride[1] = mpi->stride[1]; | |
247 dmpi->stride[2] = mpi->stride[2]; | |
248 dmpi->planes[0] = mpi->planes[0]; | |
249 dmpi->planes[1] = mpi->planes[1]; | |
250 dmpi->planes[2] = mpi->planes[2]; | |
251 dmpi->priv = mpi->priv; | |
252 } | |
21924
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
253 } |
17908 | 254 return vf_next_put_image(vf,dmpi, pts); |
8197 | 255 } |
256 | |
257 static void uninit(vf_instance_t *vf) { | |
258 vf->priv=NULL; | |
259 if(pause_mpi) { | |
260 free_mp_image(pause_mpi); | |
261 pause_mpi = NULL; | |
262 } | |
263 } | |
264 | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
265 static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
266 unsigned int flags, unsigned int outfmt) { |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
267 #ifdef HAVE_FREETYPE |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
268 // here is the right place to get screen dimensions |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
269 if (force_load_font) { |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
270 force_load_font = 0; |
23338
2a66d95355f0
add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents:
22284
diff
changeset
|
271 load_font_ft(width,height,&vo_font,font_name); |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
272 } |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
273 #endif |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
274 if(outfmt == IMGFMT_MPEGPES) |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
275 vf->priv->passthrough = 1; |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
276 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
277 } |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
278 |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
279 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
280 return (vf_next_query_format(vf,fmt)); |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
281 } |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
282 |
23366
b344b6520518
rename some menu open functions, to avoid confusion with libc native open()
ben
parents:
23338
diff
changeset
|
283 static int open_vf(vf_instance_t *vf, char* args){ |
8197 | 284 if(!st_priv) { |
285 st_priv = calloc(1,sizeof(struct vf_priv_s)); | |
286 st_priv->root = st_priv->current = menu_open(args); | |
287 if(!st_priv->current) { | |
288 free(st_priv); | |
289 st_priv = NULL; | |
290 return 0; | |
291 } | |
13344
0d96af97ec00
option to display menu at startup, patch by Aurelien Jacobs <aurel at gnuage.org>
faust3
parents:
10397
diff
changeset
|
292 st_priv->root->show = menu_startup; |
8197 | 293 mp_input_add_cmd_filter((mp_input_cmd_filter)cmd_filter,st_priv); |
294 } | |
295 | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
296 vf->config = config; |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
297 vf->query_format=query_format; |
8197 | 298 vf->put_image = put_image; |
299 vf->get_image = get_image; | |
300 vf->uninit=uninit; | |
301 vf->priv=st_priv; | |
302 go2pause=0; | |
303 | |
304 return 1; | |
305 } | |
306 | |
307 | |
308 vf_info_t vf_info_menu = { | |
309 "Internal filter for libmenu", | |
310 "menu", | |
311 "Albeu", | |
312 "", | |
23366
b344b6520518
rename some menu open functions, to avoid confusion with libc native open()
ben
parents:
23338
diff
changeset
|
313 open_vf, |
9755 | 314 NULL |
8197 | 315 }; |
316 | |
317 | |
318 |