diff --git a/DOCS/man/de/mplayer.1 b/DOCS/man/de/mplayer.1 index de7bef45ca..120c6ce701 100644 --- a/DOCS/man/de/mplayer.1 +++ b/DOCS/man/de/mplayer.1 @@ -2408,6 +2408,24 @@ Deaktiviert das automatische Laden von Untertiteln. Setzt die Anzeigedauer der OSD-Meldungen in ms (Standard: 1000). . .TP +.B \-osd\-fractions <0\-2> +Setzt die Art der Anzeige von Nachkommastellen des aktuellen Zeitstempels im +OSD: +.PD 0 +.RSs +.IPs 0 +Keine Anzeige der Nachkommastellen (Standard). +.IPs 1 +Zeige die ersten beiden Nachkommastellen. +.IPs 2 +Zeige genäherte Framezahl an. +Die angezeigte Framezahl ist nicht exakt, sondern nur genähert. +Für variable FPS ist die Näherung weit von der tatsächlichen Framezahl +entfernt. +.RE +.PD 1 +. +.TP .B \-osdlevel <0\-3> (nur bei MPlayer) Gibt den Modus an, in dem das OSD startet: .PD 0 diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index 0f3a2b2aa6..efd71a63c3 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -1474,6 +1474,35 @@ Can be slow especially when seeking backwards since it has to rewind to the beginning to find an exact frame position. . .TP +.B \-http-header-fields +Set custom HTTP fields when accessing HTTP stream. +.sp 1 +.I EXAMPLE: +.PD 0 +.RSs +.IPs +mplayer \-http\-header\-fields 'Field1: value1','Field2: value2' http://localhost:1234 +.br +Will generate HTTP request: +.RSss +.br +GET / HTTP/1.0 +.br +Host: localhost:1234 +.br +User-Agent: MPlayer +.br +Icy-MetaData: 1 +.br +Field1: value1 +.br +Field2: value2 +.br +Connection: close +.REss +.RE +. +.TP .B \-idx (also see \-forceidx) Rebuilds index of files if no index was found, allowing seeking. Useful with broken/\:incomplete downloads, or badly created files. @@ -2324,6 +2353,23 @@ Turns off automatic subtitle file loading. Set the duration of the OSD messages in ms (default: 1000). . .TP +.B \-osd\-fractions <0\-2> +Set how fractions of seconds of the current timestamp are printed on the OSD: +.PD 0 +.RSs +.IPs 0 +Do not display fractions (default). +.IPs 1 +Show the first two decimals. +.IPs 2 +Show approximate frame count within current second. +This frame count is not accurate but only an approximation. +For variable fps, the approximation is known to be far off the correct frame +count. +.RE +.PD 1 +. +.TP .B \-osdlevel <0\-3> Specifies which mode the OSD should start in. .PD 0 @@ -3110,6 +3156,11 @@ Fixes fullscreen switching on OpenBox 1.x. .PD 1 . .TP +.B \-gamma <\-100\-100> +Adjust the gamma of the video signal (default: 0). +Not supported by all video output drivers. +. +.TP .B \-geometry x[%][:y[%]] or [WxH][+-x+-y] Adjust where the output is on the screen initially. The x and y specifications are in pixels measured from the top-left of the diff --git a/cfg-mplayer.h b/cfg-mplayer.h index a4dd498b94..0ada04916a 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -442,6 +442,7 @@ const m_option_t common_opts[] = { {"user", &network_username, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"passwd", &network_password, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"bandwidth", &network_bandwidth, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, + {"http-header-fields", &network_http_header_fields, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, {"user-agent", &network_useragent, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"referrer", &network_referrer, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"cookies", &network_cookies_enabled, CONF_TYPE_FLAG, 0, 0, 1, NULL}, @@ -868,6 +869,7 @@ const m_option_t mplayer_opts[]={ OPT_INTRANGE("saturation", vo_gamma_saturation, 0, -100, 100), OPT_INTRANGE("contrast", vo_gamma_contrast, 0, -100, 100), OPT_INTRANGE("hue", vo_gamma_hue, 0, -100, 100), + OPT_INTRANGE("gamma", vo_gamma_gamma, 0, -100, 100), {"keepaspect", &vo_keepaspect, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"nokeepaspect", &vo_keepaspect, CONF_TYPE_FLAG, 0, 1, 0, NULL}, @@ -895,6 +897,7 @@ const m_option_t mplayer_opts[]={ #endif OPT_INTRANGE("osdlevel", osd_level, 0, 0, 3), OPT_INTRANGE("osd-duration", osd_duration, 0, 0, 3600000), + OPT_INTRANGE("osd-fractions", osd_fractions, 0, 0, 2), #ifdef CONFIG_MENU {"menu", &use_menu, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL}, {"nomenu", &use_menu, CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL}, @@ -955,7 +958,9 @@ const m_option_t mplayer_opts[]={ OPT_FLAG_CONSTANTS("noloop", loop_times, 0, 0, -1), OPT_INTRANGE("loop", loop_times, 0, -1, 10000), - {"playlist", NULL, CONF_TYPE_STRING, 0, 0, 0, NULL}, + {"playlist", NULL, CONF_TYPE_STRING, CONF_NOCFG, 0, 0, NULL}, + {"shuffle", NULL, CONF_TYPE_FLAG, CONF_NOCFG, 0, 0, NULL}, + {"noshuffle", NULL, CONF_TYPE_FLAG, CONF_NOCFG, 0, 0, NULL}, OPT_MAKE_FLAGS("ordered-chapters", ordered_chapters, 0), OPT_INTRANGE("chapter-merge-threshold", chapter_merge_threshold, 0, 0, 10000), diff --git a/command.c b/command.c index 5b9bf82af2..de7f1fbca9 100644 --- a/command.c +++ b/command.c @@ -605,6 +605,8 @@ static int mp_property_angle(m_option_t *prop, int action, void *arg, angle += step; if (angle < 1) //cycle angle = angles; + else if (angle > angles) + angle = 1; break; } default: diff --git a/configure b/configure index 53b58f348b..749c400206 100755 --- a/configure +++ b/configure @@ -296,7 +296,6 @@ Installation directories: Optional features: --disable-mplayer disable MPlayer compilation [enable] - --disable-largefiles disable support for files > 2GB [enable] --enable-termcap use termcap database for key codes [autodetect] --enable-termios use termios database for key codes [autodetect] --disable-iconv disable iconv for encoding conversion [autodetect] @@ -670,7 +669,6 @@ _xvr100=auto _tga=yes _directfb=auto _bl=no -_largefiles=yes #language=en _shm=auto _translation=no @@ -1076,8 +1074,6 @@ for ac_option do --disable-bl) _bl=no ;; --enable-mtrr) _mtrr=yes ;; --disable-mtrr) _mtrr=no ;; - --enable-largefiles) _largefiles=yes ;; - --disable-largefiles) _largefiles=no ;; --enable-shm) _shm=yes ;; --disable-shm) _shm=no ;; --enable-select) _select=yes ;; @@ -2615,7 +2611,7 @@ if arm ; then _armv6t2=no inline_asm_check '"movt r0, #0"' && _armv6t2=yes fi - echores "$_armv6" + echores "$_armv6t2" echocheck "ARM VFP" if test $_armvfp = "auto" ; then @@ -5284,11 +5280,9 @@ fi if test "$_dvdread_internal" = yes; then def_dvdread='#define CONFIG_DVDREAD 1' inputmodules="dvdread(internal) $inputmodules" - _largefiles=yes res_comment="internal" elif test "$_dvdread" = yes; then def_dvdread='#define CONFIG_DVDREAD 1' - _largefiles=yes extra_ldflags="$extra_ldflags -ldvdread" inputmodules="dvdread(external) $inputmodules" res_comment="external" @@ -5324,7 +5318,6 @@ if test "$_libdvdcss_internal" = yes ; then cflags_libdvdcss_dvdread="-Ilibdvdcss" def_dvdcss="#define HAVE_DVDCSS_DVDCSS_H 1" inputmodules="libdvdcss(internal) $inputmodules" - _largefiles=yes else noinputmodules="libdvdcss(internal) $noinputmodules" fi @@ -6600,14 +6593,8 @@ if os2 ; then fi ############################################################################# -# 64 bit file offsets? -if test "$_largefiles" = yes || freebsd ; then - CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" - if test "$_dvdread" = yes || test "$_libdvdcss_internal" = yes ; then - # dvdread support requires this (for off64_t) - CFLAGS="$CFLAGS -D_LARGEFILE64_SOURCE" - fi -fi + +CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE" CXXFLAGS=" $CFLAGS -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS" @@ -6637,7 +6624,6 @@ if test "$_dvdnav" = auto ; then statement_check_broken stdint.h dvdnav/dvdnav.h 'dvdnav_t *dvd = 0' $_dvdnavdir $_dvdnavlibs $_ld_dl $_ld_pthread && _dvdnav=yes fi if test "$_dvdnav" = yes ; then - _largefiles=yes def_dvdnav='#define CONFIG_DVDNAV 1' if test "$dvdnav_internal" = yes ; then cflags_libdvdnav="-Ilibdvdnav" diff --git a/etc/codecs.conf b/etc/codecs.conf index 3f624e51ee..8e37041599 100644 --- a/etc/codecs.conf +++ b/etc/codecs.conf @@ -3,12 +3,20 @@ ; Before editing this file, please read DOCS/tech/codecs.conf.txt ! ;============================================================================= -release 20101127 +release 20110311 ;============================================================================= ; VIDEO CODECS ;============================================================================= +videocodec ffanm + info "FFmpeg Deluxe Paint Animation" + status working + fourcc "ANM " ; internal MPlayer FourCC + driver ffmpeg + dll anm + out BGR8 + videocodec ffbinkvideo info "FFmpeg Bink Video" status working @@ -184,15 +192,13 @@ videocodec ffmpeg2 format 0x10000002 ; MPEG-2 fourcc mpg2,MPG2 fourcc "DVR " - fourcc hdv1 - fourcc hdv2 fourcc MPEG - fourcc hdv3 ; HDV 1080i50 - fourcc hdv5 ; HDV 720p25 fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s) fourcc MMES,mmes ; matrox mpeg2 in avi fourcc M701 ; matrox mpeg2 intra-only - fourcc hdv6,hdv7,hdv8 + fourcc hdv1,hdv2,hdv3 + fourcc hdv4,hdv5,hdv6 + fourcc hdv7,hdv8,hdv9 fourcc xdv1,xdv2,xdv3 fourcc xdv4,xdv5,xdv6 fourcc xdv7,xdv8,xdv9 @@ -200,7 +206,7 @@ videocodec ffmpeg2 fourcc xdvd,xdve,xdvf fourcc xd5a,xd5b,xd5c fourcc xd5d,xd5e,xd5f - fourcc xd59,xd54 + fourcc xd59,xd54,xd55 fourcc mx5n,mx4n,mx4p fourcc mx3n,mx3p fourcc AVmp @@ -226,15 +232,13 @@ videocodec ffmpeg12 fourcc PIM2 ; Pinnacle hardware-MPEG-2 fourcc VCR2 fourcc "DVR " - fourcc hdv2 fourcc MPEG - fourcc hdv1 - fourcc hdv3 ; HDV 1080i50 - fourcc hdv5 ; HDV 720p25 fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s) fourcc MMES,mmes ; matrox mpeg2 in avi fourcc M701 ; matrox mpeg2 intra-only - fourcc hdv6,hdv7,hdv8 + fourcc hdv1,hdv2,hdv3 + fourcc hdv4,hdv5,hdv6 + fourcc hdv7,hdv8,hdv9 fourcc xdv1,xdv2,xdv3 fourcc xdv4,xdv5,xdv6 fourcc xdv7,xdv8,xdv9 @@ -242,7 +246,7 @@ videocodec ffmpeg12 fourcc xdvd,xdve,xdvf fourcc xd5a,xd5b,xd5c fourcc xd5d,xd5e,xd5f - fourcc xd59,xd54 + fourcc xd59,xd54,xd55 fourcc mx5n,mx4n,mx4p fourcc mx3n,mx3p fourcc AVmp @@ -250,6 +254,7 @@ videocodec ffmpeg12 fourcc m2v1,m1v1 fourcc LMP2 ; Lead mpeg2 in avi fourcc slif ; SoftLab MPEG-2 I-frames Codec + fourcc EM2V ; Etymonix MPEG-2 I-frame Video Codec driver ffmpeg dll "mpegvideo" out YV12,I420,IYUV @@ -262,17 +267,15 @@ videocodec ffmpeg12mc format 0x10000002 ; MPEG-2 fourcc mpg1,mpg2,MPG2 fourcc "DVR " - fourcc hdv1 - fourcc hdv2 fourcc PIM1 ; Pinnacle hardware-MPEG-1 fourcc PIM2 ; Pinnacle hardware-MPEG-2 fourcc VCR2 fourcc MPEG - fourcc hdv3 ; HDV 1080i50 - fourcc hdv5 ; HDV 720p25 fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s) fourcc MMES,mmes ; matrox mpeg2 in avi - fourcc hdv6,hdv7,hdv8 + fourcc hdv1,hdv2,hdv3 + fourcc hdv4,hdv5,hdv6 + fourcc hdv7,hdv8,hdv9 fourcc xdv1,xdv2,xdv3 fourcc xdv4,xdv5,xdv6 fourcc xdv7,xdv8,xdv9 @@ -280,7 +283,7 @@ videocodec ffmpeg12mc fourcc xdvd,xdve,xdvf fourcc xd5a,xd5b,xd5c fourcc xd5d,xd5e,xd5f - fourcc xd59,xd54 + fourcc xd59,xd54,xd55 fourcc mx5n,mx4n,mx4p fourcc mx3n,mx3p fourcc AVmp @@ -313,9 +316,6 @@ videocodec ffmpeg12vdpau fourcc xdv7,xdv8,xdv9 fourcc xdva,xdvb,xdvc fourcc xdvd,xdve,xdvf - fourcc xd5a,xd5b,xd5c - fourcc xd5d,xd5e,xd5f - fourcc xd59,xd54 fourcc mx5n,mx4n,mx4p fourcc mx3n,mx3p fourcc AVmp @@ -327,6 +327,40 @@ videocodec ffmpeg12vdpau out VDPAU_MPEG1 out VDPAU_MPEG2 +videocodec ffmpeg2crystalhd + info "FFmpeg MPEG-2 (CrystalHD)" + status working + format 0x10000002 ; MPEG-2 + fourcc mpg2,MPG2 + fourcc "DVR " + fourcc MPEG + fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s) + fourcc MMES,mmes ; matrox mpeg2 in avi + fourcc M701 ; matrox mpeg2 intra-only + fourcc hdv1,hdv2,hdv3 + fourcc hdv4,hdv5,hdv6 + fourcc hdv7,hdv8,hdv9 + fourcc xdv1,xdv2,xdv3 + fourcc xdv4,xdv5,xdv6 + fourcc xdv7,xdv8,xdv9 + fourcc xdva,xdvb,xdvc + fourcc xdvd,xdve,xdvf + fourcc xd5a,xd5b,xd5c + fourcc xd5d,xd5e,xd5f + fourcc xd59,xd54 + fourcc mx5n,mx4n,mx4p + fourcc mx3n,mx3p + fourcc AVmp + fourcc VCR2 + fourcc mp2v,mpgv + fourcc m2v1 + fourcc PIM2 + fourcc LMP2 ; Lead mpeg2 in avi + fourcc slif ; SoftLab MPEG-2 I-frames Codec + driver ffmpeg + dll mpeg2_crystalhd + out YUY2 + videocodec mpegpes info "MPEG-PES output (.mpg or DXR3/IVTV/DVB/V4L2 card)" comment "for hardware decoding" @@ -336,8 +370,8 @@ videocodec mpegpes fourcc mpg1,MPG1,mpg2,MPG2 fourcc MPEG fourcc hdv1,hdv2,hdv3 - fourcc hdv5 - fourcc hdv6,hdv7,hdv8 + fourcc hdv4,hdv5,hdv6 + fourcc hdv7,hdv8,hdv9 fourcc xdv1,xdv2,xdv3 fourcc xdv4,xdv5,xdv6 fourcc xdv7,xdv8,xdv9 @@ -345,7 +379,7 @@ videocodec mpegpes fourcc xdvd,xdve,xdvf fourcc xd5a,xd5b,xd5c fourcc xd5d,xd5e,xd5f - fourcc xd59,xd54 + fourcc xd59,xd54,xd55 fourcc mx5n,mx4n,mx4p fourcc mx3n,mx3p fourcc AVmp @@ -861,6 +895,23 @@ videocodec ffdivx dll msmpeg4 out YV12,I420,IYUV +videocodec ffdivxcrystalhd + info "FFmpeg DivX ;-) (MSMPEG-4 v3) (CrystalHD)" + status buggy + fourcc MPG3,mpg3 div3 + fourcc MP43,mp43 div3 ; MSMPEG-4 v3 (fourcc mapping to div3) + fourcc DIV5,div5 div3 ; DivX 3.20 + fourcc DIV6,div6 div4 ; -||- + fourcc DIV3,div3,DIV4,div4 + fourcc DIVF,divf ; divx4.12 + fourcc AP41 div3 ; AngelPotion stuff + fourcc COL1,col1,COL0,col0 ; Cool codec (based on mpg4ds32.ax) + fourcc 3IVD,3ivd ; divxdoctored files (3ivx.com) + fourcc DVX3 + driver ffmpeg + dll msmpeg4_crystalhd + out YUY2 + videocodec ffmp42 info "FFmpeg MSMPEG-4 v2" status working @@ -921,6 +972,14 @@ videocodec ffwmv3vdpau dll wmv3_vdpau out VDPAU_WMV3 +videocodec ffwmv3crystalhd + info "FFmpeg WMV3/WMV9 (CrystalHD)" + status buggy + fourcc WMV3,wmv3 + driver ffmpeg + dll wmv3_crystalhd + out YUY2 + videocodec ffvc1 info "FFmpeg WVC1" status buggy @@ -939,6 +998,15 @@ videocodec ffvc1vdpau dll vc1_vdpau out VDPAU_VC1 +videocodec ffvc1crystalhd + info "FFmpeg WVC1 (CrystalHD)" + status buggy + fourcc WVC1,wvc1,WMVA + fourcc vc-1,VC-1 + driver ffmpeg + dll vc1_crystalhd + out YUY2 + videocodec ffh264 info "FFmpeg H.264" status working @@ -948,6 +1016,8 @@ videocodec ffh264 fourcc davc,DAVC fourcc vvvc ; only one sample using this fourcc fourcc ai55,ai15 ; flip4mac avc intra + fourcc ai1q,ai5q ; flip4mac avc intra + fourcc ai12 ;AVC Intra 100 / 1080 format 0x10000005 driver ffmpeg dll h264 @@ -961,11 +1031,27 @@ videocodec ffh264vdpau fourcc avc1,AVC1 fourcc davc,DAVC fourcc ai55,ai15 ; flip4mac avc intra + fourcc ai1q,ai5q ; flip4mac avc intra format 0x10000005 driver ffmpeg dll h264_vdpau out VDPAU_H264 +videocodec ffh264crystalhd + info "FFmpeg H.264 (CrystalHD)" + status working + fourcc H264,h264 + fourcc X264,x264 + fourcc avc1,AVC1 + fourcc davc,DAVC + fourcc vvvc ; only one sample using this fourcc + fourcc ai55,ai15 ; flip4mac avc intra + fourcc ai1q,ai5q ; flip4mac avc intra + format 0x10000005 + driver ffmpeg + dll h264_crystalhd + out YUY2 + videocodec coreavcwindows info "CoreAVC H.264 for x86 - http://corecodec.org/" comment "this codec will only work after purchasing it" @@ -976,6 +1062,7 @@ videocodec coreavcwindows fourcc davc,DAVC fourcc VSSH fourcc ai55,ai15 ; flip4mac avc intra + fourcc ai1q,ai5q ; flip4mac avc intra format 0x10000005 driver dshow dll "CoreAVCDecoder.ax" @@ -1057,6 +1144,39 @@ videocodec ffodivxvdpau dll mpeg4_vdpau out VDPAU_MPEG4 +videocodec ffodivxcrystalhd + info "FFmpeg MPEG-4,DIVX-4/5 (CrystalHD)" + status working + fourcc FMP4,fmp4 + fourcc DIVX,divx + fourcc DIV1,div1 divx + fourcc MP4S,mp4s ; ISO MPEG-4 Video V1 + fourcc M4S2,m4s2 + fourcc xvid,XVID,XviD,XVIX + fourcc DX50,dx50,BLZ0 DX50 + fourcc mp4v,MP4V + format 0x4 + fourcc UMP4 + fourcc RMP4 + fourcc 3IV2,3iv2 ; 3ivx Delta 4 + fourcc DXGM + fourcc SEDG ; diskless camcorder Samsung Miniket VP-M110 + fourcc SMP4,smp4 ; Samsung SMP4 video codec + fourcc VIDM ; vidm 4.01 codec + format 0x10000004 ; mpeg 4 es + fourcc m4cc,M4CC + fourcc hdx4,HDX4 + fourcc FVFW,fvfw + fourcc FFDS + fourcc DCOD,MVXM,EM4A,PM4V + fourcc M4T3,DMK2,DIGI,INMC + fourcc EPHV,SN40,WAWV + fourcc uldx,ULDX,VSPX + fourcc SIPP ; Samsung SHR-6040 + driver ffmpeg + dll mpeg4_crystalhd + out YUY2 + videocodec ffwv1f info "WV1F MPEG-4" status working @@ -1742,6 +1862,7 @@ videocodec ffdv status working fourcc CDVC,cdvc fourcc CDVH,cdvh ; Canopus DVCPRO HD + fourcc CDV5 ; Canopus SD50 fourcc DVSD,dvsd ; PAL fourcc DVCS,dvcs ; NTSC ? fourcc "dvcp" ; PAL DV in .mov @@ -2494,6 +2615,14 @@ videocodec webtrain dll "wtvc.dll" out BGR16 flip +videocodec ffkega + info "FFmpeg Kega Video" + status working + fourcc KGV1 + driver ffmpeg + dll kgv1 + out BGR15 + videocodec kegavideo info "Kega Video" comment "requires MSVCR80.DLL on windows" @@ -3008,6 +3137,14 @@ videocodec fffraps dll "fraps" out BGR24,YV12,I420 +videocodec ffjv + info "FFmpeg Bitmap Brothers JV" + status working + fourcc FFJV ; internal MPlayer FourCC + driver ffmpeg + dll "jv" + out BGR8 + videocodec fftiertexseq info "FFmpeg Tiertex SEQ" status working @@ -3554,45 +3691,45 @@ audiocodec wma9spdshow audiocodec ffqdm2 info "FFmpeg QDM2 audio" status working - format 0x324D4451 ; "QDM2" + fourcc QDM2 driver ffmpeg dll "qdm2" audiocodec qdmc info "QuickTime QDMC/QDM2 audio" status working - format 0x324D4451 ; "QDM2" - format 0x434D4451 ; "QDMC" + fourcc QDM2 + fourcc QDMC driver qtaudio dll "QuickTime.qts" audiocodec ffqclp info "FFmpeg QCLP audio" status working - format 0x706C6351 ; "Qclp" - format 0x70637173 ; "sqcp" - format 0x716C6351 ; "Qclq" + fourcc Qclp + fourcc sqcp + fourcc Qclq driver ffmpeg dll "qcelp" audiocodec qclp info "QuickTime QCLP audio" status working - format 0x706C6351 ; "Qclp" + fourcc Qclp driver qtaudio dll "QuickTime.qts" audiocodec qtmace3 info "QuickTime MACE3 audio" status working - format 0x3343414D ; "MAC3" + fourcc MAC3 driver qtaudio dll "QuickTime.qts" audiocodec qtmace6 info "QuickTime MACE6 audio" status working - format 0x3643414D ; "MAC6" + fourcc MAC6 driver qtaudio dll "QuickTime.qts" @@ -3606,29 +3743,29 @@ audiocodec zygoaudio audiocodec ffra144 info "FFmpeg RealAudio 1.0" status working - format 0x345F3431 ; "14_4" - format 0x4A63706C ; "lpcJ" + fourcc 14_4 + fourcc lpcJ driver ffmpeg dll "real_144" audiocodec ffra288 info "FFmpeg RealAudio 2.0" status working - format 0x385F3832 ; "28_8" + fourcc 28_8 driver ffmpeg dll "real_288" audiocodec ffcook info "FFmpeg COOK audio" status working - format 0x6B6F6F63 ; "cook" + fourcc cook driver ffmpeg dll "cook" audiocodec ffatrc info "FFmpeg Atrac 3 audio" status working - format 0x63727461 ; "atrc" + fourcc atrc format 0x270 ; atrac3 in wav driver ffmpeg dll "atrac3" @@ -3636,7 +3773,7 @@ audiocodec ffatrc audiocodec ffsipr info "FFmpeg Sipr/Acelp.net audio" status working - format 0x72706973 ; "sipr" + fourcc sipr format 0x130 ; acelp.net driver ffmpeg dll "sipr" @@ -3644,42 +3781,42 @@ audiocodec ffsipr audiocodec ra144 info "RealAudio 1.0" status working - format 0x345F3431 ; "14_4" + fourcc 14_4 driver realaud dll "14_4.so.6.0" audiocodec ra144win info "Win32 RealAudio 1.0" status working - format 0x345F3431 ; "14_4" + fourcc 14_4 driver realaud dll "14_43260.dll" audiocodec ra144mac info "Mac OS X RealAudio 1.0" status working - format 0x345F3431 ; "14_4" + fourcc 14_4 driver realaud dll "14_4.shlb" audiocodec ra288 info "RealAudio 2.0" status working - format 0x385F3832 ; "28_8" + fourcc 28_8 driver realaud dll "28_8.so.6.0" audiocodec ra288win info "Win32 RealAudio 2.0" status working - format 0x385F3832 ; "28_8" + fourcc 28_8 driver realaud dll "28_83260.dll" audiocodec ra288mac info "Mac OS X RealAudio 2.0" status working - format 0x385F3832 ; "28_8" + fourcc 28_8 driver realaud dll "28_8.shlb" @@ -3687,14 +3824,14 @@ audiocodec ra10cook info "RealPlayer 10 COOK audio" comment "supports cook 5.1" status working - format 0x6B6F6F63 ; "cook" + fourcc cook driver realaud dll "cook.so" audiocodec racook info "RealAudio COOK" status working - format 0x6B6F6F63 ; "cook" + fourcc cook driver realaud dll "cook.so.6.0" @@ -3702,91 +3839,91 @@ audiocodec ra10cookwin info "Win32 RealAudio 10 COOK" comment "supports cook 5.1" status working - format 0x6B6F6F63 ; "cook" + fourcc cook driver realaud dll "cook.dll" audiocodec racookwin info "Win32 RealAudio COOK" status working - format 0x6B6F6F63 ; "cook" + fourcc cook driver realaud dll "cook3260.dll" audiocodec racookmac info "Mac OS X RealAudio COOK" status working - format 0x6B6F6F63 ; "cook" + fourcc cook driver realaud dll "cook.bundle/Contents/MacOS/cook" audiocodec rasipr info "RealAudio Sipro" status working - format 0x72706973 ; "sipr" + fourcc sipr driver realaud dll "sipr.so.6.0" audiocodec ra10sipr info "RealPlayer 10 RealAudio Sipro" status working - format 0x72706973 ; "sipr" + fourcc sipr driver realaud dll "sipr.so" audiocodec ra10siprwin info "Win32 RealAudio 10 Sipro" status working - format 0x72706973 ; "sipr" + fourcc sipr driver realaud dll "sipr.dll" audiocodec rasiprwin info "Win32 RealAudio Sipro" status working - format 0x72706973 ; "sipr" + fourcc sipr driver realaud dll "sipr3260.dll" audiocodec rasiprmac info "Mac OS X RealAudio Sipro" status working - format 0x72706973 ; "sipr" + fourcc sipr driver realaud dll "sipr.bundle/Contents/MacOS/sipr" audiocodec raatrc info "RealAudio ATRAC3" status working - format 0x63727461 ; "atrc" + fourcc atrc driver realaud dll "atrc.so.6.0" audiocodec ra10atrc info "RealPlayer 10 RealAudio ATRAC3" status working - format 0x63727461 ; "atrc" + fourcc atrc driver realaud dll "atrc.so" audiocodec ra10atrcwin info "Win32 RealAudio 10 ATRAC3" status working - format 0x63727461 ; "atrc" + fourcc atrc driver realaud dll "atrc.dll" audiocodec raatrcwin info "Win32 RealAudio ATRAC3" status working - format 0x63727461 ; "atrc" + fourcc atrc driver realaud dll "atrc3260.dll" audiocodec raatrcmac info "Mac OS X RealAudio ATRAC3" status working - format 0x63727461 ; "atrc" + fourcc atrc driver realaud dll "atrc.bundle/Contents/MacOS/atrc" @@ -3807,7 +3944,7 @@ audiocodec ffadpcmimaamv audiocodec ffadpcmimaqt info "FFmpeg QT IMA ADPCM audio" status working - format 0x34616d69 ; "ima4" (MOV files) + fourcc ima4 ; (MOV files) driver ffmpeg dll adpcm_ima_qt @@ -3824,7 +3961,7 @@ audiocodec imaadpcm info "IMA ADPCM" status working format 0x11 - format 0x34616d69 ; "ima4" (MOV files) + fourcc ima4 ; (MOV files) format 0x1100736d ; "ms\x00\x11" (MOV files) driver imaadpcm @@ -3959,9 +4096,10 @@ audiocodec ffadpcmxa audiocodec ffxandpcm info "FFmpeg XAN DPCM audio" - comment "only works with libavformat demuxer" + comment "Wing Commander 4 files only work with libavformat demuxer" status working fourcc Axan + format 0x594A driver ffmpeg dll xan_dpcm @@ -4119,18 +4257,20 @@ audiocodec pcm format 0x1 format 0x3 ; IEEE float format 0xfffe ; Extended - format 0x20776172 ; "raw " (MOV files) - format 0x736f7774 ; "twos" (MOV files) - format 0x74776f73 ; "sowt" (MOV files) - format 0x32336c66 ; "fl32" (MOV files) - format 0x666c3332 ; "23lf" (MOV files) -; format 0x34366c66 ; "fl64" (MOV files) -; format 0x666c3634 ; "46lf" (MOV files) - format 0x454e4f4e ; "NONE" (MOV files from Kodak CX6320) - format 0x34326e69 ; "in24" (MOV files) - format 0x696e3234 ; "42ni" (MOV files) - format 0x32336e69 ; "in32" (MOV files) - format 0x696e3332 ; "23ni" (MOV files) + fourcc "raw " ; (MOV files) + fourcc twos ; (MOV files) + fourcc sowt ; (MOV files) + fourcc fl32 ; (MOV files) + fourcc 23lf ; (MOV files) +; fourcc fl64 ; (MOV files) +; fourcc 46lf ; (MOV files) + fourcc NONE ; (MOV files from Kodak CX6320) + fourcc in24 ; (MOV files) + fourcc 42ni ; (MOV files) + fourcc in32 ; (MOV files) + fourcc 23ni ; (MOV files) + fourcc lpcm ; (MOV files) + fourcc FL32 ; (aiff files) ;;;; these are for hardware support only: (alaw,ulaw,ima-adpcm,mpeg,ac3) ; format 0x6 ; format 0x7 @@ -4347,7 +4487,7 @@ audiocodec imaadpcmacm audiocodec ffgsm info "FFmpeg GSM 06.10" status working - format 0x204D5347 + fourcc "GSM " format 0x1500 fourcc agsm driver ffmpeg @@ -4364,7 +4504,7 @@ audiocodec ffgsmms audiocodec libgsm info "libgsm GSM 06.10" status working - format 0x204D5347 + fourcc "GSM " format 0x1500 driver ffmpeg dll "libgsm" @@ -4397,14 +4537,14 @@ audiocodec alaw info "aLaw" status working format 0x6 - format 0x77616C61 ; 'alaw', .mov files + fourcc alaw ; (MOV files) driver alaw audiocodec ulaw info "uLaw" status working format 0x7 - format 0x77616c75 ; "ulaw" (MOV files) + fourcc ulaw ; (MOV files) format 0x6c75 driver alaw @@ -4421,14 +4561,21 @@ audiocodec fflpcm driver ffmpeg dll pcm_bluray +audiocodec ffpcmlxf + info "Leitch/Harris PCM" + status working + fourcc PLXF ; internal MPlayer FourCC + driver ffmpeg + dll pcm_lxf + ; add every new fourcc also to allocate_parser() ; in libmpdemux/demuxer.c audiocodec ffac3 info "FFmpeg AC-3" status working format 0x2000 - format 0x332D6361 ; ac-3 in mp4 - format 0x332D4341 + fourcc ac-3 ; ac-3 in mp4 + fourcc AC-3 format 0x20736D ; "ms\20" older ac3 fcc (MOV files) fourcc dnet fourcc sac3 @@ -4448,8 +4595,11 @@ audiocodec a52 info "AC3-liba52" status working format 0x2000 - ; format 0x332D6361 ; ac-3 in mp4 -- not working + fourcc ac-3 ; ac-3 in mp4 + fourcc AC-3 + format 0x20736D ; "ms\20" older ac3 fcc (MOV files) fourcc dnet + fourcc sac3 driver liba52 dll "liba52" diff --git a/libmpcodecs/ad_liba52.c b/libmpcodecs/ad_liba52.c index 45126a0786..dd277fd20a 100644 --- a/libmpcodecs/ad_liba52.c +++ b/libmpcodecs/ad_liba52.c @@ -81,11 +81,11 @@ while(1){ if(c<0) return -1; /* EOF*/ sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++]=c; } - if(sh_audio->format!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); + if(sh_audio->format==MKTAG('d','n','e','t')) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); length = a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); if(length>=7 && length<=3840) break; /* we're done.*/ /* bad file => resync*/ - if(sh_audio->format!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); + if(sh_audio->format==MKTAG('d','n','e','t')) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); memmove(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,7); --sh_audio->a_in_buffer_len; } @@ -94,7 +94,7 @@ while(1){ sh_audio->i_bps=bit_rate/8; sh_audio->samplesize=sh_audio->sample_format==AF_FORMAT_FLOAT_NE ? 4 : 2; demux_read_data(sh_audio->ds,sh_audio->a_in_buffer+8,length-8); - if(sh_audio->format!=0x2000) + if(sh_audio->format==MKTAG('d','n','e','t')) swab(sh_audio->a_in_buffer+8,sh_audio->a_in_buffer+8,length-8); #ifdef CONFIG_LIBA52_INTERNAL diff --git a/libmpcodecs/ad_pcm.c b/libmpcodecs/ad_pcm.c index 29e78d69af..1920f396f4 100644 --- a/libmpcodecs/ad_pcm.c +++ b/libmpcodecs/ad_pcm.c @@ -86,10 +86,12 @@ static int init(sh_audio_t * sh_audio) sh_audio->sample_format = AF_FORMAT_S8; break; case 0x32336c66: // 'fl32', bigendian float32 + case 0x32334C46: // 'FL32', bigendian float32 in aiff sh_audio->sample_format = AF_FORMAT_FLOAT_BE; sh_audio->samplesize = 4; break; case 0x666c3332: // '23lf', little endian float32, MPlayer internal fourCC + case 0x6D63706C: // 'lpcm' sh_audio->sample_format = AF_FORMAT_FLOAT_LE; sh_audio->samplesize = 4; break; diff --git a/libmpcodecs/ad_qtaudio.c b/libmpcodecs/ad_qtaudio.c index fd1ad2151a..b6c7ef6299 100644 --- a/libmpcodecs/ad_qtaudio.c +++ b/libmpcodecs/ad_qtaudio.c @@ -279,7 +279,7 @@ static void uninit(sh_audio_t *sh){ unsigned long ConvertedFrames=0; unsigned long ConvertedBytes=0; -#ifdef WIN32_LOADER +#if defined(WIN32_LOADER) && !defined(CONFIG_QUICKTIME) Setup_FS_Segment(); #endif @@ -306,7 +306,7 @@ static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen) unsigned long ConvertedFrames=0; unsigned long ConvertedBytes=0; -#ifdef WIN32_LOADER +#if defined(WIN32_LOADER) && !defined(CONFIG_QUICKTIME) Setup_FS_Segment(); #endif diff --git a/libmpcodecs/ad_speex.c b/libmpcodecs/ad_speex.c index f8ddc2f336..c9ac1a42c6 100644 --- a/libmpcodecs/ad_speex.c +++ b/libmpcodecs/ad_speex.c @@ -63,11 +63,8 @@ static int init(sh_audio_t *sh) { const uint8_t *hdr = (const uint8_t *)(sh->wf + 1); const SpeexMode *spx_mode; const SpeexStereoState st_st = SPEEX_STEREO_STATE_INIT; // hack - if (!sh->wf || sh->wf->cbSize < 80) { - mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Missing extradata!\n"); - goto err_out; - } - ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize); + if (sh->wf && sh->wf->cbSize >= 80) + ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize); if (!ctx->hdr && sh->wf->cbSize == 0x72 && hdr[0] == 1 && hdr[1] == 0) { // speex.acm format: raw SpeexHeader dump ctx->hdr = calloc(1, sizeof(*ctx->hdr)); @@ -86,8 +83,18 @@ static int init(sh_audio_t *sh) { ctx->hdr->frames_per_packet = read_le32(&hdr); } if (!ctx->hdr) { - mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Invalid extradata!\n"); - goto err_out; + mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Invalid or missing extradata! Assuming defaults.\n"); + ctx->hdr = calloc(1, sizeof(*ctx->hdr)); + ctx->hdr->frames_per_packet = 1; + ctx->hdr->mode = 0; + if (sh->wf) { + ctx->hdr->nb_channels = sh->wf->nChannels; + ctx->hdr->rate = sh->wf->nSamplesPerSec; + if (ctx->hdr->rate > 16000) + ctx->hdr->mode = 2; + else if (ctx->hdr->rate > 8000) + ctx->hdr->mode = 1; + } } if (ctx->hdr->nb_channels != 1 && ctx->hdr->nb_channels != 2) { mp_msg(MSGT_DECAUDIO, MSGL_WARN, "Invalid number of channels (%i), " @@ -119,12 +126,6 @@ static int init(sh_audio_t *sh) { sh->sample_format = AF_FORMAT_S16_NE; sh->context = ctx; return 1; - -err_out: - if (ctx) - free(ctx->hdr); - free(ctx); - return 0; } static void uninit(sh_audio_t *sh) { diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c index 431b5cd340..598be093c1 100644 --- a/libmpcodecs/vd_ffmpeg.c +++ b/libmpcodecs/vd_ffmpeg.c @@ -521,10 +521,13 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ sh_video_t *sh = avctx->opaque; vd_ffmpeg_ctx *ctx = sh->context; mp_image_t *mpi=NULL; - int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE; + int flags= MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE; int type= MP_IMGTYPE_IPB; int width= avctx->width; int height= avctx->height; + // special case to handle reget_buffer without buffer hints + if (pic->opaque && pic->data[0] && !pic->buffer_hints) + return 0; avcodec_align_dimensions(avctx, &width, &height); //printf("get_buffer %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count); @@ -557,6 +560,9 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ if(init_vo(sh, avctx->pix_fmt) < 0){ avctx->release_buffer= avcodec_default_release_buffer; avctx->get_buffer= avcodec_default_get_buffer; + avctx->reget_buffer= avcodec_default_reget_buffer; + if (pic->data[0]) + release_buffer(avctx, pic); return avctx->get_buffer(avctx, pic); } @@ -569,6 +575,9 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ ctx->do_dr1=0; //FIXME avctx->get_buffer= avcodec_default_get_buffer; + avctx->reget_buffer= avcodec_default_reget_buffer; + if (pic->data[0]) + release_buffer(avctx, pic); return avctx->get_buffer(avctx, pic); } diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c index 0085f286e0..dbb9f3ef55 100644 --- a/libmpdemux/demux_ts.c +++ b/libmpdemux/demux_ts.c @@ -901,7 +901,7 @@ static off_t ts_detect_streams(demuxer_t *demuxer, tsdemux_init_t *param) audio_found = 0; param->atype = UNKNOWN; //WE DIDN'T MATCH ANY AUDIO STREAM, SO WE FORCE THE DEMUXER TO IGNORE AUDIO - mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO AUDIO! "); + mp_msg(MSGT_DEMUXER, MSGL_INFO, "NO AUDIO! (try increasing -tsprobe)"); } if(IS_SUB(param->stype)) diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index a4cee9b8ea..d441ac2863 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -516,10 +516,13 @@ static void allocate_parser(AVCodecContext **avctx, AVCodecParserContext **parse case 0x332D6361: case 0x332D4341: case 0x20736D: - case MKTAG('d', 'n', 'e', 't'): case MKTAG('s', 'a', 'c', '3'): codec_id = CODEC_ID_AC3; break; + case MKTAG('d', 'n', 'e', 't'): + // DNET/byte-swapped AC-3 - there is no parser for that yet + //codec_id = CODEC_ID_DNET; + break; case MKTAG('E', 'A', 'C', '3'): codec_id = CODEC_ID_EAC3; break; diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c index e994075d56..7fb493b3b6 100644 --- a/libmpdemux/mp_taglists.c +++ b/libmpdemux/mp_taglists.c @@ -46,6 +46,9 @@ static const struct mp_AVCodecTag mp_wav_tags[] = { { CODEC_ID_MUSEPACK7, MKTAG('M', 'P', 'C', ' ')}, { CODEC_ID_MUSEPACK8, MKTAG('M', 'P', 'C', '8')}, { CODEC_ID_NELLYMOSER, MKTAG('N', 'E', 'L', 'L')}, +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 92, 0) + { CODEC_ID_PCM_LXF, MKTAG('P', 'L', 'X', 'F')}, +#endif { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'p')}, { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2')}, { CODEC_ID_RA_144, MKTAG('1', '4', '_', '4')}, @@ -71,6 +74,7 @@ static const struct mp_AVCodecTag mp_codecid_override_tags[] = { { CODEC_ID_AC3, 0x2000}, { CODEC_ID_ADPCM_IMA_AMV, MKTAG('A', 'M', 'V', 'A')}, { CODEC_ID_DTS, 0x2001}, + { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd')}, { CODEC_ID_EAC3, MKTAG('E', 'A', 'C', '3')}, { CODEC_ID_H264, MKTAG('H', '2', '6', '4')}, { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'V')}, @@ -93,6 +97,8 @@ const struct mp_AVCodecTag * const mp_codecid_override_taglists[] = {mp_codecid_ static const struct mp_AVCodecTag mp_bmp_tags[] = { { CODEC_ID_AMV, MKTAG('A', 'M', 'V', 'V')}, + { CODEC_ID_ANM, MKTAG('A', 'N', 'M', ' ')}, + { CODEC_ID_AVS, MKTAG('A', 'V', 'S', ' ')}, { CODEC_ID_BETHSOFTVID, MKTAG('B', 'E', 'T', 'H')}, { CODEC_ID_BFI, MKTAG('B', 'F', 'I', 'V')}, { CODEC_ID_C93, MKTAG('C', '9', '3', 'V')}, @@ -103,6 +109,9 @@ static const struct mp_AVCodecTag mp_bmp_tags[] = { { CODEC_ID_FLIC, MKTAG('F', 'L', 'I', 'C')}, { CODEC_ID_IDCIN, MKTAG('I', 'D', 'C', 'I')}, { CODEC_ID_INTERPLAY_VIDEO, MKTAG('I', 'N', 'P', 'V')}, +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 114, 0) + { CODEC_ID_JV, MKTAG('F', 'F', 'J', 'V')}, +#endif { CODEC_ID_MDEC, MKTAG('M', 'D', 'E', 'C')}, { CODEC_ID_MOTIONPIXELS, MKTAG('M', 'V', 'I', '1')}, { CODEC_ID_NUV, MKTAG('N', 'U', 'V', '1')}, diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h index dc84518abc..f67a3217ac 100644 --- a/libmpdemux/stheader.h +++ b/libmpdemux/stheader.h @@ -102,7 +102,7 @@ typedef struct sh_video { double i_pts; // PTS for the _next_ I/P frame float next_frame_time; double last_pts; - double buffered_pts[20]; + double buffered_pts[32]; int num_buffered_pts; double codec_reordered_pts; double prev_codec_reordered_pts; diff --git a/libvo/vo_fbdev.c b/libvo/vo_fbdev.c index 7d2e9fb6a9..6d70cca0fe 100644 --- a/libvo/vo_fbdev.c +++ b/libvo/vo_fbdev.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "config.h" #include "video_out.h" @@ -43,7 +44,6 @@ #include "geometry.h" #include "aspect.h" #include "mp_msg.h" -#include "libavutil/common.h" static const vo_info_t info = { "Framebuffer Device", @@ -480,7 +480,7 @@ static fb_mode_t *find_best_mode(int xres, int yres, range_t *hfreq, return best; } -static void set_bpp(struct fb_var_screeninfo *p, int bpp) +static void set_bpp(struct fb_var_screeninfo *p, int bpp, int rgb) { p->bits_per_pixel = FFALIGN(bpp, 2); p->red.msb_right = p->green.msb_right = p->blue.msb_right = p->transp.msb_right = 0; @@ -519,15 +519,19 @@ static void set_bpp(struct fb_var_screeninfo *p, int bpp) p->blue.length = 4; break; } + if (rgb) { + p->blue.offset = p->red.offset; + p->red.offset = 0; + } } -static void fb_mode2fb_vinfo(fb_mode_t *m, struct fb_var_screeninfo *v) +static void fb_mode2fb_vinfo(fb_mode_t *m, struct fb_var_screeninfo *v, int rgb) { v->xres = m->xres; v->yres = m->yres; v->xres_virtual = m->vxres; v->yres_virtual = m->vyres; - set_bpp(v, m->depth); + set_bpp(v, m->depth, rgb); v->pixclock = m->pixclock; v->left_margin = m->left; v->right_margin = m->right; @@ -563,6 +567,7 @@ static struct fb_var_screeninfo fb_vinfo; static unsigned short fb_ored[256], fb_ogreen[256], fb_oblue[256]; static struct fb_cmap fb_oldcmap = { 0, 256, fb_ored, fb_ogreen, fb_oblue }; static int fb_cmap_changed = 0; +static int fb_rgb; static int fb_pixel_size; // 32: 4 24: 3 16: 2 15: 2 static int fb_bpp; // 32: 32 24: 24 16: 16 15: 15 static int fb_bpp_we_want; // 32: 32 24: 24 16: 16 15: 15 @@ -687,6 +692,7 @@ static int fb_preinit(int reset) mp_msg(MSGT_VO, MSGL_ERR, "notice: Can't open /dev/tty: %s\n", strerror(errno)); } + fb_rgb = !fb_vinfo.red.offset; fb_bpp = fb_vinfo.bits_per_pixel; if (fb_bpp == 16) fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length; @@ -779,7 +785,7 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, mp_msg(MSGT_VO, MSGL_ERR, "can't find requested video mode\n"); return 1; } - fb_mode2fb_vinfo(fb_mode, &fb_vinfo); + fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); } else if (vm) { monitor_hfreq = str2range(monitor_hfreq_str); monitor_vfreq = str2range(monitor_vfreq_str); @@ -796,10 +802,10 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, } mp_msg(MSGT_VO, MSGL_V, "using mode %dx%d @ %.1fHz\n", fb_mode->xres, fb_mode->yres, vsf(fb_mode)); - fb_mode2fb_vinfo(fb_mode, &fb_vinfo); + fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); } fb_bpp_we_want = fb_bpp; - set_bpp(&fb_vinfo, fb_bpp); + set_bpp(&fb_vinfo, fb_bpp, fb_rgb); fb_vinfo.xres_virtual = fb_vinfo.xres; fb_vinfo.yres_virtual = fb_vinfo.yres; fb_page = 0; @@ -955,7 +961,7 @@ static int query_format(uint32_t format) { if (!fb_preinit(0)) return 0; - if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR) { + if ((format & IMGFMT_BGR_MASK) == (fb_rgb ? IMGFMT_RGB : IMGFMT_BGR)) { int bpp = format & 0xff; if (bpp == fb_bpp) diff --git a/libvo/vo_fbdev2.c b/libvo/vo_fbdev2.c index 612b145464..bec9fea8ff 100644 --- a/libvo/vo_fbdev2.c +++ b/libvo/vo_fbdev2.c @@ -36,6 +36,8 @@ #include "fastmemcpy.h" #include "sub/sub.h" #include "mp_msg.h" +#include "aspect.h" +#include "libavutil/common.h" static const vo_info_t info = { "Framebuffer Device", @@ -108,8 +110,6 @@ static void (*draw_alpha_p)(int w, int h, unsigned char *src, static uint8_t *next_frame = NULL; // for double buffering static int in_width; static int in_height; -static int out_width; -static int out_height; static struct fb_cmap *make_directcolor_cmap(struct fb_var_screeninfo *var) { @@ -122,42 +122,25 @@ static struct fb_cmap *make_directcolor_cmap(struct fb_var_screeninfo *var) bcols = 1 << var->blue.length; /* Make our palette the length of the deepest color */ - cols = (rcols > gcols ? rcols : gcols); - cols = (cols > bcols ? cols : bcols); + cols = FFMAX3(rcols, gcols, bcols); - red = malloc(cols * sizeof(red[0])); + red = malloc(3 * cols * sizeof(red[0])); if(!red) { mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate red palette with %d entries.\n", cols); return NULL; } - for(i=0; i< rcols; i++) - red[i] = (65535/(rcols-1)) * i; - - green = malloc(cols * sizeof(green[0])); - if(!green) { - mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate green palette with %d entries.\n", cols); - free(red); - return NULL; - } - for(i=0; i< gcols; i++) + green = red + cols; + blue = green + cols; + for (i = 0; i < cols; i++) { + red[i] = (65535/(rcols-1)) * i; green[i] = (65535/(gcols-1)) * i; - - blue = malloc(cols * sizeof(blue[0])); - if(!blue) { - mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate blue palette with %d entries.\n", cols); - free(red); - free(green); - return NULL; + blue[i] = (65535/(bcols-1)) * i; } - for(i=0; i< bcols; i++) - blue[i] = (65535/(bcols-1)) * i; cmap = malloc(sizeof(struct fb_cmap)); if(!cmap) { mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate color map\n"); free(red); - free(green); - free(blue); return NULL; } cmap->start = 0; @@ -232,20 +215,17 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, { struct fb_cmap *cmap; int fs = flags & VOFLAG_FULLSCREEN; + int x_offset = vo_dx + (d_width - width ) / 2; + int y_offset = vo_dy + (d_height - height) / 2; + x_offset = av_clip(x_offset, 0, fb_vinfo.xres - width); + y_offset = av_clip(y_offset, 0, fb_vinfo.yres - height); - out_width = width; - out_height = height; in_width = width; in_height = height; - if (fs) { - out_width = fb_vinfo.xres; - out_height = fb_vinfo.yres; - } - - if (out_width < in_width || out_height < in_height) { + if (fb_vinfo.xres < in_width || fb_vinfo.yres < in_height) { mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Screensize is smaller than video size (%dx%d < %dx%d)\n", - out_width, out_height, in_width, in_height); + fb_vinfo.xres, fb_vinfo.yres, in_width, in_height); return 1; } @@ -282,12 +262,12 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, return 1; if (ioctl(fb_dev_fd, FBIOPUTCMAP, cmap)) { mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] can't put cmap: %s\n", strerror(errno)); + free(cmap->red); + free(cmap); return 1; } fb_cmap_changed = 1; free(cmap->red); - free(cmap->green); - free(cmap->blue); free(cmap); break; default: @@ -304,8 +284,8 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, } center = frame_buffer + - ( (out_width - in_width) / 2 ) * fb_pixel_size + - ( (out_height - in_height) / 2 ) * fb_line_len; + x_offset * fb_pixel_size + + y_offset * fb_line_len; #ifndef USE_CONVERT2FB if (!(next_frame = realloc(next_frame, in_width * in_height * fb_pixel_size))) { @@ -378,13 +358,8 @@ static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y) uint8_t *dest = next_frame + (in_width * y + x) * fb_pixel_size; int next = in_width * fb_pixel_size; #endif - int i; - for (i = 0; i < h; i++) { - fast_memcpy(dest, in, w * fb_pixel_size); - dest += next; - in += stride[0]; - } + memcpy_pic(dest, in, w * fb_pixel_size, h, next, stride[0]); return 0; } @@ -395,14 +370,11 @@ static void check_events(void) static void flip_page(void) { #ifndef USE_CONVERT2FB - int i, out_offset = 0, in_offset = 0; + int out_offset = 0, in_offset = 0; - for (i = 0; i < in_height; i++) { - fast_memcpy(center + out_offset, next_frame + in_offset, - in_width * fb_pixel_size); - out_offset += fb_line_len; - in_offset += in_width * fb_pixel_size; - } + memcpy_pic(center + out_offset, next_frame + in_offset, + in_width * fb_pixel_size, in_height, + fb_line_len, in_width * fb_pixel_size); #endif } @@ -430,6 +402,11 @@ static int control(uint32_t request, void *data) switch (request) { case VOCTRL_QUERY_FORMAT: return query_format(*((uint32_t*)data)); + case VOCTRL_UPDATE_SCREENINFO: + vo_screenwidth = fb_vinfo.xres; + vo_screenheight = fb_vinfo.yres; + aspect_save_screenres(vo_screenwidth, vo_screenheight); + return VO_TRUE; } return VO_NOTIMPL; } diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index d2f98a26fe..e663057beb 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -1393,6 +1393,8 @@ static int control(uint32_t request, void *data) if (!(eq_map[i].supportmask & (1 << use_yuv))) break; *eq_map[i].value = args->value; + if (strcmp(args->name, "gamma") == 0) + eq_rgamma = eq_ggamma = eq_bgamma = args->value; update_yuvconv(); return VO_TRUE; } diff --git a/mplayer.c b/mplayer.c index d4149395cf..6730bc3cbf 100644 --- a/mplayer.c +++ b/mplayer.c @@ -1632,7 +1632,9 @@ static void update_osd_msg(struct MPContext *mpctx) int len = get_time_length(mpctx); int percentage = -1; char percentage_text[10]; - int pts = get_current_time(mpctx); + char fractions_text[4]; + double fpts = get_current_time(mpctx); + int pts = fpts; if (mpctx->osd_show_percentage_until) percentage = get_percent_pos(mpctx); @@ -1642,15 +1644,41 @@ static void update_osd_msg(struct MPContext *mpctx) else percentage_text[0] = 0; + if (opts->osd_fractions == 1) { + //print fractions as sub-second timestamp + snprintf(fractions_text, sizeof(fractions_text), ".%02d", + (int)((fpts - pts) * 100)); + } else if (opts->osd_fractions == 2) { + /* Print fractions by estimating the frame count within the + * second. + * + * Rounding or cutting off numbers after the decimal point + * causes problems because of float's precision and movies + * whose first frame is not exactly at timestamp 0. Therefore, + * we add 0.2 and cut off at the decimal point, which proved + * to be good heuristic. + */ + double fps = mpctx->sh_video->fps; + if (fps <= 1 || fps > 99) + strcpy(fractions_text, ".??"); + else + snprintf(fractions_text, sizeof(fractions_text), ".%02d", + (int) ( (fpts - pts) * fps + 0.2 ) ); + } else { + //do not print fractions + fractions_text[0] = 0; + } + if (opts->osd_level == 3) snprintf(osd_text_timer, 63, - "%c %02d:%02d:%02d / %02d:%02d:%02d%s", + "%c %02d:%02d:%02d%s / %02d:%02d:%02d%s", mpctx->osd_function,pts/3600,(pts/60)%60,pts%60, - len/3600,(len/60)%60,len%60,percentage_text); + fractions_text, len/3600, (len/60)%60, len%60, + percentage_text); else - snprintf(osd_text_timer, 63, "%c %02d:%02d:%02d%s", + snprintf(osd_text_timer, 63, "%c %02d:%02d:%02d%s%s", mpctx->osd_function,pts/3600,(pts/60)%60, - pts%60,percentage_text); + pts%60, fractions_text, percentage_text); } else osd_text_timer[0]=0; diff --git a/options.h b/options.h index d5cc82c462..521d3a9751 100644 --- a/options.h +++ b/options.h @@ -31,6 +31,7 @@ typedef struct MPOpts { int osd_level; int osd_duration; + int osd_fractions; char *vobsub_name; int auto_quality; int benchmark; diff --git a/rpm/mplayer.spec b/rpm/mplayer.spec index 2acc2a6ed7..36eb2e7bd1 100644 --- a/rpm/mplayer.spec +++ b/rpm/mplayer.spec @@ -124,7 +124,6 @@ mv DOCS/man/zh DOCS/man/zh_CN --codecsdir=%{codecsdir} \ \ --enable-gui \ - --enable-largefiles \ --disable-termcap \ --disable-bitmap-font \ --enable-lirc \ @@ -167,7 +166,6 @@ mv -f mplayer gmplayer --libdir=%{_libdir} \ --codecsdir=%{codecsdir} \ \ - --enable-largefiles \ --disable-termcap \ --disable-bitmap-font \ --enable-lirc \ diff --git a/stream/cache2.c b/stream/cache2.c index 9e4bea35b4..e930d72255 100644 --- a/stream/cache2.c +++ b/stream/cache2.c @@ -167,6 +167,7 @@ static int cache_fill(cache_vars_t *s) int back,back2,newb,space,len,pos; off_t read=s->read_filepos; int read_chunk; + int wraparound_copy = 0; if(readmin_filepos || read>s->max_filepos){ // seek... @@ -208,8 +209,16 @@ static int cache_fill(cache_vars_t *s) // printf("### read=0x%X back=%d newb=%d space=%d pos=%d\n",read,back,newb,space,pos); - // reduce space if needed: - if(space>s->buffer_size-pos) space=s->buffer_size-pos; + // try to avoid wrap-around. If not possible due to sector size + // do an extra copy. + if(space>s->buffer_size-pos) { + if (s->buffer_size-pos >= s->sector_size) { + space=s->buffer_size-pos; + } else { + space = s->sector_size; + wraparound_copy = 1; + } + } // limit one-time block size read_chunk = s->stream->read_chunk; @@ -224,6 +233,13 @@ static int cache_fill(cache_vars_t *s) s->min_filepos=read-back; // avoid seeking-back to temp area... #endif + if (wraparound_copy) { + int to_copy; + len = stream_read_internal(s->stream, s->stream->buffer, space); + to_copy = FFMIN(len, s->buffer_size-pos); + memcpy(s->buffer + pos, s->stream->buffer, to_copy); + memcpy(s->buffer, s->stream->buffer + to_copy, len - to_copy); + } else len = stream_read_internal(s->stream, &s->buffer[pos], space); s->eof= !len; diff --git a/stream/network.c b/stream/network.c index c6776ac29a..b722023061 100644 --- a/stream/network.c +++ b/stream/network.c @@ -58,6 +58,7 @@ int network_bandwidth=0; int network_cookies_enabled = 0; char *network_useragent=NULL; char *network_referrer=NULL; +char **network_http_header_fields=NULL; /* IPv6 options */ int network_ipv4_only_proxy = 0; @@ -250,6 +251,12 @@ http_send_request( URL_t *url, off_t pos ) { if (network_cookies_enabled) cookies_set( http_hdr, server_url->hostname, server_url->url ); + if (network_http_header_fields) { + int i=0; + while (network_http_header_fields[i]) + http_set_field(http_hdr, network_http_header_fields[i++]); + } + http_set_field( http_hdr, "Connection: close"); if (proxy) http_add_basic_proxy_authentication(http_hdr, url->username, url->password); diff --git a/stream/network.h b/stream/network.h index 1c395acc49..33b668c516 100644 --- a/stream/network.h +++ b/stream/network.h @@ -61,6 +61,8 @@ typedef struct { extern const mime_struct_t mime_type_table[]; +extern char **network_http_header_fields; + streaming_ctrl_t *streaming_ctrl_new(void); int streaming_bufferize( streaming_ctrl_t *streaming_ctrl, char *buffer, int size); diff --git a/stream/stream.c b/stream/stream.c index 86dd61389e..9a3f25f8ab 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -28,6 +28,7 @@ #endif #include #include +#include #include "talloc.h" @@ -279,6 +280,7 @@ void stream_capture_do(stream_t *s) int stream_read_internal(stream_t *s, void *buf, int len) { + int orig_len = len; // we will retry even if we already reached EOF previously. switch(s->type){ case STREAMTYPE_STREAM: @@ -300,7 +302,26 @@ int stream_read_internal(stream_t *s, void *buf, int len) default: len= s->fill_buffer ? s->fill_buffer(s, buf, len) : 0; } - if(len<=0){ s->eof=1; return 0; } + if(len<=0){ + // dvdnav has some horrible hacks to "suspend" reads, + // we need to skip this code or seeks will hang. + if (!s->eof && s->type != STREAMTYPE_DVDNAV) { + // just in case this is an error e.g. due to network + // timeout reset and retry + // Seeking is used as a hack to make network streams + // reopen the connection, ideally they would implement + // e.g. a STREAM_CTRL_RECONNECT to do this + off_t pos = s->pos; + s->eof=1; + stream_reset(s); + stream_seek_internal(s, pos); + // make sure EOF is set to ensure no endless loops + s->eof=1; + return stream_read_internal(s, buf, orig_len); + } + s->eof=1; + return 0; + } // When reading succeeded we are obviously not at eof. // This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS s->eof=0; @@ -328,6 +349,7 @@ int stream_write_buffer(stream_t *s, unsigned char *buf, int len) { if(rd < 0) return -1; s->pos += rd; + assert(rd == len && "stream_write_buffer(): unexpected short write"); return rd; } diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c index b1c51e68e9..d5b12dc9f6 100644 --- a/stream/stream_dvdnav.c +++ b/stream/stream_dvdnav.c @@ -134,7 +134,7 @@ static dvdnav_priv_t * new_dvdnav_stream(char * filename) { mp_msg(MSGT_OPEN,MSGL_ERR,"stream_dvdnav, failed to set PGC positioning\n"); /* report the title?! */ if (dvdnav_get_title_string(priv->dvdnav,&title_str)==DVDNAV_STATUS_OK) { - mp_msg(MSGT_IDENTIFY, MSGL_INFO,"Title: '%s'\n",title_str); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_VOLUME_ID=%s\n", title_str); } //dvdnav_event_clear(priv); @@ -509,7 +509,9 @@ static void identify_chapters(dvdnav_t *nav, uint32_t title) if(parts) { t = duration / 90; mp_msg(MSGT_IDENTIFY, MSGL_V, "ID_DVD_TITLE_%d_LENGTH=%d.%03d\n", title, t / 1000, t % 1000); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLE_%d_CHAPTERS=%d\n", title, n); mp_msg(MSGT_IDENTIFY, MSGL_INFO, "TITLE %u, CHAPTERS: ", title); + for(i=0; itrack <= 0) { dvdnav_get_number_of_titles(priv->dvdnav, &titles); - for(i=0; idvdnav, i); } else @@ -600,6 +602,7 @@ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { mp_msg(MSGT_OPEN,MSGL_FATAL,"dvdnav_stream, couldn't select title %d, error '%s'\n", p->track, dvdnav_err_to_string(priv->dvdnav)); return STREAM_UNSUPPORTED; } + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_CURRENT_TITLE=%d\n", p->track); } else if (p->track == 0) { if(dvdnav_menu_call(priv->dvdnav, DVD_MENU_Root) != DVDNAV_STATUS_OK) dvdnav_menu_call(priv->dvdnav, DVD_MENU_Title); diff --git a/stream/stream_ffmpeg.c b/stream/stream_ffmpeg.c index e6705883fc..343381afb0 100644 --- a/stream/stream_ffmpeg.c +++ b/stream/stream_ffmpeg.c @@ -34,6 +34,7 @@ static int fill_buffer(stream_t *s, char *buffer, int max_len) static int write_buffer(stream_t *s, char *buffer, int len) { + /* url_write retries internally on short writes and EAGAIN */ int r = url_write(s->priv, buffer, len); return (r <= 0) ? -1 : r; } diff --git a/stream/stream_file.c b/stream/stream_file.c index 22be803fba..6d436cf6f5 100644 --- a/stream/stream_file.c +++ b/stream/stream_file.c @@ -56,8 +56,16 @@ static int fill_buffer(stream_t *s, char* buffer, int max_len){ } static int write_buffer(stream_t *s, char* buffer, int len) { - int r = write(s->fd,buffer,len); - return (r <= 0) ? -1 : r; + int r; + int wr = 0; + while (wr < len) { + r = write(s->fd,buffer,len); + if (r <= 0) + return -1; + wr += r; + buffer += r; + } + return len; } static int seek(stream_t *s,off_t newpos) { diff --git a/stream/stream_smb.c b/stream/stream_smb.c index 14791a2995..f176bc7518 100644 --- a/stream/stream_smb.c +++ b/stream/stream_smb.c @@ -100,8 +100,16 @@ static int fill_buffer(stream_t *s, char* buffer, int max_len){ } static int write_buffer(stream_t *s, char* buffer, int len) { - int r = smbc_write(s->fd,buffer,len); - return (r <= 0) ? -1 : r; + int r; + int wr = 0; + while (wr < len) { + r = smbc_write(s->fd,buffer,len); + if (r <= 0) + return -1; + wr += r; + buffer += r; + } + return len; } static void close_f(stream_t *s){ diff --git a/sub/spudec.c b/sub/spudec.c index f48d47fd2a..dbf956bb25 100644 --- a/sub/spudec.c +++ b/sub/spudec.c @@ -920,6 +920,10 @@ void spudec_draw_scaled(void *me, unsigned int dxs, unsigned int dys, void (*dra } if (spu->scaled_image) { unsigned int x, y; + // needs to be 0-initialized because draw_alpha draws always a + // multiple of 8 pixels. TODO: optimize + if (spu->scaled_width & 7) + memset(spu->scaled_image, 0, 2 * spu->scaled_image_size); if (spu->scaled_width <= 1 || spu->scaled_height <= 1) { goto nothing_to_do; }