Mercurial > mplayer.hg
annotate mpcommon.c @ 35967:76d4f38ffdf9
Fix crash with file selector after pressing OK.
The crash would occur with the "dot directory" selected and pressing OK
when previously either the "directory up" button or OK (to refresh the
file list) has been pressed.
author | ib |
---|---|
date | Wed, 27 Mar 2013 18:56:13 +0000 |
parents | 3edaed3c1d60 |
children | 8587ae275646 |
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 |
32414
a14dd8b8d314
Add windows.h include to fix compilation in some cases.
reimar
parents:
32389
diff
changeset
|
19 #if defined(__MINGW32__) || defined(__CYGWIN__) |
a14dd8b8d314
Add windows.h include to fix compilation in some cases.
reimar
parents:
32389
diff
changeset
|
20 #include <windows.h> |
a14dd8b8d314
Add windows.h include to fix compilation in some cases.
reimar
parents:
32389
diff
changeset
|
21 #endif |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
22 #include <stdlib.h> |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
23 #include "stream/stream.h" |
33598 | 24 #ifdef CONFIG_DVDREAD |
33577
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
25 #include "stream/stream_dvd.h" |
33598 | 26 #endif |
27 #ifdef CONFIG_DVDNAV | |
33577
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
28 #include "stream/stream_dvdnav.h" |
33598 | 29 #endif |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
30 #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
|
31 #include "libmpdemux/stheader.h" |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
32 #include "codec-cfg.h" |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
33 #include "osdep/timer.h" |
32416 | 34 #include "osdep/priority.h" |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
35 #include "path.h" |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
36 #include "mplayer.h" |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32461
diff
changeset
|
37 #include "sub/font_load.h" |
32467 | 38 #include "sub/sub.h" |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
39 #include "libvo/video_out.h" |
28325 | 40 #include "cpudetect.h" |
41 #include "help_mp.h" | |
42 #include "mp_msg.h" | |
33877
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
43 #include "parser-cfg.h" |
32456 | 44 #include "sub/spudec.h" |
28325 | 45 #include "version.h" |
34013
18dfcac48055
libass: consistently #include sub/ass_mp.h without #ifdefs
diego
parents:
33877
diff
changeset
|
46 #include "sub/ass_mp.h" |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
32457
diff
changeset
|
47 #include "sub/vobsub.h" |
32457 | 48 #include "sub/av_sub.h" |
34761 | 49 #include "sub/sub_cc.h" |
29759
d287e2785570
Move teletext specific code from stream into libmpcodecs.
cehoyos
parents:
29670
diff
changeset
|
50 #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
|
51 #include "libavutil/intreadwrite.h" |
26416 | 52 #include "m_option.h" |
29666
ca2030774a61
Include mpcommon.h in mpcommon.c, ensures that the declarations in the header
reimar
parents:
29665
diff
changeset
|
53 #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
|
54 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
55 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
|
56 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
57 #ifdef CONFIG_ASS |
31792
55dacfca4a43
Rename libass types to match upstream libass >= 0.9.7
greg
parents:
31686
diff
changeset
|
58 ASS_Track* ass_track = 0; // current track to render |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
59 #endif |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
60 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
61 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
|
62 subtitle* vo_sub_last = NULL; |
33577
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
63 char *spudec_ifo; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
64 int forced_subs_only; |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
65 |
31796
a6abbb323d04
10l: Add the Subversion revision to the version string, not "VERSION".
diego
parents:
31792
diff
changeset
|
66 const char *mencoder_version = "MEncoder " VERSION; |
a6abbb323d04
10l: Add the Subversion revision to the version string, not "VERSION".
diego
parents:
31792
diff
changeset
|
67 const char *mplayer_version = "MPlayer " VERSION; |
28325 | 68 |
69 void print_version(const char* name) | |
70 { | |
71 mp_msg(MSGT_CPLAYER, MSGL_INFO, MP_TITLE, name); | |
72 | |
73 /* Test for CPU capabilities (and corresponding OS support) for optimizing */ | |
74 GetCpuCaps(&gCpuCaps); | |
75 #if ARCH_X86 | |
76 mp_msg(MSGT_CPLAYER, MSGL_V, | |
35211 | 77 "CPUflags: MMX: %d MMX2: %d 3DNow: %d 3DNowExt: %d SSE: %d SSE2: %d SSE3: %d SSSE3: %d SSE4: %d SSE4.2: %d AVX: %d\n", |
32862
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
78 gCpuCaps.hasMMX, gCpuCaps.hasMMX2, |
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
79 gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, |
35211 | 80 gCpuCaps.hasSSE, gCpuCaps.hasSSE2, gCpuCaps.hasSSE3, |
81 gCpuCaps.hasSSSE3, gCpuCaps.hasSSE4, gCpuCaps.hasSSE42, | |
82 gCpuCaps.hasAVX); | |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
28340
diff
changeset
|
83 #if CONFIG_RUNTIME_CPUDETECT |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33598
diff
changeset
|
84 mp_msg(MSGT_CPLAYER, MSGL_V, "Compiled with runtime CPU detection.\n"); |
28325 | 85 #else |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33598
diff
changeset
|
86 mp_msg(MSGT_CPLAYER, MSGL_V, "Compiled for x86 CPU with extensions:"); |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
87 if (HAVE_MMX) |
28325 | 88 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
|
89 if (HAVE_MMX2) |
28325 | 90 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
|
91 if (HAVE_AMD3DNOW) |
28325 | 92 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
|
93 if (HAVE_AMD3DNOWEXT) |
28330 | 94 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
|
95 if (HAVE_SSE) |
28325 | 96 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
|
97 if (HAVE_SSE2) |
28325 | 98 mp_msg(MSGT_CPLAYER,MSGL_V," SSE2"); |
35211 | 99 if (HAVE_SSE3) |
100 mp_msg(MSGT_CPLAYER,MSGL_V," SSE3"); | |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
101 if (HAVE_SSSE3) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
102 mp_msg(MSGT_CPLAYER,MSGL_V," SSSE3"); |
35211 | 103 if (HAVE_SSE4) |
104 mp_msg(MSGT_CPLAYER,MSGL_V," SSE4"); | |
105 if (HAVE_SSE42) | |
106 mp_msg(MSGT_CPLAYER,MSGL_V," SSE4.2"); | |
107 if (HAVE_AVX) | |
108 mp_msg(MSGT_CPLAYER,MSGL_V," AVX"); | |
28340
b0af9b4b5015
Replace a bunch of '#if HAVE_FOO' preprocessor checks by 'if (HAVE_FOO)'.
diego
parents:
28335
diff
changeset
|
109 if (HAVE_CMOV) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
110 mp_msg(MSGT_CPLAYER,MSGL_V," CMOV"); |
28325 | 111 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
|
112 #endif /* CONFIG_RUNTIME_CPUDETECT */ |
28325 | 113 #endif /* ARCH_X86 */ |
114 } | |
115 | |
33577
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
116 void init_vo_spudec(struct stream *stream, struct sh_video *sh_video, struct sh_sub *sh_sub) |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
117 { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
118 unsigned width, height; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
119 spudec_free(vo_spudec); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
120 vo_spudec = NULL; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
121 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
122 // we currently can't work without video stream |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
123 if (!sh_video) |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
124 return; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
125 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
126 if (spudec_ifo) { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
127 unsigned int palette[16]; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
128 current_module = "spudec_init_vobsub"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
129 if (vobsub_parse_ifo(NULL, spudec_ifo, palette, &width, &height, 1, -1, NULL) >= 0) |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
130 vo_spudec = spudec_new_scaled(palette, width, height, NULL, 0); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
131 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
132 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
133 width = sh_video->disp_w; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
134 height = sh_video->disp_h; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
135 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
136 #ifdef CONFIG_DVDREAD |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
137 if (vo_spudec == NULL && stream->type == STREAMTYPE_DVD) { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
138 current_module = "spudec_init_dvdread"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
139 vo_spudec = spudec_new_scaled(((dvd_priv_t *)(stream->priv))->cur_pgc->palette, |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
140 width, height, |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
141 NULL, 0); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
142 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
143 #endif |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
144 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
145 #ifdef CONFIG_DVDNAV |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
146 if (vo_spudec == NULL && stream->type == STREAMTYPE_DVDNAV) { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
147 unsigned int *palette = mp_dvdnav_get_spu_clut(stream); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
148 current_module = "spudec_init_dvdnav"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
149 vo_spudec = spudec_new_scaled(palette, width, height, NULL, 0); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
150 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
151 #endif |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
152 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
153 if (vo_spudec == NULL) { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
154 current_module = "spudec_init_normal"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
155 vo_spudec = spudec_new_scaled(NULL, width, height, |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
156 sh_sub ? sh_sub->extradata : NULL, |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
157 sh_sub ? sh_sub->extradata_len : 0); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
158 spudec_set_font_factor(vo_spudec, font_factor); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
159 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
160 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
161 if (vo_spudec) |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
162 spudec_set_forced_subs_only(vo_spudec, forced_subs_only); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
163 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
164 |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
165 static int is_text_sub(int type) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
166 { |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
167 return type == 't' || type == 'm' || type == 'a'; |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
168 } |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
169 |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
170 static int is_av_sub(int type) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
171 { |
31628
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31626
diff
changeset
|
172 return type == 'b' || type == 'p' || type == 'x'; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
173 } |
28325 | 174 |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
175 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
|
176 { |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
177 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
|
178 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
|
179 int len; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
180 int type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v'; |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
181 static subtitle subs; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
182 if (reset) { |
25604 | 183 sub_clear_text(&subs, MP_NOPTS_VALUE); |
184 if (vo_sub) { | |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
185 set_osd_subtitle(NULL); |
25604 | 186 } |
187 if (vo_spudec) { | |
188 spudec_reset(vo_spudec); | |
189 vo_osd_changed(OSDTYPE_SPU); | |
190 } | |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31948
diff
changeset
|
191 #ifdef CONFIG_FFMPEG |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
192 if (is_av_sub(type)) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
193 reset_avsub(d_dvdsub->sh); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
194 #endif |
34761 | 195 subcc_reset(); |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
196 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
197 // find sub |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
198 if (subdata) { |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
199 if (sub_fps==0) sub_fps = sh_video ? sh_video->fps : 25; |
25604 | 200 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
|
201 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
|
202 find_sub(subdata, curpts * |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
203 (subdata->sub_uses_time ? 100. : sub_fps)); |
25604 | 204 if (vo_sub) vo_sub_last = vo_sub; |
205 // FIXME! frame counter... | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
206 sub_last_pts = refpts; |
25604 | 207 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
208 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
209 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
210 // DVD sub: |
31608
ad007a37ae4e
Automatically allocate a vo_spudec if there is none.
reimar
parents:
31599
diff
changeset
|
211 if (vo_config_count && |
31626
8bb62807f3b8
Remove dvdsub_id checks that should not be necessary.
reimar
parents:
31608
diff
changeset
|
212 (vobsub_id >= 0 || type == 'v')) { |
25604 | 213 int timestamp; |
214 current_module = "spudec"; | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
215 /* Get a sub packet from the DVD or a vobsub */ |
25604 | 216 while(1) { |
217 // Vobsub | |
218 len = 0; | |
219 if (vo_vobsub) { | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
220 if (curpts >= 0) { |
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
221 len = vobsub_get_packet(vo_vobsub, curpts, |
25604 | 222 (void**)&packet, ×tamp); |
223 if (len > 0) { | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
224 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 | 225 } |
226 } | |
227 } else { | |
228 // DVD sub | |
31558 | 229 len = ds_get_packet_sub(d_dvdsub, (unsigned char**)&packet, NULL, NULL); |
25604 | 230 if (len > 0) { |
231 // XXX This is wrong, sh_video->pts can be arbitrarily | |
232 // much behind demuxing position. Unfortunately using | |
233 // d_video->pts which would have been the simplest | |
234 // improvement doesn't work because mpeg specific hacks | |
235 // 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
|
236 float x = d_dvdsub->pts - refpts; |
25604 | 237 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
|
238 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
|
239 else timestamp = 90000*curpts; |
25604 | 240 mp_dbg(MSGT_CPLAYER, MSGL_V, "\rDVD sub: len=%d " |
241 "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
|
242 refpts, d_dvdsub->pts, timestamp); |
25604 | 243 } |
244 } | |
245 if (len<=0 || !packet) break; | |
31838
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
246 // create it only here, since with some broken demuxers we might |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
247 // type = v but no DVD sub and we currently do not change the |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
248 // "original frame size" ever after init, leading to wrong-sized |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
249 // PGS subtitles. |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
250 if (!vo_spudec) |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
251 vo_spudec = spudec_new(NULL); |
25604 | 252 if (vo_vobsub || timestamp >= 0) |
253 spudec_assemble(vo_spudec, packet, len, timestamp); | |
254 } | |
34761 | 255 } else if (is_text_sub(type) || is_av_sub(type) || type == 'd' || type == 'c') { |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
256 int orig_type = type; |
25604 | 257 double endpts; |
29833 | 258 if (type == 'd' && !d_dvdsub->demuxer->teletext) { |
259 tt_stream_props tsp = {0}; | |
260 void *ptr = &tsp; | |
261 if (teletext_control(NULL, TV_VBI_CONTROL_START, &ptr) == VBI_CONTROL_TRUE) | |
262 d_dvdsub->demuxer->teletext = ptr; | |
263 } | |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
264 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
265 ds_get_next_pts(d_dvdsub); |
31558 | 266 while (1) { |
267 double subpts = curpts; | |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
268 type = orig_type; |
31558 | 269 len = ds_get_packet_sub(d_dvdsub, &packet, &subpts, &endpts); |
270 if (len < 0) | |
25604 | 271 break; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
272 if (is_av_sub(type)) { |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31948
diff
changeset
|
273 #ifdef CONFIG_FFMPEG |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
274 type = decode_avsub(d_dvdsub->sh, &packet, &len, &subpts, &endpts); |
32778
9404cb19e08d
Print a message when lavc subtitle decoding fails.
reimar
parents:
32594
diff
changeset
|
275 if (type < 0) |
9404cb19e08d
Print a message when lavc subtitle decoding fails.
reimar
parents:
32594
diff
changeset
|
276 mp_msg(MSGT_SPUDEC, MSGL_WARN, "lavc failed decoding subtitle\n"); |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
277 if (type <= 0) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
278 #endif |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
279 continue; |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
280 } |
25855
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
281 if (type == 'm') { |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
282 if (len < 2) continue; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
283 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
|
284 packet += 2; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
285 } |
29833 | 286 if (type == 'd') { |
287 if (d_dvdsub->demuxer->teletext) { | |
288 uint8_t *p = packet; | |
35044
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
289 if (len == 3124) { // wtv subtitle-only format |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
290 while (len >= 42) { |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
291 teletext_control(d_dvdsub->demuxer->teletext, |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
292 TV_VBI_CONTROL_DECODE_LINE, p); |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
293 p += 42; |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
294 len -= 42; |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
295 } |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
296 return; |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
297 } |
29833 | 298 p++; |
299 len--; | |
300 while (len >= 46) { | |
301 int sublen = p[1]; | |
302 if (p[0] == 2 || p[0] == 3) | |
303 teletext_control(d_dvdsub->demuxer->teletext, | |
304 TV_VBI_CONTROL_DECODE_DVB, p + 2); | |
305 p += sublen + 2; | |
306 len -= sublen + 2; | |
307 } | |
308 } | |
309 continue; | |
310 } | |
34761 | 311 if (type == 'c') { |
312 subcc_process_data(packet, len); | |
313 continue; | |
314 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
315 #ifdef CONFIG_ASS |
25856 | 316 if (ass_enabled) { |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
317 sh_sub_t* sh = d_dvdsub->sh; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
318 ass_track = sh ? sh->ass_track : NULL; |
25856 | 319 if (!ass_track) continue; |
320 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
|
321 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
|
322 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
|
323 else |
31948 | 324 ass_process_chunk(ass_track, packet, len, |
325 (long long)(subpts*1000 + 0.5), | |
326 (long long)((endpts-subpts)*1000 + 0.5)); | |
25857 | 327 } else { // plaintext subs with libass |
29664 | 328 if (subpts != MP_NOPTS_VALUE) { |
30017
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
329 subtitle tmp_subs = {0}; |
29664 | 330 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 3; |
31686
b41cbf02f854
subtitles: convert SRT/MicroDVD markup into ASS markup
greg
parents:
31628
diff
changeset
|
331 sub_add_text(&tmp_subs, packet, len, endpts, 0); |
30017
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
332 tmp_subs.start = subpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
333 tmp_subs.end = endpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
334 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
|
335 sub_clear_text(&tmp_subs, MP_NOPTS_VALUE); |
25857 | 336 } |
25604 | 337 } |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
338 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
339 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
340 #endif |
29664 | 341 if (subpts != MP_NOPTS_VALUE) { |
25604 | 342 if (endpts == MP_NOPTS_VALUE) |
343 sub_clear_text(&subs, MP_NOPTS_VALUE); | |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
344 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
|
345 int i; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
346 unsigned char* p = packet; |
30992
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
347 int skip_commas = 8; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
348 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
|
349 skip_commas = 9; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
350 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
|
351 if (*p == ',') |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
352 i++; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
353 if (*p == '\0') /* Broken line? */ |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
354 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
355 len -= p - packet; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
356 packet = p; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
357 } |
33421
f10754220d42
Workaround embedded ssa/ass never hiding with -noass.
iive
parents:
32866
diff
changeset
|
358 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 4; |
31686
b41cbf02f854
subtitles: convert SRT/MicroDVD markup into ASS markup
greg
parents:
31628
diff
changeset
|
359 sub_add_text(&subs, packet, len, endpts, 1); |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
360 set_osd_subtitle(&subs); |
25604 | 361 } |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
362 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
363 ds_get_next_pts(d_dvdsub); |
25604 | 364 } |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
365 if (sub_clear_text(&subs, curpts)) |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
366 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
|
367 } |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
368 if (vo_spudec) { |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
369 spudec_heartbeat(vo_spudec, 90000*curpts); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
370 if (spudec_changed(vo_spudec)) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
371 vo_osd_changed(OSDTYPE_SPU); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
372 } |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
373 |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
374 current_module=NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
375 } |
23903 | 376 |
377 void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset) | |
378 { | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
379 int page_changed; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
380 |
29806 | 381 if (!demuxer->teletext) |
382 return; | |
23903 | 383 |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
384 //Also forcing page update when such ioctl is not supported or call error occured |
29806 | 385 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
|
386 page_changed=1; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
387 |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
388 if(!page_changed) |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
389 return; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
390 |
29806 | 391 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=VBI_CONTROL_TRUE) |
23903 | 392 vo_osd_teletext_page=NULL; |
29806 | 393 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=VBI_CONTROL_TRUE) |
23903 | 394 vo_osd_teletext_half=0; |
29806 | 395 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_MODE,&vo_osd_teletext_mode)!=VBI_CONTROL_TRUE) |
23903 | 396 vo_osd_teletext_mode=0; |
29806 | 397 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=VBI_CONTROL_TRUE) |
23903 | 398 vo_osd_teletext_format=0; |
399 vo_osd_changed(OSDTYPE_TELETEXT); | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
400 |
29806 | 401 teletext_control(demuxer->teletext,TV_VBI_CONTROL_MARK_UNCHANGED,NULL); |
23903 | 402 } |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
403 |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
404 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
|
405 { |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
406 if (audio_id == -1 && audio_lang) |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
407 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
|
408 if (audio_id == -1) |
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26090
diff
changeset
|
409 audio_id = demuxer_default_audio_track(demuxer); |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
410 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
|
411 demuxer_switch_audio(demuxer, audio_id); |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
412 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
|
413 demuxer->audio->id = -2; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
414 demuxer->audio->sh = NULL; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
415 } |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
416 return demuxer->audio->id; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
417 } |
26416 | 418 |
419 /* Parse -noconfig common to both programs */ | |
420 int disable_system_conf=0; | |
421 int disable_user_conf=0; | |
27343 | 422 #ifdef CONFIG_GUI |
26422
f74bff77f088
noconfig fix, disable_gui_conf was not defined when compiling mencoder.
albeu
parents:
26416
diff
changeset
|
423 int disable_gui_conf=0; |
27343 | 424 #endif /* CONFIG_GUI */ |
26416 | 425 |
426 /* Disable all configuration files */ | |
427 static void noconfig_all(void) | |
428 { | |
429 disable_system_conf = 1; | |
430 disable_user_conf = 1; | |
27343 | 431 #ifdef CONFIG_GUI |
26416 | 432 disable_gui_conf = 1; |
27343 | 433 #endif /* CONFIG_GUI */ |
26416 | 434 } |
435 | |
33877
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
436 m_config_t *mconfig; |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
437 |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
438 int cfg_inc_verbose(m_option_t *conf) |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
439 { |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
440 ++verbose; |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
441 return 0; |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
442 } |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
443 |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
444 int cfg_include(m_option_t *conf, const char *filename) |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
445 { |
34172 | 446 return m_config_parse_config_file(mconfig, filename, 0); |
33877
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
447 } |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
448 |
26416 | 449 const m_option_t noconfig_opts[] = { |
450 {"all", noconfig_all, CONF_TYPE_FUNC, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 0, NULL}, | |
451 {"system", &disable_system_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
452 {"user", &disable_user_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
27343 | 453 #ifdef CONFIG_GUI |
26416 | 454 {"gui", &disable_gui_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, |
27343 | 455 #endif /* CONFIG_GUI */ |
26416 | 456 {NULL, NULL, 0, 0, 0, 0, NULL} |
457 }; | |
30872 | 458 |
35868
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
459 #ifdef __MINGW32__ |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
460 static int get_win32_cmdline(int *argc_ptr, char **argv_ptr[]) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
461 { |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
462 int i; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
463 int argv_size, size; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
464 int argc_n; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
465 char **argv_n; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
466 LPWSTR *argv_w = NULL; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
467 void *buffer = NULL; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
468 char *strs, *strs_end; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
469 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
470 HMODULE kernel32 = GetModuleHandle("Kernel32.dll"); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
471 HMODULE shell32 = GetModuleHandle("shell32.dll"); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
472 int WINAPI (*wc2mb)(UINT, DWORD, LPCWSTR, int, LPSTR, int, LPCSTR, LPBOOL) = NULL; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
473 LPCWSTR WINAPI (*getCmdlW)(void) = NULL; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
474 LPWSTR * WINAPI (*cmdl2argv)(LPCWSTR, int *) = NULL; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
475 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
476 if (!kernel32 || !shell32) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
477 goto err_out; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
478 wc2mb = GetProcAddress(kernel32, "WideCharToMultiByte"); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
479 getCmdlW = GetProcAddress(kernel32, "GetCommandLineW"); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
480 cmdl2argv = GetProcAddress(shell32, "CommandLineToArgvW"); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
481 if (!wc2mb || !getCmdlW || !cmdl2argv) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
482 goto err_out; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
483 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
484 argv_w = cmdl2argv(getCmdlW(), &argc_n); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
485 if (!argv_w || argc_n < 0 || argc_n >= INT_MAX / sizeof(char *)) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
486 goto err_out; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
487 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
488 size = argv_size = (argc_n + 1) * sizeof(char *); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
489 for (i = 0; i < argc_n; i++) { |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
490 int conv_size = wc2mb(CP_UTF8, 0, argv_w[i], -1, NULL, 0, NULL, NULL); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
491 if (conv_size < 0 || conv_size > INT_MAX - size) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
492 goto err_out; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
493 size += conv_size; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
494 } |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
495 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
496 buffer = calloc(1, size); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
497 if (!buffer) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
498 goto err_out; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
499 argv_n = buffer; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
500 strs_end = strs = buffer; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
501 strs += argv_size; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
502 strs_end += size; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
503 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
504 for (i = 0; i < argc_n; i++) { |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
505 int conv_size = wc2mb(CP_UTF8, 0, argv_w[i], -1, |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
506 strs, strs_end - strs, NULL, NULL); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
507 if (conv_size < 0 || conv_size > strs_end - strs) |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
508 goto err_out; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
509 argv_n[i] = strs; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
510 strs += conv_size; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
511 } |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
512 argv_n[i] = NULL; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
513 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
514 *argc_ptr = argc_n; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
515 *argv_ptr = argv_n; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
516 LocalFree(argv_w); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
517 return 0; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
518 |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
519 err_out: |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
520 free(buffer); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
521 LocalFree(argv_w); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
522 return -1; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
523 } |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
524 #endif |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
525 |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
526 /** |
32385
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
527 * Code to fix any kind of insane defaults some OS might have. |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
528 * Currently mostly fixes for insecure-by-default Windows. |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
529 */ |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
530 static void sanitize_os(void) |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
531 { |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
532 #if defined(__MINGW32__) || defined(__CYGWIN__) |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
533 HMODULE kernel32 = GetModuleHandle("Kernel32.dll"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
534 BOOL WINAPI (*setDEP)(DWORD) = NULL; |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
535 BOOL WINAPI (*setDllDir)(LPCTSTR) = NULL; |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
536 if (kernel32) { |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
537 setDEP = GetProcAddress(kernel32, "SetProcessDEPPolicy"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
538 setDllDir = GetProcAddress(kernel32, "SetDllDirectoryA"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
539 } |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
540 if (setDEP) setDEP(3); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
541 if (setDllDir) setDllDir(""); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
542 // stop Windows from showing all kinds of annoying error dialogs |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
543 SetErrorMode(0x8003); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
544 // request 1ms timer resolution |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
545 timeBeginPeriod(1); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
546 #endif |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
547 } |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
548 |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
549 /** |
35619
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
550 * Initialization code to be run at the very start, must not depend |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
551 * on option values. |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
552 */ |
35868
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
553 void common_preinit(int *argc_ptr, char **argv_ptr[]) |
35619
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
554 { |
35868
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
555 #ifdef __MINGW32__ |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
556 get_win32_cmdline(argc_ptr, argv_ptr); |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
557 #else |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
558 (void)argc_ptr; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
559 (void)argv_ptr; |
3edaed3c1d60
Win32: support file names with characters outside system code-page
reimar
parents:
35619
diff
changeset
|
560 #endif |
35619
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
561 sanitize_os(); |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
562 InitTimer(); |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
563 srand(GetTimerMS()); |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
564 |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
565 mp_msg_init(); |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
566 } |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
567 |
9ca9775defff
Call sanitize_os already in preinit function instead of only during init.
reimar
parents:
35211
diff
changeset
|
568 /** |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
569 * Initialization code to be run after command-line parsing. |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
570 */ |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
571 int common_init(void) |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
572 { |
32415
d1f6c6cf8905
Move gui-specific code out of common_init, it certainly does
reimar
parents:
32414
diff
changeset
|
573 #if (defined(__MINGW32__) || defined(__CYGWIN__)) && defined(CONFIG_WIN32DLL) |
32384 | 574 set_path_env(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
575 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
576 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
577 #ifdef CONFIG_PRIORITY |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
578 set_priority(); |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
579 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
580 |
32384 | 581 if (codec_path) |
582 set_codec_path(codec_path); | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
583 |
32384 | 584 /* Check codecs.conf. */ |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
585 if (!codecs_file || !parse_codec_cfg(codecs_file)) { |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
586 char *conf_path = get_path("codecs.conf"); |
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
587 if (!parse_codec_cfg(conf_path)) { |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
588 if (!parse_codec_cfg(MPLAYER_CONFDIR "/codecs.conf")) { |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
589 if (!parse_codec_cfg(NULL)) { |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
590 free(conf_path); |
32384 | 591 return 0; |
592 } | |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33598
diff
changeset
|
593 mp_msg(MSGT_CPLAYER, MSGL_V, "Using built-in default codecs.conf.\n"); |
32384 | 594 } |
595 } | |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
596 free(conf_path); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
597 } |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
598 |
32384 | 599 // check font |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
600 #ifdef CONFIG_FREETYPE |
32384 | 601 init_freetype(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
602 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
603 #ifdef CONFIG_FONTCONFIG |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
604 if (font_fontconfig <= 0) |
32386 | 605 #endif |
32384 | 606 { |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
607 #ifdef CONFIG_BITMAP_FONT |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
608 if (font_name) { |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
609 vo_font = read_font_desc(font_name, font_factor, verbose>1); |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
610 if (!vo_font) |
32384 | 611 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont, |
612 filename_recode(font_name)); | |
613 } else { | |
614 // try default: | |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
615 char *desc_path = get_path("font/font.desc"); |
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
616 vo_font = read_font_desc(desc_path, font_factor, verbose>1); |
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
617 free(desc_path); |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
618 if (!vo_font) |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
619 vo_font = read_font_desc(MPLAYER_DATADIR "/font/font.desc", font_factor, verbose>1); |
32384 | 620 } |
621 if (sub_font_name) | |
622 sub_font = read_font_desc(sub_font_name, font_factor, verbose>1); | |
623 else | |
624 sub_font = vo_font; | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
625 #endif |
32384 | 626 } |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
627 |
32384 | 628 vo_init_osd(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
629 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
630 #ifdef CONFIG_ASS |
32384 | 631 ass_library = ass_init(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
632 #endif |
32384 | 633 return 1; |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
634 } |
32863
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
635 |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
636 /// Returns a_pts |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
637 double calc_a_pts(sh_audio_t *sh_audio, demux_stream_t *d_audio) |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
638 { |
32865 | 639 double a_pts; |
32863
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
640 if(!sh_audio || !d_audio) |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
641 return MP_NOPTS_VALUE; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
642 // first calculate the end pts of audio that has been output by decoder |
32865 | 643 a_pts = sh_audio->pts; |
32866
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
644 // If we cannot get any useful information at all from the demuxer layer |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
645 // just count the decoded bytes. This is still better than constantly |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
646 // resetting to 0. |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
647 if (sh_audio->pts_bytes && a_pts == MP_NOPTS_VALUE && |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
648 !d_audio->pts && !sh_audio->i_bps) |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
649 a_pts = 0; |
32863
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
650 if (a_pts != MP_NOPTS_VALUE) |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
651 // Good, decoder supports new way of calculating audio pts. |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
652 // sh_audio->pts is the timestamp of the latest input packet with |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
653 // known pts that the decoder has decoded. sh_audio->pts_bytes is |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
654 // the amount of bytes the decoder has written after that timestamp. |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
655 a_pts += sh_audio->pts_bytes / (double) sh_audio->o_bps; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
656 else { |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
657 // Decoder doesn't support new way of calculating pts (or we're |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
658 // being called before it has decoded anything with known timestamp). |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
659 // Use the old method of audio pts calculation: take the timestamp |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
660 // of last packet with known pts the decoder has read data from, |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
661 // and add amount of bytes read after the beginning of that packet |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
662 // divided by input bps. This will be inaccurate if the input/output |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
663 // ratio is not constant for every audio packet or if it is constant |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
664 // but not accurately known in sh_audio->i_bps. |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
665 |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
666 a_pts = d_audio->pts; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
667 // ds_tell_pts returns bytes read after last timestamp from |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
668 // demuxing layer, decoder might use sh_audio->a_in_buffer for bytes |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
669 // it has read but not decoded |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
670 if (sh_audio->i_bps) |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
671 a_pts += (ds_tell_pts(d_audio) - sh_audio->a_in_buffer_len) / |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
672 (double)sh_audio->i_bps; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
673 } |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
674 return a_pts; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
675 } |