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