[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[459] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-27 09:45:03
|
Revision: 459 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=459&view=rev Author: nickols_k Date: 2012-11-27 09:44:49 +0000 (Tue, 27 Nov 2012) Log Message: ----------- performance patch: use methods instead of switch case constructions in ctrl(). IMHO, with c++ ctrl method should in most cases empty. It useful for some rare exotic cases but not for common methods. Also convert vobsub_vidix into class Vidix_System Modified Paths: -------------- mplayerxp/libvo/Makefile mplayerxp/libvo/dri_vo.h mplayerxp/libvo/video_out.cpp mplayerxp/libvo/video_out.h mplayerxp/libvo/video_out_internal.h mplayerxp/libvo/vo_fbdev.cpp mplayerxp/libvo/vo_null.cpp mplayerxp/libvo/vo_opengl.cpp mplayerxp/libvo/vo_sdl.cpp mplayerxp/libvo/vo_vesa.cpp mplayerxp/libvo/vo_x11.cpp mplayerxp/libvo/vo_xv.cpp mplayerxp/postproc/vf_vo.cpp Added Paths: ----------- mplayerxp/libvo/vidix_system.cpp mplayerxp/libvo/vidix_system.h Removed Paths: ------------- mplayerxp/libvo/vosub_vidix.cpp mplayerxp/libvo/vosub_vidix.h Modified: mplayerxp/libvo/Makefile =================================================================== --- mplayerxp/libvo/Makefile 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/Makefile 2012-11-27 09:44:49 UTC (rev 459) @@ -23,7 +23,7 @@ CXXSRCS += vo_vesa.cpp endif ifeq ($(CONFIG_VIDIX),yes) -CXXSRCS += vosub_vidix.cpp +CXXSRCS += vidix_system.cpp endif CFLAGS = $(OPTFLAGS) -I. -I.. -DMPG12PLAY -Wall -W Modified: mplayerxp/libvo/dri_vo.h =================================================================== --- mplayerxp/libvo/dri_vo.h 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/dri_vo.h 2012-11-27 09:44:49 UTC (rev 459) @@ -40,9 +40,4 @@ unsigned idx; /**< app->drv:specify number of surface (0 default for single buffering) */ uint8_t* planes[4]; /**< drv->app:specify planes (include alpha channel) */ }dri_surface_t; - -enum { - DRI_GET_SURFACE_CAPS=16, /**< Query capabilties of surfaces. We assume that all surfaces have the same capabilities */ - DRI_GET_SURFACE =17, /**< Query surface by index */ -}; #endif Modified: mplayerxp/libvo/video_out.cpp =================================================================== --- mplayerxp/libvo/video_out.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/video_out.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -278,12 +278,12 @@ if(!priv.dri.bpp) priv.dri.has_dri=0; /*unknown fourcc*/ if(priv.dri.has_dri) { - priv.vo_iface->ctrl(VOCTRL_GET_NUM_FRAMES,&priv.dri.num_xp_frames); + priv.dri.num_xp_frames=priv.vo_iface->get_num_frames(); priv.dri.num_xp_frames=std::min(priv.dri.num_xp_frames,unsigned(MAX_DRI_BUFFERS)); for(i=0;i<priv.dri.num_xp_frames;i++) { priv.dri.surf[i].idx=i; - priv.vo_iface->ctrl(DRI_GET_SURFACE,&priv.dri.surf[i]); + priv.vo_iface->get_surface(&priv.dri.surf[i]); } } } @@ -380,7 +380,7 @@ { vo_priv_t& priv=*static_cast<vo_priv_t*>(vo->vo_priv); priv.dri.has_dri = 1; - priv.vo_iface->ctrl(DRI_GET_SURFACE_CAPS,&priv.dri.cap); + priv.vo_iface->get_surface_caps(&priv.dri.cap); dri_config(vo,priv.dri.cap.fourcc); /* ugly workaround of swapped BGR-fourccs. Should be removed in the future */ if(!priv.dri.has_dri) @@ -430,13 +430,12 @@ retval = priv.vo_iface->configure(w,h,d_w,d_h,fullscreen,title,dest_fourcc); priv.srcFourcc=format; if(retval == MPXP_Ok) { - int dri_retv; - dri_retv = priv.vo_iface->ctrl(DRI_GET_SURFACE_CAPS,&priv.dri.cap); + priv.vo_iface->get_surface_caps(&priv.dri.cap); priv.image_format = format; priv.image_width = w; priv.image_height = h; ps_tune(vo,priv.image_width,priv.org_height); - if(dri_retv == MPXP_True) dri_reconfig(vo,0); + dri_reconfig(vo,0); MSG_V("dri_vo_caps: driver does %s support DRI\n",priv.dri.has_dri?"":"not"); MSG_V("dri_vo_caps: caps=%08X fourcc=%08X(%s) x,y,w,h(%u %u %u %u)\n" "dri_vo_caps: width_height(%u %u) strides(%u %u %u %u) priv.dri.bpp=%u\n" @@ -470,7 +469,7 @@ qfourcc.fourcc = *fourcc; qfourcc.w = src_w; qfourcc.h = src_h; - if(priv.vo_iface->ctrl(VOCTRL_QUERY_FORMAT,&qfourcc)==MPXP_False) + if(priv.vo_iface->query_format(&qfourcc)==MPXP_False) qfourcc.flags=VOCAP_NA; MSG_V("dri_vo: request for %s fourcc: %i\n",vo_format_name(*fourcc),qfourcc.flags); dri_forced_fourcc = *fourcc; @@ -516,6 +515,12 @@ pthread_mutex_unlock(&priv.surfaces_mutex); } +MPXP_Rc __FASTCALL__ vo_get_surface_caps(vo_data_t* vo,dri_surface_cap_t*caps) { + vo_priv_t& priv=*static_cast<vo_priv_t*>(vo->vo_priv); + priv.vo_iface->get_surface_caps(caps); + return MPXP_Ok; +} + MPXP_Rc __FASTCALL__ vo_get_surface(vo_data_t*vo,mp_image_t* mpi) { vo_priv_t& priv=*static_cast<vo_priv_t*>(vo->vo_priv); Modified: mplayerxp/libvo/video_out.h =================================================================== --- mplayerxp/libvo/video_out.h 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/video_out.h 2012-11-27 09:44:49 UTC (rev 459) @@ -19,6 +19,7 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> +#include "dri_vo.h" #include "font_load.h" #include "sub.h" #include "libmpsub/subreader.h" @@ -35,7 +36,6 @@ enum { VOCTRL_UNUSED0=1, - VOCTRL_QUERY_FORMAT=2, /**< Query direct FOURCC support. Takes a pointer to uint32_t fourcc */ VOCTRL_RESET=3, /**< Signal a device reset seek */ VOCTRL_FULLSCREEN=4, /**< Signal to switch window to fullscreen. Must affect window only (not surfaces) */ VOCTRL_UNUSED=5, @@ -43,7 +43,6 @@ VOCTRL_RESUME=7, /**< Notification to start/resume playback after pause (for dxr3) */ VOCTRL_UNUSED2=8, VOCTRL_CHECK_EVENTS=9, /**< Notification that user performs key pressing. Takes (vo_resize_t *)&vrest as arg. Must return at least VO_EVENT_RESIZE */ - VOCTRL_GET_NUM_FRAMES=10, /**< Query total number of allocated frames (multibuffering) */ VOCTRL_UNUSED3=12, VOCTRL_FLUSH_PAGES=13, /**< Flush pages of frame from RAM into video memory (bus mastering) */ VOCTRL_UNUSED4=14, @@ -225,6 +224,7 @@ extern void vo_lock_surfaces(vo_data_t* vo); extern void vo_unlock_surfaces(vo_data_t* vo); extern MPXP_Rc __FASTCALL__ vo_get_surface(vo_data_t* vo,mp_image_t* mpi); +extern MPXP_Rc __FASTCALL__ vo_get_surface_caps(vo_data_t* vo,dri_surface_cap_t*); extern int vo_check_events(vo_data_t* vo); extern unsigned __FASTCALL__ vo_get_num_frames(vo_data_t* vo); Modified: mplayerxp/libvo/video_out_internal.h =================================================================== --- mplayerxp/libvo/video_out_internal.h 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/video_out_internal.h 2012-11-27 09:44:49 UTC (rev 459) @@ -22,6 +22,7 @@ */ #ifndef __VIDEO_OUT_INTERNAL_H #define __VIDEO_OUT_INTERNAL_H 1 +#include "dri_vo.h" class VO_Interface : public Opaque { public: @@ -35,7 +36,13 @@ unsigned flags, const char *title, uint32_t format) = 0; - virtual void select_frame(unsigned idx) = 0; + virtual MPXP_Rc select_frame(unsigned idx) = 0; + + virtual MPXP_Rc query_format(vo_query_fourcc_t* format) const = 0; + virtual void get_surface_caps(dri_surface_cap_t *caps) const = 0; + virtual void get_surface(dri_surface_t *surf) const = 0; + virtual unsigned get_num_frames() const = 0; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data) = 0; }; Copied: mplayerxp/libvo/vidix_system.cpp (from rev 458, mplayerxp/libvo/vosub_vidix.cpp) =================================================================== --- mplayerxp/libvo/vidix_system.cpp (rev 0) +++ mplayerxp/libvo/vidix_system.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -0,0 +1,506 @@ +#include "mp_config.h" +#include "osdep/mplib.h" +using namespace mpxp; +/* vosub_vidix.c + * + * Copyright (C) Nickols_K <nic...@ma...> - 2002 + * Copyright (C) Alex Beregszaszi + * + * You can redistribute this file under terms and conditions + * of GNU General Public licence v2. + * + * This file contains vidix interface to any mplayer's VO plugin. + * (Partly based on vesa_lvo.c from mplayer's package) + */ +#include <errno.h> +#include <inttypes.h> +#include <sys/ioctl.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include "mplayerxp.h" + +#include "vidix_system.h" +#include "osdep/fastmemcpy.h" +#include "osd.h" +#include "sub.h" +#include "xmpcore/mp_image.h" +#include "vo_msg.h" + +using namespace vidix; + +#ifndef HAVE_MLOCK +/* stubs */ +int mlock(const any_t*addr,size_t len) { return ENOSYS; } +int munlock(const any_t*addr,size_t len) { return ENOSYS; } +#endif + +Vidix_System::Vidix_System(const char *drvname) + :vidix(*new(zeromem) Vidix(drvname?drvname[0]==':'?&drvname[1]:drvname[0]?drvname:NULL:NULL, + TYPE_OUTPUT, + mp_conf.verbose)) +{ + int err; + MSG_DBG2("vidix_preinit(%s) was called\n",drvname); + if(vidix.version() != VIDIX_VERSION) { + MSG_FATAL("You have wrong version of VIDIX library\n"); + exit_player("Vidix"); + } + if(vidix.is_error()) { + MSG_FATAL("Couldn't find working VIDIX driver\n"); + exit_player("Vidix"); + } + if((err=vidix.get_capabilities()) != 0) { + MSG_FATAL("Couldn't get capability: %s\n",strerror(err)); + exit_player("Vidix"); + } + else MSG_V("Driver capability: %X\n",vidix.cap.flags); + MSG_V("Using: %s by %s\n",vidix.cap.name,vidix.cap.author); +} + +Vidix_System::~Vidix_System() { + size_t i; + MSG_DBG2("vidix_term() was called\n"); + stop(); + if(vo_conf.use_bm) { + for(i=0;i<vo_conf.xp_buffs;i++) { + if(bm_locked) munlock(bm_buffs[i],vidix.playback.frame_size); + delete bm_buffs[i]; + bm_buffs[i]=NULL; + } + if(bm_slow_frames) + MSG_WARN("from %u frames %u were copied through memcpy()\n" + ,bm_total_frames,bm_slow_frames); + } +} + +int Vidix_System::start() +{ + int err; + if((err=vidix.playback_on())!=0) { + MSG_FATAL("Can't start playback: %s\n",strerror(err)); + return -1; + } + video_on=1; + if (vidix.cap.flags & FLAG_EQUALIZER) { + MSG_V("vo_gamma_brightness=%i\n" + "vo_gamma_saturation=%i\n" + "vo_gamma_contrast=%i\n" + "vo_gamma_hue=%i\n" + "vo_gamma_red_intensity=%i\n" + "vo_gamma_green_intensity=%i\n" + "vo_gamma_blue_intensity=%i\n" + ,vo_conf.gamma.brightness + ,vo_conf.gamma.saturation + ,vo_conf.gamma.contrast + ,vo_conf.gamma.hue + ,vo_conf.gamma.red_intensity + ,vo_conf.gamma.green_intensity + ,vo_conf.gamma.blue_intensity); + /* To use full set of priv.video_eq.cap */ + if(vidix.get_eq() == 0) { + vidix.video_eq.brightness = vo_conf.gamma.brightness; + vidix.video_eq.saturation = vo_conf.gamma.saturation; + vidix.video_eq.contrast = vo_conf.gamma.contrast; + vidix.video_eq.hue = vo_conf.gamma.hue; + vidix.video_eq.red_intensity = vo_conf.gamma.red_intensity; + vidix.video_eq.green_intensity = vo_conf.gamma.green_intensity; + vidix.video_eq.blue_intensity = vo_conf.gamma.blue_intensity; + vidix.video_eq.flags = VEQ_FLG_ITU_R_BT_601; + vidix.set_eq(); + } + } + return 0; +} + +int Vidix_System::stop() +{ + int err; + if((err=vidix.playback_off())!=0) { + MSG_ERR("Can't stop playback: %s\n",strerror(err)); + return -1; + } + video_on=0; + return 0; +} + +void Vidix_System::copy_dma(unsigned idx,int sync_mode) +{ + int err,i; + int dma_busy; + MSG_DBG2("vidix_copy_dma(%u,%i) was called\n",idx,sync_mode); + bm_total_frames++; + if(idx > vidix.playback.num_frames-1 && vidix.playback.num_frames>1) { + MSG_FATAL("\nDetected internal error!\n" + "Request to copy %u frame into %u array\n",idx,vidix.playback.num_frames); + return; + } + dma_busy = vidix.dma_status(); + i=5; + if(!sync_mode) + while(dma_busy && i) { + yield_timeslice(); + dma_busy = vidix.dma_status(); + i--; + } + if(!dma_busy || sync_mode) { + vidix.dma.src = bm_buffs[idx]; + vidix.dma.dest_offset = vidix.playback.offsets[vidix.playback.num_frames>1?idx:0]; + vidix.dma.size = vidix.playback.frame_size; + vidix.dma.flags = sync_mode?BM_DMA_SYNC:BM_DMA_ASYNC; + if(bm_locked) vidix.dma.flags |= BM_DMA_FIXED_BUFFS; + vidix.dma.idx = idx; + err=vidix.dma_copy_frame(); + if(err) { + /* We can switch back to DR here but for now exit */ + MSG_FATAL("\nerror '%s' occured during DMA transfer\n" + "Please send BUGREPORT to developers!!!\n",strerror(err)); + exit(EXIT_FAILURE); /* it's OK vidix_term will be called */ + } +#if 0 + printf("frame is DMA copied\n"); +#endif + } else { + memcpy(reinterpret_cast<any_t*>(reinterpret_cast<long>(vidix.playback.dga_addr)+vidix.playback.offsets[0]),bm_buffs[idx],vidix.playback.frame_size); + MSG_WARN("DMA frame is memcpy() copied\n"); + bm_slow_frames++; + } +} + +MPXP_Rc Vidix_System::select_frame(unsigned idx) +{ + MSG_DBG2("vidix_select_frame() was called\n"); + if(vo_conf.use_bm == 1) copy_dma(idx,0); + else vidix.frame_select(idx); + return MPXP_Ok; +} + +MPXP_Rc Vidix_System::query_fourcc(vo_query_fourcc_t* format) +{ + MSG_DBG2("query_format was called: %x (%s)\n",format->fourcc,vo_format_name(format->fourcc)); + vidix.fourcc.fourcc = format->fourcc; + vidix.fourcc.srcw = format->w; + vidix.fourcc.srch = format->h; + vidix.query_fourcc(); + format->flags = (vidix.fourcc.depth==VID_DEPTH_NONE)? VOCAP_NA : VOCAP_SUPPORTED|VOCAP_HWSCALER; + return MPXP_Ok; +} + +MPXP_Rc Vidix_System::grkey_support() const +{ + MPXP_Rc retval = (vidix.fourcc.flags & VID_CAP_COLORKEY)?MPXP_Ok:MPXP_False; + MSG_DBG2("query_grkey_support: %i\n",retval); + return retval; +} + +int Vidix_System::grkey_get(vidix_grkey_t *gr_key) const +{ + int rc; + rc=vidix.get_gr_keys(); + *gr_key=vidix.grkey; + return rc; +} + +int Vidix_System::grkey_set(const vidix_grkey_t *gr_key) +{ + vidix.grkey=*gr_key; + return vidix.set_gr_keys(); +} + +int Vidix_System::get_video_eq(vo_videq_t *info) const +{ + int rval; + if(!video_on) return EPERM; + rval =vidix.get_eq(); + if(!rval) { + if(!strcmp(info->name,VO_EC_BRIGHTNESS) && vidix.video_eq.cap&VEQ_CAP_BRIGHTNESS) + info->value=vidix.video_eq.brightness; + else if(!strcmp(info->name,VO_EC_SATURATION) && vidix.video_eq.cap&VEQ_CAP_SATURATION) + info->value=vidix.video_eq.saturation; + else if(!strcmp(info->name,VO_EC_CONTRAST) && vidix.video_eq.cap&VEQ_CAP_CONTRAST) + info->value=vidix.video_eq.contrast; + else if(!strcmp(info->name,VO_EC_HUE) && vidix.video_eq.cap&VEQ_CAP_HUE) + info->value=vidix.video_eq.hue; + else if(!strcmp(info->name,VO_EC_RED_INTENSITY) && vidix.video_eq.cap&VEQ_CAP_RGB_INTENSITY) + info->value=vidix.video_eq.red_intensity; + else if(!strcmp(info->name,VO_EC_GREEN_INTENSITY) && vidix.video_eq.cap&VEQ_CAP_RGB_INTENSITY) + info->value=vidix.video_eq.green_intensity; + else if(!strcmp(info->name,VO_EC_BLUE_INTENSITY) && vidix.video_eq.cap&VEQ_CAP_RGB_INTENSITY) + info->value=vidix.video_eq.blue_intensity; + } + return rval; +} + +int Vidix_System::set_video_eq(const vo_videq_t *info) +{ + int rval; + if(!video_on) return EPERM; + rval = vidix.get_eq(); + if(!rval) { + if(!strcmp(info->name,VO_EC_BRIGHTNESS) && vidix.video_eq.cap&VEQ_CAP_BRIGHTNESS) + vidix.video_eq.brightness=info->value; + else if(!strcmp(info->name,VO_EC_SATURATION) && vidix.video_eq.cap&VEQ_CAP_SATURATION) + vidix.video_eq.saturation=info->value; + else if(!strcmp(info->name,VO_EC_CONTRAST) && vidix.video_eq.cap&VEQ_CAP_CONTRAST) + vidix.video_eq.contrast=info->value; + else if(!strcmp(info->name,VO_EC_HUE) && vidix.video_eq.cap&VEQ_CAP_HUE) + vidix.video_eq.hue=info->value; + else if(!strcmp(info->name,VO_EC_RED_INTENSITY) && vidix.video_eq.cap&VEQ_CAP_RGB_INTENSITY) + vidix.video_eq.red_intensity=info->value; + else if(!strcmp(info->name,VO_EC_GREEN_INTENSITY) && vidix.video_eq.cap&VEQ_CAP_RGB_INTENSITY) + vidix.video_eq.green_intensity=info->value; + else if(!strcmp(info->name,VO_EC_BLUE_INTENSITY) && vidix.video_eq.cap&VEQ_CAP_RGB_INTENSITY) + vidix.video_eq.blue_intensity=info->value; + rval= vidix.set_eq(); + } + return rval; +} + +int Vidix_System::get_num_fx(unsigned *info) const +{ + if(!video_on) return EPERM; + return vidix.num_oemfx(*info); +} + +int Vidix_System::get_oem_fx(vidix_oem_fx_t *info) const +{ + int rc; + if(!video_on) return EPERM; + rc=vidix.get_oemfx(); + *info = vidix.oemfx; + return rc; +} + +int Vidix_System::set_oem_fx(const vidix_oem_fx_t *info) +{ + if(!video_on) return EPERM; + vidix.oemfx=*info; + return vidix.set_oemfx(); +} + +int Vidix_System::get_deint(vidix_deinterlace_t *info) const +{ + int rc; + if(!video_on) return EPERM; + rc=vidix.get_deint(); + *info = vidix.deint; + return rc; +} + +int Vidix_System::set_deint(const vidix_deinterlace_t *info) +{ + if(!video_on) return EPERM; + vidix.deint=*info; + return vidix.set_deint(); +} + +MPXP_Rc Vidix_System::configure(unsigned src_width,unsigned src_height, + unsigned x_org,unsigned y_org,unsigned dst_width, + unsigned dst_height,unsigned format,unsigned dest_bpp, + unsigned vid_w,unsigned vid_h) +{ + size_t i; + int err; + static int video_clean=0; + uint32_t apitch; + MSG_DBG2("vidix_init() was called\n" + "src_w=%u src_h=%u dest_x_y_w_h = %u %u %u %u\n" + "format=%s dest_bpp=%u vid_w=%u vid_h=%u\n" + ,src_width,src_height,x_org,y_org,dst_width,dst_height + ,vo_format_name(format),dest_bpp,vid_w,vid_h); + if(((vidix.cap.maxwidth != -1) && (vid_w > (unsigned)vidix.cap.maxwidth)) || + ((vidix.cap.minwidth != -1) && (vid_w < (unsigned)vidix.cap.minwidth)) || + ((vidix.cap.maxheight != -1) && (vid_h > (unsigned)vidix.cap.maxheight)) || + ((vidix.cap.minwidth != -1 ) && (vid_h < (unsigned)vidix.cap.minheight))) { + MSG_FATAL("video server has unsupported resolution (%dx%d), supported: %dx%d-%dx%d\n", + vid_w, vid_h, vidix.cap.minwidth, vidix.cap.minheight, + vidix.cap.maxwidth, vidix.cap.maxheight); + return MPXP_False; + } + vidix.fourcc.fourcc = format; + vidix.query_fourcc(); + err = 0; + switch(dest_bpp) { + case 1: err = ((vidix.fourcc.depth & VID_DEPTH_1BPP) != VID_DEPTH_1BPP); break; + case 2: err = ((vidix.fourcc.depth & VID_DEPTH_2BPP) != VID_DEPTH_2BPP); break; + case 4: err = ((vidix.fourcc.depth & VID_DEPTH_4BPP) != VID_DEPTH_4BPP); break; + case 8: err = ((vidix.fourcc.depth & VID_DEPTH_8BPP) != VID_DEPTH_8BPP); break; + case 12:err = ((vidix.fourcc.depth & VID_DEPTH_12BPP) != VID_DEPTH_12BPP); break; + case 15:err = ((vidix.fourcc.depth & VID_DEPTH_15BPP) != VID_DEPTH_15BPP); break; + case 16:err = ((vidix.fourcc.depth & VID_DEPTH_16BPP) != VID_DEPTH_16BPP); break; + case 24:err = ((vidix.fourcc.depth & VID_DEPTH_24BPP) != VID_DEPTH_24BPP); break; + case 32:err = ((vidix.fourcc.depth & VID_DEPTH_32BPP) != VID_DEPTH_32BPP); break; + default: err=1; break; + } + if(err) { + MSG_FATAL("video server has unsupported color depth by vidix (%d)\n" + ,vidix.fourcc.depth); + return MPXP_False; + } + if((dst_width > src_width || dst_height > src_height) && (vidix.cap.flags & FLAG_UPSCALER) != FLAG_UPSCALER) { + MSG_FATAL("vidix driver can't upscale image (%d%d -> %d%d)\n", + src_width, src_height, dst_width, dst_height); + return MPXP_False; + } + if((dst_width > src_width || dst_height > src_height) && (vidix.cap.flags & FLAG_DOWNSCALER) != FLAG_DOWNSCALER) { + MSG_FATAL("vidix driver can't downscale image (%d%d -> %d%d)\n", + src_width, src_height, dst_width, dst_height); + return MPXP_False; + } + image_width = src_width; + image_height = src_height; + src_format = format; + if(forced_fourcc) format = forced_fourcc; + vidix.playback.fourcc = format; + vidix.playback.capability = vidix.cap.flags; /* every ;) */ + vidix.playback.blend_factor = 0; /* for now */ + /* display the full picture. + Nick: we could implement here zooming to a specified area -- alex */ + vidix.playback.src.x = vidix.playback.src.y = 0; + vidix.playback.src.w = src_width; + vidix.playback.src.h = src_height; + vidix.playback.dest.x = x_org; + vidix.playback.dest.y = y_org; + vidix.playback.dest.w = dst_width; + vidix.playback.dest.h = dst_height; + vidix.playback.num_frames=(vo_conf.use_bm!=1)?NUM_FRAMES-1:1; + if(vidix.playback.num_frames > vo_conf.xp_buffs) vidix.playback.num_frames = vo_conf.xp_buffs; + vidix.playback.src.pitch.y = vidix.playback.src.pitch.u = vidix.playback.src.pitch.v = 0; + if((err=vidix.config_playback())!=0) { + MSG_FATAL("Can't configure playback: %s\n",strerror(err)); + return MPXP_False; + } + MSG_V("using %d buffers\n", vidix.playback.num_frames); + /* configure busmastering */ + if(vo_conf.use_bm) { + if(vidix.cap.flags & FLAG_DMA) { + int psize = getpagesize(); + bm_locked=1; + for(i=0;i<vo_conf.xp_buffs;i++) { + if(!bm_buffs[i]) bm_buffs[i] = new(alignmem,psize) uint8_t[vidix.playback.frame_size]; + if(!(bm_buffs[i])) { + MSG_ERR("Can't allocate memory for busmastering\n"); + return MPXP_False; + } + if(mlock(bm_buffs[i],vidix.playback.frame_size) != 0) { + unsigned j; + MSG_WARN("Can't lock memory for busmastering\n"); + for(j=0;j<i;j++) munlock(bm_buffs[i],vidix.playback.frame_size); + bm_locked=0; + } + } + memset(&vidix.dma,0,sizeof(vidix_dma_t)); + bm_total_frames=bm_slow_frames=0; + } + else + MSG_ERR("Can not configure bus mastering: your driver is not DMA capable\n"); + vo_conf.use_bm = 0; + } + if(vo_conf.use_bm) MSG_OK("using BUSMASTERING\n"); + mem = static_cast<uint8_t*>(vidix.playback.dga_addr); + + if(!video_clean) { + /* clear every frame with correct address and frame_size + only once per session */ + for (i = 0; i < vidix.playback.num_frames; i++) + memset(mem + vidix.playback.offsets[i], 0x80, vidix.playback.frame_size); + video_clean=1; + } + MSG_DBG2("vidix returns pitches %u %u %u\n",vidix.playback.dest.pitch.y,vidix.playback.dest.pitch.u,vidix.playback.dest.pitch.v); + switch(format) { + case IMGFMT_Y800: + case IMGFMT_YVU9: + case IMGFMT_IF09: + case IMGFMT_I420: + case IMGFMT_IYUV: + case IMGFMT_YV12: + apitch = vidix.playback.dest.pitch.y-1; + vidix.playback.offset.y = (image_width + apitch) & ~apitch; + apitch = vidix.playback.dest.pitch.v-1; + vidix.playback.offset.v = (image_width + apitch) & ~apitch; + apitch = vidix.playback.dest.pitch.u-1; + vidix.playback.offset.u = (image_width + apitch) & ~apitch; + image_Bpp=1; + break; + case IMGFMT_RGB32: + case IMGFMT_BGR32: + apitch = vidix.playback.dest.pitch.y-1; + vidix.playback.offset.y = (image_width*4 + apitch) & ~apitch; + vidix.playback.offset.u = vidix.playback.offset.v = 0; + image_Bpp=4; + break; + case IMGFMT_RGB24: + case IMGFMT_BGR24: + apitch = vidix.playback.dest.pitch.y-1; + vidix.playback.offset.y = (image_width*3 + apitch) & ~apitch; + vidix.playback.offset.u = vidix.playback.offset.v = 0; + image_Bpp=3; + break; + default: + apitch = vidix.playback.dest.pitch.y-1; + vidix.playback.offset.y = (image_width*2 + apitch) & ~apitch; + vidix.playback.offset.u = vidix.playback.offset.v = 0; + image_Bpp=2; + break; + } + switch(format) { + case IMGFMT_YVU9: + case IMGFMT_IF09: + vidix.playback.offset.u /= 4; + vidix.playback.offset.v /= 4; + break; + case IMGFMT_I420: + case IMGFMT_IYUV: + case IMGFMT_YV12: + vidix.playback.offset.u /= 2; + vidix.playback.offset.v /= 2; + break; + } + return MPXP_Ok; +} + +void Vidix_System::get_surface_caps(dri_surface_cap_t *caps) const +{ + caps->caps = vo_conf.use_bm ? DRI_CAP_TEMP_VIDEO|DRI_CAP_BUSMASTERING : DRI_CAP_VIDEO_MMAPED; + caps->caps |= DRI_CAP_HORZSCALER | DRI_CAP_VERTSCALER; + if((vidix.cap.flags & FLAG_DOWNSCALER) == FLAG_DOWNSCALER) + caps->caps |= DRI_CAP_DOWNSCALER; + if((vidix.cap.flags & FLAG_UPSCALER) == FLAG_UPSCALER) + caps->caps |= DRI_CAP_UPSCALER; + caps->fourcc = vidix.playback.fourcc; + caps->width=vidix.playback.src.w; + caps->height=vidix.playback.src.h; + /* in case of vidix movie fit surface */ + caps->x = caps->y=0; + caps->w=caps->width; + caps->h=caps->height; + caps->strides[0] = vidix.playback.offset.y; + caps->strides[1] = vidix.playback.offset.v; + caps->strides[2] = vidix.playback.offset.u; + caps->strides[3] = 0; +} + +void Vidix_System::get_surface(dri_surface_t *surf) const +{ + if(vo_conf.use_bm) { + surf->planes[0] = bm_buffs[surf->idx] + vidix.playback.offset.y; + surf->planes[1] = bm_buffs[surf->idx] + vidix.playback.offset.v; + surf->planes[2] = bm_buffs[surf->idx] + vidix.playback.offset.u; + } else { + surf->planes[0] = mem + vidix.playback.offsets[surf->idx] + vidix.playback.offset.y; + surf->planes[1] = mem + vidix.playback.offsets[surf->idx] + vidix.playback.offset.v; + surf->planes[2] = mem + vidix.playback.offsets[surf->idx] + vidix.playback.offset.u; + } + surf->planes[3] = 0; +} + +unsigned Vidix_System::get_num_frames() const { return (vo_conf.use_bm==1)?vo_conf.xp_buffs:vidix.playback.num_frames; } + +void Vidix_System::flush_page(unsigned idx) { + if(vo_conf.use_bm > 1) copy_dma(idx,1); +} Copied: mplayerxp/libvo/vidix_system.h (from rev 458, mplayerxp/libvo/vosub_vidix.h) =================================================================== --- mplayerxp/libvo/vidix_system.h (rev 0) +++ mplayerxp/libvo/vidix_system.h 2012-11-27 09:44:49 UTC (rev 459) @@ -0,0 +1,70 @@ +/* + * vidix_system.h + * + * Copyright (C) Nickols_K <nic...@ma...> - 2002 + * + * You can redistribute this file under terms and conditions + * of GNU General Public licence v2. + * + * This file contains vosub_vidix interface to any mplayer's VO driver + */ + +#ifndef __VIDIX_SYSTEM_H_INCLUDED +#define __VIDIX_SYSTEM_H_INCLUDED 1 +#include "xmpcore/xmp_enums.h" + +#include "osdep/mplib.h" +#include "video_out.h" +#include "dri_vo.h" +#include <vidix/vidix.h> +#include <vidix/vidixlibxx.h> + +using namespace vidix; +using namespace mpxp; + +#define NUM_FRAMES MAX_DRI_BUFFERS /* Temporary: driver will overwrite it */ + +struct Vidix_System : public video_private { + public: + Vidix_System(const char *drvname); + virtual ~Vidix_System(); + + MPXP_Rc configure(unsigned src_width,unsigned src_height, + unsigned dest_x,unsigned dest_y,unsigned dst_width, + unsigned dst_height,unsigned format,unsigned dest_bpp, + unsigned vid_w,unsigned vid_h); + int start(); + int stop(); + MPXP_Rc select_frame(unsigned idx); + void flush_page(unsigned idx); + + MPXP_Rc query_fourcc(vo_query_fourcc_t* format); + void get_surface_caps(dri_surface_cap_t *caps) const; + void get_surface(dri_surface_t *surf) const; + unsigned get_num_frames() const; + + MPXP_Rc grkey_support() const; + int grkey_get(vidix_grkey_t *gr_key) const; + int grkey_set(const vidix_grkey_t *gr_key); + int get_video_eq(vo_videq_t *info) const; + int set_video_eq(const vo_videq_t *info); + int get_num_fx(unsigned *info) const; + int get_oem_fx(vidix_oem_fx_t *info) const; + int set_oem_fx(const vidix_oem_fx_t *info); + int get_deint(vidix_deinterlace_t *info) const; + int set_deint(const vidix_deinterlace_t *info); + private: + void copy_dma(unsigned idx,int sync_mode); + + unsigned image_Bpp,image_height,image_width,src_format,forced_fourcc; + + Vidix& vidix; + uint8_t * mem; + int video_on; + +/* bus mastering */ + int bm_locked; /* requires root privelegies */ + uint8_t * bm_buffs[NUM_FRAMES]; + unsigned bm_total_frames,bm_slow_frames; +}; +#endif Modified: mplayerxp/libvo/vo_fbdev.cpp =================================================================== --- mplayerxp/libvo/vo_fbdev.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/vo_fbdev.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -31,7 +31,7 @@ #include "osdep/fastmemcpy.h" #include "sub.h" #ifdef CONFIG_VIDIX -#include "vosub_vidix.h" +#include "vidix_system.h" #endif #include "aspect.h" #include "osd.h" @@ -119,20 +119,21 @@ unsigned flags, const char *title, uint32_t format); - virtual void select_frame(unsigned idx); + virtual MPXP_Rc select_frame(unsigned idx); + virtual void get_surface_caps(dri_surface_cap_t *caps) const; + virtual void get_surface(dri_surface_t *surf) const; + virtual MPXP_Rc query_format(vo_query_fourcc_t* format) const; + virtual unsigned get_num_frames() const; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data); private: MPXP_Rc fb_preinit(); - uint32_t parse_sub_device(const char *sd); + const char* parse_sub_device(const char *sd); int parse_fbmode_cfg(const char *cfgfile); int get_token(int num); void vt_set_textarea(int u, int l); void lots_of_printf() const; - void dri_get_surface_caps(dri_surface_cap_t *caps) const; - void dri_get_surface(dri_surface_t *surf) const; - MPXP_Rc query_format(vo_query_fourcc_t* format) const; - FILE * fp; int line_num; char * line; @@ -179,26 +180,24 @@ MPXP_Rc pre_init_err; #ifdef CONFIG_VIDIX /* Name of VIDIX driver */ - const char* vidix_name; - vidix_server_t* vidix_server; - vidix_priv_t* vidix; + Vidix_System* vidix; #endif int fb_preinit_done; MPXP_Rc fb_works; }; -uint32_t FBDev_VO_Interface::parse_sub_device(const char *sd) +const char* FBDev_VO_Interface::parse_sub_device(const char *sd) { const char *param; #ifdef CONFIG_VIDIX - if(memcmp(sd,"vidix",5) == 0) vidix_name = &sd[5]; /* vidix_name will be valid within init() */ + if(memcmp(sd,"vidix",5) == 0) return &sd[5]; /* vidix_name will be valid within init() */ else #endif { param=mrl_parse_line(sd,NULL,NULL,&priv_conf.dev_name,&priv_conf.mode_name); mrl_parse_params(param,fbconf); } - return 0; + return NULL; } MPXP_Rc FBDev_VO_Interface::fb_preinit() @@ -286,20 +285,18 @@ close(dev_fd); if(frame_buffer) munmap(frame_buffer,size); #ifdef CONFIG_VIDIX - if(vidix_name) vidix_term(vidix); - delete vidix_server; - delete vidix; + if(vidix) delete vidix; #endif } FBDev_VO_Interface::FBDev_VO_Interface(const char *arg) :VO_Interface(arg) { - if(arg) parse_sub_device(arg); + const char *vidix_name=NULL; + if(arg) vidix_name=parse_sub_device(arg); #ifdef CONFIG_VIDIX if(vidix_name) { - vidix=vidix_preinit(vidix_name); - if(!(vidix_server=vidix_get_server(vidix))) { + if(!(vidix=new(zeromem) Vidix_System(vidix_name))) { MSG_ERR("Cannot initialze vidix with '%s' argument\n",vidix_name); exit_player("Vidix error"); } @@ -1061,13 +1058,11 @@ else y_offset = 0; #ifdef CONFIG_VIDIX - if(vidix_name) { - if(vidix_init(vidix,width,height,x_offset,y_offset,out_width, + if(vidix) { + if(vidix->configure(width,height,x_offset,y_offset,out_width, out_height,format,bpp, xres,yres) != MPXP_Ok) { MSG_ERR(FBDEV "Can't initialize VIDIX driver\n"); - vidix_name = NULL; - vidix_term(vidix); return MPXP_False; } else MSG_V(FBDEV "Using VIDIX\n"); if ((frame_buffer = (uint8_t *) mmap(0, size, PROT_READ | PROT_WRITE, @@ -1076,7 +1071,7 @@ return MPXP_False; } memset(frame_buffer, 0, line_len * yres); - if(vidix_start(vidix)!=0) { vidix_term(vidix); return MPXP_False; } + if(vidix->start()!=0) return MPXP_False; } else #endif { @@ -1116,6 +1111,9 @@ MPXP_Rc FBDev_VO_Interface::query_format(vo_query_fourcc_t * format) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->query_fourcc(format); +#endif format->flags=VOCAP_NA; switch(format->fourcc) { case IMGFMT_BGR15: if(bpp == 15) format->flags=VOCAP_SUPPORTED; break; @@ -1127,13 +1125,10 @@ return MPXP_Ok; } -void FBDev_VO_Interface::select_frame(unsigned idx) +MPXP_Rc FBDev_VO_Interface::select_frame(unsigned idx) { #ifdef CONFIG_VIDIX - if(vidix_server) { - vidix_server->select_frame(vidix,idx); - return; - } + if(vidix) return vidix->select_frame(idx); #endif unsigned i, out_offset = 0, in_offset = 0; @@ -1143,10 +1138,14 @@ out_offset += line_len; in_offset += out_width * pixel_size; } + return MPXP_Ok; } -void FBDev_VO_Interface::dri_get_surface_caps(dri_surface_cap_t *caps) const +void FBDev_VO_Interface::get_surface_caps(dri_surface_cap_t *caps) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_surface_caps(caps); +#endif caps->caps = DRI_CAP_TEMP_VIDEO; caps->fourcc = dstFourcc; caps->width=out_width; @@ -1161,32 +1160,33 @@ caps->strides[3] = 0; } -void FBDev_VO_Interface::dri_get_surface(dri_surface_t *surf) const +void FBDev_VO_Interface::get_surface(dri_surface_t *surf) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_surface(surf); +#endif surf->planes[0] = next_frame[surf->idx]; surf->planes[1] = 0; surf->planes[2] = 0; surf->planes[3] = 0; } +unsigned FBDev_VO_Interface::get_num_frames() const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_num_frames(); +#endif + return total_fr; +} + MPXP_Rc FBDev_VO_Interface::ctrl(uint32_t request, any_t*data) { + switch(request) { + case VOCTRL_FLUSH_PAGES: #ifdef CONFIG_VIDIX - if(vidix_server) - if(vidix_server->control(vidix,request,data)==MPXP_Ok) return MPXP_Ok; + if(vidix) vidix->flush_page(*(unsigned*)data); + return MPXP_Ok; #endif - switch (request) { - case VOCTRL_QUERY_FORMAT: - return query_format((vo_query_fourcc_t*)data); - case VOCTRL_GET_NUM_FRAMES: - *(uint32_t *)data = total_fr; - return MPXP_True; - case DRI_GET_SURFACE_CAPS: - dri_get_surface_caps(reinterpret_cast<dri_surface_cap_t*>(data)); - return MPXP_True; - case DRI_GET_SURFACE: - dri_get_surface(reinterpret_cast<dri_surface_t*>(data)); - return MPXP_True; + default: break; } return MPXP_NA; } Modified: mplayerxp/libvo/vo_null.cpp =================================================================== --- mplayerxp/libvo/vo_null.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/vo_null.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -50,12 +50,14 @@ unsigned flags, const char *title, uint32_t format); - virtual void select_frame(unsigned idx); + virtual MPXP_Rc select_frame(unsigned idx); + virtual void get_surface_caps(dri_surface_cap_t *caps) const; + virtual void get_surface(dri_surface_t *surf) const; + virtual MPXP_Rc query_format(vo_query_fourcc_t* format) const; + virtual unsigned get_num_frames() const; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data); private: - void dri_get_surface_caps(dri_surface_cap_t *caps) const; - void dri_get_surface(dri_surface_t *surf) const; - MPXP_Rc query_format(vo_query_fourcc_t* format) const; uint32_t image_width, image_height,frame_size,fourcc; uint8_t * bm_buffs[MAX_DRI_BUFFERS]; @@ -64,9 +66,10 @@ uint32_t offset_y,offset_u,offset_v; }; -void Null_VO_Interface::select_frame(unsigned idx) +MPXP_Rc Null_VO_Interface::select_frame(unsigned idx) { UNUSED(idx); + return MPXP_Ok; } MPXP_Rc Null_VO_Interface::configure(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height,unsigned flags,const char *title, uint32_t format) @@ -140,7 +143,7 @@ if(arg) MSG_ERR("vo_null: Unknown subdevice: %s\n",arg); } -void Null_VO_Interface::dri_get_surface_caps(dri_surface_cap_t *caps) const +void Null_VO_Interface::get_surface_caps(dri_surface_cap_t *caps) const { caps->caps =DRI_CAP_TEMP_VIDEO | DRI_CAP_HORZSCALER | DRI_CAP_VERTSCALER | @@ -158,7 +161,7 @@ caps->strides[3] = 0; } -void Null_VO_Interface::dri_get_surface(dri_surface_t *surf) const +void Null_VO_Interface::get_surface(dri_surface_t *surf) const { surf->planes[0] = bm_buffs[surf->idx] + offset_y; surf->planes[1] = bm_buffs[surf->idx] + offset_v; @@ -166,6 +169,8 @@ surf->planes[3] = 0; } +unsigned Null_VO_Interface::get_num_frames() const { return num_frames; } + MPXP_Rc Null_VO_Interface::query_format(vo_query_fourcc_t* format) const { /* we must avoid compressed-fourcc here */ switch(format->fourcc) { @@ -214,17 +219,6 @@ MPXP_Rc Null_VO_Interface::ctrl(uint32_t request, any_t*data) { switch (request) { - case VOCTRL_QUERY_FORMAT: - return query_format(reinterpret_cast<vo_query_fourcc_t*>(data)); - case VOCTRL_GET_NUM_FRAMES: - *(uint32_t *)data = num_frames; - return MPXP_True; - case DRI_GET_SURFACE_CAPS: - dri_get_surface_caps(reinterpret_cast<dri_surface_cap_t*>(data)); - return MPXP_True; - case DRI_GET_SURFACE: - dri_get_surface(reinterpret_cast<dri_surface_t*>(data)); - return MPXP_True; case VOCTRL_FLUSH_PAGES: return MPXP_True; } Modified: mplayerxp/libvo/vo_opengl.cpp =================================================================== --- mplayerxp/libvo/vo_opengl.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/vo_opengl.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -65,7 +65,12 @@ unsigned flags, const char *title, uint32_t format); - virtual void select_frame(unsigned idx); + virtual MPXP_Rc select_frame(unsigned idx); + virtual void get_surface_caps(dri_surface_cap_t *caps) const; + virtual void get_surface(dri_surface_t *surf) const; + virtual MPXP_Rc query_format(vo_query_fourcc_t* format) const; + virtual unsigned get_num_frames() const; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data); private: void gl_init_fb(unsigned x,unsigned y,unsigned d_width,unsigned d_height) const; @@ -73,9 +78,6 @@ uint32_t check_events(const vo_resize_t*) const; void gl_display_Image(XImage *myximage) const; - void dri_get_surface_caps(dri_surface_cap_t *caps) const; - void dri_get_surface(dri_surface_t *surf) const; - MPXP_Rc query_format(vo_query_fourcc_t* format) const; uint32_t image_width; uint32_t image_height; @@ -239,11 +241,11 @@ myximage->data); } -void OpenGL_VO_Interface::select_frame(unsigned idx) { +MPXP_Rc OpenGL_VO_Interface::select_frame(unsigned idx) { gl_display_Image(glx.Image(idx)); if (num_buffers>1) glx.swap_buffers(); glFlush(); - return; + return MPXP_Ok; } MPXP_Rc OpenGL_VO_Interface::query_format( vo_query_fourcc_t* format ) const @@ -259,7 +261,7 @@ } -void OpenGL_VO_Interface::dri_get_surface_caps(dri_surface_cap_t *caps) const +void OpenGL_VO_Interface::get_surface_caps(dri_surface_cap_t *caps) const { caps->caps =DRI_CAP_TEMP_VIDEO| DRI_CAP_HORZSCALER|DRI_CAP_VERTSCALER| @@ -277,7 +279,7 @@ caps->strides[3] = 0; } -void OpenGL_VO_Interface::dri_get_surface(dri_surface_t *surf) const +void OpenGL_VO_Interface::get_surface(dri_surface_t *surf) const { surf->planes[0] = glx.ImageData(surf->idx); surf->planes[1] = 0; @@ -285,26 +287,17 @@ surf->planes[3] = 0; } +unsigned OpenGL_VO_Interface::get_num_frames() const { return num_buffers; } + MPXP_Rc OpenGL_VO_Interface::ctrl(uint32_t request, any_t*data) { switch (request) { - case VOCTRL_QUERY_FORMAT: - return query_format((vo_query_fourcc_t*)data); case VOCTRL_FULLSCREEN: glx.fullscreen(); vo_rect_t r; glx.get_win_coord(&r); resize(r.w,r.h); return MPXP_True; - case VOCTRL_GET_NUM_FRAMES: - *(uint32_t *)data = num_buffers; - return MPXP_True; - case DRI_GET_SURFACE_CAPS: - dri_get_surface_caps(reinterpret_cast<dri_surface_cap_t*>(data)); - return MPXP_True; - case DRI_GET_SURFACE: - dri_get_surface(reinterpret_cast<dri_surface_t*>(data)); - return MPXP_True; case VOCTRL_CHECK_EVENTS: { vo_resize_t* vrest = (vo_resize_t *)data; vrest->event_type = check_events(vrest); Modified: mplayerxp/libvo/vo_sdl.cpp =================================================================== --- mplayerxp/libvo/vo_sdl.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/vo_sdl.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -132,7 +132,7 @@ #include "video_out_internal.h" #include "xmpcore/mp_image.h" #ifdef CONFIG_VIDIX -#include "vosub_vidix.h" +#include "vidix_system.h" #endif #include "vo_msg.h" @@ -206,7 +206,12 @@ unsigned flags, const char *title, uint32_t format); - virtual void select_frame(unsigned idx); + virtual MPXP_Rc select_frame(unsigned idx); + virtual void get_surface_caps(dri_surface_cap_t *caps) const; + virtual void get_surface(dri_surface_t *surf) const; + virtual MPXP_Rc query_format(vo_query_fourcc_t* format) const; + virtual unsigned get_num_frames() const; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data); private: void sdl_open ( ); @@ -219,10 +224,8 @@ uint32_t check_events(const vo_resize_t*); void lock_surfaces(); void unlock_surfaces(); + const char* parse_sub_device(const char *sd) const; - void dri_get_surface_caps(dri_surface_cap_t *caps) const; - void dri_get_surface(dri_surface_t *surf) const; - MPXP_Rc query_format(vo_query_fourcc_t* format) const; char sdl_subdevice[100]; char driver[8]; /* output driver used by sdl */ @@ -249,9 +252,7 @@ uint32_t format; /* source image format (YUV/RGB/...) */ SDL_Rect dirty_off_frame[2]; #ifdef CONFIG_VIDIX - const char * vidix_name; - vidix_server_t* vidix_server; - vidix_priv_t* vidix; + Vidix_System* vidix; #endif #ifdef HAVE_X11 X11_System& x11; @@ -268,6 +269,13 @@ } /** Private SDL Data structure **/ +const char* SDL_VO_Interface::parse_sub_device(const char *sd) const +{ +#ifdef CONFIG_VIDIX + if(memcmp(sd,"vidix",5) == 0) return &sd[5]; /* vidix_name will be valid within init() */ +#endif + return NULL; +} SDL_VO_Interface::~SDL_VO_Interface() { @@ -277,10 +285,7 @@ sdl_close(); pthread_mutex_destroy(&surfaces_mutex); #ifdef CONFIG_VIDIX - if(vidix_name) { - vidix_term(vidix); - delete vidix_server; - } + if(vidix) delete vidix; #endif } @@ -290,10 +295,20 @@ ,x11(*new(zeromem) X11_System(vo_conf.mDisplayName)) #endif { + const char* vidix_name=NULL; num_buffs = 1; surface = NULL; sdl_subdevice[0]='\0'; if(arg) strcpy(sdl_subdevice,arg); + if(arg) vidix_name = parse_sub_device(arg); +#ifdef CONFIG_VIDIX + if(vidix_name) { + if(!(vidix=new(zeromem) Vidix_System(vidix_name))) { + MSG_ERR("Cannot initialze vidix with '%s' argument\n",vidix_name); + exit_player("Vidix error"); + } + } +#endif #ifdef HAVE_X11 x11.saver_off(); #endif @@ -336,27 +351,13 @@ { const SDL_VideoInfo *vidInfo = NULL; MSG_DBG3("SDL: Opening Plugin\n"); -#ifdef CONFIG_VIDIX - if(memcmp(sdl_subdevice,"vidix",5) == 0) { - vidix_name = &sdl_subdevice[5]; /* vidix_name will be valid within init() */ - vidix=vidix_preinit(vidix_name); - if(!(vidix_server=vidix_get_server(vidix))) { - MSG_ERR("Cannot initialze vidix with '%s' argument\n",vidix_name); - exit_player("Vidix error"); - strcpy(driver,"vidix"); - } - } else { -#endif - if(sdl_subdevice[0]) setenv("SDL_VIDEODRIVER", sdl_subdevice, 1); + if(sdl_subdevice[0]) setenv("SDL_VIDEODRIVER", sdl_subdevice, 1); - /* does the user want SDL to try and force Xv */ - if(sdl_forcexv) setenv("SDL_VIDEO_X11_NODIRECTCOLOR", "1", 1); + /* does the user want SDL to try and force Xv */ + if(sdl_forcexv) setenv("SDL_VIDEO_X11_NODIRECTCOLOR", "1", 1); - /* does the user want to disable Xv and use software scaling instead */ - if(sdl_noxv) setenv("SDL_VIDEO_YUV_HWACCEL", "0", 1); -#ifdef CONFIG_VIDIX - } -#endif + /* does the user want to disable Xv and use software scaling instead */ + if(sdl_noxv) setenv("SDL_VIDEO_YUV_HWACCEL", "0", 1); /* default to no fullscreen mode, we'll set this as soon we have the avail. modes */ fullmode = -2; @@ -457,9 +458,6 @@ void SDL_VO_Interface::sdl_close () { unsigned i,n; -#ifdef CONFIG_VIDIX - if(vidix_name) vidix_term(vidix); -#endif n=num_buffs; for(i=0;i<n;i++) { /* Cleanup YUV Overlay structure */ @@ -742,25 +740,20 @@ MPXP_Rc retval; num_buffs=vo_conf.xp_buffs; #ifdef CONFIG_VIDIX - if(!vidix_name) { -#endif - for(i=0;i<num_buffs;i++) { - retval = setup_surface(i); - if(retval!=MPXP_Ok) return retval; - } -#ifdef CONFIG_VIDIX - } - else { - if(vidix_init(vidix,width,height,0,y, + if(vidix) { + if(vidix->configure(width,height,0,y, dstwidth,dstheight,format,bpp, XWidth,XHeight) != MPXP_Ok) { MSG_ERR("vo_sdl: Can't initialize VIDIX driver\n"); - vidix_name = NULL; return MPXP_False; } else MSG_V("vo_sdl: Using VIDIX\n"); - if(vidix_start(vidix)!=0) return MPXP_False; - } + if(vidix->start()!=0) return MPXP_False; + } else #endif + for(i=0;i<num_buffs;i++) { + retval = setup_surface(i); + if(retval!=MPXP_Ok) return retval; + } return MPXP_Ok; } @@ -1107,51 +1100,48 @@ * returns : doesn't return **/ -void SDL_VO_Interface::select_frame(unsigned idx) +MPXP_Rc SDL_VO_Interface::select_frame(unsigned idx) { #ifdef CONFIG_VIDIX - if(vidix_server) { - vidix_server->select_frame(vidix,idx); - return; - } + if(vidix) return vidix->select_frame(idx); #endif - if(mode == YUV) { - /* blit to the YUV overlay */ - SDL_DisplayYUVOverlay (overlay[idx], &surface->clip_rect); + if(mode == YUV) { + /* blit to the YUV overlay */ + SDL_DisplayYUVOverlay (overlay[idx], &surface->clip_rect); - /* check if we have a double buffered surface and flip() if we do. */ - if ( surface->flags & SDL_DOUBLEBUF ) - SDL_Flip(surface); + /* check if we have a double buffered surface and flip() if we do. */ + if ( surface->flags & SDL_DOUBLEBUF ) + SDL_Flip(surface); - //SDL_LockYUVOverlay (overlay); // removed because unused!? - } else { - /* blit to the RGB surface */ - if(SDL_BlitSurface (rgbsurface[idx], NULL, surface, NULL)) - MSG_ERR("SDL: Blit failed: %s\n", SDL_GetError()); + //SDL_LockYUVOverlay (overlay); // removed because unused!? + } else { + /* blit to the RGB surface */ + if(SDL_BlitSurface (rgbsurface[idx], NULL, surface, NULL)) + MSG_ERR("SDL: Blit failed: %s\n", SDL_GetError()); - /* update screen */ - if(sdl_forcegl) + /* update screen */ + if(sdl_forcegl) SDL_UpdateRects(surface, 1, &surface->clip_rect); + else { + if(osd_has_changed) { + osd_has_changed = 0; SDL_UpdateRects(surface, 1, &surface->clip_rect); - else - { - if(osd_has_changed) { - osd_has_changed = 0; - SDL_UpdateRects(surface, 1, &surface->clip_rect); - } - else - SDL_UpdateRect(surface, 0, y_screen_top, + } else + SDL_UpdateRect(surface, 0, y_screen_top, surface->clip_rect.w, y_screen_bottom); - } - /* check if we have a double buffered surface and flip() if we do. */ - if(sdl_forcegl) SDL_GL_SwapBuffers(); - else - if(surface->flags & SDL_DOUBLEBUF ) SDL_Flip(surface); } + /* check if we have a double buffered surface and flip() if we do. */ + if(sdl_forcegl) SDL_GL_SwapBuffers(); + else if(surface->flags & SDL_DOUBLEBUF ) SDL_Flip(surface); + } + return MPXP_Ok; } MPXP_Rc SDL_VO_Interface::query_format(vo_query_fourcc_t* format) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->query_fourcc(format); +#endif if(sdl_forcegl) { if (IMGFMT_IS_BGR(format->fourcc)) { if (rgbfmt_depth(format->fourcc) == (unsigned)bpp && @@ -1183,8 +1173,11 @@ return MPXP_False; } -void SDL_VO_Interface::dri_get_surface_caps(dri_surface_cap_t *caps) const +void SDL_VO_Interface::get_surface_caps(dri_surface_cap_t *caps) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_surface_caps(caps); +#endif caps->caps = DRI_CAP_TEMP_VIDEO | DRI_CAP_UPSCALER | DRI_CAP_DOWNSCALER | DRI_CAP_HORZSCALER | DRI_CAP_VERTSCALER; caps->fourcc = format; @@ -1222,8 +1215,11 @@ } } -void SDL_VO_Interface::dri_get_surface(dri_surface_t *surf) const +void SDL_VO_Interface::get_surface(dri_surface_t *surf) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_surface(surf); +#endif if(mode == YUV) { int i,n; n = std::min(4,overlay[surf->idx]->planes); @@ -1245,24 +1241,16 @@ } } -MPXP_Rc SDL_VO_Interface::ctrl(uint32_t request, any_t*data) -{ +unsigned SDL_VO_Interface::get_num_frames() const { #ifdef CONFIG_VIDIX - if(vidix_server) - if(vidix_server->control(vidix,request,data)==MPXP_Ok) return MPXP_Ok; + if(vidix) return vidix->get_num_frames(); #endif + return num_buffs; +} + +MPXP_Rc SDL_VO_Interface::ctrl(uint32_t request, any_t*data) +{ switch (request) { - case VOCTRL_QUERY_FORMAT: - return query_format((vo_query_fourcc_t*)data); - case VOCTRL_GET_NUM_FRAMES: - *(uint32_t *)data = num_buffs; - return MPXP_True; - case DRI_GET_SURFACE_CAPS: - dri_get_surface_caps(reinterpret_cast<dri_surface_cap_t*>(data)); - return MPXP_True; - case DRI_GET_SURFACE: - dri_get_surface(reinterpret_cast<dri_surface_t*>(data)); - return MPXP_True; case VOCTRL_CHECK_EVENTS: { vo_resize_t * vrest = (vo_resize_t *)data; vrest->event_type = check_events(vrest); @@ -1279,6 +1267,11 @@ } *(uint32_t *)data = VO_EVENT_RESIZE; return MPXP_True; + case VOCTRL_FLUSH_PAGES: +#ifdef CONFIG_VIDIX + if(vidix) vidix->flush_page(*(unsigned*)data); + return MPXP_Ok; +#endif } return MPXP_NA; } Modified: mplayerxp/libvo/vo_vesa.cpp =================================================================== --- mplayerxp/libvo/vo_vesa.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/vo_vesa.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -40,7 +40,7 @@ #include "osdep/bswap.h" #include "aspect.h" #ifdef CONFIG_VIDIX -#include "vosub_vidix.h" +#include "vidix_system.h" #endif #include "dri_vo.h" #include "help_mp.h" @@ -70,10 +70,15 @@ unsigned flags, const char *title, uint32_t format); - virtual void select_frame(unsigned idx); + virtual MPXP_Rc select_frame(unsigned idx); + virtual void get_surface_caps(dri_surface_cap_t *caps) const; + virtual void get_surface(dri_surface_t *surf) const; + virtual MPXP_Rc query_format(vo_query_fourcc_t* format) const; + virtual unsigned get_num_frames() const; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data); private: - uint32_t parse_sub_device(const char *sd); + const char* parse_sub_device(const char *sd); int has_dga() const { return win.idx == -1; } int valid_win_frame(unsigned long offset) const { return offset >= win.low && offset < win.high; } any_t* video_ptr(unsigned long offset) const { return win.ptr + offset - win.low; } @@ -93,9 +98,6 @@ void vesa_term(); - void dri_get_surface_caps(dri_surface_cap_t *caps) const; - void dri_get_surface(dri_surface_t *surf) const; - MPXP_Rc query_format(vo_query_fourcc_t* format) const; void (VESA_VO_Interface::*cpy_blk_fnc)(unsigned long,uint8_t *,unsigned long); @@ -116,9 +118,7 @@ uint8_t multi_size; /* total number of buffers */ /* Linux Video Overlay */ #ifdef CONFIG_VIDIX - const char * vidix_name; - vidix_server_t* vidix_server; - vidix_priv_t* vidix; + Vidix_System* vidix; #endif uint32_t subdev_flags; }; @@ -152,23 +152,23 @@ vesa_term(); MSG_DBG3("vo_vesa: uninit was called\n"); #ifdef CONFIG_VIDIX - delete vidix_server; + if(vidix) delete vidix; #endif } VESA_VO_Interface::VESA_VO_Interface(const char *arg) :VO_Interface(arg) { + const char* vidix_name=NULL; MPXP_Rc pre_init_err = MPXP_Ok; subdev_flags = 0xFFFFFFFEUL; cpy_blk_fnc=NULL; MSG_DBG2("vo_vesa: preinit(%s) was called\n",arg); MSG_DBG3("vo_vesa: subdevice %s is being initialized\n",arg); - if(arg) subdev_flags = parse_sub_device(arg); + if(arg) vidix_name = parse_sub_device(arg); #ifdef CONFIG_VIDIX if(vidix_name) { - vidix=vidix_preinit(vidix_name); - if(!(vidix_server=vidix_get_server(vidix))) { + if(!(vidix=new(zeromem) Vidix_System(vidix_name))) { MSG_ERR("Cannot initialze vidix with '%s' argument\n",vidix_name); exit_player("Vidix error"); } @@ -189,9 +189,6 @@ void VESA_VO_Interface::vesa_term() { int err; -#ifdef CONFIG_VIDIX - if(vidix_name) vidix_term(vidix); -#endif if((err=vbeRestoreState(init_state)) != VBE_OK) PRINT_VBE_ERR("vbeRestoreState",err); if((err=vbeSetMode(init_mode,NULL)) != VBE_OK) PRINT_VBE_ERR("vbeSetMode",err); if(has_dga()) vbeUnmapVideoBuffer((unsigned long)win.ptr,win.high); @@ -286,13 +283,10 @@ } } -void VESA_VO_Interface::select_frame(unsigned idx) +MPXP_Rc VESA_VO_Interface::select_frame(unsigned idx) { #ifdef CONFIG_VIDIX - if(vidix_server) { - vidix_server->select_frame(vidix,idx); - return; - } + if(vidix) return vidix->select_frame(idx); #endif MSG_DBG3("vo_vesa: select_frame was called\n"); if(!has_dga()) __vbeCopyData(dga_buffer); @@ -306,23 +300,23 @@ } win.ptr = dga_buffer = video_base + multi_buff[(idx+1)%multi_size]; } + return MPXP_Ok; } #define SUBDEV_NODGA 0x00000001UL #define SUBDEV_FORCEDGA 0x00000002UL -uint32_t VESA_VO_Interface::parse_sub_device(const char *sd) +const char* VESA_VO_Interface::parse_sub_device(const char *sd) { - uint32_t flags; - flags = 0; - if(strcmp(sd,"nodga") == 0) { flags |= SUBDEV_NODGA; flags &= ~(SUBDEV_FORCEDGA); } + subdev_flags = 0; + if(strcmp(sd,"nodga") == 0) { subdev_flags |= SUBDEV_NODGA; subdev_flags &= ~(SUBDEV_FORCEDGA); } else - if(strcmp(sd,"dga") == 0) { flags &= ~(SUBDEV_NODGA); flags |= SUBDEV_FORCEDGA; } + if(strcmp(sd,"dga") == 0) { subdev_flags &= ~(SUBDEV_NODGA); subdev_flags |= SUBDEV_FORCEDGA; } #ifdef CONFIG_VIDIX else - if(memcmp(sd,"vidix",5) == 0) vidix_name = &sd[5]; /* priv.vidix_name will be valid within init() */ + if(memcmp(sd,"vidix",5) == 0) return &sd[5]; /* priv.vidix_name will be valid within init() */ #endif - else { MSG_ERR("vo_vesa: Unknown subdevice: '%s'\n", sd); return 0xFFFFFFFFUL; } - return flags; + else { MSG_ERR("vo_vesa: Unknown subdevice: '%s'\n", sd); subdev_flags = 0xFFFFFFFFUL; } + return NULL; } static int __FASTCALL__ check_depth(unsigned bpp) @@ -344,19 +338,6 @@ return VOCAP_NA; } -MPXP_Rc VESA_VO_Interface::query_format(vo_query_fourcc_t* format) const -{ - MSG_DBG3("vo_vesa: query_format was called: %x (%s)\n",format->fourcc,vo_format_name(format->fourcc)); - switch(format->fourcc) { - case IMGFMT_BGR8: format->flags=check_depth(8); break; - case IMGFMT_BGR15: format->flags=check_depth(15); break; - case IMGFMT_BGR16: format->flags=check_depth(16); break; - case IMGFMT_BGR24: format->flags=check_depth(24); break; - case IMGFMT_BGR32: format->flags=check_depth(32); break; - default: break; - } - return MPXP_Ok; -} void VESA_VO_Interface::paintBkGnd() { @@ -683,7 +664,7 @@ } else { cpy_blk_fnc = &VESA_VO_Interface::__vbeCopyBlock; #ifdef CONFIG_VIDIX - if(!vidix_name) + if(!vidix) #endif { if(!(dga_buffer = new(alignmem,64) uint8_t[vmode_info.XResolution*vmode_info.YResolution*dstBpp])) { @@ -705,16 +686,15 @@ /* Below 'return MPXP_False' is impossible */ MSG_V("vo_vesa: Graphics mode was activated\n"); #ifdef CONFIG_VIDIX - if(vidix_name) { - if(vidix_init(vidix,width,height,x_offset,y_offset,dstW, + if(vidix) { + if(vidix->configure(width,height,x_offset,y_offset,dstW, dstH,format,dstBpp, vmode_info.XResolution,vmode_info.YResolution) != MPXP_Ok) { MSG_ERR("vo_vesa: Can't initialize VIDIX driver\n"); - vidix_name = NULL; vesa_term(); return MPXP_False; } else MSG_V("vo_vesa: Using VIDIX\n"); - if(vidix_start(vidix)!=0) { + if(vidix->start()!=0) { vesa_term(); return MPXP_False; } @@ -742,8 +722,28 @@ return MPXP_Ok; } -void VESA_VO_Interface::dri_get_surface_caps(dri_surface_cap_t *caps) const +MPXP_Rc VESA_VO_Interface::query_format(vo_query_fourcc_t* format) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->query_fourcc(format); +#endif + MSG_DBG3("vo_vesa: query_format was called: %x (%s)\n",format->fourcc,vo_format_name(format->fourcc)); + switch(format->fourcc) { + case IMGFMT_BGR8: format->flags=check_depth(8); break; + case IMGFMT_BGR15: format->flags=check_depth(15); break; + case IMGFMT_BGR16: format->flags=check_depth(16); break; + case IMGFMT_BGR24: format->flags=check_depth(24); break; + case IMGFMT_BGR32: format->flags=check_depth(32); break; + default: break; + } + return MPXP_Ok; +} + +void VESA_VO_Interface::get_surface_caps(dri_surface_cap_t *caps) const +{ +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_surface_caps(caps); +#endif caps->caps = has_dga() ? DRI_CAP_VIDEO_MMAPED : DRI_CAP_TEMP_VIDEO; caps->fourcc = dstFourcc; caps->width=has_dga()?vmode_info.XResolution:dstW; @@ -758,32 +758,33 @@ caps->strides[3] = 0; } -void VESA_VO_Interface::dri_get_surface(dri_surface_t *surf) const +void VESA_VO_Interface::get_surface(dri_surface_t *surf) const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_surface(surf); +#endif surf->planes[0] = has_dga()?video_base + multi_buff[surf->idx]:dga_buffer; surf->planes[1] = 0; surf->planes[2] = 0; surf->planes[3] = 0; } +unsigned VESA_VO_Interface::get_num_frames() const { +#ifdef CONFIG_VIDIX + if(vidix) return vidix->get_num_frames(); +#endif + return multi_size; +} + MPXP_Rc VESA_VO_Interface::ctrl(uint32_t request, any_t*data) { + switch(request) { + case VOCTRL_FLUSH_PAGES: #ifdef CONFIG_VIDIX - if(vidix_server) - if(vidix_server->control(vidix,request,data)==MPXP_Ok) return MPXP_Ok; + if(vidix) vidix->flush_page(*(unsigned*)data); + return MPXP_Ok; #endif - switch (request) { - case VOCTRL_QUERY_FORMAT: - return query_format(reinterpret_cast<vo_query_fourcc_t*>(data)); - case VOCTRL_GET_NUM_FRAMES: - *(uint32_t *)data = multi_size; - return MPXP_True; - case DRI_GET_SURFACE_CAPS: - dri_get_surface_caps(reinterpret_cast<dri_surface_cap_t*>(data)); - return MPXP_True; - case DRI_GET_SURFACE: - dri_get_surface(reinterpret_cast<dri_surface_t*>(data)); - return MPXP_True; + default: break; } return MPXP_NA; } Modified: mplayerxp/libvo/vo_x11.cpp =================================================================== --- mplayerxp/libvo/vo_x11.cpp 2012-11-26 17:16:03 UTC (rev 458) +++ mplayerxp/libvo/vo_x11.cpp 2012-11-27 09:44:49 UTC (rev 459) @@ -45,8 +45,7 @@ #include "video_out_internal.h" #include "video_out.h" #ifdef CONFIG_VIDIX -#include "vosub_vidix.h" -#include <vidix/vidix.h> +#include "vidix_system.h" #endif #include "dri_vo.h" #include "xmpcore/mp_image.h" @@ -64,17 +63,19 @@ unsigned flags, const char *title, uint32_t format); - virtual void select_frame(unsigned idx); + virtual MPXP_Rc select_frame(unsigned idx); + virtual void get_surface_caps(dri_surface_cap_t *caps) const; + virtual void get_surface(dri_surface_t *surf) const; + MPXP_Rc query_format(vo_query_fourcc_t* format) const; + virtual unsigned get_num_frames() const; + virtual MPXP_Rc ctrl(uint32_t request, any_t*data); private: - uint32_t parse_sub_device(const char *sd); + const char* parse_sub_device(const char *sd); void resize(int x,int y) const; uint32_t check_events(const vo_resize_t*); void display_image(XImage * myximage) const; - void dri_get_surface_caps(dri_surface_cap_t *caps) const; - void dri_get_surface(dri_surface_t *surf) const; - MPXP_Rc query_format(vo_query_fourcc_t* format) const; uint32_t image_width; uint32_t image_height; @@ -89,9 +90,7 @@ /* xp related variables */ unsigned num_buffers; // 1 - default #ifdef CONFIG_VIDIX - const char * vidix_name; - vidix_server_t* vidix_server; - vidix_priv_t* vidix; + Vidix_System* vidix; void resize_vidix() const; #endif uint32_t subdev_flags; @@ -104,30 +103,27 @@ #include <X11/extensions/XShm.h> #endif -uint32_t X11_VO_Interface::parse_sub_device(const char *sd) +const char* X11_VO_Interface::parse_sub_device(const char *sd) { - uint32_t _flags; - _flags = 0; #ifdef CONFIG_VIDIX - if(memcmp(sd,"vidix",5) == 0) vidix_name = &sd[5]; /* priv.vidix_name will be valid within init() */ - else + if(memcmp(sd,"vidix",5) == 0) return &sd[5]; /* vidix_name will be valid within init() */ #endif - { MSG_ERR("vo_x11: Unknown subdevice: '%s'\n", sd); return 0xFFFFFFFFUL; } - return _flags; + MSG_ERR("vo_x11: Unknown subdevice: '%s'\n", sd); + return NULL; } X11_VO_Interface::X11_VO_Interf... [truncated message content] |