Mercurial > mplayer.hg
annotate mpcommon.c @ 31597:1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
changing subtitle delay to work better with vobsubs.
This probably breaks vobsub behaviour with timestamp wrapping though.
author | reimar |
---|---|
date | Sat, 10 Jul 2010 12:53:05 +0000 |
parents | 631f813874f0 |
children | cafeb7863de8 |
rev | line source |
---|---|
30429
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
1 /* |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
2 * This file is part of MPlayer. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
3 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
7 * (at your option) any later version. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
8 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
12 * GNU General Public License for more details. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
13 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
17 */ |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30025
diff
changeset
|
18 |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
19 #include <stdlib.h> |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
20 #include "stream/stream.h" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
21 #include "libmpdemux/demuxer.h" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
22 #include "libmpdemux/stheader.h" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
23 #include "mplayer.h" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
24 #include "libvo/sub.h" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
25 #include "libvo/video_out.h" |
28325 | 26 #include "cpudetect.h" |
27 #include "help_mp.h" | |
28 #include "mp_msg.h" | |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
29 #include "spudec.h" |
28325 | 30 #include "version.h" |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
31 #include "vobsub.h" |
29759
d287e2785570
Move teletext specific code from stream into libmpcodecs.
cehoyos
parents:
29670
diff
changeset
|
32 #include "libmpcodecs/dec_teletext.h" |
25855
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
33 #include "libavutil/intreadwrite.h" |
26416 | 34 #include "m_option.h" |
29666
ca2030774a61
Include mpcommon.h in mpcommon.c, ensures that the declarations in the header
reimar
parents:
29665
diff
changeset
|
35 #include "mpcommon.h" |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
36 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
37 double sub_last_pts = -303; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
38 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
39 #ifdef CONFIG_ASS |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
40 #include "libass/ass_mp.h" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
41 ass_track_t* ass_track = 0; // current track to render |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
42 #endif |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
43 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
44 sub_data* subdata = NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
45 subtitle* vo_sub_last = NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
46 |
31511
13ca93203358
Factorize MPlayer/MEncoder version string handling.
diego
parents:
30992
diff
changeset
|
47 const char *mencoder_version = "MEncoder VERSION"; |
13ca93203358
Factorize MPlayer/MEncoder version string handling.
diego
parents:
30992
diff
changeset
|
48 const char *mplayer_version = "MPlayer VERSION"; |
28325 | 49 |
50 void print_version(const char* name) | |
51 { | |
52 mp_msg(MSGT_CPLAYER, MSGL_INFO, MP_TITLE, name); | |
53 | |
54 /* Test for CPU capabilities (and corresponding OS support) for optimizing */ | |
55 GetCpuCaps(&gCpuCaps); | |
56 #if ARCH_X86 | |
57 mp_msg(MSGT_CPLAYER, MSGL_V, | |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
58 "CPUflags: MMX: %d MMX2: %d 3DNow: %d 3DNowExt: %d SSE: %d SSE2: %d SSSE3: %d\n", |
28325 | 59 gCpuCaps.hasMMX, gCpuCaps.hasMMX2, |
60 gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, | |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
61 gCpuCaps.hasSSE, gCpuCaps.hasSSE2, gCpuCaps.hasSSSE3); |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
28340
diff
changeset
|
62 #if CONFIG_RUNTIME_CPUDETECT |
28325 | 63 mp_msg(MSGT_CPLAYER,MSGL_V, MSGTR_CompiledWithRuntimeDetection); |
64 #else | |
65 mp_msg(MSGT_CPLAYER,MSGL_V, MSGTR_CompiledWithCPUExtensions); | |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
66 if (HAVE_MMX) |
28325 | 67 mp_msg(MSGT_CPLAYER,MSGL_V," MMX"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
68 if (HAVE_MMX2) |
28325 | 69 mp_msg(MSGT_CPLAYER,MSGL_V," MMX2"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
70 if (HAVE_AMD3DNOW) |
28325 | 71 mp_msg(MSGT_CPLAYER,MSGL_V," 3DNow"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
72 if (HAVE_AMD3DNOWEXT) |
28330 | 73 mp_msg(MSGT_CPLAYER,MSGL_V," 3DNowExt"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
74 if (HAVE_SSE) |
28325 | 75 mp_msg(MSGT_CPLAYER,MSGL_V," SSE"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
76 if (HAVE_SSE2) |
28325 | 77 mp_msg(MSGT_CPLAYER,MSGL_V," SSE2"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
78 if (HAVE_SSSE3) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
79 mp_msg(MSGT_CPLAYER,MSGL_V," SSSE3"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
80 if (HAVE_CMOV) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
81 mp_msg(MSGT_CPLAYER,MSGL_V," CMOV"); |
28325 | 82 mp_msg(MSGT_CPLAYER,MSGL_V,"\n"); |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
28340
diff
changeset
|
83 #endif /* CONFIG_RUNTIME_CPUDETECT */ |
28325 | 84 #endif /* ARCH_X86 */ |
85 } | |
86 | |
87 | |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
88 void update_subtitles(sh_video_t *sh_video, double refpts, demux_stream_t *d_dvdsub, int reset) |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
89 { |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
90 double curpts = refpts - sub_delay; |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
91 unsigned char *packet=NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
92 int len; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
93 char type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v'; |
31559
631f813874f0
Factor out a large conditional, hopefully making it easier to
reimar
parents:
31558
diff
changeset
|
94 int text_sub = type == 't' || type == 'm' || type == 'a' || type == 'd'; |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
95 static subtitle subs; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
96 if (reset) { |
25604 | 97 sub_clear_text(&subs, MP_NOPTS_VALUE); |
98 if (vo_sub) { | |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
99 set_osd_subtitle(NULL); |
25604 | 100 } |
101 if (vo_spudec) { | |
102 spudec_reset(vo_spudec); | |
103 vo_osd_changed(OSDTYPE_SPU); | |
104 } | |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
105 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
106 // find sub |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
107 if (subdata) { |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
108 if (sub_fps==0) sub_fps = sh_video ? sh_video->fps : 25; |
25604 | 109 current_module = "find_sub"; |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
110 if (refpts > sub_last_pts || refpts < sub_last_pts-1.0) { |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
111 find_sub(subdata, curpts * |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
112 (subdata->sub_uses_time ? 100. : sub_fps)); |
25604 | 113 if (vo_sub) vo_sub_last = vo_sub; |
114 // FIXME! frame counter... | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
115 sub_last_pts = refpts; |
25604 | 116 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
117 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
118 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
119 // DVD sub: |
25509
1cfa39a320cc
Fix update_subtitles() checking subtitle type for the wrong track.
eugeni
parents:
25322
diff
changeset
|
120 if (vo_config_count && vo_spudec && |
25604 | 121 (vobsub_id >= 0 || (dvdsub_id >= 0 && type == 'v'))) { |
122 int timestamp; | |
123 current_module = "spudec"; | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
124 spudec_heartbeat(vo_spudec, 90000*curpts); |
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
125 /* Get a sub packet from the DVD or a vobsub */ |
25604 | 126 while(1) { |
127 // Vobsub | |
128 len = 0; | |
129 if (vo_vobsub) { | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
130 if (curpts >= 0) { |
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
131 len = vobsub_get_packet(vo_vobsub, curpts, |
25604 | 132 (void**)&packet, ×tamp); |
133 if (len > 0) { | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
134 mp_dbg(MSGT_CPLAYER,MSGL_V,"\rVOB sub: len=%d v_pts=%5.3f v_timer=%5.3f sub=%5.3f ts=%d \n",len,refpts,sh_video->timer,timestamp / 90000.0,timestamp); |
25604 | 135 } |
136 } | |
137 } else { | |
138 // DVD sub | |
31558 | 139 len = ds_get_packet_sub(d_dvdsub, (unsigned char**)&packet, NULL, NULL); |
25604 | 140 if (len > 0) { |
141 // XXX This is wrong, sh_video->pts can be arbitrarily | |
142 // much behind demuxing position. Unfortunately using | |
143 // d_video->pts which would have been the simplest | |
144 // improvement doesn't work because mpeg specific hacks | |
145 // in video.c set d_video->pts to 0. | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
146 float x = d_dvdsub->pts - refpts; |
25604 | 147 if (x > -20 && x < 20) // prevent missing subs on pts reset |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
148 timestamp = 90000*d_dvdsub->pts; |
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
149 else timestamp = 90000*curpts; |
25604 | 150 mp_dbg(MSGT_CPLAYER, MSGL_V, "\rDVD sub: len=%d " |
151 "v_pts=%5.3f s_pts=%5.3f ts=%d \n", len, | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
152 refpts, d_dvdsub->pts, timestamp); |
25604 | 153 } |
154 } | |
155 if (len<=0 || !packet) break; | |
156 if (vo_vobsub || timestamp >= 0) | |
157 spudec_assemble(vo_spudec, packet, len, timestamp); | |
158 } | |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
159 |
25604 | 160 if (spudec_changed(vo_spudec)) |
161 vo_osd_changed(OSDTYPE_SPU); | |
31559
631f813874f0
Factor out a large conditional, hopefully making it easier to
reimar
parents:
31558
diff
changeset
|
162 } else if (dvdsub_id >= 0 && text_sub) { |
25604 | 163 double endpts; |
29833 | 164 if (type == 'd' && !d_dvdsub->demuxer->teletext) { |
165 tt_stream_props tsp = {0}; | |
166 void *ptr = &tsp; | |
167 if (teletext_control(NULL, TV_VBI_CONTROL_START, &ptr) == VBI_CONTROL_TRUE) | |
168 d_dvdsub->demuxer->teletext = ptr; | |
169 } | |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
170 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
171 ds_get_next_pts(d_dvdsub); |
31558 | 172 while (1) { |
173 double subpts = curpts; | |
174 len = ds_get_packet_sub(d_dvdsub, &packet, &subpts, &endpts); | |
175 if (len < 0) | |
25604 | 176 break; |
25855
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
177 if (type == 'm') { |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
178 if (len < 2) continue; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
179 len = FFMIN(len - 2, AV_RB16(packet)); |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
180 packet += 2; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
181 } |
29833 | 182 if (type == 'd') { |
183 if (d_dvdsub->demuxer->teletext) { | |
184 uint8_t *p = packet; | |
185 p++; | |
186 len--; | |
187 while (len >= 46) { | |
188 int sublen = p[1]; | |
189 if (p[0] == 2 || p[0] == 3) | |
190 teletext_control(d_dvdsub->demuxer->teletext, | |
191 TV_VBI_CONTROL_DECODE_DVB, p + 2); | |
192 p += sublen + 2; | |
193 len -= sublen + 2; | |
194 } | |
195 } | |
196 continue; | |
197 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
198 #ifdef CONFIG_ASS |
25856 | 199 if (ass_enabled) { |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
200 sh_sub_t* sh = d_dvdsub->sh; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
201 ass_track = sh ? sh->ass_track : NULL; |
25856 | 202 if (!ass_track) continue; |
203 if (type == 'a') { // ssa/ass subs with libass | |
30992
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
204 if (len > 10 && memcmp(packet, "Dialogue: ", 10) == 0) |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
205 ass_process_data(ass_track, packet, len); |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
206 else |
27518 | 207 ass_process_chunk(ass_track, packet, len, |
29664 | 208 (long long)(subpts*1000 + 0.5), |
209 (long long)((endpts-subpts)*1000 + 0.5)); | |
25857 | 210 } else { // plaintext subs with libass |
29664 | 211 if (subpts != MP_NOPTS_VALUE) { |
30017
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
212 subtitle tmp_subs = {0}; |
29664 | 213 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 3; |
30017
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
214 sub_add_text(&tmp_subs, packet, len, endpts); |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
215 tmp_subs.start = subpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
216 tmp_subs.end = endpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
217 ass_process_subtitle(ass_track, &tmp_subs); |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
218 sub_clear_text(&tmp_subs, MP_NOPTS_VALUE); |
25857 | 219 } |
25604 | 220 } |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
221 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
222 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
223 #endif |
29664 | 224 if (subpts != MP_NOPTS_VALUE) { |
25604 | 225 if (endpts == MP_NOPTS_VALUE) |
226 sub_clear_text(&subs, MP_NOPTS_VALUE); | |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
227 if (type == 'a') { // ssa/ass subs without libass => convert to plaintext |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
228 int i; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
229 unsigned char* p = packet; |
30992
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
230 int skip_commas = 8; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
231 if (len > 10 && memcmp(packet, "Dialogue: ", 10) == 0) |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
232 skip_commas = 9; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
233 for (i=0; i < skip_commas && *p != '\0'; p++) |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
234 if (*p == ',') |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
235 i++; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
236 if (*p == '\0') /* Broken line? */ |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
237 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
238 len -= p - packet; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
239 packet = p; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
240 } |
25604 | 241 sub_add_text(&subs, packet, len, endpts); |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
242 set_osd_subtitle(&subs); |
25604 | 243 } |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
244 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
245 ds_get_next_pts(d_dvdsub); |
25604 | 246 } |
31559
631f813874f0
Factor out a large conditional, hopefully making it easier to
reimar
parents:
31558
diff
changeset
|
247 if (text_sub && sub_clear_text(&subs, curpts)) |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
248 set_osd_subtitle(&subs); |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
249 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
250 current_module=NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
251 } |
23903 | 252 |
253 void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset) | |
254 { | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
255 int page_changed; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
256 |
29806 | 257 if (!demuxer->teletext) |
258 return; | |
23903 | 259 |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
260 //Also forcing page update when such ioctl is not supported or call error occured |
29806 | 261 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_IS_CHANGED,&page_changed)!=VBI_CONTROL_TRUE) |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
262 page_changed=1; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
263 |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
264 if(!page_changed) |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
265 return; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
266 |
29806 | 267 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=VBI_CONTROL_TRUE) |
23903 | 268 vo_osd_teletext_page=NULL; |
29806 | 269 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=VBI_CONTROL_TRUE) |
23903 | 270 vo_osd_teletext_half=0; |
29806 | 271 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_MODE,&vo_osd_teletext_mode)!=VBI_CONTROL_TRUE) |
23903 | 272 vo_osd_teletext_mode=0; |
29806 | 273 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=VBI_CONTROL_TRUE) |
23903 | 274 vo_osd_teletext_format=0; |
275 vo_osd_changed(OSDTYPE_TELETEXT); | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
276 |
29806 | 277 teletext_control(demuxer->teletext,TV_VBI_CONTROL_MARK_UNCHANGED,NULL); |
23903 | 278 } |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
279 |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
280 int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang) |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
281 { |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
282 if (audio_id == -1 && audio_lang) |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
283 audio_id = demuxer_audio_track_by_lang(demuxer, audio_lang); |
26269
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26090
diff
changeset
|
284 if (audio_id == -1) |
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26090
diff
changeset
|
285 audio_id = demuxer_default_audio_track(demuxer); |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
286 if (audio_id != -1) // -1 (automatic) is the default behaviour of demuxers |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
287 demuxer_switch_audio(demuxer, audio_id); |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
288 if (audio_id == -2) { // some demuxers don't yet know how to switch to no sound |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
289 demuxer->audio->id = -2; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
290 demuxer->audio->sh = NULL; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
291 } |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
292 return demuxer->audio->id; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
293 } |
26416 | 294 |
295 /* Parse -noconfig common to both programs */ | |
296 int disable_system_conf=0; | |
297 int disable_user_conf=0; | |
27343 | 298 #ifdef CONFIG_GUI |
26422
f74bff77f088
noconfig fix, disable_gui_conf was not defined when compiling mencoder.
albeu
parents:
26416
diff
changeset
|
299 int disable_gui_conf=0; |
27343 | 300 #endif /* CONFIG_GUI */ |
26416 | 301 |
302 /* Disable all configuration files */ | |
303 static void noconfig_all(void) | |
304 { | |
305 disable_system_conf = 1; | |
306 disable_user_conf = 1; | |
27343 | 307 #ifdef CONFIG_GUI |
26416 | 308 disable_gui_conf = 1; |
27343 | 309 #endif /* CONFIG_GUI */ |
26416 | 310 } |
311 | |
312 const m_option_t noconfig_opts[] = { | |
313 {"all", noconfig_all, CONF_TYPE_FUNC, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 0, NULL}, | |
314 {"system", &disable_system_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
315 {"user", &disable_user_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
27343 | 316 #ifdef CONFIG_GUI |
26416 | 317 {"gui", &disable_gui_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, |
27343 | 318 #endif /* CONFIG_GUI */ |
26416 | 319 {NULL, NULL, 0, 0, 0, 0, NULL} |
320 }; | |
30872 | 321 |