Mercurial > mplayer.hg
annotate libmenu/vf_menu.c @ 34355:316f6edb49de
Avoid double conversion from utf16/ucs2 to utf8 for text subtitles.
There is code that auto-detects utf16 encoding of the subtitle stream
and forces the reading functions to convert it to native utf8.
The bug happens when using enca to (correctly) guess that the input
file has ucs2 encoding and tries to convert the input stream to utf8, again.
In my case iconv did not accept the input and discarded the subtitles
completely.
author | iive |
---|---|
date | Wed, 14 Dec 2011 00:17:49 +0000 |
parents | fbe5c829c69b |
children | 4c7ab9a4f3cd |
rev | line source |
---|---|
28113 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
8197 | 18 |
16862 | 19 #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
|
20 #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
|
21 #include "help_mp.h" |
8197 | 22 |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <string.h> | |
26 | |
32043
f6249bc89c38
Move extern declarations used by both mplayer.c and mencoder.c to mpcommon.h.
diego
parents:
32025
diff
changeset
|
27 #include "mpcommon.h" |
16862 | 28 #include "mp_msg.h" |
8197 | 29 |
16862 | 30 #include "libmpcodecs/img_format.h" |
31 #include "libmpcodecs/mp_image.h" | |
32 #include "libmpcodecs/vf.h" | |
8197 | 33 |
16862 | 34 #include "libvo/fastmemcpy.h" |
35 #include "libvo/video_out.h" | |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32043
diff
changeset
|
36 #include "sub/font_load.h" |
32467 | 37 #include "sub/sub.h" |
16862 | 38 #include "input/input.h" |
39 #include "m_struct.h" | |
8197 | 40 #include "menu.h" |
22284 | 41 #include "access_mpcontext.h" |
8197 | 42 |
43 | |
44 static struct vf_priv_s* st_priv = NULL; | |
45 | |
46 static mp_image_t* pause_mpi = NULL; | |
47 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
|
48 /// if nonzero display menu at startup |
27746
38fbba4327fa
Remove pointless attribute_used from variable declaration.
diego
parents:
27393
diff
changeset
|
49 int menu_startup = 0; |
8197 | 50 |
51 struct vf_priv_s { | |
52 menu_t* root; | |
53 menu_t* current; | |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
54 int passthrough; |
8197 | 55 }; |
56 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30633
diff
changeset
|
57 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts); |
8197 | 58 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30633
diff
changeset
|
59 void vf_menu_pause_update(struct vf_instance *vf) { |
25219
e82ecde2cbd4
Mark several uses of vo_functions_t as const to stop some of the current
reimar
parents:
25026
diff
changeset
|
60 const vo_functions_t *video_out = mpctx_get_video_out(vf->priv->current->ctx); |
8197 | 61 if(pause_mpi) { |
17908 | 62 put_image(vf,pause_mpi, MP_NOPTS_VALUE); |
8197 | 63 // Don't draw the osd atm |
64 //vf->control(vf,VFCTRL_DRAW_OSD,NULL); | |
65 video_out->flip_page(); | |
66 } | |
67 } | |
68 | |
69 static int cmd_filter(mp_cmd_t* cmd, int paused, struct vf_priv_s * priv) { | |
70 | |
71 switch(cmd->id) { | |
72 case MP_CMD_MENU : { // Convert txt cmd from the users into libmenu stuff | |
73 char* arg = cmd->args[0].v.s; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29087
diff
changeset
|
74 |
25496 | 75 if (!priv->current->show && strcmp(arg,"hide")) |
8197 | 76 priv->current->show = 1; |
77 else if(strcmp(arg,"up") == 0) | |
78 menu_read_cmd(priv->current,MENU_CMD_UP); | |
79 else if(strcmp(arg,"down") == 0) | |
80 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
|
81 else if(strcmp(arg,"left") == 0) |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
82 menu_read_cmd(priv->current,MENU_CMD_LEFT); |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
83 else if(strcmp(arg,"right") == 0) |
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
17908
diff
changeset
|
84 menu_read_cmd(priv->current,MENU_CMD_RIGHT); |
8197 | 85 else if(strcmp(arg,"ok") == 0) |
86 menu_read_cmd(priv->current,MENU_CMD_OK); | |
87 else if(strcmp(arg,"cancel") == 0) | |
88 menu_read_cmd(priv->current,MENU_CMD_CANCEL); | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
89 else if(strcmp(arg,"home") == 0) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
90 menu_read_cmd(priv->current,MENU_CMD_HOME); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
91 else if(strcmp(arg,"end") == 0) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
92 menu_read_cmd(priv->current,MENU_CMD_END); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
93 else if(strcmp(arg,"pageup") == 0) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
94 menu_read_cmd(priv->current,MENU_CMD_PAGE_UP); |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
95 else if(strcmp(arg,"pagedown") == 0) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
25219
diff
changeset
|
96 menu_read_cmd(priv->current,MENU_CMD_PAGE_DOWN); |
25461 | 97 else if(strcmp(arg,"click") == 0) |
98 menu_read_cmd(priv->current,MENU_CMD_CLICK); | |
19489 | 99 else if(strcmp(arg,"hide") == 0 || strcmp(arg,"toggle") == 0) |
8197 | 100 priv->current->show = 0; |
101 else | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17945
diff
changeset
|
102 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_UnknownMenuCommand,arg); |
8197 | 103 return 1; |
104 } | |
105 case MP_CMD_SET_MENU : { | |
106 char* menu = cmd->args[0].v.s; | |
107 menu_t* l = priv->current; | |
108 priv->current = menu_open(menu); | |
109 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
|
110 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_FailedToOpenMenu,menu); |
8197 | 111 priv->current = l; |
112 priv->current->show = 0; | |
113 } else { | |
114 priv->current->show = 1; | |
115 priv->current->parent = l; | |
116 } | |
117 return 1; | |
118 } | |
119 } | |
120 return 0; | |
121 } | |
122 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30633
diff
changeset
|
123 static void get_image(struct vf_instance *vf, mp_image_t *mpi){ |
8197 | 124 mp_image_t *dmpi; |
125 | |
126 if(mpi->type == MP_IMGTYPE_TEMP && (!(mpi->flags&MP_IMGFLAG_PRESERVE)) ) { | |
127 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
|
128 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
|
129 memcpy(mpi->stride,dmpi->stride,MP_MAX_PLANES*sizeof(unsigned int)); |
8197 | 130 mpi->flags|=MP_IMGFLAG_DIRECT; |
131 mpi->priv=(void*)dmpi; | |
132 return; | |
133 } | |
134 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29087
diff
changeset
|
135 |
25502
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25496
diff
changeset
|
136 static int key_cb(int code) { |
605d4e3e403f
From now on, libmenu does not steal all input keys from input modules.
ulion
parents:
25496
diff
changeset
|
137 return menu_read_key(st_priv->current,code); |
8197 | 138 } |
139 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30633
diff
changeset
|
140 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ |
8197 | 141 mp_image_t *dmpi = NULL; |
142 | |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
143 if (vf->priv->passthrough) { |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
144 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
|
145 0, mpi->w, mpi->h); |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
146 dmpi->planes[0]=mpi->planes[0]; |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
147 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
|
148 } |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
149 |
8197 | 150 // Close all menu who requested it |
151 while(vf->priv->current->cl && vf->priv->current != vf->priv->root) { | |
152 menu_t* m = vf->priv->current; | |
153 vf->priv->current = m->parent ? m->parent : vf->priv->root; | |
154 menu_close(m); | |
155 } | |
156 | |
25026
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
157 // Try to capture the last frame before pause, or fallback to use |
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
158 // last captured frame. |
8197 | 159 if(pause_mpi && (mpi->w != pause_mpi->w || mpi->h != pause_mpi->h || |
160 mpi->imgfmt != pause_mpi->imgfmt)) { | |
161 free_mp_image(pause_mpi); | |
162 pause_mpi = NULL; | |
163 } | |
25026
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
164 if (!pause_mpi) { |
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
165 pause_mpi = alloc_mpi(mpi->w,mpi->h,mpi->imgfmt); |
8197 | 166 copy_mpi(pause_mpi,mpi); |
167 } | |
25026
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
168 else if (mpctx_get_osd_function(vf->priv->root->ctx) == OSD_PAUSE) |
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
169 copy_mpi(pause_mpi,mpi); |
8197 | 170 |
25026
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
171 if (vf->priv->current->show) { |
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
172 if (!mp_input_key_cb) |
afead6ecb8ba
Remove the pause filter and the cmd queue hack, to know the mplayer going to
ulion
parents:
24960
diff
changeset
|
173 mp_input_key_cb = key_cb; |
8197 | 174 |
175 if(mpi->flags&MP_IMGFLAG_DIRECT) | |
176 dmpi = mpi->priv; | |
177 else { | |
178 dmpi = vf_get_image(vf->next,mpi->imgfmt, | |
179 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, | |
180 mpi->w,mpi->h); | |
181 copy_mpi(dmpi,mpi); | |
182 } | |
183 menu_draw(vf->priv->current,dmpi); | |
184 | |
8244
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
185 } else { |
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
186 if(mp_input_key_cb) |
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
187 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
|
188 |
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
189 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
|
190 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
|
191 else { |
21925 | 192 dmpi = vf_get_image(vf->next,mpi->imgfmt, |
193 MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, | |
194 mpi->w,mpi->h); | |
8244
64352fb332b6
don't fully-copy the planes if the menu doesn't show (faster)
colin
parents:
8224
diff
changeset
|
195 |
21925 | 196 dmpi->stride[0] = mpi->stride[0]; |
197 dmpi->stride[1] = mpi->stride[1]; | |
198 dmpi->stride[2] = mpi->stride[2]; | |
199 dmpi->planes[0] = mpi->planes[0]; | |
200 dmpi->planes[1] = mpi->planes[1]; | |
201 dmpi->planes[2] = mpi->planes[2]; | |
202 dmpi->priv = mpi->priv; | |
203 } | |
21924
422eef67d14a
speeds up mplayer execution by over FIVE times when all of the of the following apply:
gpoirier
parents:
21818
diff
changeset
|
204 } |
17908 | 205 return vf_next_put_image(vf,dmpi, pts); |
8197 | 206 } |
207 | |
208 static void uninit(vf_instance_t *vf) { | |
209 vf->priv=NULL; | |
210 if(pause_mpi) { | |
211 free_mp_image(pause_mpi); | |
212 pause_mpi = NULL; | |
213 } | |
214 } | |
215 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30633
diff
changeset
|
216 static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29087
diff
changeset
|
217 unsigned int flags, unsigned int outfmt) { |
27393 | 218 #ifdef CONFIG_FREETYPE |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
219 // 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
|
220 if (force_load_font) { |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
221 force_load_font = 0; |
25851
9ebd00825df2
Allow independent scaling of vo_font and sub_font.
reimar
parents:
25502
diff
changeset
|
222 load_font_ft(width,height,&vo_font,font_name,osd_font_scale_factor); |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
223 } |
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
224 #endif |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
225 if(outfmt == IMGFMT_MPEGPES) |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
226 vf->priv->passthrough = 1; |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
227 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
|
228 } |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
229 |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30633
diff
changeset
|
230 static int query_format(struct vf_instance *vf, unsigned int fmt){ |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25851
diff
changeset
|
231 return vf_next_query_format(vf,fmt); |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
232 } |
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
233 |
23366
b344b6520518
rename some menu open functions, to avoid confusion with libc native open()
ben
parents:
23338
diff
changeset
|
234 static int open_vf(vf_instance_t *vf, char* args){ |
8197 | 235 if(!st_priv) { |
236 st_priv = calloc(1,sizeof(struct vf_priv_s)); | |
237 st_priv->root = st_priv->current = menu_open(args); | |
238 if(!st_priv->current) { | |
239 free(st_priv); | |
240 st_priv = NULL; | |
241 return 0; | |
242 } | |
13344
0d96af97ec00
option to display menu at startup, patch by Aurelien Jacobs <aurel at gnuage.org>
faust3
parents:
10397
diff
changeset
|
243 st_priv->root->show = menu_startup; |
8197 | 244 mp_input_add_cmd_filter((mp_input_cmd_filter)cmd_filter,st_priv); |
245 } | |
246 | |
8224
fefc56153615
Fix freetype. Freetype is highly recommended for a nice output ;)
albeu
parents:
8197
diff
changeset
|
247 vf->config = config; |
21803
3acc4b00bcc6
allows OSD menu to be displayed when using MPEG PES video out
ben
parents:
19489
diff
changeset
|
248 vf->query_format=query_format; |
8197 | 249 vf->put_image = put_image; |
250 vf->get_image = get_image; | |
251 vf->uninit=uninit; | |
252 vf->priv=st_priv; | |
253 go2pause=0; | |
254 | |
255 return 1; | |
256 } | |
257 | |
258 | |
32025 | 259 const vf_info_t vf_info_menu = { |
8197 | 260 "Internal filter for libmenu", |
261 "menu", | |
262 "Albeu", | |
263 "", | |
23366
b344b6520518
rename some menu open functions, to avoid confusion with libc native open()
ben
parents:
23338
diff
changeset
|
264 open_vf, |
9755 | 265 NULL |
8197 | 266 }; |