Mercurial > mplayer.hg
annotate mpcommon.c @ 33556:520fb0f7544c
Rename GUI directory 'mplayer' and some files in it.
The directory 'mplayer' contains the files for the user interface and
has thus been renamed 'ui'.
Inside this directory the following files have been renamed to better
reflect their contents:
mw.c -> main.c
sw.c -> sub.c
pb.c -> playbar.c
gui_common.* -> render.*
play.* -> actions.*
author | ib |
---|---|
date | Sat, 18 Jun 2011 16:03:31 +0000 |
parents | f10754220d42 |
children | c111d9e9cfb0 |
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" |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
24 #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
|
25 #include "libmpdemux/stheader.h" |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
26 #include "codec-cfg.h" |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
27 #include "osdep/timer.h" |
32416 | 28 #include "osdep/priority.h" |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
29 #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
|
30 #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
|
31 #include "sub/font_load.h" |
32467 | 32 #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
|
33 #include "libvo/video_out.h" |
28325 | 34 #include "cpudetect.h" |
35 #include "help_mp.h" | |
36 #include "mp_msg.h" | |
32456 | 37 #include "sub/spudec.h" |
28325 | 38 #include "version.h" |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
32457
diff
changeset
|
39 #include "sub/vobsub.h" |
32457 | 40 #include "sub/av_sub.h" |
29759
d287e2785570
Move teletext specific code from stream into libmpcodecs.
cehoyos
parents:
29670
diff
changeset
|
41 #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
|
42 #include "libavutil/intreadwrite.h" |
26416 | 43 #include "m_option.h" |
29666
ca2030774a61
Include mpcommon.h in mpcommon.c, ensures that the declarations in the header
reimar
parents:
29665
diff
changeset
|
44 #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
|
45 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
46 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
|
47 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
48 #ifdef CONFIG_ASS |
32461 | 49 #include "sub/ass_mp.h" |
31792
55dacfca4a43
Rename libass types to match upstream libass >= 0.9.7
greg
parents:
31686
diff
changeset
|
50 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
|
51 #endif |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
52 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
53 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
|
54 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
|
55 |
31796
a6abbb323d04
10l: Add the Subversion revision to the version string, not "VERSION".
diego
parents:
31792
diff
changeset
|
56 const char *mencoder_version = "MEncoder " VERSION; |
a6abbb323d04
10l: Add the Subversion revision to the version string, not "VERSION".
diego
parents:
31792
diff
changeset
|
57 const char *mplayer_version = "MPlayer " VERSION; |
28325 | 58 |
59 void print_version(const char* name) | |
60 { | |
61 mp_msg(MSGT_CPLAYER, MSGL_INFO, MP_TITLE, name); | |
62 | |
63 /* Test for CPU capabilities (and corresponding OS support) for optimizing */ | |
64 GetCpuCaps(&gCpuCaps); | |
65 #if ARCH_X86 | |
66 mp_msg(MSGT_CPLAYER, MSGL_V, | |
32862
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
67 "CPUflags: MMX: %d MMX2: %d 3DNow: %d 3DNowExt: %d SSE: %d SSE2: %d SSSE3: %d\n", |
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
68 gCpuCaps.hasMMX, gCpuCaps.hasMMX2, |
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
69 gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, |
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
70 gCpuCaps.hasSSE, gCpuCaps.hasSSE2, gCpuCaps.hasSSSE3); |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
28340
diff
changeset
|
71 #if CONFIG_RUNTIME_CPUDETECT |
28325 | 72 mp_msg(MSGT_CPLAYER,MSGL_V, MSGTR_CompiledWithRuntimeDetection); |
73 #else | |
74 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
|
75 if (HAVE_MMX) |
28325 | 76 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
|
77 if (HAVE_MMX2) |
28325 | 78 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
|
79 if (HAVE_AMD3DNOW) |
28325 | 80 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
|
81 if (HAVE_AMD3DNOWEXT) |
28330 | 82 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
|
83 if (HAVE_SSE) |
28325 | 84 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
|
85 if (HAVE_SSE2) |
28325 | 86 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
|
87 if (HAVE_SSSE3) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
88 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
|
89 if (HAVE_CMOV) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
90 mp_msg(MSGT_CPLAYER,MSGL_V," CMOV"); |
28325 | 91 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
|
92 #endif /* CONFIG_RUNTIME_CPUDETECT */ |
28325 | 93 #endif /* ARCH_X86 */ |
94 } | |
95 | |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
96 static int is_text_sub(int type) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
97 { |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
98 return type == 't' || type == 'm' || type == 'a'; |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
99 } |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
100 |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
101 static int is_av_sub(int type) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
102 { |
31628
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31626
diff
changeset
|
103 return type == 'b' || type == 'p' || type == 'x'; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
104 } |
28325 | 105 |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
106 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
|
107 { |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
108 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
|
109 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
|
110 int len; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
111 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
|
112 static subtitle subs; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
113 if (reset) { |
25604 | 114 sub_clear_text(&subs, MP_NOPTS_VALUE); |
115 if (vo_sub) { | |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
116 set_osd_subtitle(NULL); |
25604 | 117 } |
118 if (vo_spudec) { | |
119 spudec_reset(vo_spudec); | |
120 vo_osd_changed(OSDTYPE_SPU); | |
121 } | |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31948
diff
changeset
|
122 #ifdef CONFIG_FFMPEG |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
123 if (is_av_sub(type)) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
124 reset_avsub(d_dvdsub->sh); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
125 #endif |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
126 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
127 // find sub |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
128 if (subdata) { |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
129 if (sub_fps==0) sub_fps = sh_video ? sh_video->fps : 25; |
25604 | 130 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
|
131 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
|
132 find_sub(subdata, curpts * |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
133 (subdata->sub_uses_time ? 100. : sub_fps)); |
25604 | 134 if (vo_sub) vo_sub_last = vo_sub; |
135 // FIXME! frame counter... | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
136 sub_last_pts = refpts; |
25604 | 137 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
138 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
139 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
140 // DVD sub: |
31608
ad007a37ae4e
Automatically allocate a vo_spudec if there is none.
reimar
parents:
31599
diff
changeset
|
141 if (vo_config_count && |
31626
8bb62807f3b8
Remove dvdsub_id checks that should not be necessary.
reimar
parents:
31608
diff
changeset
|
142 (vobsub_id >= 0 || type == 'v')) { |
25604 | 143 int timestamp; |
144 current_module = "spudec"; | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
145 /* Get a sub packet from the DVD or a vobsub */ |
25604 | 146 while(1) { |
147 // Vobsub | |
148 len = 0; | |
149 if (vo_vobsub) { | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
150 if (curpts >= 0) { |
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
151 len = vobsub_get_packet(vo_vobsub, curpts, |
25604 | 152 (void**)&packet, ×tamp); |
153 if (len > 0) { | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
154 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 | 155 } |
156 } | |
157 } else { | |
158 // DVD sub | |
31558 | 159 len = ds_get_packet_sub(d_dvdsub, (unsigned char**)&packet, NULL, NULL); |
25604 | 160 if (len > 0) { |
161 // XXX This is wrong, sh_video->pts can be arbitrarily | |
162 // much behind demuxing position. Unfortunately using | |
163 // d_video->pts which would have been the simplest | |
164 // improvement doesn't work because mpeg specific hacks | |
165 // 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
|
166 float x = d_dvdsub->pts - refpts; |
25604 | 167 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
|
168 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
|
169 else timestamp = 90000*curpts; |
25604 | 170 mp_dbg(MSGT_CPLAYER, MSGL_V, "\rDVD sub: len=%d " |
171 "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
|
172 refpts, d_dvdsub->pts, timestamp); |
25604 | 173 } |
174 } | |
175 if (len<=0 || !packet) break; | |
31838
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
176 // 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
|
177 // 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
|
178 // "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
|
179 // PGS subtitles. |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
180 if (!vo_spudec) |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
181 vo_spudec = spudec_new(NULL); |
25604 | 182 if (vo_vobsub || timestamp >= 0) |
183 spudec_assemble(vo_spudec, packet, len, timestamp); | |
184 } | |
31626
8bb62807f3b8
Remove dvdsub_id checks that should not be necessary.
reimar
parents:
31608
diff
changeset
|
185 } else if (is_text_sub(type) || is_av_sub(type) || type == 'd') { |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
186 int orig_type = type; |
25604 | 187 double endpts; |
29833 | 188 if (type == 'd' && !d_dvdsub->demuxer->teletext) { |
189 tt_stream_props tsp = {0}; | |
190 void *ptr = &tsp; | |
191 if (teletext_control(NULL, TV_VBI_CONTROL_START, &ptr) == VBI_CONTROL_TRUE) | |
192 d_dvdsub->demuxer->teletext = ptr; | |
193 } | |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
194 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
195 ds_get_next_pts(d_dvdsub); |
31558 | 196 while (1) { |
197 double subpts = curpts; | |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
198 type = orig_type; |
31558 | 199 len = ds_get_packet_sub(d_dvdsub, &packet, &subpts, &endpts); |
200 if (len < 0) | |
25604 | 201 break; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
202 if (is_av_sub(type)) { |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31948
diff
changeset
|
203 #ifdef CONFIG_FFMPEG |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
204 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
|
205 if (type < 0) |
9404cb19e08d
Print a message when lavc subtitle decoding fails.
reimar
parents:
32594
diff
changeset
|
206 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
|
207 if (type <= 0) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
208 #endif |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
209 continue; |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
210 } |
25855
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
211 if (type == 'm') { |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
212 if (len < 2) continue; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
213 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
|
214 packet += 2; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
215 } |
29833 | 216 if (type == 'd') { |
217 if (d_dvdsub->demuxer->teletext) { | |
218 uint8_t *p = packet; | |
219 p++; | |
220 len--; | |
221 while (len >= 46) { | |
222 int sublen = p[1]; | |
223 if (p[0] == 2 || p[0] == 3) | |
224 teletext_control(d_dvdsub->demuxer->teletext, | |
225 TV_VBI_CONTROL_DECODE_DVB, p + 2); | |
226 p += sublen + 2; | |
227 len -= sublen + 2; | |
228 } | |
229 } | |
230 continue; | |
231 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
232 #ifdef CONFIG_ASS |
25856 | 233 if (ass_enabled) { |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
234 sh_sub_t* sh = d_dvdsub->sh; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
235 ass_track = sh ? sh->ass_track : NULL; |
25856 | 236 if (!ass_track) continue; |
237 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
|
238 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
|
239 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
|
240 else |
31948 | 241 ass_process_chunk(ass_track, packet, len, |
242 (long long)(subpts*1000 + 0.5), | |
243 (long long)((endpts-subpts)*1000 + 0.5)); | |
25857 | 244 } else { // plaintext subs with libass |
29664 | 245 if (subpts != MP_NOPTS_VALUE) { |
30017
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
246 subtitle tmp_subs = {0}; |
29664 | 247 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 3; |
31686
b41cbf02f854
subtitles: convert SRT/MicroDVD markup into ASS markup
greg
parents:
31628
diff
changeset
|
248 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
|
249 tmp_subs.start = subpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
250 tmp_subs.end = endpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
251 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
|
252 sub_clear_text(&tmp_subs, MP_NOPTS_VALUE); |
25857 | 253 } |
25604 | 254 } |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
255 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
256 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
257 #endif |
29664 | 258 if (subpts != MP_NOPTS_VALUE) { |
25604 | 259 if (endpts == MP_NOPTS_VALUE) |
260 sub_clear_text(&subs, MP_NOPTS_VALUE); | |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
261 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
|
262 int i; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
263 unsigned char* p = packet; |
30992
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
264 int skip_commas = 8; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
265 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
|
266 skip_commas = 9; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
267 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
|
268 if (*p == ',') |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
269 i++; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
270 if (*p == '\0') /* Broken line? */ |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
271 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
272 len -= p - packet; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
273 packet = p; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
274 } |
33421
f10754220d42
Workaround embedded ssa/ass never hiding with -noass.
iive
parents:
32866
diff
changeset
|
275 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 4; |
31686
b41cbf02f854
subtitles: convert SRT/MicroDVD markup into ASS markup
greg
parents:
31628
diff
changeset
|
276 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
|
277 set_osd_subtitle(&subs); |
25604 | 278 } |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
279 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
280 ds_get_next_pts(d_dvdsub); |
25604 | 281 } |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
282 if (sub_clear_text(&subs, curpts)) |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
283 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
|
284 } |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
285 if (vo_spudec) { |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
286 spudec_heartbeat(vo_spudec, 90000*curpts); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
287 if (spudec_changed(vo_spudec)) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
288 vo_osd_changed(OSDTYPE_SPU); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
289 } |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
290 |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
291 current_module=NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
292 } |
23903 | 293 |
294 void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset) | |
295 { | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
296 int page_changed; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
297 |
29806 | 298 if (!demuxer->teletext) |
299 return; | |
23903 | 300 |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
301 //Also forcing page update when such ioctl is not supported or call error occured |
29806 | 302 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
|
303 page_changed=1; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
304 |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
305 if(!page_changed) |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
306 return; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
307 |
29806 | 308 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=VBI_CONTROL_TRUE) |
23903 | 309 vo_osd_teletext_page=NULL; |
29806 | 310 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=VBI_CONTROL_TRUE) |
23903 | 311 vo_osd_teletext_half=0; |
29806 | 312 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_MODE,&vo_osd_teletext_mode)!=VBI_CONTROL_TRUE) |
23903 | 313 vo_osd_teletext_mode=0; |
29806 | 314 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=VBI_CONTROL_TRUE) |
23903 | 315 vo_osd_teletext_format=0; |
316 vo_osd_changed(OSDTYPE_TELETEXT); | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
317 |
29806 | 318 teletext_control(demuxer->teletext,TV_VBI_CONTROL_MARK_UNCHANGED,NULL); |
23903 | 319 } |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
320 |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
321 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
|
322 { |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
323 if (audio_id == -1 && audio_lang) |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
324 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
|
325 if (audio_id == -1) |
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26090
diff
changeset
|
326 audio_id = demuxer_default_audio_track(demuxer); |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
327 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
|
328 demuxer_switch_audio(demuxer, audio_id); |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
329 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
|
330 demuxer->audio->id = -2; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
331 demuxer->audio->sh = NULL; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
332 } |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
333 return demuxer->audio->id; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
334 } |
26416 | 335 |
336 /* Parse -noconfig common to both programs */ | |
337 int disable_system_conf=0; | |
338 int disable_user_conf=0; | |
27343 | 339 #ifdef CONFIG_GUI |
26422
f74bff77f088
noconfig fix, disable_gui_conf was not defined when compiling mencoder.
albeu
parents:
26416
diff
changeset
|
340 int disable_gui_conf=0; |
27343 | 341 #endif /* CONFIG_GUI */ |
26416 | 342 |
343 /* Disable all configuration files */ | |
344 static void noconfig_all(void) | |
345 { | |
346 disable_system_conf = 1; | |
347 disable_user_conf = 1; | |
27343 | 348 #ifdef CONFIG_GUI |
26416 | 349 disable_gui_conf = 1; |
27343 | 350 #endif /* CONFIG_GUI */ |
26416 | 351 } |
352 | |
353 const m_option_t noconfig_opts[] = { | |
354 {"all", noconfig_all, CONF_TYPE_FUNC, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 0, NULL}, | |
355 {"system", &disable_system_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
356 {"user", &disable_user_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
27343 | 357 #ifdef CONFIG_GUI |
26416 | 358 {"gui", &disable_gui_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, |
27343 | 359 #endif /* CONFIG_GUI */ |
26416 | 360 {NULL, NULL, 0, 0, 0, 0, NULL} |
361 }; | |
30872 | 362 |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
363 /** |
32594 | 364 * Initialization code to be run at the very start, must not depend |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
365 * on option values. |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
366 */ |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
367 void common_preinit(void) |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
368 { |
32384 | 369 InitTimer(); |
370 srand(GetTimerMS()); | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
371 |
32384 | 372 mp_msg_init(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
373 } |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
374 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
375 /** |
32385
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
376 * 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
|
377 * 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
|
378 */ |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
379 static void sanitize_os(void) |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
380 { |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
381 #if defined(__MINGW32__) || defined(__CYGWIN__) |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
382 HMODULE kernel32 = GetModuleHandle("Kernel32.dll"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
383 BOOL WINAPI (*setDEP)(DWORD) = NULL; |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
384 BOOL WINAPI (*setDllDir)(LPCTSTR) = NULL; |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
385 if (kernel32) { |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
386 setDEP = GetProcAddress(kernel32, "SetProcessDEPPolicy"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
387 setDllDir = GetProcAddress(kernel32, "SetDllDirectoryA"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
388 } |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
389 if (setDEP) setDEP(3); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
390 if (setDllDir) setDllDir(""); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
391 // 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
|
392 SetErrorMode(0x8003); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
393 // request 1ms timer resolution |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
394 timeBeginPeriod(1); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
395 #endif |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
396 } |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
397 |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
398 /** |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
399 * Initialization code to be run after command-line parsing. |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
400 */ |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
401 int common_init(void) |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
402 { |
32415
d1f6c6cf8905
Move gui-specific code out of common_init, it certainly does
reimar
parents:
32414
diff
changeset
|
403 #if (defined(__MINGW32__) || defined(__CYGWIN__)) && defined(CONFIG_WIN32DLL) |
32384 | 404 set_path_env(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
405 #endif |
32385
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
406 sanitize_os(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
407 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
408 #ifdef CONFIG_PRIORITY |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
409 set_priority(); |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
410 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
411 |
32384 | 412 if (codec_path) |
413 set_codec_path(codec_path); | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
414 |
32384 | 415 /* Check codecs.conf. */ |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
416 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
|
417 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
|
418 if (!parse_codec_cfg(conf_path)) { |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
419 if (!parse_codec_cfg(MPLAYER_CONFDIR "/codecs.conf")) { |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
420 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
|
421 free(conf_path); |
32384 | 422 return 0; |
423 } | |
424 mp_msg(MSGT_CPLAYER,MSGL_V,MSGTR_BuiltinCodecsConf); | |
425 } | |
426 } | |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
427 free(conf_path); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
428 } |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
429 |
32384 | 430 // check font |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
431 #ifdef CONFIG_FREETYPE |
32384 | 432 init_freetype(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
433 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
434 #ifdef CONFIG_FONTCONFIG |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
435 if (font_fontconfig <= 0) |
32386 | 436 #endif |
32384 | 437 { |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
438 #ifdef CONFIG_BITMAP_FONT |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
439 if (font_name) { |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
440 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
|
441 if (!vo_font) |
32384 | 442 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont, |
443 filename_recode(font_name)); | |
444 } else { | |
445 // try default: | |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
446 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
|
447 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
|
448 free(desc_path); |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
449 if (!vo_font) |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
450 vo_font = read_font_desc(MPLAYER_DATADIR "/font/font.desc", font_factor, verbose>1); |
32384 | 451 } |
452 if (sub_font_name) | |
453 sub_font = read_font_desc(sub_font_name, font_factor, verbose>1); | |
454 else | |
455 sub_font = vo_font; | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
456 #endif |
32384 | 457 } |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
458 |
32384 | 459 vo_init_osd(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
460 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
461 #ifdef CONFIG_ASS |
32384 | 462 ass_library = ass_init(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
463 #endif |
32384 | 464 return 1; |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
465 } |
32863
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
466 |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
467 /// Returns a_pts |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
468 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
|
469 { |
32865 | 470 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
|
471 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
|
472 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
|
473 // first calculate the end pts of audio that has been output by decoder |
32865 | 474 a_pts = sh_audio->pts; |
32866
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
475 // 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
|
476 // 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
|
477 // resetting to 0. |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
478 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
|
479 !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
|
480 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
|
481 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
|
482 // 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
|
483 // 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
|
484 // 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
|
485 // 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
|
486 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
|
487 else { |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
488 // 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
|
489 // 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
|
490 // 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
|
491 // 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
|
492 // 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
|
493 // 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
|
494 // 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
|
495 // 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
|
496 |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
497 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
|
498 // 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
|
499 // 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
|
500 // 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
|
501 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
|
502 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
|
503 (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
|
504 } |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
505 return a_pts; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
506 } |