summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-10-06 04:28:59 +0300
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-10-06 04:48:00 +0300
commit7fd3eb0f74e7986e07556077ed654bad7869add8 (patch)
tree8d293145c0ef2bc31ca63f79dccb4e3b57294c82
parentef438b3a6b5bc714d521dd46d3ccb798ecd31eed (diff)
parentcbbc886820e981f488660708678f528e1d243121 (diff)
downloadmpv-7fd3eb0f74e7986e07556077ed654bad7869add8.tar.bz2
mpv-7fd3eb0f74e7986e07556077ed654bad7869add8.tar.xz
Merge svn changes up to r29752
As part of merging subtitle-in-terminal changes make update_subtitles() only clear existing subtitles if called with the reset argument, and not try to set new ones. Later calls should set the needed new subtitles, and this change avoids some problems with trying to set subtitles when mp_property_sub() in command.c gets called from initialization code before full initialization.
-rw-r--r--Changelog14
-rw-r--r--DOCS/man/en/mplayer.18
-rw-r--r--DOCS/man/zh_CN/mplayer.16
-rw-r--r--cfg-common-opts.h7
-rw-r--r--command.c5
-rwxr-xr-xconfigure90
-rw-r--r--defaultopts.c2
-rw-r--r--etc/codecs.conf29
-rw-r--r--find_sub.c57
-rw-r--r--help/help_mp-bg.h1
-rw-r--r--help/help_mp-cs.h2
-rw-r--r--help/help_mp-de.h2
-rw-r--r--help/help_mp-dk.h1
-rw-r--r--help/help_mp-el.h1
-rw-r--r--help/help_mp-en.h2
-rw-r--r--help/help_mp-es.h2
-rw-r--r--help/help_mp-fr.h1
-rw-r--r--help/help_mp-hu.h2
-rw-r--r--help/help_mp-it.h2
-rw-r--r--help/help_mp-ja.h1
-rw-r--r--help/help_mp-ko.h1
-rw-r--r--help/help_mp-mk.h1
-rw-r--r--help/help_mp-nl.h1
-rw-r--r--help/help_mp-pl.h1
-rw-r--r--help/help_mp-pt_BR.h1
-rw-r--r--help/help_mp-ru.h2
-rw-r--r--help/help_mp-sk.h1
-rw-r--r--help/help_mp-sv.h1
-rw-r--r--help/help_mp-tr.h2
-rw-r--r--help/help_mp-uk.h1
-rw-r--r--help/help_mp-zh_CN.h2
-rw-r--r--help/help_mp-zh_TW.h2
-rw-r--r--libaf/control.h24
-rw-r--r--libao2/ao_alsa.c5
-rw-r--r--libao2/ao_oss.c13
-rw-r--r--libmpcodecs/ad_ffmpeg.c1
-rw-r--r--libmpcodecs/ad_twin.c2
-rw-r--r--libmpcodecs/ae_lavc.c2
-rw-r--r--libmpcodecs/vd.c7
-rw-r--r--libmpcodecs/vd_ffmpeg.c2
-rw-r--r--libmpcodecs/ve_lavc.c4
-rw-r--r--libmpcodecs/ve_x264.c47
-rw-r--r--libmpdemux/demux_lavf.c5
-rw-r--r--libmpdemux/demux_mkv.c32
-rw-r--r--libmpdemux/demux_ts.c1
-rw-r--r--libmpdemux/mp_taglists.c3
-rw-r--r--libvo/aclib_template.c18
-rw-r--r--libvo/gl_common.c29
-rw-r--r--libvo/osx_common.c2
-rw-r--r--libvo/sub.c4
-rw-r--r--libvo/vo_corevideo.m9
-rw-r--r--libvo/vo_gl.c10
-rw-r--r--libvo/vo_gl2.c4
-rw-r--r--mencoder.c16
-rw-r--r--mp_osd.h1
-rw-r--r--mpcommon.c59
-rw-r--r--mpcommon.h7
-rw-r--r--mplayer.c52
-rw-r--r--subreader.h3
59 files changed, 362 insertions, 251 deletions
diff --git a/Changelog b/Changelog
index 59293eb0f6..c2f7babbd3 100644
--- a/Changelog
+++ b/Changelog
@@ -5,12 +5,22 @@ MPlayer (1.0)
* YUY2 Lossless Codec (YLC0) via binary DLL
* Truemotion RT codec (TR20) via binary DLL
* Nogantech Codec (NTN1 and NTN2) via binary DLL
- * add new FourCCs (m1v1,HDMV), TwoCCs (0xA106,0x6c75), and formats (0x11005354)
- to existing codecs.
+ * add new FourCCs (m1v1)
+ TwoCCs (0xA106,0x6c75,0xAAC0)
+ to existing decoders.
* AMR now handled via opencore decoder
+ * updated Windoes Media Screen Codec (MSS1,MSS2) via binary DLL
+ * h264 decoder (CoreAVC) on Windows only via binary DLL
+ * Kega Game video codec (KGV1) via binary DLL
Demuxers:
* support for TrueHD in BluRay streams in libmpdemux
+ * more BluRay codec support with lavf
+
+ Other:
+ * -nosub option for disabling auto-selected subtitles
+ * support for displaying subs in the term (FIXME)
+ * support for subtitles with audio only files
rc3: "BikeshedCounter" March 27, 2009
Decoders:
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 749c15e922..30043fb11b 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -2291,6 +2291,10 @@ MPlayer prints the available subtitle IDs when run in verbose (\-v) mode.
If you cannot select one of the subtitles on a DVD, also try \-vobsubid.
.
.TP
+.B \-nosub
+Disables any otherwise auto-selected subtitles (as e.g. the Matroska/mkv demuxer supports).
+.
+.TP
.B \-slang <language code[,language code,...]> (also see \-sid)
Specify a priority list of subtitle languages to use.
Different container formats employ different language codes.
@@ -7263,6 +7267,10 @@ Files named 'shotNNNN.png' will be saved in the working directory,
using the first available number \- no files will be overwritten.
The filter has no overhead when not used and accepts an arbitrary
colorspace, so it is safe to add it to the configuration file.
+Make sure that screenshot is added after all other filters that
+you want to have applied to it.
+E.g. it should be the last filter if you want to have an exact
+screenshot of what you see on the monitor.
.RE
.
.TP
diff --git a/DOCS/man/zh_CN/mplayer.1 b/DOCS/man/zh_CN/mplayer.1
index 6d30e6a112..0bd744ceaa 100644
--- a/DOCS/man/zh_CN/mplayer.1
+++ b/DOCS/man/zh_CN/mplayer.1
@@ -1,4 +1,4 @@
-.\" sync with en/mplayer.1 r29661
+.\" sync with en/mplayer.1 r29731
.\" Encoding: UTF-8
.\" Reminder of hard terms which need better/final solution later:
.\" /capture; playtree in parent list; colorkey; retrace; desync; downmix;
@@ -2182,6 +2182,10 @@ MPlayer 运行在 verbose (\-v) 模式时, 打印可用的字幕标识。
如果你不能选择 DVD 中其中之一的字幕, 也请试试 \-vobsubid。
.
.TP
+.B \-nosub
+禁止所有默认情况下自动选择的字幕(就像比如 Matroska/mkv 流分离器所支持的那样)。
+.
+.TP
.B \-slang <语言代号[,语言代号,...]> (也请参见 \-sid)
指定使用字幕语言的优先级列表。
不同的容器格式使用不同的语言代号。DVDs 使用 ISO 639\-1 的
diff --git a/cfg-common-opts.h b/cfg-common-opts.h
index 053a24b372..df034ac446 100644
--- a/cfg-common-opts.h
+++ b/cfg-common-opts.h
@@ -120,10 +120,11 @@
{"loadidx", &index_file_load, CONF_TYPE_STRING, 0, 0, 0, NULL},
// select audio/video/subtitle stream
- OPT_INTRANGE("aid", audio_id, 0, 0, 8190),
+ OPT_INTRANGE("aid", audio_id, 0, -2, 8190),
{"ausid", &audio_substream_id, CONF_TYPE_INT, 0, 0, 0, NULL},
- OPT_INTRANGE("vid", video_id, 0, 0, 8190),
- OPT_INTRANGE("sid", sub_id, 0, 0, 8190),
+ OPT_INTRANGE("vid", video_id, 0, -2, 8190),
+ OPT_INTRANGE("sid", sub_id, 0, -2, 8190),
+ OPT_FLAG_CONSTANTS("nosub", sub_id, 0, -1, -2),
OPT_FLAG_CONSTANTS("novideo", video_id, 0, -1, -2),
{ "hr-mp3-seek", &hr_mp3_seek, CONF_TYPE_FLAG, 0, 0, 1, NULL },
diff --git a/command.c b/command.c
index f35f3e1a32..9738377dd3 100644
--- a/command.c
+++ b/command.c
@@ -1345,7 +1345,7 @@ static int mp_property_sub(m_option_t *prop, int action, void *arg,
int source = -1, reset_spu = 0;
char *sub_name;
- if (!mpctx->sh_video || global_sub_size <= 0)
+ if (global_sub_size <= 0)
return M_PROPERTY_UNAVAILABLE;
switch (action) {
@@ -1529,7 +1529,8 @@ static int mp_property_sub(m_option_t *prop, int action, void *arg,
d_sub->id = opts->sub_id;
}
#endif
- update_subtitles(mpctx->sh_video, d_sub, 0, 1);
+
+ update_subtitles(mpctx, &mpctx->opts, mpctx->sh_video, 0, 0, d_sub, 1);
return M_PROPERTY_OK;
}
diff --git a/configure b/configure
index e55da52c98..2beae2fafc 100755
--- a/configure
+++ b/configure
@@ -440,6 +440,7 @@ Advanced options:
--enable-armv6 enable ARMv6 (ARM) [autodetect]
--enable-armv6t2 enable ARMv6t2 (ARM) [autodetect]
--enable-armvfp enable ARM VFP (ARM) [autodetect]
+ --enable-neon enable NEON (ARM) [autodetect]
--enable-iwmmxt enable iWMMXt (ARM) [autodetect]
--disable-fastmemcpy disable 3DNow!/SSE/MMX optimized memcpy [enable]
--enable-big-endian force byte order to big-endian [autodetect]
@@ -464,7 +465,7 @@ Use these options if autodetection fails:
--with-gtk-config=PATH path to gtk*-config
--with-sdl-config=PATH path to sdl*-config
--with-dvdnav-config=PATH path to dvdnav-config
- --with-dvdread-config=PATH path to dvdread-config
+ --with-dvdread-config=PATH path to dvdread-config
This configure script is NOT autoconf-based, even though its output is similar.
It will try to autodetect all configuration options. If you --enable an option
@@ -490,6 +491,7 @@ _armv5te=auto
_armv6=auto
_armv6t2=auto
_armvfp=auto
+neon=auto
_iwmmxt=auto
_mtrr=auto
_altivec=auto
@@ -1233,6 +1235,8 @@ for ac_option do
--disable-armv6t2) _armv6t2=no ;;
--enable-armvfp) _armvfp=yes ;;
--disable-armvfp) _armvfp=no ;;
+ --enable-neon) neon=yes ;;
+ --disable-neon) neon=no ;;
--enable-iwmmxt) _iwmmxt=yes ;;
--disable-iwmmxt) _iwmmxt=no ;;
--enable-mmx) _mmx=yes ;;
@@ -1266,6 +1270,9 @@ if test -z "$_target" ; then
case "$system_name" in
Linux|FreeBSD|NetBSD|OpenBSD|DragonFly|BSD/OS|Darwin|SunOS|QNX|GNU|BeOS|MorphOS|AIX|AmigaOS)
;;
+ Haiku)
+ system_name=BeOS
+ ;;
IRIX*)
system_name=IRIX
;;
@@ -1306,16 +1313,8 @@ if test -z "$_target" ; then
# x86/x86pc is used by QNX
case "$(uname -m 2>&1)" in
- i[3-9]86*|x86|x86pc|k5|k6|k6_2|k6_3|k6-2|k6-3|pentium*|athlon*|i586_i686|i586-i686|BePC) host_arch=i386 ;;
+ x86_64|amd64|i[3-9]86*|x86|x86pc|k5|k6|k6_2|k6_3|k6-2|k6-3|pentium*|athlon*|i586_i686|i586-i686|BePC) host_arch=i386 ;;
ia64) host_arch=ia64 ;;
- x86_64|amd64)
- if [ -n "$($_cc -dumpmachine | sed -n '/^x86_64-/p;/^amd64-/p')" -a \
- -z "$(echo $CFLAGS $_cc | grep -- -m32)" ]; then
- host_arch=x86_64
- else
- host_arch=i386
- fi
- ;;
macppc|ppc) host_arch=ppc ;;
ppc64) host_arch=ppc64 ;;
alpha) host_arch=alpha ;;
@@ -1356,14 +1355,6 @@ else # if test -z "$_target"
fi
fi
-echo "Detected operating system: $system_name"
-echo "Detected host architecture: $host_arch"
-
-if test "$_runtime_cpudetection" = yes && ! x86 && ! ppc; then
- die "Runtime CPU detection only works for x86, x86-64 and PPC!"
-fi
-
-
extra_cflags="-I. $extra_cflags"
_timer=timer-linux.c
_getch=getch2.c
@@ -1446,6 +1437,24 @@ echo configuration: $_configuration > "$TMPLOG"
echo >> "$TMPLOG"
+if test -z "$_target" && x86 ; then
+ cat > $TMPC << EOF
+int main(void) {
+ int test[sizeof(char *)-7];
+ return 0;
+}
+EOF
+ cc_check && host_arch=x86_64 || host_arch=i386
+fi
+
+echo "Detected operating system: $system_name"
+echo "Detected host architecture: $host_arch"
+
+if test "$_runtime_cpudetection" = yes && ! x86 && ! ppc; then
+ die "Runtime CPU detection only works for x86, x86-64 and PPC!"
+fi
+
+
# Checking CC version...
# Intel C++ Compilers (no autoselect, use CC=/some/binary ./configure)
if test "$(basename $_cc)" = "icc" || test "$(basename $_cc)" = "ecc"; then
@@ -2297,6 +2306,7 @@ EOF
cc_check -c || die "Symbol mangling check failed."
sym=$($_nm -P -g $TMPEXE)
extern_prefix=${sym%%ff_extern*}
+def_extern_asm="#define EXTERN_ASM $extern_prefix"
def_extern_prefix="#define EXTERN_PREFIX \"$extern_prefix\""
echores $extern_prefix
@@ -2467,6 +2477,26 @@ EOF
cc_check && ten_operands=yes && def_ten_operands='#define HAVE_TEN_OPERANDS 1'
echores $ten_operands
+echocheck "ebx availability"
+ebx_available=no
+def_ebx_available='#define HAVE_EBX_AVAILABLE 0'
+cat > $TMPC << EOF
+int main(void) {
+ int x;
+ __asm__ volatile(
+ "xor %0, %0"
+ :"=b"(x)
+ // just adding ebx to clobber list seems unreliable with some
+ // compilers, e.g. Haiku's gcc 2.95
+ );
+ // and the above check does not work for OSX 64 bit...
+ __asm__ volatile("":::"%ebx");
+ return 0;
+}
+EOF
+cc_check && ebx_available=yes && def_ebx_available='#define HAVE_EBX_AVAILABLE 1'
+echores $ebx_available
+
echocheck "yasm"
if test -z "$YASMFLAGS" ; then
if darwin ; then
@@ -2623,6 +2653,16 @@ EOF
fi
echores "$_armvfp"
+ echocheck "ARM NEON"
+ if test $neon = "auto" ; then
+ cat > $TMPC << EOF
+int main(void) { __asm__ volatile ("vadd.i16 q0, q0, q0"); return 0; }
+EOF
+ neon=no
+ cc_check && neon=yes
+ fi
+ echores "$neon"
+
echocheck "iWMMXt (Intel XScale SIMD instructions)"
if test $_iwmmxt = "auto" ; then
cat > $TMPC << EOF
@@ -2634,7 +2674,7 @@ EOF
echores "$_iwmmxt"
fi
-_cpuexts_all='ALTIVEC MMX MMX2 AMD3DNOW AMD3DNOWEXT SSE SSE2 SSSE3 FAST_CMOV CMOV PLD ARMV5TE ARMV6 ARMV6T2 ARMVFP IWMMXT MMI VIS MVI'
+_cpuexts_all='ALTIVEC MMX MMX2 AMD3DNOW AMD3DNOWEXT SSE SSE2 SSSE3 FAST_CMOV CMOV PLD ARMV5TE ARMV6 ARMV6T2 ARMVFP NEON IWMMXT MMI VIS MVI'
test "$_altivec" = yes && _cpuexts="ALTIVEC $_cpuexts"
test "$_mmx" = yes && _cpuexts="MMX $_cpuexts"
test "$_mmxext" = yes && _cpuexts="MMX2 $_cpuexts"
@@ -2650,6 +2690,7 @@ test "$_armv5te" = yes && _cpuexts="ARMV5TE $_cpuexts"
test "$_armv6" = yes && _cpuexts="ARMV6 $_cpuexts"
test "$_armv6t2" = yes && _cpuexts="ARMV6T2 $_cpuexts"
test "$_armvfp" = yes && _cpuexts="ARMVFP $_cpuexts"
+test "$neon" = yes && _cpuexts="NEON $_cpuexts"
test "$_iwmmxt" = yes && _cpuexts="IWMMXT $_cpuexts"
test "$_vis" = yes && _cpuexts="VIS $_cpuexts"
test "$_mvi" = yes && _cpuexts="MVI $_cpuexts"
@@ -6347,7 +6388,7 @@ echores "$_theora"
echocheck "internal mp3lib support"
if test "$_mp3lib" = auto ; then
- test "$cc_vendor" = intel && _mp3lib=no || _mp3lib=yes
+ test "$cc_vendor" = intel && test "$_cc_major" -le 10 -o "$_cc_major" -eq 11 -a "$_cc_minor" -eq 0 && _mp3lib=no || _mp3lib=yes
fi
if test "$_mp3lib" = yes ; then
def_mp3lib='#define CONFIG_MP3LIB 1'
@@ -6360,7 +6401,7 @@ echores "$_mp3lib"
echocheck "liba52 support"
if test "$_liba52_internal" = auto ; then
- test "$cc_vendor" = intel && _liba52_internal=no || _liba52_internal=yes
+ test "$cc_vendor" = intel && test "$_cc_major" -le 10 -o "$_cc_major" -eq 11 -a "$_cc_minor" -eq 0 && _liba52_internal=no || _liba52_internal=yes
fi
def_liba52='#undef CONFIG_LIBA52'
def_liba52_internal="#undef CONFIG_LIBA52_INTERNAL"
@@ -6945,8 +6986,8 @@ if test "$_x264" = auto ; then
cat > $TMPC << EOF
#include <inttypes.h>
#include <x264.h>
-#if X264_BUILD < 65
-#error We do not support old versions of x264. Get the latest from SVN.
+#if X264_BUILD < 76
+#error We do not support old versions of x264. Get the latest from git.
#endif
int main(void) { x264_encoder_open((void*)0); return 0; }
EOF
@@ -8097,6 +8138,7 @@ $def_vsscanf
$def_asmalign_pot
$def_builtin_expect
$def_dl
+$def_extern_asm
$def_extern_prefix
$def_iconv
$def_kstat
@@ -8404,7 +8446,7 @@ $def_yasm
#define CONFIG_RDFT 1
/* Use these registers in FFmpeg x86 inline asm. No proper detection yet. */
-#define HAVE_EBX_AVAILABLE 1
+$def_ebx_available
#ifndef MP_DEBUG
#define HAVE_EBP_AVAILABLE 1
#else
diff --git a/defaultopts.c b/defaultopts.c
index d908eda347..2bd6f7e3e3 100644
--- a/defaultopts.c
+++ b/defaultopts.c
@@ -26,7 +26,7 @@ void set_default_mplayer_options(struct MPOpts *opts)
.doubleclick_time = 300,
.audio_id = -1,
.video_id = -1,
- .sub_id = -2,
+ .sub_id = -1,
.playback_speed = 1.,
.movie_aspect = -1.,
.flip = -1,
diff --git a/etc/codecs.conf b/etc/codecs.conf
index 782ff61809..84660fc82f 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -899,6 +899,22 @@ videocodec ffh264vdpau
dll h264_vdpau
out VDPAU_H264
+videocodec coreavcwindows
+ info "CoreAVC H.264 for x86 - http://corecodec.org/"
+ comment "this codec will only work after purchasing it"
+ status working
+ fourcc H264,h264
+ fourcc X264,x264
+ fourcc avc1 AVC1,AVC1
+ fourcc davc,DAVC
+ fourcc VSSH
+ format 0x10000005
+ driver dshow
+ dll "CoreAVCDecoder.ax"
+ guid 0x09571a4b, 0xf1fe, 0x4c60, 0x97, 0x60, 0xde, 0x6d, 0x31, 0x0c, 0x7c, 0x31
+ out YV12,IYUV,I420,YUY2
+
+
videocodec ffsvq3
info "FFmpeg Sorenson Video v3 (SVQ3)"
status working
@@ -1148,6 +1164,16 @@ videocodec wmsdmod
guid 0x7bafb3b1, 0xd8f4, 0x4279, 0x92, 0x53, 0x27, 0xda, 0x42, 0x31, 0x08, 0xde
out BGR32,BGR24,BGR16
+videocodec wms10dmod
+ info "Windows Media Screen Codec 2 from WMP10"
+ status working
+ fourcc MSS1
+ fourcc MSS2
+ driver dmo
+ dll "wms10dmod.dll"
+ guid 0x7bafb3b1, 0xd8f4, 0x4279, 0x92, 0x53, 0x27, 0xda, 0x42, 0x31, 0x08, 0xde
+ out BGR32,BGR24,BGR16
+
videocodec gotomeeting
info "GoToMeeting codec"
status working
@@ -3499,10 +3525,12 @@ audiocodec faad
fourcc "VLB " ; Used in NSV, not really working
fourcc "AAC " ; Used in NSV
fourcc "AACP" ; Used in NSV for AACPlus
+ fourcc raac,racp
format 0xff
format 0x706D
format 0x4143 ; aac in asf
format 0xA106 ; aac in avi
+ format 0xAAC0 ; Borgtech nonsense tag
driver faad
dll libfaad2
@@ -3518,6 +3546,7 @@ audiocodec ffaac
format 0x706D
format 0x4143 ; aac in asf
format 0xA106 ; aac in avi not yet working
+ format 0xAAC0 ; Borgtech nonsense tag
driver ffmpeg
dll aac
diff --git a/find_sub.c b/find_sub.c
index 07d91d7e55..dcd4c4cd77 100644
--- a/find_sub.c
+++ b/find_sub.c
@@ -12,6 +12,7 @@
#include "mp_msg.h"
#include "help_mp.h"
+#include "mpcommon.h"
static int current_sub=0;
@@ -52,8 +53,9 @@ void step_sub(sub_data *subd, float pts, int movement) {
sub_delay = subs[current_sub].start / (subd->sub_uses_time ? 100 : sub_fps) - pts;
}
-void find_sub(sub_data* subd,int key){
+void find_sub(struct MPContext *mpctx, sub_data* subd,int key){
subtitle *subs;
+ subtitle *new_sub = NULL;
int i,j;
if ( !subd || subd->sub_num == 0) return;
@@ -77,8 +79,8 @@ void find_sub(sub_data* subd,int key){
vo_osd_changed(OSDTYPE_SUBTITLE);
if(key<=0){
- vo_sub=NULL; // no sub here
- return;
+ // no sub here
+ goto update;
}
// printf("\r---- sub changed ----\n");
@@ -89,13 +91,12 @@ void find_sub(sub_data* subd,int key){
// no sub
nosub_range_start=subs[current_sub].end;
nosub_range_end=subs[current_sub+1].start;
- vo_sub=NULL;
- return;
+ goto update;
}
// next sub?
++current_sub;
- vo_sub=&subs[current_sub];
- if(key>=vo_sub->start && key<=vo_sub->end) return; // OK!
+ new_sub=&subs[current_sub];
+ if(key>=new_sub->start && key<=new_sub->end) goto update; // OK!
}
// printf("\r---- sub log search... ----\n");
@@ -106,22 +107,22 @@ void find_sub(sub_data* subd,int key){
// printf("Searching %d in %d..%d\n",key,subs[i].start,subs[j].end);
while(j>=i){
current_sub=(i+j+1)/2;
- vo_sub=&subs[current_sub];
- if(key<vo_sub->start) j=current_sub-1;
- else if(key>vo_sub->end) i=current_sub+1;
- else return; // found!
+ new_sub=&subs[current_sub];
+ if(key<new_sub->start) j=current_sub-1;
+ else if(key>new_sub->end) i=current_sub+1;
+ else goto update; // found!
}
-// if(key>=vo_sub->start && key<=vo_sub->end) return; // OK!
+// if(key>=new_sub->start && key<=new_sub->end) return; // OK!
// check where are we...
- if(key<vo_sub->start){
+ if(key<new_sub->start){
if(current_sub<=0){
// before the first sub
nosub_range_start=key-1; // tricky
- nosub_range_end=vo_sub->start;
-// printf("FIRST... key=%d end=%d \n",key,vo_sub->start);
- vo_sub=NULL;
- return;
+ nosub_range_end=new_sub->start;
+// printf("FIRST... key=%d end=%d \n",key,new_sub->start);
+ new_sub=NULL;
+ goto update;
}
--current_sub;
if(key>subs[current_sub].end && key<subs[current_sub+1].start){
@@ -129,31 +130,33 @@ void find_sub(sub_data* subd,int key){
nosub_range_start=subs[current_sub].end;
nosub_range_end=subs[current_sub+1].start;
// printf("No sub... 1 \n");
- vo_sub=NULL;
- return;
+ new_sub=NULL;
+ goto update;
}
printf("HEH???? ");
} else {
- if(key<=vo_sub->end) printf("JAJJ! "); else
+ if(key<=new_sub->end) printf("JAJJ! "); else
if(current_sub+1 >= subd->sub_num){
// at the end?
- nosub_range_start=vo_sub->end;
+ nosub_range_start=new_sub->end;
nosub_range_end=0x7FFFFFFF; // MAXINT
// printf("END!?\n");
- vo_sub=NULL;
- return;
+ new_sub=NULL;
+ goto update;
} else
if(key>subs[current_sub].end && key<subs[current_sub+1].start){
// no sub
nosub_range_start=subs[current_sub].end;
nosub_range_end=subs[current_sub+1].start;
// printf("No sub... 2 \n");
- vo_sub=NULL;
- return;
+ new_sub=NULL;
+ goto update;
}
}
- mp_msg(MSGT_FIXME,MSGL_FIXME,"SUB ERROR: %d ? %d --- %d [%d] \n",key,(int)vo_sub->start,(int)vo_sub->end,current_sub);
+ mp_msg(MSGT_FIXME,MSGL_FIXME,"SUB ERROR: %d ? %d --- %d [%d] \n",key,(int)new_sub->start,(int)new_sub->end,current_sub);
- vo_sub=NULL; // no sub here
+ new_sub=NULL; // no sub here
+update:
+ set_osd_subtitle(mpctx, new_sub);
}
diff --git a/help/help_mp-bg.h b/help/help_mp-bg.h
index a74732cc63..bf8608360d 100644
--- a/help/help_mp-bg.h
+++ b/help/help_mp-bg.h
@@ -546,7 +546,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Кодекът не е указал sh->disp_w и sh->disp_h, опит за решение.\n"
-#define MSGTR_VoConfigRequest "VDec: заявка на vo config - %d x %d (preferred csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Не е открит подходящ цветови формат - повторен опит с -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Пропорциите на филма са %.2f:1 - мащабиране до правилните пропорции .\n"
#define MSGTR_MovieAspectUndefined "Не са дефинирани пропорции - без предварително мащабиране.\n"
diff --git a/help/help_mp-cs.h b/help/help_mp-cs.h
index 716200e25e..aa39e02a47 100644
--- a/help/help_mp-cs.h
+++ b/help/help_mp-cs.h
@@ -1631,8 +1631,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDek: Kodek nenastavil sh->disp_w a sh->disp_h, pokouším se to obejít.\n"
-#define MSGTR_VoConfigRequest "VDek: Požadovaná konfigurace vo - %d x %d (preferovaný barevný prostor: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDek: používám %s jako výstupní csp (ne %d)\n"
#define MSGTR_CouldNotFindColorspace "Nemohu nalézt společný barevný prostor - zkouším to znovu s -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Poměr stran obrazu filmu je %.2f:1 - škáluji na správný poměr.\n"
#define MSGTR_MovieAspectUndefined "Poměr stran obrazu filmu není definován - neměním velikost.\n"
diff --git a/help/help_mp-de.h b/help/help_mp-de.h
index 0b5f467382..48b2e9976a 100644
--- a/help/help_mp-de.h
+++ b/help/help_mp-de.h
@@ -714,8 +714,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Codec hat sh->disp_w und sh->disp_h nicht gesetzt!\nVersuche Problem zu umgehen..\n"
-#define MSGTR_VoConfigRequest "VDec: VO wird versucht, auf %d x %d (Bevorzugter Farbraum: %s) zu setzen.\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: Verwende %s als Ausgabefarbraum (Nummer %d).\n"
#define MSGTR_CouldNotFindColorspace "Konnte keinen passenden Farbraum finden - neuer Versuch mit '-vf scale'...\n"
#define MSGTR_MovieAspectIsSet "Film-Aspekt ist %.2f:1 - Vorskalierung zur Korrektur der Seitenverhältnisse.\n"
#define MSGTR_MovieAspectUndefined "Film-Aspekt ist undefiniert - keine Vorskalierung durchgeführt.\n"
diff --git a/help/help_mp-dk.h b/help/help_mp-dk.h
index 99d554ae1a..dc8ea64f56 100644
--- a/help/help_mp-dk.h
+++ b/help/help_mp-dk.h
@@ -325,7 +325,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDek: codec satte ikke sh->disp_w og sh->disp_h, prøver en anden løsning!\n"
-#define MSGTR_VoConfigRequest "VDek: vo konfig. anmodning - %d x %d (foretrukket csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Kunne ikke finde colorspace som matcher - prøver med -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Størrelsesforhold er %.2f:1 - præskalerer for at rette størrelsesforholdet.\n"
#define MSGTR_MovieAspectUndefined "Størrelsesforholdet er ikke defineret - ingen præskalering benyttet.\n"
diff --git a/help/help_mp-el.h b/help/help_mp-el.h
index 99114c8185..0a6a5b016f 100644
--- a/help/help_mp-el.h
+++ b/help/help_mp-el.h
@@ -325,7 +325,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: το codec δεν όρισε sh->disp_w και sh->disp_h, προσπάθεια επίλυσης!\n"
-#define MSGTR_VoConfigRequest "VDec: αίτηση για επιλογή vo - %d x %d (προτεινόμενο csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Δεν βρέθηκε αντίστοιχο colorspace - προσπάθεια με -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Η αναλογία της ταινίας είναι %.2f:1 - προκλιμάκωση για την διόρθωση της εμφάνισης της ταινίας.\n"
#define MSGTR_MovieAspectUndefined "Η αναλογία της ταινίας δεν είναι ορισμένη - δεν εφαρμόζεται προκλιμάκωση.\n"
diff --git a/help/help_mp-en.h b/help/help_mp-en.h
index f1af384320..2c70f83dc4 100644
--- a/help/help_mp-en.h
+++ b/help/help_mp-en.h
@@ -1633,8 +1633,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Codec did not set sh->disp_w and sh->disp_h, trying workaround.\n"
-#define MSGTR_VoConfigRequest "VDec: vo config request - %d x %d (preferred colorspace: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: using %s as output csp (no %d)\n"
#define MSGTR_CouldNotFindColorspace "Could not find matching colorspace - retrying with -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Movie-Aspect is %.2f:1 - prescaling to correct movie aspect.\n"
#define MSGTR_MovieAspectUndefined "Movie-Aspect is undefined - no prescaling applied.\n"
diff --git a/help/help_mp-es.h b/help/help_mp-es.h
index 82af0a2745..59298c1e39 100644
--- a/help/help_mp-es.h
+++ b/help/help_mp-es.h
@@ -1618,8 +1618,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: el codec no declaró sh->disp_w y sh->disp_h, intentando solucionarlo!\n"
-#define MSGTR_VoConfigRequest "VDec: vo solicitud de config - %d x %d (csp preferida: %s).\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: usando %s como salida csp (no %d)\n"
#define MSGTR_CouldNotFindColorspace "No se pudo encontrar colorspace concordante - reintentando escalado -vf...\n"
#define MSGTR_MovieAspectIsSet "Aspecto es %.2f:1 - prescalando a aspecto correcto.\n"
#define MSGTR_MovieAspectUndefined "Aspecto de película no es definido - no se ha aplicado prescalado.\n"
diff --git a/help/help_mp-fr.h b/help/help_mp-fr.h
index 4350f97c0c..a3baeffd52 100644
--- a/help/help_mp-fr.h
+++ b/help/help_mp-fr.h
@@ -688,7 +688,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec : le codec n'a pas défini sh->disp_w et sh->disp_h, essai de contournement !\n"
-#define MSGTR_VoConfigRequest "VDec : requête de config de vo - %d x %d (espace colorimétrique préferé : %s)\n"
#define MSGTR_CouldNotFindColorspace "N'a pas pu trouver espace colorimétrique correspondant - nouvel essai avec -vf scale...\n"
#define MSGTR_MovieAspectIsSet "L'aspect du film est %.2f:1 - pré-redimensionnement à l'aspect correct.\n"
#define MSGTR_MovieAspectUndefined "L'aspect du film est indéfini - pas de pré-dimensionnement appliqué.\n"
diff --git a/help/help_mp-hu.h b/help/help_mp-hu.h
index f8b1a9c257..286ccc2345 100644
--- a/help/help_mp-hu.h
+++ b/help/help_mp-hu.h
@@ -1633,8 +1633,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: a codec nem állította be az sh->disp_w és az sh_disp_h izéket, megpróbálom workaroundolni!\n"
-#define MSGTR_VoConfigRequest "VDec: vo config kérés - %d x %d (preferált színtér: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: %s használata kimeneti színtérként (nincs %d)\n"
#define MSGTR_CouldNotFindColorspace "Nem találok egyező colorspace-t - újra próbálom a -vf scale filterrel...\n"
#define MSGTR_MovieAspectIsSet "A film aspect értéke %.2f:1 - aspect arány javítása.\n"
#define MSGTR_MovieAspectUndefined "A film aspect értéke nem definiált - nincs arányjavítás.\n"
diff --git a/help/help_mp-it.h b/help/help_mp-it.h
index 60006cd4c9..a7bb02bfbc 100644
--- a/help/help_mp-it.h
+++ b/help/help_mp-it.h
@@ -1632,8 +1632,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Il codec non ha impostato sh->disp_w and sh->disp_h, tento di risolvere.\n"
-#define MSGTR_VoConfigRequest "VDec: configurazione chiesta dal vo - %d x %d (sp.col. preferito: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: uso %s come sp.colore di uscita (non %d)\n"
#define MSGTR_CouldNotFindColorspace "Impossibile trovare uno spazio colore adatto - riprovo con -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Movie-Aspect è %.2f:1 - riscalo per ottenere un rapporto corretto.\n"
#define MSGTR_MovieAspectUndefined "Movie-Aspect non definito - nessuna scalatura.\n"
diff --git a/help/help_mp-ja.h b/help/help_mp-ja.h
index 9aa57f2053..e2dda8df97 100644
--- a/help/help_mp-ja.h
+++ b/help/help_mp-ja.h
@@ -268,7 +268,6 @@ static const char help_text[]=
#define MSGTR_CannotFindColorspace "common colorspaceが見付かりません, even by inserting 'scale' :(\n"
// vd.c
-#define MSGTR_VoConfigRequest "VDec: 映像出力設定 - %d x %d (preferred csp: %s)\n"
// ====================== GUI messages/buttons ========================
diff --git a/help/help_mp-ko.h b/help/help_mp-ko.h
index af277b961c..e9b606aa08 100644
--- a/help/help_mp-ko.h
+++ b/help/help_mp-ko.h
@@ -324,7 +324,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: 코덱이 sh->disp_w와 sh->disp_h로 설정되지 않아서, 다시 시도합니다.\n"
-#define MSGTR_VoConfigRequest "VDec: vo 설정 요청 - %d x %d (선호하는 csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "어울리는 컬러공간을 찾을 수 없습니다. -vf 크기조절로 다시 시도합니다...\n"
#define MSGTR_MovieAspectIsSet "화면비율이 %.2f:1 입니다. - 화면비율을 조정하기위해 사전 크기조절을 합니다.\n"
#define MSGTR_MovieAspectUndefined "화면비율이 정의되지 않았습니다. - 사전 크기조절이 적용되지 않았습니다.\n"
diff --git a/help/help_mp-mk.h b/help/help_mp-mk.h
index 153a0bcca5..c33c350f87 100644
--- a/help/help_mp-mk.h
+++ b/help/help_mp-mk.h
@@ -325,7 +325,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Кодекот не ги подеси sh->disp_w и sh->disp_h, се обидува да заобиколи.\n"
-#define MSGTR_VoConfigRequest "VDec: се бара vo конфигурирање - %d x %d (преферирано csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Не може да се пронајде соодветен простор за боја - се обидува повторно со -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Аспектот на Филмот е %.2f:1 - се преместува на точниот аспект на филмот.\n"
#define MSGTR_MovieAspectUndefined "Аспектот на филмот не е дефиниран - не е применето преместување.\n"
diff --git a/help/help_mp-nl.h b/help/help_mp-nl.h
index 0030a226f3..72f39bfaf7 100644
--- a/help/help_mp-nl.h
+++ b/help/help_mp-nl.h
@@ -531,7 +531,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: codec stelde sh->disp_w en sh->disp_h niet in, ik probeer het probleem te omzeilen!\n"
-#define MSGTR_VoConfigRequest "VDec: vo config aanvraag - %d x %d (csp voorkeur: %s)\n"
#define MSGTR_CouldNotFindColorspace "Kon geen bijpassende kleurenruimte vinden - ik probeer opnieuw met -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Film-Aspect is %.2f:1 - voorscalering naar het correcte film-aspect.\n"
#define MSGTR_MovieAspectUndefined "Movie-Aspect is niet gedefinieerd - geen voorscalering toegepast.\n"
diff --git a/help/help_mp-pl.h b/help/help_mp-pl.h
index bddf87af40..3df81430c9 100644
--- a/help/help_mp-pl.h
+++ b/help/help_mp-pl.h
@@ -652,7 +652,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Kodek nie ustawił sh->disp_w i sh->disp_h, próbuję obejścia.\n"
-#define MSGTR_VoConfigRequest "VDec: wymagana konfiguracja vo - %d x %d (preferowana przestrzeń kolorów: %s)\n"
#define MSGTR_CouldNotFindColorspace "Nie mogłem odnaleźć pasującej przestrzeni kolorów - próbuję ponownie z opcją -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Format filmu to %.2f:1 - zmieniam do poprawnego formatu filmu.\n"
#define MSGTR_MovieAspectUndefined "Format filmu nie zdefiniowany - nie stosuję zmiany formatu.\n"
diff --git a/help/help_mp-pt_BR.h b/help/help_mp-pt_BR.h
index bcb6eeff34..ea1990cd37 100644
--- a/help/help_mp-pt_BR.h
+++ b/help/help_mp-pt_BR.h
@@ -330,7 +330,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: codec não configurou sh->disp_w e sh->disp_h, tentando solução alternativa!\n"
-#define MSGTR_VoConfigRequest "VDec: configuração vo pedida - %d x %d (preferido csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Impossível encotrar \"colorspace\" similar - retentando com -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Aspecto do filme é %.2f:1 - pré-redimensionando para corrigir o aspecto do filme.\n"
#define MSGTR_MovieAspectUndefined "Aspecto do filme é indefinido - nenhum pré-redimensionamento aplicado.\n"
diff --git a/help/help_mp-ru.h b/help/help_mp-ru.h
index 3371b8e38f..7195615efd 100644
--- a/help/help_mp-ru.h
+++ b/help/help_mp-ru.h
@@ -1670,8 +1670,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Кодек не установил sh->disp_w и sh->disp_h, пытаюсь обойти.\n"
-#define MSGTR_VoConfigRequest "VDec: запрос vo config - %d x %d (предпочитаемое цветовое пространство: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: использую %s в качестве выходного csp (не %d)\n"
#define MSGTR_CouldNotFindColorspace "Не могу найти подходящее цветовое пространство - попытаюсь с -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Movie-Aspect - %.2f:1 - выполняю предварительное масштабирование\nдля коррекции соотношения сторон фильма.\n"
#define MSGTR_MovieAspectUndefined "Movie-Aspect не определён - предварительное масштабирование не применяется.\n"
diff --git a/help/help_mp-sk.h b/help/help_mp-sk.h
index 776148de87..2bf4891fee 100644
--- a/help/help_mp-sk.h
+++ b/help/help_mp-sk.h
@@ -635,7 +635,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: kodek nenastavil sh->disp_w a sh->disp_h, skúšam to obísť!\n"
-#define MSGTR_VoConfigRequest "VDec: vo konfiguračná požiadavka - %d x %d (preferovaný csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Nemôžem nájsť zhodný priestor farieb - skúšam znova s -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Movie-Aspect je %.2f:1 - mením rozmery na správne.\n"
#define MSGTR_MovieAspectUndefined "Movie-Aspect je nedefinovný - nemenia sa rozmery.\n"
diff --git a/help/help_mp-sv.h b/help/help_mp-sv.h
index aa4c45e130..ca1fd239e2 100644
--- a/help/help_mp-sv.h
+++ b/help/help_mp-sv.h
@@ -543,7 +543,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Codec satt inte sh->disp_w samt sh->disp_h, försöker gå runt problemet.\n"
-#define MSGTR_VoConfigRequest "VDec: vo-konfigurationsbegäran - %d x %d (preferred csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Kunde inte finna matchande färgrymder - försöker åter med -vf scale...\n" // -''-
#define MSGTR_MovieAspectIsSet "Movie-Aspect är %.2f:1 - prescaling till korrekt film-aspect.\n"
#define MSGTR_MovieAspectUndefined "Film-Aspect är ej definerad - ingen prescaling kommer att äga rum.\n"
diff --git a/help/help_mp-tr.h b/help/help_mp-tr.h
index 7e32f860ae..36c8497af3 100644
--- a/help/help_mp-tr.h
+++ b/help/help_mp-tr.h
@@ -696,8 +696,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Kodek ayarlanamadı: sh->disp_w ve sh->disp_h, çözülmeye çalışılıyor!\n"
-#define MSGTR_VoConfigRequest "VDec: vo ayar isteği - %d x %d (tercih csp: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: çıkış csp'si olarak %s kullanılıyor (%d yok)\n"
#define MSGTR_CouldNotFindColorspace "Renk biçimi bulunamadı. -vf scale ile tekrar deneniyor...\n"
#define MSGTR_MovieAspectIsSet "Video-Görünümü: %.2f:1 - doğru video görünümü için önölçekleniyor.\n"
#define MSGTR_MovieAspectUndefined "Video-Görünümü tanımsız - önölçekleme onaylanamadı.\n"
diff --git a/help/help_mp-uk.h b/help/help_mp-uk.h
index f766628b6e..afd3def1fe 100644
--- a/help/help_mp-uk.h
+++ b/help/help_mp-uk.h
@@ -1179,7 +1179,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: Кодек не встановив sh->disp_w та sh->disp_h, спробую обійти це.\n"
-#define MSGTR_VoConfigRequest "VDec: vo config запит - %d x %d (preferred csp: %s)\n"
#define MSGTR_CouldNotFindColorspace "Не можу підібрати підходящу схему кольорів - повтор з -vf scale...\n"
#define MSGTR_MovieAspectIsSet "Відношення сторін %.2f:1 - масштабую аби скоректувати.\n"
#define MSGTR_MovieAspectUndefined "Відношення сторін не вказано - масштабування не використовується.\n"
diff --git a/help/help_mp-zh_CN.h b/help/help_mp-zh_CN.h
index befbac0459..69a2f4cefc 100644
--- a/help/help_mp-zh_CN.h
+++ b/help/help_mp-zh_CN.h
@@ -1617,8 +1617,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: 编解码器无法设置 sh->disp_w 和 sh->disp_h, 尝试绕过。\n"
-#define MSGTR_VoConfigRequest "VDec: vo 配置请求 - %d x %d (色彩空间首选项: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: 使用 %s 作为输出 csp (没有 %d)\n"
#define MSGTR_CouldNotFindColorspace "找不到匹配的色彩空间 - 重新尝试 -vf scale...\n"
#define MSGTR_MovieAspectIsSet "电影宽高比为 %.2f:1 - 预放大到正确的电影宽高比。\n"
#define MSGTR_MovieAspectUndefined "电影宽高比未定义 - 没使用预放大。\n"
diff --git a/help/help_mp-zh_TW.h b/help/help_mp-zh_TW.h
index ea9d6befde..3ea2e45326 100644
--- a/help/help_mp-zh_TW.h
+++ b/help/help_mp-zh_TW.h
@@ -670,8 +670,6 @@ static const char help_text[]=
// vd.c
#define MSGTR_CodecDidNotSet "VDec: 編解碼器無法設置 sh->disp_w 和 sh->disp_h, 嘗試繞過。\n"
-#define MSGTR_VoConfigRequest "VDec: vo 配置請求 - %d x %d (色彩空間首選項: %s)\n"
-#define MSGTR_UsingXAsOutputCspNoY "VDec: 使用 %s 作為輸出 csp (没有 %d)\n"
#define MSGTR_CouldNotFindColorspace "找不到匹配的色彩空間 - 重新嘗試 -vf scale...\n"
#define MSGTR_MovieAspectIsSet "電影寬高比為 %.2f:1 - 預放大到正確的電影寬高比。\n"
#define MSGTR_MovieAspectUndefined "電影寬高比未定義 - 没使用預放大。\n"
diff --git a/libaf/control.h b/libaf/control.h
index b6a1ca8262..b99d50bcb4 100644
--- a/libaf/control.h
+++ b/libaf/control.h
@@ -214,44 +214,44 @@ typedef struct af_control_ext_s{
#define AF_CONTROL_PAN_NOUT 0x00001B00 | AF_CONTROL_FILTER_SPECIFIC
// Balance, arg is float*; range -1 (left) to 1 (right), 0 center
-#define AF_CONTROL_PAN_BALANCE 0x00002500 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_PAN_BALANCE 0x00001C00 | AF_CONTROL_FILTER_SPECIFIC
// Set equalizer gain, arg is a control_ext with a float*
-#define AF_CONTROL_EQUALIZER_GAIN 0x00001C00 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_EQUALIZER_GAIN 0x00001D00 | AF_CONTROL_FILTER_SPECIFIC
// Delay length in ms, arg is a control_ext with a float*
-#define AF_CONTROL_DELAY_LEN 0x00001D00 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_DELAY_LEN 0x00001E00 | AF_CONTROL_FILTER_SPECIFIC
// Subwoofer
// Channel number which to insert the filtered data, arg in int*
-#define AF_CONTROL_SUB_CH 0x00001E00 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_SUB_CH 0x00001F00 | AF_CONTROL_FILTER_SPECIFIC
// Cutoff frequency [Hz] for lowpass filter, arg is float*
-#define AF_CONTROL_SUB_FC 0x00001F00 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_SUB_FC 0x00002000 | AF_CONTROL_FILTER_SPECIFIC
// Export
-#define AF_CONTROL_EXPORT_SZ 0x00002000 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_EXPORT_SZ 0x00003000 | AF_CONTROL_FILTER_SPECIFIC
// ExtraStereo Multiplier
-#define AF_CONTROL_ES_MUL 0x00002100 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_ES_MUL 0x00003100 | AF_CONTROL_FILTER_SPECIFIC
// Center
// Channel number which to inster the filtered data, arg in int*
-#define AF_CONTROL_CENTER_CH 0x00002200 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_CENTER_CH 0x00003200 | AF_CONTROL_FILTER_SPECIFIC
// SineSuppress
-#define AF_CONTROL_SS_FREQ 0x00002300 | AF_CONTROL_FILTER_SPECIFIC
-#define AF_CONTROL_SS_DECAY 0x00002400 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_SS_FREQ 0x00003300 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_SS_DECAY 0x00003400 | AF_CONTROL_FILTER_SPECIFIC
-#define AF_CONTROL_PLAYBACK_SPEED 0x00002500 | AF_CONTROL_FILTER_SPECIFIC
-#define AF_CONTROL_SCALETEMPO_AMOUNT 0x00002600 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_PLAYBACK_SPEED 0x00003500 | AF_CONTROL_FILTER_SPECIFIC
+#define AF_CONTROL_SCALETEMPO_AMOUNT 0x00003600 | AF_CONTROL_FILTER_SPECIFIC
#endif /* MPLAYER_CONTROL_H */
diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c
index d6b9175f52..f47b4fbf3d 100644
--- a/libao2/ao_alsa.c
+++ b/libao2/ao_alsa.c
@@ -783,8 +783,11 @@ static void reset(void)
static int play(void* data, int len, int flags)
{
- int num_frames = len / bytes_per_sample;
+ int num_frames;
snd_pcm_sframes_t res = 0;
+ if (!(flags & AOPLAY_FINAL_CHUNK))
+ len = len / ao_data.outburst * ao_data.outburst;
+ num_frames = len / bytes_per_sample;
//mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: frames=%i, len=%i\n",num_frames,len);
diff --git a/libao2/ao_oss.c b/libao2/ao_oss.c
index 0ff87efadd..b4e5ab49b8 100644
--- a/libao2/ao_oss.c
+++ b/libao2/ao_oss.c
@@ -425,8 +425,19 @@ ac3_retry:
}
ao_data.bps=ao_data.channels;
- if(ao_data.format != AF_FORMAT_U8 && ao_data.format != AF_FORMAT_S8)
+ switch (ao_data.format & AF_FORMAT_BITS_MASK) {
+ case AF_FORMAT_8BIT:
+ break;
+ case AF_FORMAT_16BIT:
ao_data.bps*=2;
+ break;
+ case AF_FORMAT_24BIT:
+ ao_data.bps*=3;
+ break;
+ case AF_FORMAT_32BIT:
+ ao_data.bps*=4;
+ break;
+ }
ao_data.outburst-=ao_data.outburst % ao_data.bps; // round down
ao_data.bps*=ao_data.samplerate;
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c
index bf3da1cbbe..fd354f8ba7 100644
--- a/libmpcodecs/ad_ffmpeg.c
+++ b/libmpcodecs/ad_ffmpeg.c
@@ -68,6 +68,7 @@ static int init(sh_audio_t *sh_audio)
}
lavc_context->request_channels = audio_output_channels;
lavc_context->codec_tag = sh_audio->format; //FOURCC
+ lavc_context->codec_type = CODEC_TYPE_AUDIO;
lavc_context->codec_id = lavc_codec->id; // not sure if required, imho not --A'rpi
/* alloc extra data */
diff --git a/libmpcodecs/ad_twin.c b/libmpcodecs/ad_twin.c
index 395567128a..280b4cb8c1 100644
--- a/libmpcodecs/ad_twin.c
+++ b/libmpcodecs/ad_twin.c
@@ -184,7 +184,7 @@ void uninit(sh_audio_t *sh)
FreeLibrary(vqf_dll);
}
-int control(sh_audio_t *sh_audio,int cmd,void* arg, ...)
+static int control(sh_audio_t *sh_audio,int cmd,void* arg, ...)
{
switch(cmd) {
case ADCTRL_QUERY_FORMAT:
diff --git a/libmpcodecs/ae_lavc.c b/libmpcodecs/ae_lavc.c
index 81b76ee062..4032141c72 100644
--- a/libmpcodecs/ae_lavc.c
+++ b/libmpcodecs/ae_lavc.c
@@ -170,6 +170,8 @@ int mpae_init_lavc(audio_encoder_t *encoder)
return 0;
}
+ lavc_actx->codec_type = CODEC_TYPE_AUDIO;
+ lavc_actx->codec_id = lavc_acodec->id;
// put sample parameters
lavc_actx->channels = encoder->params.channels;
lavc_actx->sample_rate = encoder->params.sample_rate;
diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c
index 62a3fcbdda..1910af62ee 100644
--- a/libmpcodecs/vd.c
+++ b/libmpcodecs/vd.c
@@ -121,8 +121,9 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h,
if (!sh->disp_w || !sh->disp_h)
return 0;
- mp_tmsg(MSGT_DECVIDEO, MSGL_INFO, "VDec: vo config request - %d x %d (preferred colorspace: %s)\n", w, h,
- vo_format_name(preferred_outfmt));
+ mp_msg(MSGT_DECVIDEO, MSGL_V,
+ "VDec: vo config request - %d x %d (preferred colorspace: %s)\n",
+ w, h, vo_format_name(preferred_outfmt));
if (get_video_quality_max(sh) <= 0 && divx_quality) {
// user wants postprocess but no pp filter yet:
@@ -216,7 +217,7 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h,
return 0; // failed
}
out_fmt = sh->codec->outfmt[j];
- mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "VDec: using %s as output csp (no %d)\n",
+ mp_msg(MSGT_CPLAYER, MSGL_V, "VDec: using %s as output csp (no %d)\n",
vo_format_name(out_fmt), j);
sh->outfmtidx = j;
sh->vfilter = vf;
diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c
index dfc7958a23..886a07f3cb 100644
--- a/libmpcodecs/vd_ffmpeg.c
+++ b/libmpcodecs/vd_ffmpeg.c
@@ -246,6 +246,8 @@ static int init(sh_video_t *sh){
ctx->avctx = avcodec_alloc_context();
avctx = ctx->avctx;
avctx->opaque = sh;
+ avctx->codec_type = CODEC_TYPE_VIDEO;
+ avctx->codec_id = lavc_codec->id;
#if CONFIG_VDPAU
if(lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU){
diff --git a/libmpcodecs/ve_lavc.c b/libmpcodecs/ve_lavc.c
index c9d60a202a..f798378dbe 100644
--- a/libmpcodecs/ve_lavc.c
+++ b/libmpcodecs/ve_lavc.c
@@ -331,7 +331,7 @@ static int config(struct vf_instance* vf,
int width, int height, int d_width, int d_height,
unsigned int flags, unsigned int outfmt){
int size, i;
- void *p;
+ char *p;
mux_v->bih->biWidth=width;
mux_v->bih->biHeight=height;
@@ -1047,6 +1047,8 @@ static int vf_open(vf_instance_t *vf, char* args){
vf->priv->pic = avcodec_alloc_frame();
vf->priv->context = avcodec_alloc_context();
+ vf->priv->context->codec_type = CODEC_TYPE_VIDEO;
+ vf->priv->context->codec_id = vf->priv->codec->id;
return 1;
}
diff --git a/libmpcodecs/ve_x264.c b/libmpcodecs/ve_x264.c
index 3a909cdfb7..6733b8c641 100644
--- a/libmpcodecs/ve_x264.c
+++ b/libmpcodecs/ve_x264.c
@@ -59,20 +59,6 @@ static int turbo = 0;
static x264_param_t param;
static int parse_error = 0;
-static int encode_nals(uint8_t *buf, int size, x264_nal_t *nals, int nnal){
- uint8_t *p = buf;
- int i;
-
- for(i = 0; i < nnal; i++){
- int s = x264_nal_encode(p, &size, 1, nals + i);
- if(s < 0)
- return -1;
- p += s;
- }
-
- return p - buf;
-}
-
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts);
static int encode_frame(struct vf_instance *vf, x264_picture_t *pic_in);
@@ -189,21 +175,13 @@ static int config(struct vf_instance* vf, int width, int height, int d_width, in
}
if(!param.b_repeat_headers){
- uint8_t *extradata;
x264_nal_t *nal;
- int extradata_size, nnal, i, s = 0;
+ int extradata_size, nnal;
- x264_encoder_headers(mod->x264, &nal, &nnal);
-
- /* 5 bytes NAL header + worst case escaping */
- for(i = 0; i < nnal; i++)
- s += 5 + nal[i].i_payload * 4 / 3;
-
- extradata = malloc(s);
- extradata_size = encode_nals(extradata, s, nal, nnal);
+ extradata_size = x264_encoder_headers(mod->x264, &nal, &nnal);
mod->mux->bih= realloc(mod->mux->bih, sizeof(BITMAPINFOHEADER) + extradata_size);
- memcpy(mod->mux->bih + 1, extradata, extradata_size);
+ memcpy(mod->mux->bih + 1, nal->p_payload, extradata_size);
mod->mux->bih->biSize= sizeof(BITMAPINFOHEADER) + extradata_size;
}
@@ -218,12 +196,10 @@ static int config(struct vf_instance* vf, int width, int height, int d_width, in
static int control(struct vf_instance* vf, int request, void *data)
{
h264_module_t *mod=(h264_module_t*)vf->priv;
- int count = 256; // giant HACK, x264_encoder_encode may incorrectly return 0
- // when threads > 1 and delayed frames pending
switch(request){
case VFCTRL_FLUSH_FRAMES:
- while(encode_frame(vf, NULL) == 0 && --count);
- while(encode_frame(vf, NULL) > 0);
+ while (x264_encoder_delayed_frames(mod->x264) > 0)
+ encode_frame(vf, NULL);
return CONTROL_TRUE;
default:
return CONTROL_UNKNOWN;
@@ -273,23 +249,20 @@ static int encode_frame(struct vf_instance *vf, x264_picture_t *pic_in)
x264_picture_t pic_out;
x264_nal_t *nal;
int i_nal;
- int i_size = 0;
- int i;
+ int i_size;
- if(x264_encoder_encode(mod->x264, &nal, &i_nal, pic_in, &pic_out) < 0) {
+ i_size = x264_encoder_encode(mod->x264, &nal, &i_nal, pic_in, &pic_out);
+
+ if(i_size<0) {
mp_msg(MSGT_MENCODER, MSGL_ERR, "x264_encoder_encode failed\n");
return -1;
}
-
- for(i=0; i < i_nal; i++) {
- int i_data = mod->mux->buffer_size - i_size;
- i_size += x264_nal_encode(mod->mux->buffer + i_size, &i_data, 1, &nal[i]);
- }
if(i_size>0) {
int keyframe = (pic_out.i_type == X264_TYPE_IDR) ||
(pic_out.i_type == X264_TYPE_I
&& param.i_frame_reference == 1
&& !param.i_bframe);
+ memcpy(mod->mux->buffer, nal->p_payload, i_size);
muxer_write_chunk(mod->mux, i_size, keyframe?0x10:0, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
}
else
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 31eabc67a1..f69f2715ff 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -623,7 +623,10 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, float audio
} else {
priv->last_pts += rel_seek_secs * AV_TIME_BASE;
}
- av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags);
+ if (av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags) < 0) {
+ avsflags ^= AVSEEK_FLAG_BACKWARD;
+ av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags);
+ }
}
static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 118217e999..8280a8793e 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -240,30 +240,10 @@ add_cluster_position (mkv_demuxer_t *mkv_d, uint64_t position)
static int
aac_get_sample_rate_index (uint32_t sample_rate)
{
- if (92017 <= sample_rate)
- return 0;
- else if (75132 <= sample_rate)
- return 1;
- else if (55426 <= sample_rate)
- return 2;
- else if (46009 <= sample_rate)
- return 3;
- else if (37566 <= sample_rate)
- return 4;
- else if (27713 <= sample_rate)
- return 5;
- else if (23004 <= sample_rate)
- return 6;
- else if (18783 <= sample_rate)
- return 7;
- else if (13856 <= sample_rate)
- return 8;
- else if (11502 <= sample_rate)
- return 9;
- else if (9391 <= sample_rate)
- return 10;
- else
- return 11;
+ static const int srates[] = {92017, 75132, 55426, 46009, 37566, 27713, 23004, 18783, 13856, 11502, 9391, 0};
+ int i = 0;
+ while (sample_rate < srates[i]) i++;
+ return i;
}
/** \brief Free cached demux packets
@@ -1637,7 +1617,7 @@ demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid)
uint32_t type2;
unsigned int cnt;
- src = track->private_data + RVPROPERTIES_SIZE;
+ src = (uint8_t *)track->private_data + RVPROPERTIES_SIZE;
cnt = track->private_size - RVPROPERTIES_SIZE;
bih = realloc(bih, sizeof (BITMAPINFOHEADER)+8+cnt);
@@ -2992,7 +2972,7 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
target_filepos = (uint64_t) (target_timecode * mkv_d->last_filepos
/ (mkv_d->last_pts * 1000.0));
- max_pos = mkv_d->cluster_positions[mkv_d->num_cluster_pos-1];
+ max_pos = mkv_d->num_cluster_pos ? mkv_d->cluster_positions[mkv_d->num_cluster_pos-1] : 0;
if (target_filepos > max_pos)
{
if ((off_t) max_pos > stream_tell (s))
diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c
index 109275a7fa..c7966da9ba 100644
--- a/libmpdemux/demux_ts.c
+++ b/libmpdemux/demux_ts.c
@@ -2521,6 +2521,7 @@ static int parse_pmt(ts_priv_t * priv, uint16_t progid, uint16_t pid, int is_sta
break;
case 0x8A:
case 0x82:
+ case 0x85:
case 0x86:
pmt->es[idx].type = AUDIO_DTS;
break;
diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c
index 12281ae997..286a755f8b 100644
--- a/libmpdemux/mp_taglists.c
+++ b/libmpdemux/mp_taglists.c
@@ -48,7 +48,6 @@ static const struct mp_AVCodecTag mp_wav_tags[] = {
{ CODEC_ID_ROQ_DPCM, MKTAG('R', 'o', 'Q', 'A')},
{ CODEC_ID_SHORTEN, MKTAG('s', 'h', 'r', 'n')},
{ CODEC_ID_SPEEX, MKTAG('s', 'p', 'x', ' ')},
- { CODEC_ID_TRUEHD, MKTAG('T', 'R', 'H', 'D')},
{ CODEC_ID_TTA, MKTAG('T', 'T', 'A', '1')},
{ CODEC_ID_TWINVQ, MKTAG('T', 'W', 'I', '2')},
{ CODEC_ID_WAVPACK, MKTAG('W', 'V', 'P', 'K')},
@@ -78,6 +77,7 @@ static const struct mp_AVCodecTag mp_codecid_override_tags[] = {
{ CODEC_ID_PCM_S32LE, 1},
{ CODEC_ID_MP2, 0x50},
{ CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'G', '2')},
+ { CODEC_ID_TRUEHD, MKTAG('T', 'R', 'H', 'D')},
{ 0, 0 },
};
@@ -88,6 +88,7 @@ static const struct mp_AVCodecTag mp_bmp_tags[] = {
{ CODEC_ID_BETHSOFTVID, MKTAG('B', 'E', 'T', 'H')},
{ CODEC_ID_BFI, MKTAG('B', 'F', 'I', 'V')},
{ CODEC_ID_C93, MKTAG('C', '9', '3', 'V')},
+ { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n')},
{ CODEC_ID_DSICINVIDEO, MKTAG('D', 'C', 'I', 'V')},
{ CODEC_ID_DXA, MKTAG('D', 'X', 'A', '1')},
{ CODEC_ID_FLIC, MKTAG('F', 'L', 'I', 'C')},
diff --git a/libvo/aclib_template.c b/libvo/aclib_template.c
index 0d486bdaec..d7b2201944 100644
--- a/libvo/aclib_template.c
+++ b/libvo/aclib_template.c
@@ -277,10 +277,10 @@ static void * RENAME(fast_memcpy)(void * to, const void * from, size_t len)
"xor %%"REG_a", %%"REG_a" \n\t"
ASMALIGN(4)
"1: \n\t"
- "movl (%0, %%"REG_a"), %%ebx \n\t"
- "movl 32(%0, %%"REG_a"), %%ebx \n\t"
- "movl 64(%0, %%"REG_a"), %%ebx \n\t"
- "movl 96(%0, %%"REG_a"), %%ebx \n\t"
+ "movl (%0, %%"REG_a"), %%ecx \n\t"
+ "movl 32(%0, %%"REG_a"), %%ecx \n\t"
+ "movl 64(%0, %%"REG_a"), %%ecx \n\t"
+ "movl 96(%0, %%"REG_a"), %%ecx \n\t"
"add $128, %%"REG_a" \n\t"
"cmp %3, %%"REG_a" \n\t"
" jb 1b \n\t"
@@ -313,10 +313,10 @@ static void * RENAME(fast_memcpy)(void * to, const void * from, size_t len)
// a few percent speedup on out of order executing CPUs
"mov %5, %%"REG_a" \n\t"
"2: \n\t"
- "movl (%0), %%ebx \n\t"
- "movl (%0), %%ebx \n\t"
- "movl (%0), %%ebx \n\t"
- "movl (%0), %%ebx \n\t"
+ "movl (%0), %%ecx \n\t"
+ "movl (%0), %%ecx \n\t"
+ "movl (%0), %%ecx \n\t"
+ "movl (%0), %%ecx \n\t"
"dec %%"REG_a" \n\t"
" jnz 2b \n\t"
#endif
@@ -329,7 +329,7 @@ static void * RENAME(fast_memcpy)(void * to, const void * from, size_t len)
" jae 1b \n\t"
: "+r" (from), "+r" (to), "+r" (i)
: "r" ((long)BLOCK_SIZE), "i" (BLOCK_SIZE/64), "i" ((long)CONFUSION_FACTOR)
- : "%"REG_a, "%ebx"
+ : "%"REG_a, "%ecx"
);
for(; i>0; i--)
diff --git a/libvo/gl_common.c b/libvo/gl_common.c
index bb351f90d6..f827771a97 100644
--- a/libvo/gl_common.c
+++ b/libvo/gl_common.c
@@ -1564,6 +1564,21 @@ static XVisualInfo *getWindowVisualInfo(Window win) {
return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp);
}
+static void appendstr(char **dst, const char *str)
+{
+ int newsize;
+ char *newstr;
+ if (!str)
+ return;
+ newsize = strlen(*dst) + 1 + strlen(str) + 1;
+ newstr = realloc(*dst, newsize);
+ if (!newstr)
+ return;
+ *dst = newstr;
+ strcat(*dst, " ");
+ strcat(*dst, str);
+}
+
/**
* \brief Changes the window in which video is displayed.
* If possible only transfers the context to the new window, otherwise
@@ -1620,6 +1635,7 @@ int setGlWindow(XVisualInfo **vinfo, GLXContext *context, Window win)
if (!keep_context) {
void *(*getProcAddress)(const GLubyte *);
const char *(*glXExtStr)(Display *, int);
+ char *glxstr = strdup("");
if (*context)
glXDestroyContext(mDisplay, *context);
*context = new_context;
@@ -1632,8 +1648,17 @@ int setGlWindow(XVisualInfo **vinfo, GLXContext *context, Window win)
if (!getProcAddress)
getProcAddress = (void *)getdladdr;
glXExtStr = getdladdr("glXQueryExtensionsString");
- getFunctions(getProcAddress, !glXExtStr ? NULL :
- glXExtStr(mDisplay, DefaultScreen(mDisplay)));
+ if (glXExtStr)
+ appendstr(&glxstr, glXExtStr(mDisplay, DefaultScreen(mDisplay)));
+ glXExtStr = getdladdr("glXGetClientString");
+ if (glXExtStr)
+ appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
+ glXExtStr = getdladdr("glXGetServerString");
+ if (glXExtStr)
+ appendstr(&glxstr, glXExtStr(mDisplay, GLX_EXTENSIONS));
+
+ getFunctions(getProcAddress, glxstr);
+ free(glxstr);
// and inform that reinit is neccessary
return SET_WINDOW_REINIT;
diff --git a/libvo/osx_common.c b/libvo/osx_common.c
index 377460346a..359e6a78f7 100644
--- a/libvo/osx_common.c
+++ b/libvo/osx_common.c
@@ -38,7 +38,7 @@ static const struct keymap keymap[] = {
// navigation block
{kVK_Help, KEY_INSERT}, {kVK_ForwardDelete, KEY_DELETE}, {kVK_Home, KEY_HOME},
- {kVK_End, KEY_END}, {kVK_PageUp, KEY_PAGE_UP}, {kVK_PageUp, KEY_PAGE_DOWN},
+ {kVK_End, KEY_END}, {kVK_PageUp, KEY_PAGE_UP}, {kVK_PageDown, KEY_PAGE_DOWN},
// F-keys
{kVK_F1, KEY_F + 1}, {kVK_F2, KEY_F + 2}, {kVK_F3, KEY_F + 3}, {kVK_F4, KEY_F + 4},
diff --git a/libvo/sub.c b/libvo/sub.c
index f729f56ad8..744652086d 100644
--- a/libvo/sub.c
+++ b/libvo/sub.c
@@ -359,9 +359,9 @@ inline static void vo_update_text_teletext(mp_osd_obj_t *obj, int dxs, int dys)
//very simple teletext font auto scaling
if(!vo_osd_teletext_scale && hm*(max_rows+1)>dys){
- text_font_scale_factor*=1.0*(dys)/((max_rows+1)*hm);
+ osd_font_scale_factor*=1.0*(dys)/((max_rows+1)*hm);
force_load_font=1;
- vo_osd_teletext_scale=text_font_scale_factor;
+ vo_osd_teletext_scale=osd_font_scale_factor;
obj->flags&=~OSDFLAG_VISIBLE;
return;
}
diff --git a/libvo/vo_corevideo.m b/libvo/vo_corevideo.m
index ed90f5b14c..1748e059ec 100644
--- a/libvo/vo_corevideo.m
+++ b/libvo/vo_corevideo.m
@@ -161,10 +161,6 @@ static void free_file_specific(void)
static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format)
{
free_file_specific();
- config_movie_aspect((float)d_width/d_height);
-
- vo_dwidth = d_width *= mpGLView->winSizeMult;
- vo_dheight = d_height *= mpGLView->winSizeMult;
//misc mplayer setup
image_width = width;
@@ -183,6 +179,11 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_
if(!shared_buffer)
{
+ config_movie_aspect((float)d_width/d_height);
+
+ vo_dwidth = d_width *= mpGLView->winSizeMult;
+ vo_dheight = d_height *= mpGLView->winSizeMult;
+
image_data = malloc(image_width*image_height*image_bytes);
image_datas[0] = image_data;
if (vo_doublebuffering)
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index a97b524c56..1bd908f22b 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -431,7 +431,7 @@ static void uninitGl(void) {
DeleteBuffers(2, gl_buffer_uv);
gl_buffer_uv[0] = gl_buffer_uv[1] = 0; gl_buffersize_uv = 0;
gl_bufferptr_uv[0] = gl_bufferptr_uv[1] = 0;
-#ifndef GL_WIN32
+#ifdef CONFIG_X11
if (mesa_bufferptr)
FreeMemoryMESA(mDisplay, mScreen, mesa_bufferptr);
#endif
@@ -559,6 +559,10 @@ glconfig:
uninitGl();
if (setGlWindow(&gl_vinfo, &gl_context, vo_window) == SET_WINDOW_FAILED)
return -1;
+ if (mesa_buffer && !AllocateMemoryMESA) {
+ mp_msg(MSGT_VO, MSGL_ERR, "Can not enable mesa-buffer because AllocateMemoryMESA was not found\n");
+ mesa_buffer = 0;
+ }
initGl(vo_dwidth, vo_dheight);
return 0;
@@ -763,13 +767,13 @@ static uint32_t get_image(mp_image_t *mpi) {
mpi->stride[0] = mpi->width * mpi->bpp / 8;
needed_size = mpi->stride[0] * mpi->height;
if (mesa_buffer) {
-#ifndef GL_WIN32
+#ifdef CONFIG_X11
if (mesa_bufferptr && needed_size > mesa_buffersize) {
FreeMemoryMESA(mDisplay, mScreen, mesa_bufferptr);
mesa_bufferptr = NULL;
}
if (!mesa_bufferptr)
- mesa_bufferptr = AllocateMemoryMESA(mDisplay, mScreen, needed_size, 0, 0, 0);
+ mesa_bufferptr = AllocateMemoryMESA(mDisplay, mScreen, needed_size, 0, 1.0, 1.0);
mesa_buffersize = needed_size;
#endif
mpi->planes[0] = mesa_bufferptr;
diff --git a/libvo/vo_gl2.c b/libvo/vo_gl2.c
index 71361916f4..e72f735bcd 100644
--- a/libvo/vo_gl2.c
+++ b/libvo/vo_gl2.c
@@ -114,7 +114,7 @@ static GLint getInternalFormat(void)
{
#ifdef GL_WIN32
PIXELFORMATDESCRIPTOR pfd;
- HDC vo_hdc = GetDC(vo_window);
+ HDC vo_hdc = GetDC(vo_w32_window);
int pf = GetPixelFormat(vo_hdc);
if (!DescribePixelFormat(vo_hdc, pf, sizeof pfd, &pfd)) {
r_sz = g_sz = b_sz = a_sz = 0;
@@ -124,7 +124,7 @@ static GLint getInternalFormat(void)
b_sz = pfd.cBlueBits;
a_sz = pfd.cAlphaBits;
}
- ReleaseDC(vo_window, vo_hdc);
+ ReleaseDC(vo_w32_window, vo_hdc);
#else
if (glXGetConfig(mDisplay, gl_vinfo, GLX_RED_SIZE, &r_sz) != 0) r_sz = 0;
if (glXGetConfig(mDisplay, gl_vinfo, GLX_GREEN_SIZE, &g_sz) != 0) g_sz = 0;
diff --git a/mencoder.c b/mencoder.c
index d1472a0568..7f4094f663 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -221,6 +221,12 @@ void mplayer_put_key(struct mp_fifo *fifo, int code)
char *current_module;
#include "mpcommon.h"
+// Needed by mpcommon.c
+void set_osd_subtitle(struct MPContext *mpctx, subtitle *subs) {
+ vo_sub = subs;
+ vo_osd_changed(OSDTYPE_SUBTITLE);
+}
+
//char *out_audio_codec=NULL; // override audio codec
//char *out_video_codec=NULL; // override video codec
@@ -526,14 +532,14 @@ play_next_file:
#ifdef CONFIG_DVDREAD
if(stream->type==STREAMTYPE_DVD){
if(audio_lang && opts.audio_id==-1) opts.audio_id=dvd_aid_from_lang(stream,audio_lang);
- if(dvdsub_lang && opts.sub_id==-2) opts.sub_id=dvd_sid_from_lang(stream,dvdsub_lang);
+ if(dvdsub_lang && opts.sub_id==-1) opts.sub_id=dvd_sid_from_lang(stream,dvdsub_lang);
}
#endif
#ifdef CONFIG_DVDNAV
if(stream->type==STREAMTYPE_DVDNAV){
if(audio_lang && opts.audio_id==-1) opts.audio_id=mp_dvdnav_aid_from_lang(stream,audio_lang);
- if(dvdsub_lang && opts.sub_id==-2) opts.sub_id=mp_dvdnav_sid_from_lang(stream,dvdsub_lang);
+ if(dvdsub_lang && opts.sub_id==-1) opts.sub_id=mp_dvdnav_sid_from_lang(stream,dvdsub_lang);
}
#endif
@@ -553,10 +559,10 @@ if(stream->type==STREAMTYPE_DVDNAV){
select_audio(demuxer, opts.audio_id, audio_lang);
- if (opts.sub_id < 0 && dvdsub_lang)
+ if (opts.sub_id < -1 && dvdsub_lang)
opts.sub_id = demuxer_sub_track_by_lang(demuxer, dvdsub_lang);
- if (opts.sub_id < 0)
+ if (opts.sub_id < -1)
opts.sub_id = demuxer_default_sub_track(demuxer);
for (i = 0; i < MAX_S_STREAMS; i++) {
@@ -1470,7 +1476,7 @@ if(sh_audio && !demuxer2){
}
else
#endif
- update_subtitles(sh_video, d_dvdsub, 0, 0);
+ update_subtitles(NULL, &opts, sh_video, sh_video->pts, 0, d_dvdsub, 0);
frame_data = (s_frame_data){ .start = NULL, .in_size = 0, .frame_time = 0., .already_read = 0 };
diff --git a/mp_osd.h b/mp_osd.h
index 6a1b3b94fe..77eaacd7d2 100644
--- a/mp_osd.h
+++ b/mp_osd.h
@@ -11,6 +11,7 @@
#define OSD_MSG_RADIO_CHANNEL 7
/// Base id for messages generated from the commmand to property bridge.
#define OSD_MSG_PROPERTY 0x100
+#define OSD_MSG_SUB_BASE 0x1000
#define MAX_OSD_LEVEL 3
#define MAX_TERM_OSD_LEVEL 1
diff --git a/mpcommon.c b/mpcommon.c
index 245383c803..6e699e9866 100644
--- a/mpcommon.c
+++ b/mpcommon.c
@@ -66,10 +66,10 @@ if (HAVE_CMOV)
}
-void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
- double video_offset, int reset)
+void update_subtitles(struct MPContext *mpctx, struct MPOpts *opts,
+ sh_video_t *sh_video, double refpts, double sub_offset,
+ demux_stream_t *d_dvdsub, int reset)
{
- struct MPOpts *opts = sh_video->opts;
unsigned char *packet=NULL;
int len;
char type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v';
@@ -77,25 +77,24 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
if (reset) {
sub_clear_text(&subs, MP_NOPTS_VALUE);
if (vo_sub) {
- vo_sub = NULL;
- vo_osd_changed(OSDTYPE_SUBTITLE);
+ set_osd_subtitle(mpctx, NULL);
}
if (vo_spudec) {
spudec_reset(vo_spudec);
vo_osd_changed(OSDTYPE_SPU);
}
+ return;
}
// find sub
if (subdata) {
- double pts = sh_video->pts;
- if (sub_fps==0) sub_fps = sh_video->fps;
+ if (sub_fps==0) sub_fps = sh_video ? sh_video->fps : 25;
current_module = "find_sub";
- if (pts > sub_last_pts || pts < sub_last_pts-1.0) {
- find_sub(subdata, (pts+sub_delay) *
+ if (refpts > sub_last_pts || refpts < sub_last_pts-1.0) {
+ find_sub(mpctx, subdata, (refpts+sub_delay) *
(subdata->sub_uses_time ? 100. : sub_fps));
if (vo_sub) vo_sub_last = vo_sub;
// FIXME! frame counter...
- sub_last_pts = pts;
+ sub_last_pts = refpts;
}
}
@@ -110,12 +109,12 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
// Vobsub
len = 0;
if (vo_vobsub) {
- if (sh_video->pts+sub_delay >= 0) {
- len = vobsub_get_packet(vo_vobsub, sh_video->pts+sub_delay,
+ if (refpts+sub_delay >= 0) {
+ len = vobsub_get_packet(vo_vobsub, refpts+sub_delay,
(void**)&packet, &timestamp);
if (len > 0) {
- timestamp -= (sh_video->pts + sub_delay - sh_video->timer)*90000;
- 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,sh_video->pts,sh_video->timer,timestamp / 90000.0,timestamp);
+ timestamp -= (refpts + sub_delay - sh_video->timer)*90000;
+ 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);
}
}
} else {
@@ -127,14 +126,14 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
// d_video->pts which would have been the simplest
// improvement doesn't work because mpeg specific hacks
// in video.c set d_video->pts to 0.
- float x = d_dvdsub->pts - sh_video->pts;
+ float x = d_dvdsub->pts - refpts;
if (x > -20 && x < 20) // prevent missing subs on pts reset
timestamp = 90000*(sh_video->timer + d_dvdsub->pts
- + sub_delay - sh_video->pts);
+ + sub_delay - refpts);
else timestamp = 90000*(sh_video->timer + sub_delay);
mp_dbg(MSGT_CPLAYER, MSGL_V, "\rDVD sub: len=%d "
"v_pts=%5.3f s_pts=%5.3f ts=%d \n", len,
- sh_video->pts, d_dvdsub->pts, timestamp);
+ refpts, d_dvdsub->pts, timestamp);
}
}
if (len<=0 || !packet) break;
@@ -146,14 +145,13 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
vo_osd_changed(OSDTYPE_SPU);
} else if (opts->sub_id >= 0
&& (type == 't' || type == 'm' || type == 'a')) {
- double curpts = sh_video->pts + sub_delay;
+ double curpts = refpts + sub_delay;
double endpts;
- vo_sub = &subs;
while (d_dvdsub->first) {
- double pts = ds_get_next_pts(d_dvdsub) + video_offset;
- if (pts > curpts)
+ double subpts = ds_get_next_pts(d_dvdsub) + sub_offset;
+ if (subpts > curpts)
break;
- endpts = d_dvdsub->first->endpts + video_offset;
+ endpts = d_dvdsub->first->endpts + sub_offset;
len = ds_get_packet_sub(d_dvdsub, &packet);
if (type == 'm') {
if (len < 2) continue;
@@ -167,15 +165,14 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
if (!ass_track) continue;
if (type == 'a') { // ssa/ass subs with libass
ass_process_chunk(ass_track, packet, len,
- (long long)(pts*1000 + 0.5),
- (long long)((endpts-pts)*1000 + 0.5));
+ (long long)(subpts*1000 + 0.5),
+ (long long)((endpts-subpts)*1000 + 0.5));
} else { // plaintext subs with libass
- vo_sub = NULL;
- if (pts != MP_NOPTS_VALUE) {
- if (endpts == MP_NOPTS_VALUE) endpts = pts + 3;
+ if (subpts != MP_NOPTS_VALUE) {
+ if (endpts == MP_NOPTS_VALUE) endpts = subpts + 3;
sub_clear_text(&subs, MP_NOPTS_VALUE);
sub_add_text(&subs, packet, len, endpts);
- subs.start = pts * 100;
+ subs.start = subpts * 100;
subs.end = endpts * 100;
ass_process_subtitle(ass_track, &subs);
}
@@ -183,7 +180,7 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
continue;
}
#endif
- if (pts != MP_NOPTS_VALUE) {
+ if (subpts != MP_NOPTS_VALUE) {
if (endpts == MP_NOPTS_VALUE)
sub_clear_text(&subs, MP_NOPTS_VALUE);
if (type == 'a') { // ssa/ass subs without libass => convert to plaintext
@@ -198,11 +195,11 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
packet = p;
}
sub_add_text(&subs, packet, len, endpts);
- vo_osd_changed(OSDTYPE_SUBTITLE);
+ set_osd_subtitle(mpctx, &subs);
}
}
if (sub_clear_text(&subs, curpts))
- vo_osd_changed(OSDTYPE_SUBTITLE);
+ set_osd_subtitle(mpctx, &subs);
}
current_module=NULL;
}
diff --git a/mpcommon.h b/mpcommon.h
index 211145abfc..bbec3113a6 100644
--- a/mpcommon.h
+++ b/mpcommon.h
@@ -9,11 +9,14 @@ extern double sub_last_pts;
extern struct ass_track *ass_track;
extern subtitle *vo_sub_last;
+struct MPContext;
void print_version(const char* name);
-void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub,
- double video_offset, int reset);
+void update_subtitles(struct MPContext *mpctx, struct MPOpts *opts,
+ sh_video_t *sh_video, double refpts, double sub_offset,
+ demux_stream_t *d_dvdsub, int reset);
void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset);
int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang);
+void set_osd_subtitle(struct MPContext *mpctx, subtitle *subs);
extern int disable_system_conf;
extern int disable_user_conf;
diff --git a/mplayer.c b/mplayer.c
index 1677b601ef..c306c73b4f 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -1493,6 +1493,27 @@ void set_osd_bar(struct MPContext *mpctx, int type,const char* name,double min,d
name, ROUND(100*(val-min)/(max-min)));
}
+/**
+ * \brief Display text subtitles on the OSD
+ */
+void set_osd_subtitle(struct MPContext *mpctx, subtitle *subs)
+{
+ int i;
+ vo_sub = subs;
+ vo_osd_changed(OSDTYPE_SUBTITLE);
+ if (!mpctx->sh_video) {
+ // reverse order, since newest set_osd_msg is displayed first
+ for (i = SUB_MAX_TEXT - 1; i >= 0; i--) {
+ if (!subs || i >= subs->lines || !subs->text[i])
+ rm_osd_msg(OSD_MSG_SUB_BASE + i);
+ else {
+ // HACK: currently display time for each sub line except the last is set to 2 seconds.
+ int display_time = i == subs->lines - 1 ? 180000 : 2000;
+ set_osd_msg(OSD_MSG_SUB_BASE + i, 1, display_time, "%s", subs->text[i]);
+ }
+ }
+ }
+}
/**
* \brief Update the OSD message line.
@@ -2251,7 +2272,8 @@ static double update_video_nocorrect_pts(struct MPContext *mpctx,
#endif
if (decoded_frame) {
// These updates are done here for vf_expand OSD/subtitles
- update_subtitles(sh_video, mpctx->d_sub, mpctx->video_offset, 0);
+ update_subtitles(mpctx, &mpctx->opts, sh_video, sh_video->pts,
+ mpctx->video_offset, mpctx->d_sub, 0);
update_teletext(sh_video, mpctx->demuxer, 0);
update_osd_msg(mpctx);
current_module = "filter video";
@@ -2304,7 +2326,8 @@ static double update_video(struct MPContext *mpctx, int *blit_frame)
framedrop_type, pts);
if (decoded_frame) {
// These updates are done here for vf_expand OSD/subtitles
- update_subtitles(sh_video, mpctx->d_sub, mpctx->video_offset, 0);
+ update_subtitles(mpctx, &mpctx->opts, sh_video, sh_video->pts,
+ mpctx->video_offset, mpctx->d_sub, 0);
update_teletext(sh_video, mpctx->demuxer, 0);
update_osd_msg(mpctx);
current_module = "filter video";
@@ -2580,7 +2603,9 @@ static int seek(MPContext *mpctx, double amount, int style)
// (which is used by at least vobsub and edl code below) may
// be completely wrong (probably 0).
mpctx->sh_video->pts = mpctx->d_video->pts + mpctx->video_offset;
- update_subtitles(mpctx->sh_video, mpctx->d_sub, mpctx->video_offset, 1);
+ update_subtitles(mpctx, &mpctx->opts, mpctx->sh_video,
+ mpctx->sh_video->pts, mpctx->video_offset,
+ mpctx->d_sub, 1);
update_teletext(mpctx->sh_video, mpctx->demuxer, 1);
}
@@ -2589,6 +2614,9 @@ static int seek(MPContext *mpctx, double amount, int style)
mpctx->audio_out->reset(); // stop audio, throwing away buffered data
mpctx->sh_audio->a_buffer_len = 0;
mpctx->sh_audio->a_out_buffer_len = 0;
+ if (!mpctx->sh_video)
+ update_subtitles(mpctx, &mpctx->opts, NULL, mpctx->sh_audio->pts,
+ mpctx->video_offset, mpctx->d_sub, 1);
}
if (vo_vobsub && mpctx->sh_video) {
@@ -3406,7 +3434,6 @@ if(stream_dump_type==5){
if(mpctx->stream->type==STREAMTYPE_DVD){
current_module="dvd lang->id";
if(opts->audio_id==-1) opts->audio_id=dvd_aid_from_lang(mpctx->stream,audio_lang);
- if(dvdsub_lang && opts->sub_id==-2) opts->sub_id=-1;
if(dvdsub_lang && opts->sub_id==-1) opts->sub_id=dvd_sid_from_lang(mpctx->stream,dvdsub_lang);
// setup global sub numbering
mpctx->global_sub_indices[SUB_SOURCE_DEMUX] = mpctx->global_sub_size; // the global # of the first demux-specific sub.
@@ -3419,7 +3446,6 @@ if(mpctx->stream->type==STREAMTYPE_DVD){
if(mpctx->stream->type==STREAMTYPE_DVDNAV){
current_module="dvdnav lang->id";
if(opts->audio_id==-1) opts->audio_id=mp_dvdnav_aid_from_lang(mpctx->stream,audio_lang);
- if(dvdsub_lang && opts->sub_id==-2) opts->sub_id=-1;
if(dvdsub_lang && opts->sub_id==-1) opts->sub_id=mp_dvdnav_sid_from_lang(mpctx->stream,dvdsub_lang);
// setup global sub numbering
mpctx->global_sub_indices[SUB_SOURCE_DEMUX] = mpctx->global_sub_size; // the global # of the first demux-specific sub.
@@ -3668,14 +3694,14 @@ if(vo_spudec==NULL && mpctx->sh_video &&
init_vo_spudec(mpctx);
}
-if(mpctx->sh_video) {
// after reading video params we should load subtitles because
// we know fps so now we can adjust subtitle time to ~6 seconds AST
// check .sub
current_module="read_subtitles_file";
+ double sub_fps = mpctx->sh_video ? mpctx->sh_video->fps : 25;
if(sub_name){
for (i = 0; sub_name[i] != NULL; ++i)
- add_subtitles(mpctx, sub_name[i], mpctx->sh_video->fps, 0);
+ add_subtitles(mpctx, sub_name[i], sub_fps, 0);
}
if(sub_auto) { // auto load sub file ...
char *psub = get_path( "sub/" );
@@ -3683,7 +3709,7 @@ if(mpctx->sh_video) {
int i = 0;
free(psub); // release the buffer created by get_path() above
while (tmp[i]) {
- add_subtitles(mpctx, tmp[i], mpctx->sh_video->fps, 1);
+ add_subtitles(mpctx, tmp[i], sub_fps, 1);
free(tmp[i++]);
}
free(tmp);
@@ -3693,7 +3719,7 @@ if(mpctx->sh_video) {
mpctx->global_sub_indices[SUB_SOURCE_SUBS] = mpctx->global_sub_size; // the global # of the first sub.
mpctx->global_sub_size += mpctx->set_of_sub_size;
}
-}
+
if (mpctx->global_sub_size) {
// find the best sub to use
@@ -3708,11 +3734,11 @@ if (mpctx->global_sub_size) {
} else if (mpctx->global_sub_indices[SUB_SOURCE_SUBS] >= 0) {
// if there are text subs to use, use those. (autosubs come last here)
mpctx->global_sub_pos = mpctx->global_sub_indices[SUB_SOURCE_SUBS];
- } else if (opts->sub_id < 0 && mpctx->global_sub_indices[SUB_SOURCE_DEMUX] >= 0) {
+ } else if (opts->sub_id == -1 && mpctx->global_sub_indices[SUB_SOURCE_DEMUX] >= 0) {
// finally select subs by language and container hints
- if (opts->sub_id < 0 && dvdsub_lang)
+ if (opts->sub_id == -1 && dvdsub_lang)
opts->sub_id = demuxer_sub_track_by_lang(mpctx->demuxer, dvdsub_lang);
- if (opts->sub_id < 0)
+ if (opts->sub_id == -1)
opts->sub_id = demuxer_default_sub_track(mpctx->demuxer);
if (opts->sub_id >= 0)
mpctx->global_sub_pos = mpctx->global_sub_indices[SUB_SOURCE_DEMUX] + opts->sub_id;
@@ -3941,6 +3967,8 @@ if(!mpctx->sh_video) {
if(end_at.type == END_AT_TIME && end_at.pos < a_pos)
mpctx->stop_play = PT_NEXT_ENTRY;
+ update_subtitles(mpctx, &mpctx->opts, NULL, a_pos, mpctx->video_offset,
+ mpctx->d_sub, 0);
update_osd_msg(mpctx);
} else {
diff --git a/subreader.h b/subreader.h
index 28246ec483..683d12ffbf 100644
--- a/subreader.h
+++ b/subreader.h
@@ -83,7 +83,8 @@ void dump_microdvd(sub_data* subd, float fps);
void dump_jacosub(sub_data* subd, float fps);
void dump_sami(sub_data* subd, float fps);
void sub_free( sub_data * subd );
-void find_sub(sub_data* subd,int key);
+struct MPContext;
+void find_sub(struct MPContext *mpctx, sub_data* subd,int key);
void step_sub(sub_data *subd, float pts, int movement);
void sub_add_text(subtitle *sub, const char *txt, int len, double endpts);
int sub_clear_text(subtitle *sub, double pts);