Mercurial > mplayer.hg
annotate mpcommon.c @ 35123:bf46a9b2abda
Set ass margins only from one single locations.
This fixes the different settings from e.g. vo and -ass-margin options
fighting against each other.
To allow this to work, apply the global option values on top of
the vo values.
If this is the most desirable behaviour is up to discussion,
but it seems reasonable and is the easiest way to solve this.
author | reimar |
---|---|
date | Wed, 26 Sep 2012 20:16:38 +0000 |
parents | 99ac85950277 |
children | 014d0c671b80 |
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, | |
32862
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
77 "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
|
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, |
702867779920
Remove some tabs that accidentally ended up in mpcommon.c
reimar
parents:
32778
diff
changeset
|
80 gCpuCaps.hasSSE, gCpuCaps.hasSSE2, gCpuCaps.hasSSSE3); |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
28340
diff
changeset
|
81 #if CONFIG_RUNTIME_CPUDETECT |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33598
diff
changeset
|
82 mp_msg(MSGT_CPLAYER, MSGL_V, "Compiled with runtime CPU detection.\n"); |
28325 | 83 #else |
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 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
|
85 if (HAVE_MMX) |
28325 | 86 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
|
87 if (HAVE_MMX2) |
28325 | 88 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
|
89 if (HAVE_AMD3DNOW) |
28325 | 90 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
|
91 if (HAVE_AMD3DNOWEXT) |
28330 | 92 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
|
93 if (HAVE_SSE) |
28325 | 94 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
|
95 if (HAVE_SSE2) |
28325 | 96 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
|
97 if (HAVE_SSSE3) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
98 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
|
99 if (HAVE_CMOV) |
28331
8461282f0eed
Add SSSE3 and CMOV to CPU information printed on startup.
diego
parents:
28330
diff
changeset
|
100 mp_msg(MSGT_CPLAYER,MSGL_V," CMOV"); |
28325 | 101 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
|
102 #endif /* CONFIG_RUNTIME_CPUDETECT */ |
28325 | 103 #endif /* ARCH_X86 */ |
104 } | |
105 | |
33577
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
106 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
|
107 { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
108 unsigned width, height; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
109 spudec_free(vo_spudec); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
110 vo_spudec = NULL; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
111 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
112 // 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
|
113 if (!sh_video) |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
114 return; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
115 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
116 if (spudec_ifo) { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
117 unsigned int palette[16]; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
118 current_module = "spudec_init_vobsub"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
119 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
|
120 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
|
121 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
122 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
123 width = sh_video->disp_w; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
124 height = sh_video->disp_h; |
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 #ifdef CONFIG_DVDREAD |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
127 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
|
128 current_module = "spudec_init_dvdread"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
129 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
|
130 width, height, |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
131 NULL, 0); |
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 #endif |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
134 |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
135 #ifdef CONFIG_DVDNAV |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
136 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
|
137 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
|
138 current_module = "spudec_init_dvdnav"; |
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(palette, width, height, NULL, 0); |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
140 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
141 #endif |
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 if (vo_spudec == NULL) { |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
144 current_module = "spudec_init_normal"; |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
145 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
|
146 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
|
147 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
|
148 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
|
149 } |
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 if (vo_spudec) |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
152 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
|
153 } |
c111d9e9cfb0
Move init_vo_spudec to mp_common.c and reuse it in mencoder.
reimar
parents:
33421
diff
changeset
|
154 |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
155 static int is_text_sub(int type) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
156 { |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
157 return type == 't' || type == 'm' || type == 'a'; |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
158 } |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
159 |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
160 static int is_av_sub(int type) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
161 { |
31628
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31626
diff
changeset
|
162 return type == 'b' || type == 'p' || type == 'x'; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
163 } |
28325 | 164 |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
165 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
|
166 { |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
167 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
|
168 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
|
169 int len; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
170 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
|
171 static subtitle subs; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
172 if (reset) { |
25604 | 173 sub_clear_text(&subs, MP_NOPTS_VALUE); |
174 if (vo_sub) { | |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
175 set_osd_subtitle(NULL); |
25604 | 176 } |
177 if (vo_spudec) { | |
178 spudec_reset(vo_spudec); | |
179 vo_osd_changed(OSDTYPE_SPU); | |
180 } | |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31948
diff
changeset
|
181 #ifdef CONFIG_FFMPEG |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
182 if (is_av_sub(type)) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
183 reset_avsub(d_dvdsub->sh); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
184 #endif |
34761 | 185 subcc_reset(); |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
186 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
187 // find sub |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
188 if (subdata) { |
29668
ecc719c6d7a9
Make update_subtitles work without sh_video for text subtitles.
reimar
parents:
29666
diff
changeset
|
189 if (sub_fps==0) sub_fps = sh_video ? sh_video->fps : 25; |
25604 | 190 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
|
191 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
|
192 find_sub(subdata, curpts * |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
193 (subdata->sub_uses_time ? 100. : sub_fps)); |
25604 | 194 if (vo_sub) vo_sub_last = vo_sub; |
195 // FIXME! frame counter... | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
196 sub_last_pts = refpts; |
25604 | 197 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
198 } |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
199 |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
200 // DVD sub: |
31608
ad007a37ae4e
Automatically allocate a vo_spudec if there is none.
reimar
parents:
31599
diff
changeset
|
201 if (vo_config_count && |
31626
8bb62807f3b8
Remove dvdsub_id checks that should not be necessary.
reimar
parents:
31608
diff
changeset
|
202 (vobsub_id >= 0 || type == 'v')) { |
25604 | 203 int timestamp; |
204 current_module = "spudec"; | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
205 /* Get a sub packet from the DVD or a vobsub */ |
25604 | 206 while(1) { |
207 // Vobsub | |
208 len = 0; | |
209 if (vo_vobsub) { | |
31597
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
210 if (curpts >= 0) { |
1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
reimar
parents:
31559
diff
changeset
|
211 len = vobsub_get_packet(vo_vobsub, curpts, |
25604 | 212 (void**)&packet, ×tamp); |
213 if (len > 0) { | |
29665
6f1ebc60c04f
Factor out sh_video->pts into a refpts variable. This simplifies a future patch
reimar
parents:
29664
diff
changeset
|
214 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 | 215 } |
216 } | |
217 } else { | |
218 // DVD sub | |
31558 | 219 len = ds_get_packet_sub(d_dvdsub, (unsigned char**)&packet, NULL, NULL); |
25604 | 220 if (len > 0) { |
221 // XXX This is wrong, sh_video->pts can be arbitrarily | |
222 // much behind demuxing position. Unfortunately using | |
223 // d_video->pts which would have been the simplest | |
224 // improvement doesn't work because mpeg specific hacks | |
225 // 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
|
226 float x = d_dvdsub->pts - refpts; |
25604 | 227 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
|
228 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
|
229 else timestamp = 90000*curpts; |
25604 | 230 mp_dbg(MSGT_CPLAYER, MSGL_V, "\rDVD sub: len=%d " |
231 "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
|
232 refpts, d_dvdsub->pts, timestamp); |
25604 | 233 } |
234 } | |
235 if (len<=0 || !packet) break; | |
31838
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
236 // 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
|
237 // 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
|
238 // "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
|
239 // PGS subtitles. |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
240 if (!vo_spudec) |
31ece8c6baed
Move initialization of vo_spudec further behind to avoid issues with
reimar
parents:
31796
diff
changeset
|
241 vo_spudec = spudec_new(NULL); |
25604 | 242 if (vo_vobsub || timestamp >= 0) |
243 spudec_assemble(vo_spudec, packet, len, timestamp); | |
244 } | |
34761 | 245 } 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
|
246 int orig_type = type; |
25604 | 247 double endpts; |
29833 | 248 if (type == 'd' && !d_dvdsub->demuxer->teletext) { |
249 tt_stream_props tsp = {0}; | |
250 void *ptr = &tsp; | |
251 if (teletext_control(NULL, TV_VBI_CONTROL_START, &ptr) == VBI_CONTROL_TRUE) | |
252 d_dvdsub->demuxer->teletext = ptr; | |
253 } | |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
254 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
255 ds_get_next_pts(d_dvdsub); |
31558 | 256 while (1) { |
257 double subpts = curpts; | |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
258 type = orig_type; |
31558 | 259 len = ds_get_packet_sub(d_dvdsub, &packet, &subpts, &endpts); |
260 if (len < 0) | |
25604 | 261 break; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
262 if (is_av_sub(type)) { |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
31948
diff
changeset
|
263 #ifdef CONFIG_FFMPEG |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
264 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
|
265 if (type < 0) |
9404cb19e08d
Print a message when lavc subtitle decoding fails.
reimar
parents:
32594
diff
changeset
|
266 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
|
267 if (type <= 0) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
268 #endif |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
269 continue; |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
270 } |
25855
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
271 if (type == 'm') { |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
272 if (len < 2) continue; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
273 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
|
274 packet += 2; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25656
diff
changeset
|
275 } |
29833 | 276 if (type == 'd') { |
277 if (d_dvdsub->demuxer->teletext) { | |
278 uint8_t *p = packet; | |
35044
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
279 if (len == 3124) { // wtv subtitle-only format |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
280 while (len >= 42) { |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
281 teletext_control(d_dvdsub->demuxer->teletext, |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
282 TV_VBI_CONTROL_DECODE_LINE, p); |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
283 p += 42; |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
284 len -= 42; |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
285 } |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
286 return; |
99ac85950277
Support decoding teletext in the format that WTV uses.
reimar
parents:
34761
diff
changeset
|
287 } |
29833 | 288 p++; |
289 len--; | |
290 while (len >= 46) { | |
291 int sublen = p[1]; | |
292 if (p[0] == 2 || p[0] == 3) | |
293 teletext_control(d_dvdsub->demuxer->teletext, | |
294 TV_VBI_CONTROL_DECODE_DVB, p + 2); | |
295 p += sublen + 2; | |
296 len -= sublen + 2; | |
297 } | |
298 } | |
299 continue; | |
300 } | |
34761 | 301 if (type == 'c') { |
302 subcc_process_data(packet, len); | |
303 continue; | |
304 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26422
diff
changeset
|
305 #ifdef CONFIG_ASS |
25856 | 306 if (ass_enabled) { |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
307 sh_sub_t* sh = d_dvdsub->sh; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
308 ass_track = sh ? sh->ass_track : NULL; |
25856 | 309 if (!ass_track) continue; |
310 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
|
311 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
|
312 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
|
313 else |
31948 | 314 ass_process_chunk(ass_track, packet, len, |
315 (long long)(subpts*1000 + 0.5), | |
316 (long long)((endpts-subpts)*1000 + 0.5)); | |
25857 | 317 } else { // plaintext subs with libass |
29664 | 318 if (subpts != MP_NOPTS_VALUE) { |
30017
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
319 subtitle tmp_subs = {0}; |
29664 | 320 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 3; |
31686
b41cbf02f854
subtitles: convert SRT/MicroDVD markup into ASS markup
greg
parents:
31628
diff
changeset
|
321 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
|
322 tmp_subs.start = subpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
323 tmp_subs.end = endpts * 100; |
7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
reimar
parents:
29833
diff
changeset
|
324 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
|
325 sub_clear_text(&tmp_subs, MP_NOPTS_VALUE); |
25857 | 326 } |
25604 | 327 } |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
328 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
329 } |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
330 #endif |
29664 | 331 if (subpts != MP_NOPTS_VALUE) { |
25604 | 332 if (endpts == MP_NOPTS_VALUE) |
333 sub_clear_text(&subs, MP_NOPTS_VALUE); | |
25655
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
334 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
|
335 int i; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
336 unsigned char* p = packet; |
30992
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
337 int skip_commas = 8; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
338 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
|
339 skip_commas = 9; |
bf1afb0fa07d
Make ASS processing work with both subtitle formats, the MKV one and the
reimar
parents:
30907
diff
changeset
|
340 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
|
341 if (*p == ',') |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
342 i++; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
343 if (*p == '\0') /* Broken line? */ |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
344 continue; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
345 len -= p - packet; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
346 packet = p; |
e98ceb0190c1
Move all subtitle parsing from mkv demuxer to update_subtitles().
eugeni
parents:
25604
diff
changeset
|
347 } |
33421
f10754220d42
Workaround embedded ssa/ass never hiding with -noass.
iive
parents:
32866
diff
changeset
|
348 if (endpts == MP_NOPTS_VALUE) endpts = subpts + 4; |
31686
b41cbf02f854
subtitles: convert SRT/MicroDVD markup into ASS markup
greg
parents:
31628
diff
changeset
|
349 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
|
350 set_osd_subtitle(&subs); |
25604 | 351 } |
29768
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
352 if (d_dvdsub->non_interleaved) |
fa5a020677d6
Unbreak the demuxer-specific code in video.c with e.g.
reimar
parents:
29760
diff
changeset
|
353 ds_get_next_pts(d_dvdsub); |
25604 | 354 } |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
355 if (sub_clear_text(&subs, curpts)) |
29670
2e3751815a21
Add support for displaying subtitles on the command-line when playing
reimar
parents:
29668
diff
changeset
|
356 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
|
357 } |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
358 if (vo_spudec) { |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
359 spudec_heartbeat(vo_spudec, 90000*curpts); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
360 if (spudec_changed(vo_spudec)) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
361 vo_osd_changed(OSDTYPE_SPU); |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
362 } |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31597
diff
changeset
|
363 |
22233
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
364 current_module=NULL; |
5bf6c178f09a
Move some subtitle handling from mplayer.c to mpcommon.c and share it with mencoder.c
reimar
parents:
diff
changeset
|
365 } |
23903 | 366 |
367 void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset) | |
368 { | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
369 int page_changed; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
370 |
29806 | 371 if (!demuxer->teletext) |
372 return; | |
23903 | 373 |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
374 //Also forcing page update when such ioctl is not supported or call error occured |
29806 | 375 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
|
376 page_changed=1; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
377 |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
378 if(!page_changed) |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
379 return; |
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
380 |
29806 | 381 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_VBIPAGE,&vo_osd_teletext_page)!=VBI_CONTROL_TRUE) |
23903 | 382 vo_osd_teletext_page=NULL; |
29806 | 383 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_HALF_PAGE,&vo_osd_teletext_half)!=VBI_CONTROL_TRUE) |
23903 | 384 vo_osd_teletext_half=0; |
29806 | 385 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_MODE,&vo_osd_teletext_mode)!=VBI_CONTROL_TRUE) |
23903 | 386 vo_osd_teletext_mode=0; |
29806 | 387 if(teletext_control(demuxer->teletext,TV_VBI_CONTROL_GET_FORMAT,&vo_osd_teletext_format)!=VBI_CONTROL_TRUE) |
23903 | 388 vo_osd_teletext_format=0; |
389 vo_osd_changed(OSDTYPE_TELETEXT); | |
24342
8873c972c6aa
Decrease teletext page rendering frequency from 1/frame to about 4/sec.
voroshil
parents:
23903
diff
changeset
|
390 |
29806 | 391 teletext_control(demuxer->teletext,TV_VBI_CONTROL_MARK_UNCHANGED,NULL); |
23903 | 392 } |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
393 |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
394 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
|
395 { |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
396 if (audio_id == -1 && audio_lang) |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
397 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
|
398 if (audio_id == -1) |
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26090
diff
changeset
|
399 audio_id = demuxer_default_audio_track(demuxer); |
26090
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
400 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
|
401 demuxer_switch_audio(demuxer, audio_id); |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
402 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
|
403 demuxer->audio->id = -2; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
404 demuxer->audio->sh = NULL; |
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 return demuxer->audio->id; |
c585e2ad8ebf
Select audio stream in mplayer and mencoder, overriding demuxer decision.
eugeni
parents:
25857
diff
changeset
|
407 } |
26416 | 408 |
409 /* Parse -noconfig common to both programs */ | |
410 int disable_system_conf=0; | |
411 int disable_user_conf=0; | |
27343 | 412 #ifdef CONFIG_GUI |
26422
f74bff77f088
noconfig fix, disable_gui_conf was not defined when compiling mencoder.
albeu
parents:
26416
diff
changeset
|
413 int disable_gui_conf=0; |
27343 | 414 #endif /* CONFIG_GUI */ |
26416 | 415 |
416 /* Disable all configuration files */ | |
417 static void noconfig_all(void) | |
418 { | |
419 disable_system_conf = 1; | |
420 disable_user_conf = 1; | |
27343 | 421 #ifdef CONFIG_GUI |
26416 | 422 disable_gui_conf = 1; |
27343 | 423 #endif /* CONFIG_GUI */ |
26416 | 424 } |
425 | |
33877
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
426 m_config_t *mconfig; |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
427 |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
428 int cfg_inc_verbose(m_option_t *conf) |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
429 { |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
430 ++verbose; |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
431 return 0; |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
432 } |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
433 |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
434 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
|
435 { |
34172 | 436 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
|
437 } |
c52940fe54dd
Move cfg_inc_verbose and cfg_include into mpcommon.c.
diego
parents:
33827
diff
changeset
|
438 |
26416 | 439 const m_option_t noconfig_opts[] = { |
440 {"all", noconfig_all, CONF_TYPE_FUNC, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 0, NULL}, | |
441 {"system", &disable_system_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
442 {"user", &disable_user_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, | |
27343 | 443 #ifdef CONFIG_GUI |
26416 | 444 {"gui", &disable_gui_conf, CONF_TYPE_FLAG, CONF_GLOBAL|CONF_NOCFG|CONF_PRE_PARSE, 0, 1, NULL}, |
27343 | 445 #endif /* CONFIG_GUI */ |
26416 | 446 {NULL, NULL, 0, 0, 0, 0, NULL} |
447 }; | |
30872 | 448 |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
449 /** |
32594 | 450 * 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
|
451 * on option values. |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
452 */ |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
453 void common_preinit(void) |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
454 { |
32384 | 455 InitTimer(); |
456 srand(GetTimerMS()); | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
457 |
32384 | 458 mp_msg_init(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
459 } |
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 /** |
32385
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
462 * 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
|
463 * 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
|
464 */ |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
465 static void sanitize_os(void) |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
466 { |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
467 #if defined(__MINGW32__) || defined(__CYGWIN__) |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
468 HMODULE kernel32 = GetModuleHandle("Kernel32.dll"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
469 BOOL WINAPI (*setDEP)(DWORD) = NULL; |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
470 BOOL WINAPI (*setDllDir)(LPCTSTR) = NULL; |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
471 if (kernel32) { |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
472 setDEP = GetProcAddress(kernel32, "SetProcessDEPPolicy"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
473 setDllDir = GetProcAddress(kernel32, "SetDllDirectoryA"); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
474 } |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
475 if (setDEP) setDEP(3); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
476 if (setDllDir) setDllDir(""); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
477 // 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
|
478 SetErrorMode(0x8003); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
479 // request 1ms timer resolution |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
480 timeBeginPeriod(1); |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
481 #endif |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
482 } |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
483 |
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
484 /** |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
485 * Initialization code to be run after command-line parsing. |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
486 */ |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
487 int common_init(void) |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
488 { |
32415
d1f6c6cf8905
Move gui-specific code out of common_init, it certainly does
reimar
parents:
32414
diff
changeset
|
489 #if (defined(__MINGW32__) || defined(__CYGWIN__)) && defined(CONFIG_WIN32DLL) |
32384 | 490 set_path_env(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
491 #endif |
32385
8d841a288ca7
Move OS-fixup hacks in init code into a separate function.
reimar
parents:
32384
diff
changeset
|
492 sanitize_os(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
493 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
494 #ifdef CONFIG_PRIORITY |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
495 set_priority(); |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
496 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
497 |
32384 | 498 if (codec_path) |
499 set_codec_path(codec_path); | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
500 |
32384 | 501 /* Check codecs.conf. */ |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
502 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
|
503 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
|
504 if (!parse_codec_cfg(conf_path)) { |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
505 if (!parse_codec_cfg(MPLAYER_CONFDIR "/codecs.conf")) { |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
506 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
|
507 free(conf_path); |
32384 | 508 return 0; |
509 } | |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33598
diff
changeset
|
510 mp_msg(MSGT_CPLAYER, MSGL_V, "Using built-in default codecs.conf.\n"); |
32384 | 511 } |
512 } | |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
513 free(conf_path); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
514 } |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
515 |
32384 | 516 // check font |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
517 #ifdef CONFIG_FREETYPE |
32384 | 518 init_freetype(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
519 #endif |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
520 #ifdef CONFIG_FONTCONFIG |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
521 if (font_fontconfig <= 0) |
32386 | 522 #endif |
32384 | 523 { |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
524 #ifdef CONFIG_BITMAP_FONT |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
525 if (font_name) { |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
526 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
|
527 if (!vo_font) |
32384 | 528 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont, |
529 filename_recode(font_name)); | |
530 } else { | |
531 // try default: | |
32389
4fb3f810de30
Write the code in a more understandable way instead of trying to explain
reimar
parents:
32388
diff
changeset
|
532 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
|
533 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
|
534 free(desc_path); |
32388
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
535 if (!vo_font) |
211cd5f02401
Whitespace cosmetics: format init function more consistent with the
reimar
parents:
32386
diff
changeset
|
536 vo_font = read_font_desc(MPLAYER_DATADIR "/font/font.desc", font_factor, verbose>1); |
32384 | 537 } |
538 if (sub_font_name) | |
539 sub_font = read_font_desc(sub_font_name, font_factor, verbose>1); | |
540 else | |
541 sub_font = vo_font; | |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
542 #endif |
32384 | 543 } |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
544 |
32384 | 545 vo_init_osd(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
546 |
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
547 #ifdef CONFIG_ASS |
32384 | 548 ass_library = ass_init(); |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
549 #endif |
32384 | 550 return 1; |
32383
f6e78eef2e1b
Avoid duplicating common init code between MPlayer and mencoder.
reimar
parents:
32209
diff
changeset
|
551 } |
32863
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
552 |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
553 /// Returns a_pts |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
554 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
|
555 { |
32865 | 556 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
|
557 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
|
558 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
|
559 // first calculate the end pts of audio that has been output by decoder |
32865 | 560 a_pts = sh_audio->pts; |
32866
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
561 // 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
|
562 // 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
|
563 // resetting to 0. |
9acb64ec6484
Improve handling of audio timestamps where we do not have even a
reimar
parents:
32865
diff
changeset
|
564 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
|
565 !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
|
566 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
|
567 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
|
568 // 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
|
569 // 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
|
570 // 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
|
571 // 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
|
572 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
|
573 else { |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
574 // 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
|
575 // 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
|
576 // 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
|
577 // 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
|
578 // 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
|
579 // 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
|
580 // 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
|
581 // 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
|
582 |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
583 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
|
584 // 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
|
585 // 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
|
586 // 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
|
587 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
|
588 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
|
589 (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
|
590 } |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
591 return a_pts; |
674117ab7ce7
Move MPlayer's audio pts calculation code into mp_common.c and reuse it in
reimar
parents:
32862
diff
changeset
|
592 } |