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