Mercurial > mplayer.hg
annotate libmenu/menu_chapsel.c @ 36782:06344efeded3
configure: improve FFmpeg check.
If internal FFmpeg is not available we should fall back to
external automatically instead of trying to build without
(which is currently broken it seems).
Also we can compile without internal copy as long as the
necessary headers can be found.
Two are required that FFmpeg does not install:
libavformat/internal.h
libavutil/x86/asm.h
author | reimar |
---|---|
date | Mon, 17 Feb 2014 23:25:32 +0000 |
parents | b28f3ff37ae7 |
children |
rev | line source |
---|---|
25364 | 1 /* |
2 * Support chapter list and selection. | |
3 * | |
4 * Copyright (C) 2006-2007 Benjamin Zores <ben A geexbox P org> | |
5 * Copyright (C) 2007 Ulion <ulion A gmail P com> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
25499
diff
changeset
|
19 * You should have received a copy of the GNU General Public License along |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
25499
diff
changeset
|
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
25499
diff
changeset
|
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
25364 | 22 */ |
23 | |
24 #include <stdlib.h> | |
25 #include <stdio.h> | |
26 #include <string.h> | |
27 | |
36582
b28f3ff37ae7
Use av_unused for unused arguments instead of various hacks.
reimar
parents:
35282
diff
changeset
|
28 #include "libavutil/attributes.h" |
b28f3ff37ae7
Use av_unused for unused arguments instead of various hacks.
reimar
parents:
35282
diff
changeset
|
29 |
25364 | 30 #include "config.h" |
31 | |
32 #include "m_struct.h" | |
33 #include "m_option.h" | |
34 #include "input/input.h" | |
35 | |
36 #include "stream/stream.h" | |
37 #include "libmpdemux/demuxer.h" | |
38 #include "access_mpcontext.h" | |
39 | |
40 #include "libmpcodecs/mp_image.h" | |
41 | |
42 #include "menu.h" | |
43 #include "menu_list.h" | |
44 | |
45 struct list_entry_s { | |
46 struct list_entry p; | |
47 int cid; | |
48 }; | |
49 | |
50 struct menu_priv_s { | |
51 menu_list_priv_t p; | |
52 char* title; | |
53 int auto_close; | |
54 char* fmt_with_time; | |
55 }; | |
56 | |
57 static struct menu_priv_s cfg_dflt = { | |
58 MENU_LIST_PRIV_DFLT, | |
59 "Select chapter", | |
60 0, | |
61 "${chapter_name} [${start}]" | |
62 }; | |
63 | |
64 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m) | |
65 | |
30957 | 66 static const m_option_t cfg_fields[] = { |
25364 | 67 MENU_LIST_PRIV_FIELDS, |
68 { "title", ST_OFF (title), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
69 { "auto-close", ST_OFF (auto_close), CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
25499 | 70 { "fmt-with-time", ST_OFF (fmt_with_time), CONF_TYPE_STRING, 0, 0, 0, NULL }, |
25364 | 71 { NULL, NULL, NULL, 0, 0, 0, NULL } |
72 }; | |
73 | |
74 static char *fmt_replace(const char *fmt, const char *chapter_name, | |
75 const char *start) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26743
diff
changeset
|
76 static const char ctag[] = "${chapter_name}"; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26743
diff
changeset
|
77 static const char stag[] = "${start}"; |
25364 | 78 int l = strlen(fmt); |
79 int cl = strlen(chapter_name); | |
80 int sl = strlen(start); | |
35282
38a5d56c389c
Fix allocation that could in theory be too small for the terminating NULL.
reimar
parents:
30957
diff
changeset
|
81 char *str = malloc(l + cl + sl + 1); |
25364 | 82 char *p; |
83 strcpy(str, fmt); | |
84 p = strstr(str, ctag); | |
85 if (p) { | |
86 memmove(p+cl, p+sizeof(ctag)-1, str+l+1 - (p+sizeof(ctag)-1)); | |
87 memcpy(p, chapter_name, cl); | |
88 l -= sizeof(ctag) + 1; | |
89 l += cl; | |
90 } | |
91 p = strstr(str, stag); | |
92 if (p) { | |
93 memmove(p+sl, p+sizeof(stag)-1, str+l+1 - (p+sizeof(stag)-1)); | |
94 memcpy(p, start, sl); | |
95 l -= sizeof(stag) + 1; | |
96 l += sl; | |
97 } | |
98 return str; | |
99 } | |
100 | |
101 static int fill_menu (menu_t* menu) | |
102 { | |
103 list_entry_t* e; | |
104 int cid, chapter_num = 0; | |
105 int start_time; | |
106 demuxer_t* demuxer = mpctx_get_demuxer(menu->ctx); | |
107 | |
108 if (demuxer) | |
109 chapter_num = demuxer_chapter_count(demuxer); | |
110 if (chapter_num > 0) { | |
111 menu_list_init (menu); | |
112 for (cid = 0; cid < chapter_num; ++cid) | |
113 if ((e = calloc (1, sizeof (list_entry_t))) != NULL) { | |
114 e->cid = cid + 1; | |
115 e->p.next = NULL; | |
116 e->p.txt = demuxer_chapter_display_name(demuxer, cid); | |
117 start_time = demuxer_chapter_time(demuxer, cid, NULL); | |
118 if (start_time >= 0) { | |
119 char timestr[13]; | |
120 char *tmp; | |
121 int hour = start_time / 3600; | |
122 int minute = (start_time / 60) % 60; | |
123 int seconds = start_time % 60; | |
124 sprintf(timestr,"%02d:%02d:%02d", hour, minute, seconds); | |
125 | |
126 tmp = fmt_replace(menu->priv->fmt_with_time, e->p.txt, timestr); | |
127 free(e->p.txt); | |
128 e->p.txt = tmp; | |
129 } | |
130 menu_list_add_entry(menu, e); | |
131 } | |
132 } | |
133 else | |
134 menu_list_read_cmd(menu, MENU_CMD_CANCEL); | |
135 | |
136 return 1; | |
137 } | |
138 | |
139 static void read_cmd (menu_t* menu, int cmd) | |
140 { | |
141 switch (cmd) { | |
142 case MENU_CMD_RIGHT: | |
143 case MENU_CMD_OK: { | |
144 char cmdbuf[26]; | |
145 sprintf(cmdbuf, "seek_chapter %d 1", menu->priv->p.current->cid); | |
146 mp_input_queue_cmd(mp_input_parse_cmd(cmdbuf)); | |
147 if (menu->priv->auto_close) | |
148 mp_input_queue_cmd(mp_input_parse_cmd("menu hide")); | |
149 break; | |
150 } | |
151 default: | |
152 menu_list_read_cmd (menu, cmd); | |
153 } | |
154 } | |
155 | |
156 static void close_cs (menu_t* menu) | |
157 { | |
158 menu_list_uninit (menu, NULL); | |
159 } | |
160 | |
36582
b28f3ff37ae7
Use av_unused for unused arguments instead of various hacks.
reimar
parents:
35282
diff
changeset
|
161 static int open_cs (menu_t* menu, char* av_unused args) |
25364 | 162 { |
163 menu->draw = menu_list_draw; | |
164 menu->read_cmd = read_cmd; | |
165 menu->close = close_cs; | |
166 menu->priv->p.title = menu->priv->title; | |
167 | |
168 return fill_menu (menu); | |
169 } | |
170 | |
171 const menu_info_t menu_info_chapsel = { | |
172 "Chapter selector menu", | |
173 "chapsel", | |
174 "Benjamin Zores & Ulion", | |
175 "", | |
176 { | |
177 "chapsel_cfg", | |
178 sizeof(struct menu_priv_s), | |
179 &cfg_dflt, | |
180 cfg_fields | |
181 }, | |
182 open_cs | |
183 }; |