Author: pebender
Date: Mon Jun 22 13:27:37 2009
New Revision: 5014
Added:
trunk/gar-minimyth/script/mediaplayers/mplayer-svn/files/MPlayer-vaapi_20090423.patch
Modified:
trunk/gar-minimyth/html/minimyth/document-changelog.txt
trunk/gar-minimyth/script/mediaplayers/mplayer-svn/Makefile
trunk/gar-minimyth/script/mediaplayers/mplayer-svn/checksums
Log:
- Added VAAPI support to MPlayer.
Modified: trunk/gar-minimyth/html/minimyth/document-changelog.txt
==============================================================================
--- trunk/gar-minimyth/html/minimyth/document-changelog.txt (original)
+++ trunk/gar-minimyth/html/minimyth/document-changelog.txt Mon Jun 22
13:27:37 2009
@@ -38,6 +38,7 @@
- Added VAAPI support to VLC, but it is currently rather broken.
- You will need to set ffmpeg-hw=1 in
/home/minimyth/.confic/vlc/vlcrc
in order to enable VAAPI.
+ - Added VAAPI support to MPlayer.
Modified LIRC
- Updated to pick up the improved iMON driver
Modified: trunk/gar-minimyth/script/mediaplayers/mplayer-svn/Makefile
==============================================================================
--- trunk/gar-minimyth/script/mediaplayers/mplayer-svn/Makefile (original)
+++ trunk/gar-minimyth/script/mediaplayers/mplayer-svn/Makefile Mon Jun 22
13:27:37 2009
@@ -4,7 +4,7 @@
MASTER_SITES = svn://svn.mplayerhq.hu/mplayer/trunk/
SOURCEPKG = lib/ffmpeg lib/libdvdnav lib/libdvdread
DISTFILES = $(DISTNAME).tar.bz2
-PATCHFILES = $(GARNAME)-gcc_4.4.0_hack.patch
+PATCHFILES = $(GARNAME)-gcc_4.4.0_hack.patch
$(GARNAME)-vaapi_20090423.patch
LICENSE = mplayer
mplayer_LICENSE_TEXT = $(WORKSRC)/Copyright
@@ -12,7 +12,7 @@
define BLURB
endef
-DEPENDS = lang/c lib/a52dec lib/alsa-lib lib/faad2 lib/ffmpeg
lib/fontconfig lib/freetype lib/libcdio lib/libdca lib/libdvdnav
lib/libdvdread lib/libjpeg lib/libmad lib/libmng lib/libpng lib/zlib
system/lirc X11/vdpau xorg/xorg
+DEPENDS = lang/c lib/a52dec lib/alsa-lib lib/faad2 lib/ffmpeg
lib/fontconfig lib/freetype lib/libcdio lib/libdca lib/libdvdnav
lib/libdvdread lib/libjpeg lib/libmad lib/libmng lib/libpng lib/zlib
system/lirc X11/libva X11/vdpau xorg/xorg
BUILD_DEPS = devel/yasm
CONFIGURE_SCRIPTS = $(WORKSRC)/configure
@@ -177,6 +177,7 @@
--disable-xmga \
--enable-xv \
--enable-xvmc \
+ --enable-vaapi \
--enable-vdpau \
--enable-vm \
--enable-xinerama \
Modified: trunk/gar-minimyth/script/mediaplayers/mplayer-svn/checksums
==============================================================================
--- trunk/gar-minimyth/script/mediaplayers/mplayer-svn/checksums
(original)
+++ trunk/gar-minimyth/script/mediaplayers/mplayer-svn/checksums Mon Jun
22
13:27:37 2009
@@ -1 +1,2 @@
4238ea4bd0a9cdee7d66f1a57f714184 download/MPlayer-gcc_4.4.0_hack.patch
+ff5df15d5af378068db9c2557f3904dc download/MPlayer-vaapi_20090423.patch
Added:
trunk/gar-minimyth/script/mediaplayers/mplayer-svn/files/MPlayer-vaapi_20090423.patch
==============================================================================
--- (empty file)
+++
trunk/gar-minimyth/script/mediaplayers/mplayer-svn/files/MPlayer-vaapi_20090423.patch
Mon Jun 22 13:27:37 2009
@@ -0,0 +1,1474 @@
+diff -Naur MPlayer-29374-old/cfg-common-opts.h
MPlayer-29374-new/cfg-common-opts.h
+--- MPlayer-29374-old/cfg-common-opts.h 2009-06-19 21:04:12.000000000
-0700
++++ MPlayer-29374-new/cfg-common-opts.h 2009-06-22 08:47:33.000000000
-0700
+@@ -227,6 +227,7 @@
+ // {"ac", &audio_codec, CONF_TYPE_STRING, 0, 0, 0, NULL},
+ {"ac", &audio_codec_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL},
+ {"vc", &video_codec_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL},
++ {"va", &video_hwaccel_name, CONF_TYPE_STRING, 0, 0, 0, NULL},
+
+ // postprocessing:
+ #ifdef CONFIG_LIBAVCODEC
+diff -Naur MPlayer-29374-old/codec-cfg.c MPlayer-29374-new/codec-cfg.c
+--- MPlayer-29374-old/codec-cfg.c 2009-06-19 21:04:12.000000000 -0700
++++ MPlayer-29374-new/codec-cfg.c 2009-06-22 08:47:33.000000000 -0700
+@@ -182,6 +182,13 @@
+ {"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2},
+ {"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2},
+
++ {"VAAPI_MPEG2", IMGFMT_VAAPI_MPEG2},
++ {"VAAPI_MPEG4", IMGFMT_VAAPI_MPEG4},
++ {"VAAPI_H263", IMGFMT_VAAPI_H263},
++ {"VAAPI_H264", IMGFMT_VAAPI_H264},
++ {"VAAPI_WMV3", IMGFMT_VAAPI_WMV3},
++ {"VAAPI_VC1", IMGFMT_VAAPI_VC1},
++
+ {"VDPAU_MPEG1",IMGFMT_VDPAU_MPEG1},
+ {"VDPAU_MPEG2",IMGFMT_VDPAU_MPEG2},
+ {"VDPAU_H264",IMGFMT_VDPAU_H264},
+diff -Naur MPlayer-29374-old/configure MPlayer-29374-new/configure
+--- MPlayer-29374-old/configure 2009-06-19 21:04:12.000000000 -0700
++++ MPlayer-29374-new/configure 2009-06-22 08:47:33.000000000 -0700
+@@ -354,6 +354,9 @@
+ --disable-muxer=MUXER disable specified FFmpeg muxer
+ --enable-muxer=MUXER enable specified FFmpeg muxer
+
++Hardware acceleration:
++ --enable-vaapi enable VA API acceleration [disable]
++
+ Video output:
+ --disable-vidix disable VIDIX [for x86 *nix]
+ --with-vidix-drivers[=*] list of VIDIX drivers to be compiled in
+@@ -537,6 +540,8 @@
+ _libavcodec_a=auto
+ _libamr_nb=auto
+ _libamr_wb=auto
++_libavhwaccels_all=$(sed -n 's/^[^#]*HWACCEL.*(.*,
*\(.*\)).*/\1_hwaccel/p' libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]')
++_libavhwaccels="$_libavhwaccels_all"
+ _libavdecoders_all=$(sed -n 's/^[^#]*DEC.*(.*, *\(.*\)).*/\1_decoder/p'
libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]')
+ _libavdecoders=$(echo $_libavdecoders_all | sed -e 's/
LIB[A-Z0-9_]*_DECODER//g' -e s/MPEG4AAC_DECODER//)
+ _libavencoders_all=$(sed -n 's/^[^#]*ENC.*(.*, *\(.*\)).*/\1_encoder/p'
libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]')
+@@ -560,6 +565,7 @@
+ _libavcodec_mpegaudio_hp=yes
+ _mencoder=yes
+ _mplayer=yes
++_vaapi=auto
+ _x11=auto
+ _xshape=auto
+ _xss=auto
+@@ -901,6 +907,8 @@
+ --disable-mplayer) _mplayer=no ;;
+ --enable-dynamic-plugins) _dynamic_plugins=yes ;;
+ --disable-dynamic-plugins) _dynamic_plugins=no ;;
++ --enable-vaapi) _vaapi=yes ;;
++ --disable-vaapi) _vaapi=no ;;
+ --enable-x11) _x11=yes ;;
+ --disable-x11) _x11=no ;;
+ --enable-xshape) _xshape=yes ;;
+@@ -4177,7 +4185,7 @@
+ _novomodules="x11 $_novomodules"
+ _res_comment="check if the dev(el) packages are installed"
+ # disable stuff that depends on X
+- _xv=no ; _xvmc=no ; _xinerama=no ; _vm=no ; _xf86keysym=no ; _vdpau=no
++ _xv=no ; _xvmc=no ; _xinerama=no ; _vm=no ; _xf86keysym=no ;
_vaapi=no ; _vdpau=no
+ fi
+ echores "$_x11"
+
+@@ -4288,6 +4296,29 @@
+ echores "$_xvmc"
+
+
++echocheck "VA API"
++if test "$_vaapi" = yes -o "$_vaapi" = auto; then
++ _vaapi=no
++ cat > $TMPC <<EOF
++#include <va/va_x11.h>
++int main(void) { (void) vaGetDisplay(0); return 0; }
++EOF
++ cc_check -lva-x11 && _vaapi=yes
++fi
++
++if test "$_vaapi" = yes ; then
++ def_vaapi='#define CONFIG_VAAPI 1'
++ libs_mencoder="$libs_mencoder -lva"
++ libs_mplayer="$libs_mplayer -lva-x11"
++ _vomodules="vaapi $_vomodules"
++else
++ def_vaapi='#define CONFIG_VAAPI 0'
++ _novomodules="vaapi $_novomodules"
++ _libavhwaccels=`echo $_libavhwaccels | sed -e "s/\(MPEG[124]\|H26[34]\|
WMV3\|VC1\)_VAAPI_HWACCEL//g"`
++fi
++echores "$_vaapi"
++
++
+ echocheck "VDPAU"
+ if test "$_vdpau" = auto ; then
+ _vdpau=no
+@@ -4305,7 +4336,7 @@
+ else
+ def_vdpau='#define CONFIG_VDPAU 0'
+ _novomodules="vdpau $_novomodules"
+- _libavdecoders=$(echo $_libavdecoders | sed -e s/MPEG_VDPAU_DECODER//
-e s/MPEG1_VDPAU_DECODER// -e s/H264_VDPAU_DECODER// -e
s/WMV3_VDPAU_DECODER// -e s/VC1_VDPAU_DECODER//)
++ _libavdecoders=$(echo $_libavdecoders | sed -e "s/\(MPEG\|MPEG[124]\|
H26[34]\|WMV3\|VC1\)_VDPAU_DECODER//g")
+ fi
+ echores "$_vdpau"
+
+@@ -8316,6 +8347,7 @@
+ TWOLAME=$_twolame
+ UNRAR_EXEC = $_unrar_exec
+ V4L2 = $_v4l2
++VAAPI = $_vaapi
+ VCD = $_vcd
+ VDPAU = $_vdpau
+ VESA = $_vesa
+@@ -8405,6 +8437,7 @@
+ CONFIG_POSTPROC = yes
+ # Prevent building libavcodec/imgresample.c with conflicting symbols
+ CONFIG_SWSCALE=yes
++CONFIG_VAAPI=$_vaapi
+ CONFIG_VDPAU=$_vdpau
+ CONFIG_XVMC=$_xvmc
+ CONFIG_ZLIB=$_zlib
+@@ -8413,6 +8446,7 @@
+ HAVE_W32THREADS = $_w32threads
+ HAVE_YASM = $_have_yasm
+
++$(echo $_libavhwaccels | tr '[a-z] ' '[A-Z]\n' |
sed 's/^/CONFIG_/;s/$/=yes/')
+ $(echo $_libavdecoders | tr '[a-z] ' '[A-Z]\n' |
sed 's/^/CONFIG_/;s/$/=yes/')
+ $(echo $_libavencoders | tr '[a-z] ' '[A-Z]\n' |
sed 's/^/CONFIG_/;s/$/=yes/')
+ $(echo $_libavparsers | tr '[a-z] ' '[A-Z]\n' |
sed 's/^/CONFIG_/;s/$/=yes/')
+@@ -8770,6 +8804,7 @@
+ $def_tdfxvid
+ $def_tga
+ $def_v4l2
++$def_vaapi
+ $def_vdpau
+ $def_vesa
+ $def_vidix
+@@ -8887,6 +8922,7 @@
+ $def_x264_lavc
+ $def_xvid_lavc
+
++$(ff_config_enable "$_libavhwaccels_all" "$_libavhwaccels")
+ $(ff_config_enable "$_libavdecoders_all" "$_libavdecoders")
+ $(ff_config_enable "$_libavencoders_all" "$_libavencoders")
+ $(ff_config_enable "$_libavparsers_all" "$_libavparsers")
+@@ -8895,13 +8931,6 @@
+ $(ff_config_enable "$_libavprotocols_all" "$_libavprotocols")
+ $(ff_config_enable "$_libavbsfs_all" "$_libavbsfs")
+
+-#define CONFIG_H263_VAAPI_HWACCEL 0
+-#define CONFIG_MPEG2_VAAPI_HWACCEL 0
+-#define CONFIG_MPEG4_VAAPI_HWACCEL 0
+-#define CONFIG_H264_VAAPI_HWACCEL 0
+-#define CONFIG_VC1_VAAPI_HWACCEL 0
+-#define CONFIG_WMV3_VAAPI_HWACCEL 0
+-
+ #endif /* MPLAYER_CONFIG_H */
+ EOF
+
+diff -Naur MPlayer-29374-old/etc/codecs.conf
MPlayer-29374-new/etc/codecs.conf
+--- MPlayer-29374-old/etc/codecs.conf 2009-06-19 21:04:11.000000000 -0700
++++ MPlayer-29374-new/etc/codecs.conf 2009-06-22 08:47:33.000000000 -0700
+@@ -164,6 +164,7 @@
+ fourcc LMP2 ; Lead mpeg2 in avi
+ driver ffmpeg
+ dll "mpeg2video"
++ out VAAPI_MPEG2
+ out YV12,I420,IYUV
+ out 422P,444P
+
+@@ -824,6 +825,7 @@
+ fourcc WMV3,wmv3
+ driver ffmpeg
+ dll wmv3
++ out VAAPI_WMV3
+ out YV12,I420,IYUV
+
+ videocodec ffwmv3vdpau
+@@ -841,6 +843,7 @@
+ fourcc vc-1,VC-1
+ driver ffmpeg
+ dll vc1
++ out VAAPI_VC1
+ out YV12,I420,IYUV
+
+ videocodec ffvc1vdpau
+@@ -862,6 +865,7 @@
+ format 0x10000005
+ driver ffmpeg
+ dll h264
++ out VAAPI_H264
+ out YV12,I420,IYUV
+
+ videocodec ffh264vdpau
+@@ -913,6 +917,7 @@
+ fourcc EPHV,SN40
+ driver ffmpeg
+ dll mpeg4 ;opendivx
++ out VAAPI_MPEG4
+ out YV12,I420,IYUV
+
+ videocodec ffwv1f
+@@ -1412,6 +1417,7 @@
+ fourcc VX1K ; Agora Labs VX1000S H263
+ driver ffmpeg
+ dll h263
++ out VAAPI_H263
+ out YV12,I420,IYUV
+
+ videocodec ffzygo
+diff -Naur MPlayer-29374-old/fmt-conversion.c
MPlayer-29374-new/fmt-conversion.c
+--- MPlayer-29374-old/fmt-conversion.c 2009-06-19 21:04:12.000000000 -0700
++++ MPlayer-29374-new/fmt-conversion.c 2009-06-22 08:47:33.000000000 -0700
+@@ -18,12 +18,14 @@
+
+ #include "mp_msg.h"
+ #include "libavutil/avutil.h"
++#include "libavcodec/avcodec.h"
+ #include "libmpcodecs/img_format.h"
+ #include "fmt-conversion.h"
+
+ static const struct {
+ int fmt;
+ enum PixelFormat pix_fmt;
++ enum CodecID codec_id;
+ } conversion_map[] = {
+ {IMGFMT_BGR32, PIX_FMT_RGB32},
+ {IMGFMT_BGR24, PIX_FMT_BGR24},
+@@ -71,6 +73,17 @@
+ {IMGFMT_VDPAU_H264, PIX_FMT_VDPAU_H264},
+ {IMGFMT_VDPAU_WMV3, PIX_FMT_VDPAU_WMV3},
+ {IMGFMT_VDPAU_VC1, PIX_FMT_VDPAU_VC1},
++
++ /* VA API formats */
++ {IMGFMT_VAAPI_MPEG2, PIX_FMT_VAAPI_VLD, CODEC_ID_MPEG2VIDEO},
++ {IMGFMT_VAAPI_MPEG2_IDCT,PIX_FMT_VAAPI_IDCT, CODEC_ID_MPEG2VIDEO},
++ {IMGFMT_VAAPI_MPEG2_MOCO,PIX_FMT_VAAPI_MOCO, CODEC_ID_MPEG2VIDEO},
++ {IMGFMT_VAAPI_MPEG4, PIX_FMT_VAAPI_VLD, CODEC_ID_MPEG4},
++ {IMGFMT_VAAPI_H263, PIX_FMT_VAAPI_VLD, CODEC_ID_H263},
++ {IMGFMT_VAAPI_H264, PIX_FMT_VAAPI_VLD, CODEC_ID_H264},
++ {IMGFMT_VAAPI_WMV3, PIX_FMT_VAAPI_VLD, CODEC_ID_WMV3},
++ {IMGFMT_VAAPI_VC1, PIX_FMT_VAAPI_VLD, CODEC_ID_VC1},
++
+ {0, PIX_FMT_NONE}
+ };
+
+@@ -87,12 +100,14 @@
+ return pix_fmt;
+ }
+
+-int pixfmt2imgfmt(enum PixelFormat pix_fmt)
++int pixfmt2imgfmt(enum PixelFormat pix_fmt, int codec_id)
+ {
+ int i;
+ int fmt;
+ for (i = 0; conversion_map[i].pix_fmt != PIX_FMT_NONE; i++)
+- if (conversion_map[i].pix_fmt == pix_fmt)
++ if (conversion_map[i].pix_fmt == pix_fmt &&
++ (conversion_map[i].codec_id == 0 ||
++ conversion_map[i].codec_id == codec_id))
+ break;
+ fmt = conversion_map[i].fmt;
+ if (!fmt)
+diff -Naur MPlayer-29374-old/fmt-conversion.h
MPlayer-29374-new/fmt-conversion.h
+--- MPlayer-29374-old/fmt-conversion.h 2009-06-19 21:04:12.000000000 -0700
++++ MPlayer-29374-new/fmt-conversion.h 2009-06-22 08:47:33.000000000 -0700
+@@ -4,6 +4,6 @@
+ #include "libavutil/avutil.h"
+
+ enum PixelFormat imgfmt2pixfmt(int fmt);
+-int pixfmt2imgfmt(enum PixelFormat pix_fmt);
++int pixfmt2imgfmt(enum PixelFormat pix_fmt, int codec_id);
+
+ #endif /* MPLAYER_FMT_CONVERSION_H */
+diff -Naur MPlayer-29374-old/gui/mplayer/gtk/opts.c
MPlayer-29374-new/gui/mplayer/gtk/opts.c
+--- MPlayer-29374-old/gui/mplayer/gtk/opts.c 2009-06-19 21:03:43.000000000
-0700
++++ MPlayer-29374-new/gui/mplayer/gtk/opts.c 2009-06-22 08:47:33.000000000
-0700
+@@ -63,9 +63,11 @@
+ GtkWidget * prEFontName;
+ GtkWidget * prEDVDDevice;
+ GtkWidget * prECDRomDevice;
++static GtkWidget * EVHW;
+ static GtkWidget * EVFM;
+ static GtkWidget * EAFM;
+
++static GtkWidget * CBVHW;
+ static GtkWidget * CBVFM;
+ static GtkWidget * CBAFM;
+ static GtkWidget * CBAudioEqualizer;
+@@ -353,6 +355,26 @@
+ // -- 5. page
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBNonInterlaved
),force_ni );
+ if ( index_mode == 1 ) gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(
CBIndex ),1 );
++
++ {
++ int i;
++ GList * Items = NULL;
++ char * name = NULL;
++
++ Items = g_list_append(Items, MSGTR_PREFERENCES_None);
++ for (i = 0; i < HWACCEL_COUNT; i++) {
++ const char *hwaccel_name = get_video_hwaccel_name(i);
++ if (!hwaccel_name)
++ continue;
++ Items = g_list_append(Items, hwaccel_name);
++ if (video_hwaccel_name && !gstrcmp(video_hwaccel_name,
get_video_hwaccel_short_name(i) ) ) name = hwaccel_name;
++ }
++ gtk_combo_set_popdown_strings(GTK_COMBO(CBVHW), Items);
++ g_list_free(Items);
++ if (name)
++ gtk_entry_set_text(GTK_ENTRY(EVHW), name);
++ }
++
+ {
+ int i;
+ GList * Items = NULL;
+@@ -599,6 +621,17 @@
+ if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBIndex ) ) )
index_mode=1;
+
+ {
++ int i;
++ const char *tmp = gtk_entry_get_text(GTK_ENTRY(EVHW));
++ for (i = 0; i < HWACCEL_COUNT; i++) {
++ if (!gstrcmp(tmp, get_video_hwaccel_name(i))) {
++ video_hwaccel_name = get_video_hwaccel_short_name(i);
++ break;
++ }
++ }
++ }
++
++ {
+ int i;
+ const char * tmp = gtk_entry_get_text( GTK_ENTRY( EVFM ) );
+ for( i=0;mpcodecs_vd_drivers[i];i++ )
+@@ -1198,6 +1231,20 @@
+
+ hbox5=AddHBox( vbox602,1 );
+
++ AddLabel( MSGTR_PREFERENCES_VideoHardwareAcceleration,hbox5 );
++
++ CBVHW=gtk_combo_new();
++ gtk_widget_set_name( CBVHW,"CBVHW" );
++ gtk_widget_show( CBVHW );
++ gtk_box_pack_start( GTK_BOX( hbox5 ),CBVHW,TRUE,TRUE,0 );
++
++ EVHW=GTK_COMBO( CBVHW )->entry;
++ gtk_widget_set_name( EVHW,"CEVHW" );
++ gtk_entry_set_editable( GTK_ENTRY( EVHW ),FALSE );
++ gtk_widget_show( EVHW );
++
++ hbox5=AddHBox( vbox602,1 );
++
+ AddLabel( MSGTR_PREFERENCES_VideoCodecFamily,hbox5 );
+
+ CBVFM=gtk_combo_new();
+diff -Naur MPlayer-29374-old/help/help_mp-en.h
MPlayer-29374-new/help/help_mp-en.h
+--- MPlayer-29374-old/help/help_mp-en.h 2009-06-19 21:04:06.000000000
-0700
++++ MPlayer-29374-new/help/help_mp-en.h 2009-06-22 08:47:33.000000000
-0700
+@@ -718,6 +718,7 @@
+ #define MSGTR_PREFERENCES_IDX "Rebuild index table, if needed"
+ #define MSGTR_PREFERENCES_VideoCodecFamily "Video codec family:"
+ #define MSGTR_PREFERENCES_AudioCodecFamily "Audio codec family:"
++#define MSGTR_PREFERENCES_VideoHardwareAcceleration "Video hardware
acceleration:"
+ #define MSGTR_PREFERENCES_FRAME_OSD_Level "OSD level"
+ #define MSGTR_PREFERENCES_FRAME_Subtitle "Subtitle"
+ #define MSGTR_PREFERENCES_FRAME_Font "Font"
+@@ -1662,6 +1663,7 @@
+ #define MSGTR_MPCODECS_UnexpectedInitVoError "[VD_FFMPEG] Unexpected
init_vo error.\n"
+ #define
MSGTR_MPCODECS_UnrecoverableErrorRenderBuffersNotTaken "[VD_FFMPEG]
Unrecoverable error, render buffers not taken.\n"
+ #define MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed "[VD_FFMPEG]
Only buffers allocated by vo_xvmc allowed.\n"
++#define MSGTR_MPCODECS_VAAPIAcceleratedCodec "[VD_FFMPEG] VA API
accelerated codec.\n"
+
+ // libmpcodecs/ve_lavc.c
+ #define MSGTR_MPCODECS_HighQualityEncodingSelected "[VE_LAVC] High
quality encoding selected (non-realtime)!\n"
+diff -Naur MPlayer-29374-old/libmpcodecs/dec_video.c
MPlayer-29374-new/libmpcodecs/dec_video.c
+--- MPlayer-29374-old/libmpcodecs/dec_video.c 2009-06-19
21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/dec_video.c 2009-06-22
08:47:48.000000000 -0700
+@@ -39,9 +39,47 @@
+ int field_dominance=-1;
+
+ int divx_quality=0;
++char *video_hwaccel_name=NULL;
+
+ vd_functions_t* mpvdec=NULL;
+
++int get_video_hwaccel(void)
++{
++ static int video_hwaccel = -1;
++ if (video_hwaccel < 0) {
++ video_hwaccel = HWACCEL_NONE;
++ if (video_hwaccel_name) {
++ if (!strcmp(video_hwaccel_name,"xvmc"))
++ video_hwaccel = HWACCEL_XVMC;
++ else if (!strcmp(video_hwaccel_name,"vaapi"))
++ video_hwaccel = HWACCEL_VAAPI;
++ else if (!strcmp(video_hwaccel_name,"vdpau"))
++ video_hwaccel = HWACCEL_VDPAU;
++ }
++ }
++ return video_hwaccel;
++}
++
++const char *get_video_hwaccel_name(int hwaccel)
++{
++ switch (hwaccel) {
++ case HWACCEL_XVMC: return "XvMC";
++ case HWACCEL_VAAPI: return "VA API";
++ case HWACCEL_VDPAU: return "VDPAU";
++ }
++ return NULL;
++}
++
++const char *get_video_hwaccel_short_name(int hwaccel)
++{
++ switch (hwaccel) {
++ case HWACCEL_XVMC: return "xvmc";
++ case HWACCEL_VAAPI: return "vaapi";
++ case HWACCEL_VDPAU: return "vdpau";
++ }
++ return NULL;
++}
++
+ int get_video_quality_max(sh_video_t *sh_video){
+ vf_instance_t* vf=sh_video->vfilter;
+ if(vf){
+diff -Naur MPlayer-29374-old/libmpcodecs/dec_video.h
MPlayer-29374-new/libmpcodecs/dec_video.h
+--- MPlayer-29374-old/libmpcodecs/dec_video.h 2009-06-19
21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/dec_video.h 2009-06-22
08:47:48.000000000 -0700
+@@ -3,6 +3,14 @@
+
+ #include "libmpdemux/stheader.h"
+
++enum {
++ HWACCEL_NONE = 0,
++ HWACCEL_XVMC,
++ HWACCEL_VAAPI,
++ HWACCEL_VDPAU,
++ HWACCEL_COUNT
++};
++
+ // dec_video.c:
+ void vfm_help(void);
+
+@@ -21,6 +29,11 @@
+ void resync_video_stream(sh_video_t *sh_video);
+ int get_current_video_decoder_lag(sh_video_t *sh_video);
+
++int get_video_hwaccel(void);
++const char *get_video_hwaccel_name(int hwaccel);
++const char *get_video_hwaccel_short_name(int hwaccel);
++
+ extern int divx_quality;
++extern char *video_hwaccel_name;
+
+ #endif /* MPLAYER_DEC_VIDEO_H */
+diff -Naur MPlayer-29374-old/libmpcodecs/img_format.c
MPlayer-29374-new/libmpcodecs/img_format.c
+--- MPlayer-29374-old/libmpcodecs/img_format.c 2009-06-19
21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/img_format.c 2009-06-22
08:47:48.000000000 -0700
+@@ -67,6 +67,14 @@
+ case IMGFMT_ZRMJPEGIB: return "Zoran MJPEG bottom field first";
+ case IMGFMT_XVMC_MOCO_MPEG2: return "MPEG1/2 Motion Compensation";
+ case IMGFMT_XVMC_IDCT_MPEG2: return "MPEG1/2 Motion Compensation and
IDCT";
++ case IMGFMT_VAAPI_MPEG2: return "MPEG-2 VA API Acceleration";
++ case IMGFMT_VAAPI_MPEG2_IDCT: return "MPEG-2 VA API Acceleration
(Motion Compensation and IDCT)";
++ case IMGFMT_VAAPI_MPEG2_MOCO: return "MPEG-2 VA API Acceleration
(Motion Compensation)";
++ case IMGFMT_VAAPI_MPEG4: return "MPEG-4 VA API Acceleration";
++ case IMGFMT_VAAPI_H263: return "H.263 VA API Acceleration";
++ case IMGFMT_VAAPI_H264: return "H.264 VA API Acceleration";
++ case IMGFMT_VAAPI_WMV3: return "WMV3 VA API Acceleration";
++ case IMGFMT_VAAPI_VC1: return "VC-1 VA API Acceleration";
+ case IMGFMT_VDPAU_MPEG1: return "MPEG1 VDPAU acceleration";
+ case IMGFMT_VDPAU_MPEG2: return "MPEG2 VDPAU acceleration";
+ case IMGFMT_VDPAU_H264: return "H.264 VDPAU acceleration";
+diff -Naur MPlayer-29374-old/libmpcodecs/img_format.h
MPlayer-29374-new/libmpcodecs/img_format.h
+--- MPlayer-29374-old/libmpcodecs/img_format.h 2009-06-19
21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/img_format.h 2009-06-22
08:47:48.000000000 -0700
+@@ -107,6 +107,26 @@
+ #define IMGFMT_XVMC_MOCO_MPEG2 (IMGFMT_XVMC|0x02)
+ #define IMGFMT_XVMC_IDCT_MPEG2 (IMGFMT_XVMC|0x82)
+
++/* VA API Formats */
++
++#define IMGFMT_VAAPI 0x56410000 /* 'VA'00 */
++#define IMGFMT_VAAPI_MASK 0xFFFF0000
++#define IMGFMT_IS_VAAPI(fmt) (((fmt) & IMGFMT_VAAPI_MASK) ==
IMGFMT_VAAPI)
++#define IMGFMT_VAAPI_CODEC_MASK 0x000000F0
++#define IMGFMT_VAAPI_CODEC(fmt) ((fmt) & IMGFMT_VAAPI_CODEC_MASK)
++#define IMGFMT_VAAPI_CODEC_MPEG2 (0x10)
++#define IMGFMT_VAAPI_CODEC_MPEG4 (0x20)
++#define IMGFMT_VAAPI_CODEC_H264 (0x30)
++#define IMGFMT_VAAPI_CODEC_VC1 (0x40)
++#define IMGFMT_VAAPI_MPEG2 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG2)
++#define IMGFMT_VAAPI_MPEG2_IDCT (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG2|
1)
++#define IMGFMT_VAAPI_MPEG2_MOCO (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG2|
2)
++#define IMGFMT_VAAPI_MPEG4 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG4)
++#define IMGFMT_VAAPI_H263 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG4|
1)
++#define IMGFMT_VAAPI_H264 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_H264)
++#define IMGFMT_VAAPI_VC1 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_VC1)
++#define IMGFMT_VAAPI_WMV3 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_VC1|1)
++
+ // VDPAU specific format.
+ #define IMGFMT_VDPAU 0x1DC80000
+ #define IMGFMT_VDPAU_MASK 0xFFFF0000
+diff -Naur MPlayer-29374-old/libmpcodecs/mp_image.h
MPlayer-29374-new/libmpcodecs/mp_image.h
+--- MPlayer-29374-old/libmpcodecs/mp_image.h 2009-06-19 21:03:33.000000000
-0700
++++ MPlayer-29374-new/libmpcodecs/mp_image.h 2009-06-22 08:47:48.000000000
-0700
+@@ -111,6 +111,7 @@
+ // compressed formats
+ if(out_fmt == IMGFMT_MPEGPES ||
+ out_fmt == IMGFMT_ZRMJPEGNI || out_fmt == IMGFMT_ZRMJPEGIT ||
out_fmt == IMGFMT_ZRMJPEGIB ||
++ IMGFMT_IS_VAAPI(out_fmt) ||
+ IMGFMT_IS_VDPAU(out_fmt) || IMGFMT_IS_XVMC(out_fmt)){
+ mpi->bpp=0;
+ return;
+diff -Naur MPlayer-29374-old/libmpcodecs/vd.c
MPlayer-29374-new/libmpcodecs/vd.c
+--- MPlayer-29374-old/libmpcodecs/vd.c 2009-06-19 21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/vd.c 2009-06-22 08:47:48.000000000 -0700
+@@ -345,3 +345,12 @@
+ if(vf->draw_slice)
+ vf->draw_slice(vf,src,stride,w,h,x,y);
+ }
++
++void *mpcodecs_get_hwaccel_context(sh_video_t *sh)
++{
++ void *ctx = NULL;
++ struct vf_instance_s *vf = sh->vfilter;
++ if (vf->control(vf, VFCTRL_GET_HWACCEL_CONTEXT, &ctx) == CONTROL_TRUE)
++ return ctx;
++ return NULL;
++}
+diff -Naur MPlayer-29374-old/libmpcodecs/vd_ffmpeg.c
MPlayer-29374-new/libmpcodecs/vd_ffmpeg.c
+--- MPlayer-29374-old/libmpcodecs/vd_ffmpeg.c 2009-06-19
21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/vd_ffmpeg.c 2009-06-22
08:47:48.000000000 -0700
+@@ -14,6 +14,7 @@
+ #include "fmt-conversion.h"
+
+ #include "vd_internal.h"
++#include "dec_video.h"
+
+ static vd_info_t info = {
+ "FFmpeg's libavcodec codec family",
+@@ -202,8 +203,8 @@
+
+ static void set_format_params(struct AVCodecContext *avctx, enum
PixelFormat fmt){
+ int imgfmt;
+- imgfmt = pixfmt2imgfmt(fmt);
+- if (IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) {
++ imgfmt = pixfmt2imgfmt(fmt, avctx->codec_id);
++ if (IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt) ||
IMGFMT_IS_VAAPI(imgfmt)) {
+ sh_video_t *sh = avctx->opaque;
+ vd_ffmpeg_ctx *ctx = sh->context;
+ ctx->do_dr1 = 1;
+@@ -258,6 +259,12 @@
+ avctx = ctx->avctx;
+ avctx->opaque = sh;
+
++#if CONFIG_VAAPI
++ if(get_video_hwaccel() == HWACCEL_VAAPI){
++ mp_msg(MSGT_DECVIDEO, MSGL_INFO,
MSGTR_MPCODECS_VAAPIAcceleratedCodec);
++ avctx->get_format = get_format;
++ }
++#endif /* CONFIG_VAAPI */
+ #if CONFIG_VDPAU
+ if(lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU){
+ avctx->get_format = get_format;
+@@ -451,7 +458,7 @@
+ AVFrame *src, int offset[4],
+ int y, int type, int height){
+ sh_video_t *sh = s->opaque;
+- uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0],
src->data[1] + offset[1], src->data[2] + offset[2]};
++ uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0],
src->data[1] + offset[1], src->data[2] + offset[2], src->data[3] +
offset[3]};
+ #if 0
+ int start=0, i;
+ int width= s->width;
+@@ -517,9 +524,10 @@
+ sh->disp_w = width;
+ sh->disp_h = height;
+ ctx->pix_fmt = pix_fmt;
+- ctx->best_csp = pixfmt2imgfmt(pix_fmt);
++ ctx->best_csp = pixfmt2imgfmt(pix_fmt, avctx->codec_id);
+ if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h,
ctx->best_csp))
+ return -1;
++ avctx->hwaccel_context = mpcodecs_get_hwaccel_context(sh);
+ ctx->vo_initialized = 1;
+ }
+ return 0;
+@@ -572,7 +580,9 @@
+ return avctx->get_buffer(avctx, pic);
+ }
+
+- if (IMGFMT_IS_XVMC(ctx->best_csp) || IMGFMT_IS_VDPAU(ctx->best_csp)) {
++ if (IMGFMT_IS_XVMC(ctx->best_csp) ||
++ IMGFMT_IS_VAAPI(ctx->best_csp) ||
++ IMGFMT_IS_VDPAU(ctx->best_csp)) {
+ type = MP_IMGTYPE_NUMBERED | (0xffff << 16);
+ } else
+ if (!pic->buffer_hints) {
+@@ -603,6 +613,11 @@
+ avctx->draw_horiz_band= draw_slice;
+ } else
+ avctx->draw_horiz_band= NULL;
++#if CONFIG_VAAPI
++ if(IMGFMT_IS_VAAPI(mpi->imgfmt)) {
++ avctx->draw_horiz_band= NULL;
++ }
++#endif
+ if(IMGFMT_IS_VDPAU(mpi->imgfmt)) {
+ avctx->draw_horiz_band= draw_slice;
+ }
+@@ -637,6 +652,7 @@
+ pic->data[0]= mpi->planes[0];
+ pic->data[1]= mpi->planes[1];
+ pic->data[2]= mpi->planes[2];
++ pic->data[3]= mpi->planes[3];
+
+ #if 0
+ assert(mpi->width >= ((width +align)&(~align)));
+@@ -661,6 +677,7 @@
+ pic->linesize[0]= mpi->stride[0];
+ pic->linesize[1]= mpi->stride[1];
+ pic->linesize[2]= mpi->stride[2];
++ pic->linesize[3]= mpi->stride[3];
+
+ pic->opaque = mpi;
+ //printf("%X\n", (int)mpi->planes[0]);
+@@ -882,9 +899,11 @@
+ mpi->planes[0]=pic->data[0];
+ mpi->planes[1]=pic->data[1];
+ mpi->planes[2]=pic->data[2];
++ mpi->planes[3]=pic->data[3];
+ mpi->stride[0]=pic->linesize[0];
+ mpi->stride[1]=pic->linesize[1];
+ mpi->stride[2]=pic->linesize[2];
++ mpi->stride[3]=pic->linesize[3];
+ }
+
+ if (!mpi->planes[0])
+@@ -914,24 +933,62 @@
+ return mpi;
+ }
+
+-#if CONFIG_XVMC || CONFIG_VDPAU
++#if CONFIG_XVMC || CONFIG_VAAPI || CONFIG_VDPAU
++static inline int is_hwaccel_format(int imgfmt)
++{
++ switch (get_video_hwaccel()) {
++ case HWACCEL_VAAPI: return IMGFMT_IS_VAAPI(imgfmt) != 0;
++ case HWACCEL_VDPAU: return IMGFMT_IS_VDPAU(imgfmt) != 0;
++ case HWACCEL_XVMC: return IMGFMT_IS_XVMC(imgfmt) != 0;
++ }
++ return 0;
++}
++
++static int query_format(sh_video_t *sh, int fmt)
++{
++ vd_ffmpeg_ctx * const ctx = sh->context;
++ AVCodecContext * const avctx = ctx->avctx;
++ int r, width, height;
++ /* XXX: some codecs have not initialized width and height yet at
++ this point, so we are faking the dimensions so that init_vo()
++ doesn't fail because of 0x0 size */
++ if ((width = avctx->width) == 0)
++ avctx->width = 64;
++ if ((height = avctx->height) == 0)
++ avctx->height = 64;
++ r = init_vo(sh, fmt);
++ avctx->width = width;
++ avctx->height = height;
++ return r;
++}
++
+ static enum PixelFormat get_format(struct AVCodecContext *avctx,
+- const enum PixelFormat *fmt){
+- enum PixelFormat selected_format;
++ const enum PixelFormat *fmt){
++ enum PixelFormat selected_format = PIX_FMT_NONE;
+ int imgfmt;
+ sh_video_t *sh = avctx->opaque;
+- int i;
++ int i, try_hwaccel;
+
+- for(i=0;fmt[i]!=PIX_FMT_NONE;i++){
+- imgfmt = pixfmt2imgfmt(fmt[i]);
+- if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue;
+- mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i);
+- if(init_vo(sh, fmt[i]) >= 0) {
+- break;
++ for (try_hwaccel = 1; try_hwaccel >= 0; --try_hwaccel) {
++ for (i = 0; fmt[i] != PIX_FMT_NONE; i++){
++ imgfmt = pixfmt2imgfmt(fmt[i], avctx->codec_id);
++ if ((try_hwaccel ^ is_hwaccel_format(imgfmt)) != 0)
++ continue;
++ mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt,
i);
++ if (query_format(sh, fmt[i]) >= 0) {
++ if (try_hwaccel) {
++ /* don't allow format conversion for HW acceleration
*/
++ if (sh->codec->outfmt[sh->outfmtidx] != imgfmt)
++ continue;
++ }
++ selected_format = fmt[i];
++ break;
++ }
+ }
++ if (selected_format != PIX_FMT_NONE)
++ break;
+ }
+- selected_format = fmt[i];
+ set_format_params(avctx, selected_format);
+ return selected_format;
+ }
+-#endif /* CONFIG_XVMC || CONFIG_VDPAU */
++#endif /* CONFIG_XVMC || CONFIG_VAAPI || CONFIG_VDPAU */
+diff -Naur MPlayer-29374-old/libmpcodecs/vd.h
MPlayer-29374-new/libmpcodecs/vd.h
+--- MPlayer-29374-old/libmpcodecs/vd.h 2009-06-19 21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/vd.h 2009-06-22 08:47:48.000000000 -0700
+@@ -34,6 +34,7 @@
+ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int
preferred_outfmt);
+ mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int
mp_imgflag, int w, int h);
+ void mpcodecs_draw_slice(sh_video_t *sh, unsigned char** src, int*
stride, int w,int h, int x, int y);
++void *mpcodecs_get_hwaccel_context(sh_video_t *sh);
+
+ #define VDFLAGS_DROPFRAME 3
+
+diff -Naur MPlayer-29374-old/libmpcodecs/vf.h
MPlayer-29374-new/libmpcodecs/vf.h
+--- MPlayer-29374-old/libmpcodecs/vf.h 2009-06-19 21:03:33.000000000 -0700
++++ MPlayer-29374-new/libmpcodecs/vf.h 2009-06-22 08:47:48.000000000 -0700
+@@ -89,6 +89,7 @@
+ #define VFCTRL_GET_PTS 17 /* Return last pts value that reached
vf_vo*/
+ #define VFCTRL_SET_DEINTERLACE 18 /* Set deinterlacing status */
+ #define VFCTRL_GET_DEINTERLACE 19 /* Get deinterlacing status */
++#define VFCTRL_GET_HWACCEL_CONTEXT 20 /* Get HW accelerator context */
+
+ #include "vfcap.h"
+
+diff -Naur MPlayer-29374-old/libmpcodecs/vf_vo.c
MPlayer-29374-new/libmpcodecs/vf_vo.c
+--- MPlayer-29374-old/libmpcodecs/vf_vo.c 2009-06-19 21:03:33.000000000
-0700
++++ MPlayer-29374-new/libmpcodecs/vf_vo.c 2009-06-22 08:47:48.000000000
-0700
+@@ -151,6 +151,12 @@
+ *(double *)data = vf->priv->pts;
+ return CONTROL_TRUE;
+ }
++ case VFCTRL_GET_HWACCEL_CONTEXT:
++ {
++ if(!video_out) return CONTROL_FALSE; // vo not configured?
++ return(video_out->control(VOCTRL_GET_HWACCEL_CONTEXT, data)
++ == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
++ }
+ }
+ // return video_out->control(request,data);
+ return CONTROL_UNKNOWN;
+@@ -170,6 +176,7 @@
+ if(!vo_config_count) return;
+ // GET_IMAGE is required for hardware-accelerated formats
+ if(vo_directrendering ||
++ IMGFMT_IS_VAAPI(mpi->imgfmt) ||
+ IMGFMT_IS_XVMC(mpi->imgfmt) || IMGFMT_IS_VDPAU(mpi->imgfmt))
+ video_out->control(VOCTRL_GET_IMAGE,mpi);
+ }
+diff -Naur MPlayer-29374-old/libvo/video_out.c
MPlayer-29374-new/libvo/video_out.c
+--- MPlayer-29374-old/libvo/video_out.c 2009-06-19 21:03:47.000000000
-0700
++++ MPlayer-29374-new/libvo/video_out.c 2009-06-22 08:47:48.000000000
-0700
+@@ -132,6 +132,7 @@
+ extern vo_functions_t video_out_quartz;
+ extern vo_functions_t video_out_pnm;
+ extern vo_functions_t video_out_md5sum;
++extern vo_functions_t video_out_vaapi;
+
+ const vo_functions_t* const video_out_drivers[] =
+ {
+@@ -274,6 +275,9 @@
+ #ifdef CONFIG_MD5SUM
+ &video_out_md5sum,
+ #endif
++#if CONFIG_VAAPI
++ &video_out_vaapi,
++#endif
+ NULL
+ };
+
+diff -Naur MPlayer-29374-old/libvo/video_out.h
MPlayer-29374-new/libvo/video_out.h
+--- MPlayer-29374-old/libvo/video_out.h 2009-06-19 21:03:47.000000000
-0700
++++ MPlayer-29374-new/libvo/video_out.h 2009-06-22 08:47:48.000000000
-0700
+@@ -97,6 +97,10 @@
+ int w,h;
+ } mp_win_t;
+
++// Return current HW acceleration context
++// void *get_hwaccel_context(void);
++#define VOCTRL_GET_HWACCEL_CONTEXT 33
++
+ #define VO_TRUE 1
+ #define VO_FALSE 0
+ #define VO_ERROR -1
+diff -Naur MPlayer-29374-old/libvo/vo_vaapi.c
MPlayer-29374-new/libvo/vo_vaapi.c
+--- MPlayer-29374-old/libvo/vo_vaapi.c 1969-12-31 16:00:00.000000000 -0800
++++ MPlayer-29374-new/libvo/vo_vaapi.c 2009-06-22 08:47:48.000000000 -0700
+@@ -0,0 +1,656 @@
++/*
++ * VA API output module
++ *
++ * Copyright (C) 2008-2009 Splitted-Desktop Systems
++ *
++ * This file is part of MPlayer.
++ *
++ * MPlayer is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * MPlayer is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License along
++ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ */
++
++#include "config.h"
++#include "mp_msg.h"
++#include "help_mp.h"
++#include "video_out.h"
++#include "video_out_internal.h"
++#include "x11_common.h"
++#include "libavcodec/vaapi.h"
++#include "gui/interface.h"
++
++#include <va/va_x11.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++static vo_info_t info = {
++ "VA API with X11",
++ "vaapi",
++ "Gwenole Beauchesne <[email protected]>",
++ ""
++};
++
++LIBVO_EXTERN(vaapi)
++
++/* Numbers of video surfaces */
++#define NUM_VIDEO_SURFACES_MPEG2 3 /* 1 decode frame, up to 2 reference
*/
++#define NUM_VIDEO_SURFACES_MPEG4 3 /* 1 decode frame, up to 2 reference
*/
++#define NUM_VIDEO_SURFACES_H264 17 /* 1 decode frame, up to 16
references */
++#define NUM_VIDEO_SURFACES_VC1 3 /* 1 decode frame, up to 2 references
*/
++
++static int g_is_paused;
++static uint32_t g_image_width;
++static uint32_t g_image_height;
++static uint32_t g_image_format;
++static struct vo_rect g_output_rect;
++static VASurfaceID g_output_surface;
++
++static struct vaapi_context *va_context;
++static VAProfile *va_profiles;
++static int va_num_profiles;
++static VAEntrypoint *va_entrypoints;
++static int va_num_entrypoints;
++static VASurfaceID *va_surface_ids;
++static int va_num_surfaces;
++static VAImageFormat *va_image_formats;
++static int va_num_image_formats;
++
++static int check_status(VAStatus status, const char *msg)
++{
++ if (status != VA_STATUS_SUCCESS) {
++ mp_msg(MSGT_VO, MSGL_ERR, "[vo_vaapi] %s: %s\n", msg,
vaErrorStr(status));
++ return 0;
++ }
++ return 1;
++}
++
++static const char *string_of_VAImageFormat(VAImageFormat *imgfmt)
++{
++ static char str[5];
++ str[0] = imgfmt->fourcc;
++ str[1] = imgfmt->fourcc >> 8;
++ str[2] = imgfmt->fourcc >> 16;
++ str[3] = imgfmt->fourcc >> 24;
++ str[4] = '\0';
++ return str;
++}
++
++static const char *string_of_VAProfile(VAProfile profile)
++{
++ switch (profile) {
++#define PROFILE(profile) \
++ case VAProfile##profile: return "VAProfile" #profile
++ PROFILE(MPEG2Simple);
++ PROFILE(MPEG2Main);
++ PROFILE(MPEG4Simple);
++ PROFILE(MPEG4AdvancedSimple);
++ PROFILE(MPEG4Main);
++ PROFILE(H264Baseline);
++ PROFILE(H264Main);
++ PROFILE(H264High);
++ PROFILE(VC1Simple);
++ PROFILE(VC1Main);
++ PROFILE(VC1Advanced);
++#undef PROFILE
++ }
++ return "<unknown>";
++}
++
++static const char *string_of_VAEntrypoint(VAEntrypoint entrypoint)
++{
++ switch (entrypoint) {
++#define ENTRYPOINT(entrypoint) \
++ case VAEntrypoint##entrypoint: return "VAEntrypoint" #entrypoint
++ ENTRYPOINT(VLD);
++ ENTRYPOINT(IZZ);
++ ENTRYPOINT(IDCT);
++ ENTRYPOINT(MoComp);
++ ENTRYPOINT(Deblocking);
++#undef ENTRYPOINT
++ }
++ return "<unknown>";
++}
++
++static int has_profile(VAProfile profile)
++{
++ if (va_profiles && va_num_profiles > 0) {
++ int i;
++ for (i = 0; i < va_num_profiles; i++) {
++ if (va_profiles[i] == profile)
++ return 1;
++ }
++ }
++ return 0;
++}
++
++static int VAProfile_from_imgfmt(uint32_t format)
++{
++ static const int mpeg2_profiles[] =
++ { VAProfileMPEG2Main, VAProfileMPEG2Simple, -1 };
++ static const int mpeg4_profiles[] =
++ { VAProfileMPEG4Main, VAProfileMPEG4AdvancedSimple,
VAProfileMPEG4Simple, -1 };
++ static const int h264_profiles[] =
++ { VAProfileH264High, VAProfileH264Main, VAProfileH264Baseline, -1
};
++ static const int wmv3_profiles[] =
++ { VAProfileVC1Main, VAProfileVC1Simple, -1 };
++ static const int vc1_profiles[] =
++ { VAProfileVC1Advanced, -1 };
++
++ const int *profiles = NULL;
++ switch (IMGFMT_VAAPI_CODEC(format)) {
++ case IMGFMT_VAAPI_CODEC_MPEG2:
++ profiles = mpeg2_profiles;
++ break;
++ case IMGFMT_VAAPI_CODEC_MPEG4:
++ profiles = mpeg4_profiles;
++ break;
++ case IMGFMT_VAAPI_CODEC_H264:
++ profiles = h264_profiles;
++ break;
++ case IMGFMT_VAAPI_CODEC_VC1:
++ switch (format) {
++ case IMGFMT_VAAPI_WMV3:
++ profiles = wmv3_profiles;
++ break;
++ case IMGFMT_VAAPI_VC1:
++ profiles = vc1_profiles;
++ break;
++ }
++ break;
++ }
++
++ if (profiles) {
++ for (int i = 0; profiles[i] != -1; i++) {
++ if (has_profile(profiles[i]))
++ return profiles[i];
++ }
++ }
++ return -1;
++}
++
++static int has_entrypoint(VAEntrypoint entrypoint)
++{
++ if (va_entrypoints && va_num_entrypoints > 0) {
++ int i;
++ for (i = 0; i < va_num_entrypoints; i++) {
++ if (va_entrypoints[i] == entrypoint)
++ return 1;
++ }
++ }
++ return 0;
++}
++
++static int VAEntrypoint_from_imgfmt(uint32_t format)
++{
++ int entrypoint = 0;
++ switch (format) {
++ case IMGFMT_VAAPI_MPEG2:
++ case IMGFMT_VAAPI_MPEG4:
++ case IMGFMT_VAAPI_H263:
++ case IMGFMT_VAAPI_H264:
++ case IMGFMT_VAAPI_WMV3:
++ case IMGFMT_VAAPI_VC1:
++ entrypoint = VAEntrypointVLD;
++ break;
++ case IMGFMT_VAAPI_MPEG2_IDCT:
++ entrypoint = VAEntrypointIDCT;
++ break;
++ case IMGFMT_VAAPI_MPEG2_MOCO:
++ entrypoint = VAEntrypointMoComp;
++ break;
++ }
++
++ if (entrypoint)
++ return has_entrypoint(entrypoint);
++
++ return -1;
++}
++
++static void resize(void)
++{
++ struct vo_rect src;
++
++ calc_src_dst_rects(g_image_width, g_image_height,
++ &src, &g_output_rect, NULL, NULL);
++
++ vo_x11_clearwindow(mDisplay, vo_window);
++ flip_page();
++}
++
++static int preinit(const char *arg)
++{
++ VAStatus status;
++ int va_major_version, va_minor_version;
++ int i, max_image_formats, max_profiles;
++
++ if (!vo_init())
++ return -1;
++
++ va_context = calloc(1, sizeof(*va_context));
++ if (va_context == NULL)
++ return -1;
++
++ va_context->display = vaGetDisplay(mDisplay);
++ if (va_context->display == NULL)
++ return -1;
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): VA display %p\n",
va_context->display);
++
++ status = vaInitialize(va_context->display, &va_major_version,
&va_minor_version);
++ if (!check_status(status, "vaInitialize()"))
++ return -1;
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): VA API
version %d.%d\n",
++ va_major_version, va_minor_version);
++
++ max_image_formats = vaMaxNumImageFormats(va_context->display);
++ va_image_formats = calloc(max_image_formats,
sizeof(*va_image_formats));
++ if (va_image_formats == NULL)
++ return -1;
++ status = vaQueryImageFormats(va_context->display, va_image_formats,
&va_num_image_formats);
++ if (!check_status(status, "vaQueryImageFormats()"))
++ return -1;
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): %d image formats
available\n",
++ va_num_image_formats);
++ for (i = 0; i < va_num_image_formats; i++)
++ mp_msg(MSGT_VO, MSGL_DBG2, " %s\n",
string_of_VAImageFormat(&va_image_formats[i]));
++
++ max_profiles = vaMaxNumProfiles(va_context->display);
++ va_profiles = calloc(max_profiles, sizeof(*va_profiles));
++ if (va_profiles == NULL)
++ return -1;
++ status = vaQueryConfigProfiles(va_context->display, va_profiles,
&va_num_profiles);
++ if (!check_status(status, "vaQueryConfigProfiles()"))
++ return -1;
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): %d profiles
available\n",
++ va_num_profiles);
++ for (i = 0; i < va_num_profiles; i++)
++ mp_msg(MSGT_VO, MSGL_DBG2, " %s\n",
string_of_VAProfile(va_profiles[i]));
++
++ return 0;
++}
++
++static void free_video_specific(void)
++{
++ if (va_context && va_context->context_id) {
++ vaDestroyContext(va_context->display, va_context->context_id);
++ va_context->context_id = 0;
++ }
++
++ if (va_surface_ids) {
++ vaDestroySurfaces(va_context->display, va_surface_ids,
va_num_surfaces);
++ free(va_surface_ids);
++ va_surface_ids = NULL;
++ }
++
++ if (va_context && va_context->config_id) {
++ vaDestroyConfig(va_context->display, va_context->config_id);
++ va_context->config_id = 0;
++ }
++
++ if (va_entrypoints) {
++ free(va_entrypoints);
++ va_entrypoints = NULL;
++ }
++}
++
++static void uninit(void)
++{
++ free_video_specific();
++
++ if (va_profiles) {
++ free(va_profiles);
++ va_profiles = NULL;
++ }
++
++ if (va_image_formats) {
++ free(va_image_formats);
++ va_image_formats = NULL;
++ }
++
++ if (va_context && va_context->display) {
++ vaTerminate(va_context->display);
++ va_context->display = NULL;
++ }
++
++ if (va_context) {
++ free(va_context);
++ va_context = NULL;
++ }
++
++#ifdef CONFIG_XF86VM
++ vo_vm_close();
++#endif
++ vo_x11_uninit();
++}
++
++static int config_x11(uint32_t width, uint32_t height,
++ uint32_t display_width, uint32_t display_height,
++ uint32_t flags, char *title)
++{
++ XVisualInfo visualInfo;
++ XSetWindowAttributes xswa;
++ unsigned long xswa_mask;
++ XWindowAttributes wattr;
++ int depth;
++
++#ifdef CONFIG_GUI
++ if (use_gui)
++ guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize
our window
++ else
++#endif
++ {
++#ifdef CONFIG_XF86VM
++ if (flags & VOFLAG_MODESWITCHING)
++ vo_vm_switch();
++ else
++#endif
++ XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay),
&wattr);
++ depth = wattr.depth;
++ if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
++ depth = 24;
++ XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor,
&visualInfo);
++
++ vo_x11_create_vo_window(&visualInfo,
++ vo_dx, vo_dy, display_width,
display_height,
++ flags, CopyFromParent, "vaapi", title);
++
++ xswa_mask = CWBorderPixel | CWBackPixel;
++ xswa.border_pixel = 0;
++ xswa.background_pixel = 0;
++ XChangeWindowAttributes(mDisplay, vo_window, xswa_mask, &xswa);
++
++#ifdef CONFIG_XF86VM
++ if (flags & VOFLAG_MODESWITCHING) {
++ /* Grab the mouse pointer in our window */
++ if (vo_grabpointer)
++ XGrabPointer(mDisplay, vo_window, True, 0,
++ GrabModeAsync, GrabModeAsync,
++ vo_window, None, CurrentTime);
++ XSetInputFocus(mDisplay, vo_window, RevertToNone,
CurrentTime);
++ }
++#endif
++ }
++
++ if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0)
++ vo_fs = VO_TRUE;
++ return 0;
++}
++
++static int config_vaapi(uint32_t width, uint32_t height, uint32_t format)
++{
++ VAConfigAttrib attrib;
++ VAStatus status;
++ int i, profile, entrypoint, max_entrypoints;
++
++ /* Check profile */
++ profile = VAProfile_from_imgfmt(format);
++ if (profile < 0)
++ return -1;
++
++ /* Check entry-point (only VLD for now) */
++ max_entrypoints = vaMaxNumEntrypoints(va_context->display);
++ va_entrypoints = calloc(max_entrypoints, sizeof(*va_entrypoints));
++ if (va_entrypoints == NULL)
++ return -1;
++
++ status = vaQueryConfigEntrypoints(va_context->display, profile,
++ va_entrypoints,
&va_num_entrypoints);
++ if (!check_status(status, "vaQueryConfigEntrypoints()"))
++ return -1;
++
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] config_vaapi(%s): %d
entrypoints available\n",
++ string_of_VAProfile(profile), va_num_entrypoints);
++ for (i = 0; i < va_num_entrypoints; i++)
++ mp_msg(MSGT_VO, MSGL_DBG2, " %s\n",
string_of_VAEntrypoint(va_entrypoints[i]));
++
++ entrypoint = VAEntrypoint_from_imgfmt(format);
++ if (entrypoint != VAEntrypointVLD)
++ return -1;
++
++ /* Check chroma format (only 4:2:0 for now) */
++ attrib.type = VAConfigAttribRTFormat;
++ status = vaGetConfigAttributes(va_context->display, profile,
entrypoint, &attrib, 1);
++ if (!check_status(status, "vaGetConfigAttributes()"))
++ return -1;
++ if ((attrib.value & VA_RT_FORMAT_YUV420) == 0)
++ return -1;
++
++ /* Create a configuration for the decode pipeline */
++ status = vaCreateConfig(va_context->display, profile, entrypoint,
&attrib, 1, &va_context->config_id);
++ if (!check_status(status, "vaCreateConfig()"))
++ return -1;
++
++ /* Create video surfaces */
++ switch (IMGFMT_VAAPI_CODEC(format)) {
++ case IMGFMT_VAAPI_CODEC_MPEG2:
++ va_num_surfaces = NUM_VIDEO_SURFACES_MPEG2;
++ break;
++ case IMGFMT_VAAPI_CODEC_MPEG4:
++ va_num_surfaces = NUM_VIDEO_SURFACES_MPEG4;
++ break;
++ case IMGFMT_VAAPI_CODEC_H264:
++ va_num_surfaces = NUM_VIDEO_SURFACES_H264;
++ break;
++ case IMGFMT_VAAPI_CODEC_VC1:
++ va_num_surfaces = NUM_VIDEO_SURFACES_VC1;
++ break;
++ default:
++ va_num_surfaces = 0;
++ break;
++ }
++ if (va_num_surfaces == 0)
++ return -1;
++ va_surface_ids = calloc(va_num_surfaces, sizeof(*va_surface_ids));
++ if (va_surface_ids == NULL)
++ return -1;
++ status = vaCreateSurfaces(va_context->display, width, height,
VA_RT_FORMAT_YUV420,
++ va_num_surfaces, va_surface_ids);
++ if (!check_status(status, "vaCreateSurfaces()"))
++ return -1;
++
++ /* Create a context for the decode pipeline */
++ status = vaCreateContext(va_context->display, va_context->config_id,
++ width, height, VA_PROGRESSIVE,
++ va_surface_ids, va_num_surfaces,
++ &va_context->context_id);
++ if (!check_status(status, "vaCreateContext()"))
++ return -1;
++
++ return 0;
++}
++
++static int config(uint32_t width, uint32_t height,
++ uint32_t display_width, uint32_t display_height,
++ uint32_t flags, char *title, uint32_t format)
++{
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] config(): size %dx%d, display
size %dx%d, flags %x, title '%s', format %x (%s)\n",
++ width, height, display_width, display_height, flags, title,
format, vo_format_name(format));
++
++ free_video_specific();
++
++ if (config_x11(width, height, display_width, display_height, flags,
title) < 0)
++ return -1;
++
++ if (config_vaapi(width, height, format) < 0)
++ return -1;
++
++ g_is_paused = 0;
++ g_image_width = width;
++ g_image_height = height;
++ g_image_format = format;
++ resize();
++ return 0;
++}
++
++static int query_format(uint32_t format)
++{
++ const int default_caps = (VFCAP_CSP_SUPPORTED |
++ VFCAP_CSP_SUPPORTED_BY_HW |
++ VFCAP_HWSCALE_UP |
++ VFCAP_HWSCALE_DOWN);
++
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] query_format(): format %x
(%s)\n",
++ format, vo_format_name(format));
++
++ switch (format) {
++ case IMGFMT_VAAPI_MPEG2:
++ case IMGFMT_VAAPI_MPEG4:
++ case IMGFMT_VAAPI_H263:
++ case IMGFMT_VAAPI_H264:
++ case IMGFMT_VAAPI_WMV3:
++ case IMGFMT_VAAPI_VC1:
++ return default_caps;
++ }
++ return 0;
++}
++
++static void put_surface(VASurfaceID surface)
++{
++ VAStatus status;
++
++ if (surface == 0)
++ return;
++
++ status = vaSyncSurface(va_context->display, va_context->context_id,
++ surface);
++ if (!check_status(status, "vaSyncSurface() for decode"))
++ return;
++
++ status = vaPutSurface(va_context->display,
++ surface,
++ vo_window,
++ 0, 0, g_image_width, g_image_height,
++ g_output_rect.left,
++ g_output_rect.top,
++ g_output_rect.width,
++ g_output_rect.height,
++ NULL, 0,
++ VA_FRAME_PICTURE);
++ if (!check_status(status, "vaPutSurface()"))
++ return;
++
++ status = vaSyncSurface(va_context->display, va_context->context_id,
++ surface);
++ if (!check_status(status, "vaSyncSurface() for display"))
++ return;
++}
++
++static int draw_slice(uint8_t * image[], int stride[],
++ int w, int h, int x, int y)
++{
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] draw_slice(): location
(%d,%d), size %dx%d\n", x, y, w, h);
++
++ return VO_TRUE;
++}
++
++static int draw_frame(uint8_t * src[])
++{
++ mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_X11_DrawFrameCalled);
++
++ return -1;
++}
++
++static void draw_osd(void)
++{
++ // XXX: not implemented
++}
++
++static void flip_page(void)
++{
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] flip_page()\n");
++
++ put_surface(g_output_surface);
++}
++
++static uint32_t get_image(mp_image_t *mpi)
++{
++ VASurfaceID surface;
++
++ if (mpi->type != MP_IMGTYPE_NUMBERED)
++ return VO_FALSE;
++
++ if (!IMGFMT_IS_VAAPI(g_image_format))
++ return VO_FALSE;
++
++ surface = va_surface_ids[mpi->number];
++ if (surface == 0)
++ return VO_FALSE;
++
++ mpi->flags |= MP_IMGFLAG_DIRECT;
++ mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = mpi->stride[3] = 0;
++ mpi->planes[0] = mpi->planes[1] = mpi->planes[2] = mpi->planes[3] =
NULL;
++ mpi->planes[0] = mpi->planes[3] = (char *)(uintptr_t)surface;
++ mpi->num_planes = 1;
++
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] get_image(): surface
0x%08x\n", surface);
++
++ return VO_TRUE;
++}
++
++static uint32_t draw_image(mp_image_t *mpi)
++{
++ VASurfaceID surface = (uintptr_t)mpi->planes[3];
++
++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] draw_image(): surface
0x%08x\n", surface);
++
++ g_output_surface = surface;
++ return VO_TRUE;
++}
++
++static void check_events(void)
++{
++ int events = vo_x11_check_events(mDisplay);
++
++ if (events & VO_EVENT_RESIZE)
++ resize();
++
++ if ((events & (VO_EVENT_EXPOSE|VO_EVENT_RESIZE)) && g_is_paused)
++ put_surface(g_output_surface);
++}
++
++static int control(uint32_t request, void *data, ...)
++{
++ switch (request) {
++ case VOCTRL_PAUSE:
++ return (g_is_paused = 1);
++ case VOCTRL_RESUME:
++ return (g_is_paused = 0);
++ case VOCTRL_QUERY_FORMAT:
++ return query_format(*((uint32_t *)data));
++ case VOCTRL_GET_IMAGE:
++ return get_image(data);
++ case VOCTRL_DRAW_IMAGE:
++ return draw_image(data);
++ case VOCTRL_GUISUPPORT:
++ return VO_TRUE;
++ case VOCTRL_BORDER:
++ vo_x11_border();
++ resize();
++ return VO_TRUE;
++ case VOCTRL_FULLSCREEN:
++ vo_x11_fullscreen();
++ resize();
++ return VO_TRUE;
++ case VOCTRL_ONTOP:
++ vo_x11_ontop();
++ return VO_TRUE;
++ case VOCTRL_GET_PANSCAN:
++ return VO_TRUE;
++ case VOCTRL_SET_PANSCAN:
++ resize();
++ return VO_TRUE;
++ case VOCTRL_GET_HWACCEL_CONTEXT:
++ *((void **)data) = va_context;
++ return VO_TRUE;
++ }
++ return VO_NOTIMPL;
++}
+diff -Naur MPlayer-29374-old/Makefile MPlayer-29374-new/Makefile
+--- MPlayer-29374-old/Makefile 2009-06-19 21:04:12.000000000 -0700
++++ MPlayer-29374-new/Makefile 2009-06-22 08:47:33.000000000 -0700
+@@ -620,6 +620,7 @@
+ SRCS_MPLAYER-$(TGA) += libvo/vo_tga.c
+ SRCS_MPLAYER-$(V4L2) += libvo/vo_v4l2.c
+ SRCS_MPLAYER-$(V4L2) += libao2/ao_v4l2.c
++SRCS_MPLAYER-$(VAAPI) += libvo/vo_vaapi.c
+ SRCS_MPLAYER-$(VDPAU) += libvo/vo_vdpau.c
+ SRCS_MPLAYER-$(VESA) += libvo/gtf.c libvo/vo_vesa.c
libvo/vesa_lvo.c
+ SRCS_MPLAYER-$(VIDIX) += libvo/vo_cvidix.c \
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"minimyth-commits" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/minimyth-commits?hl=en
-~----------~----~----~----~------~----~------~--~---