# # Patch managed by http://www.holgerschurig.de/patcher.html # --- MPlayer-1.0pre8.orig/configure~mplayer-imageon +++ MPlayer-1.0pre8.orig/configure @@ -1581,6 +1581,7 @@ _vesa=auto _fbdev=auto _w100=no +_imageon=no _dvb=auto _dvbhead=auto _dxr2=auto @@ -1766,6 +1767,8 @@ --disable-fbdev) _fbdev=no ;; --enable-w100) _w100=yes ;; --disable-w100) _w100=no ;; + --enable-imageon) _imageon=yes ;; + --disable-imageon) _imageon=no ;; --enable-dvb) _dvb=yes ;; --disable-dvb) _dvb=no ;; --enable-dvbhead) _dvbhead=yes ;; @@ -4222,6 +4225,18 @@ fi echores "$_w100" +echocheck "ATI Imageon 100 (imageon)" +if test "$_imageon" = yes ; then + _def_imageon='#define HAVE_IMAGEON 1' + _ld_imageon='-lw100' + _vosrc="$_vosrc vo_imageon.c" + _vomodules="imageon $_vomodules" +else + _def_imageon='#undef HAVE_IMAGEON' + _novomodules="imageon $_novomodules" +fi +echores "$_imageon" + echocheck "DVB" if test "$_dvb" != no ; then @@ -7464,6 +7479,7 @@ CACA_INC = $_inc_caca CACA_LIB = $_ld_caca W100_LIB = $_ld_w100 +IMAGEON_LIB = $_ld_imageon # audio output ALSA_LIB = $_ld_alsa @@ -8262,6 +8278,7 @@ $_def_syncfb $_def_fbdev $_def_w100 +$_def_imageon $_def_dxr2 $_def_dxr3 $_def_dvb --- MPlayer-1.0pre8.orig/Makefile~mplayer-imageon +++ MPlayer-1.0pre8.orig/Makefile @@ -74,7 +74,8 @@ $(DIRECTFB_LIB) \ $(CACA_LIB) \ $(VESA_LIB) \ - $(W100_LIB) + $(W100_LIB) \ + $(IMAGEON_LIB) ifeq ($(EXTERNAL_VIDIX),yes) VO_LIBS += $(EXTERNAL_VIDIX_LIB) --- /dev/null +++ MPlayer-1.0pre8.orig/libvo/vo_imageon.c @@ -0,0 +1,308 @@ +#include +#include +#include +#include + +#include +#include +#include + +static vo_info_t info = +{ + "ATI IMAGEON 100 driver", + "imageon", + "Manuel Teira", + "C760-Openzaurus Testing version" +}; + +LIBVO_EXTERN(imageon) + +#include + +static struct w100privdata_t { + uint8_t config; + ac_device_t *dev; + uint16_t xres; + uint16_t yres; + uint16_t ovwidth; + uint16_t ovheight; + ac_surface_t insurface; + ac_surface_t ovsurface; + uint16_t srcwidth; + uint16_t srcheight; + uint8_t rotate; + uint8_t scale; + ac_point_t ovdst; + ac_point_t dstpos; + ac_overlayprops_t ovprops; + uint32_t format; +} w100_privdata; + +static int preinit(const char *arg) +{ + //Perhaps libw100 should include some code to query the framebuffer + struct w100privdata_t *pdata = &w100_privdata; + + pdata->config = 0; + pdata->xres = 640; + pdata->yres = 480; + pdata->dev = ac_init(pdata->xres, pdata->yres, AC_ROT90); + if (pdata->dev) { + return 0; + } else { + //Put a log message here + return 1; + } +} + + +static void draw_osd(void) +{ +} + +void check_events(void) +{ + mp_msg(MSGT_VO, MSGL_V, "check_events got called\n"); +} + +static int config(uint32_t srcwidth, uint32_t srcheight, + uint32_t dstwidth, uint32_t dstheight, + uint32_t flags, char *title, uint32_t format) +{ + struct w100privdata_t *pdata = &w100_privdata; + uint8_t xscale, yscale; + uint16_t scaledwidth, scaledheight; + + mp_msg(MSGT_VO, MSGL_V, + "vo_imageon: srcwidth:%d, srcheight:%d, " + "dstwidth:%d, dstheight:%d\n", + srcwidth, srcheight, dstwidth, dstheight); + + if (pdata->config) { + ac_overlay_disable(pdata->dev); + ac_free_surface(pdata->dev, &pdata->insurface); + ac_free_surface(pdata->dev, &pdata->ovsurface); + } + + pdata->srcwidth = srcwidth; + pdata->srcheight = srcheight; + + //By the moment, only YUV420 supported + pdata->ovprops.format = OVLFORMAT_YUV420; + pdata->ovprops.portrait_mode = 0; + pdata->ovprops.inv_hor = 0; + pdata->ovprops.inv_ver = 0; + pdata->ovprops.yuv2rgb = 0; + + pdata->rotate = AC_ROT90; + + if (flags & VOFLAG_FULLSCREEN) { + pdata->ovwidth = 240; + pdata->ovheight = 320; + xscale = ac_get_scaler(pdata->ovheight, srcwidth); + yscale = ac_get_scaler(pdata->ovwidth, srcheight); + pdata->scale = (xscale > yscale) ? xscale : yscale; + pdata->ovdst.x = 0; + pdata->ovdst.y = 0; + pdata->ovprops.video_hor_exp = 1; + pdata->ovprops.video_ver_exp = 1; + } else { + pdata->ovwidth = (dstheight + 0xf) & ~0xf; + pdata->ovheight = (dstwidth + 0xf) & ~0xf; + xscale = ac_get_scaler(dstwidth, srcwidth); + yscale = ac_get_scaler(dstheight, srcheight); + pdata->ovdst.x = (pdata->xres - pdata->ovheight) / 2; + pdata->ovdst.y = (pdata->yres - pdata->ovwidth) / 2; + pdata->ovprops.video_hor_exp = 0; + pdata->ovprops.video_ver_exp = 0; + } + + pdata->scale = (xscale > yscale) ? xscale : yscale; + scaledwidth = ac_apply_scaler(srcwidth, pdata->scale); + scaledheight = ac_apply_scaler(srcheight, pdata->scale); + pdata->dstpos.x = (pdata->ovwidth - scaledheight) / 2; + pdata->dstpos.y = (pdata->ovheight - scaledwidth) / 2; + + if (ac_alloc_surface(pdata->dev, &pdata->ovsurface, + FMT_YUV420, + pdata->ovwidth, + pdata->ovheight, + AC_MEM_INTERNAL) == NULL) { + mp_msg(MSGT_VO, MSGL_FATAL, "Unable to allocate ov surface\n"); + return -1; + } + + if (ac_alloc_surface(pdata->dev, &pdata->insurface, + FMT_YUV420, srcwidth, srcheight, + AC_MEM_INTERNAL) == NULL) { + mp_msg(MSGT_VO, MSGL_WARN, + "No room in internal memory for insurface\n"); + if (ac_alloc_surface(pdata->dev, &pdata->insurface, + FMT_YUV420, srcwidth, srcheight, + AC_MEM_EXTERNAL) == NULL) { + mp_msg(MSGT_VO, MSGL_FATAL, + "Unable to allocate surface\n"); + ac_free_surface(pdata->dev, &pdata->ovsurface); + return -1; + } + } + + ac_clear_surface(pdata->dev, &pdata->ovsurface); + ac_clear_surface(pdata->dev, &pdata->insurface); + + + mp_msg(MSGT_VO, MSGL_V, + "vo_imageon: rotate:%d scale:%d ovwidth:%d, ovheight:%d, " + "ovdst(x:%d, y:%d) dstpos(x:%d,y:%d)\n", + pdata->rotate, + pdata->scale, + pdata->ovwidth, + pdata->ovheight, + pdata->ovdst.x, + pdata->ovdst.y, + pdata->dstpos.x, + pdata->dstpos.y); + + ac_overlay_setup(pdata->dev, &pdata->ovsurface, &pdata->ovsurface.rect, + &pdata->ovprops, 0); + ac_overlay_setpos(pdata->dev, &pdata->ovdst); + ac_overlay_enable(pdata->dev); + + pdata->config = 1; + return 0; +} + +static int draw_slice(uint8_t *image[], int stride[], + int w, int h, int x, int y) +{ + struct w100privdata_t *pdata = &w100_privdata; + ac_rect_t dstrect; + ac_surface_t *dstsurface = &pdata->insurface; + int plane; + mp_msg(MSGT_VO, MSGL_V, + "vo_imageon: draw_slice(w:%d,h:%d,x:%d,y:%d)\n", + w, h, x, y); + + ac_reset_ctx(pdata->dev); + for (plane = 0; plane <= V_PLANE; plane++) { + mp_msg(MSGT_VO, MSGL_V, "Plane: %d, Stride: %d\n", + plane, stride[plane]); + dstrect.x = x; + dstrect.y = y; + dstrect.w = w; + dstrect.h = h; + ac_host2planerect(pdata->dev, + image[plane], + &dstrect, + &pdata->insurface, + plane); + } + return 0; +} + +static int draw_frame(uint8_t *frame[]) +{ + struct w100privdata_t *pdata = &w100_privdata; + mp_msg(MSGT_VO, MSGL_V, "vo_imageon: draw_frame() not implemented!\n"); + +} + +static void flip_page(void) +{ + struct w100privdata_t *pdata = &w100_privdata; + int plane; + ac_rect_t srcrect; + ac_point_t dstpoint; + ac_surface_t *insurface = &pdata->insurface; + ac_surface_t *ovsurface = &pdata->ovsurface; + ac_surfspec_t *surfspec = &ac_surfspecs[ovsurface->format]; + + mp_msg(MSGT_VO, MSGL_V, "vo_imageon: flip_page\n"); + + srcrect.x = 0; + srcrect.y = 0; + + ac_reset_ctx(pdata->dev); + if (pdata->rotate != AC_ROT0) { + ac_set_xform(pdata->dev, pdata->rotate, AC_NOMIRROR); + } + ac_disable_dbuf_update(pdata->dev); + ac_waitidle(pdata->dev); + for (plane = Y_PLANE; plane < surfspec->nplanes; plane++) { + ac_setsrcplane(pdata->dev, insurface, plane); + ac_setdstplane(pdata->dev, ovsurface, plane); + ac_prepare_scaleblt(pdata->dev, DP_DST_8BPP); + srcrect.w = pdata->srcwidth / surfspec->planes[plane].xsubsampling; + srcrect.h = pdata->srcheight / surfspec->planes[plane].ysubsampling; + dstpoint.x = pdata->dstpos.x / surfspec->planes[plane].xsubsampling; + dstpoint.y = pdata->dstpos.y / surfspec->planes[plane].ysubsampling; + mp_msg(MSGT_VO, MSGL_V, + "vo_imageon: scaleblt src(x:%d,y:%d,w:%d,h:%d)" + "dst(%d,%d)" + "scale(%d)\n", + srcrect.x, srcrect.y, + srcrect.w, srcrect.h, + dstpoint.x, dstpoint.y, + pdata->scale); + ac_scaleblt(pdata->dev, &srcrect, &dstpoint, + pdata->scale, pdata->scale); + } + ac_enable_dbuf_update(pdata->dev); +} + +static void uninit(void) +{ + struct w100privdata_t *pdata = &w100_privdata; + ac_overlay_disable(pdata->dev); + ac_finish(pdata->dev); +} + +static int control(uint32_t request, void *data, ...) +{ + struct w100privdata_t *pdata = &w100_privdata; + switch (request) { + case VOCTRL_QUERY_FORMAT: + return query_format(*((uint32_t *)data)); + case VOCTRL_FULLSCREEN: + mp_msg(MSGT_VO, MSGL_V, "vo_imageon: Asked for fullscreen\n"); + } + return VO_NOTIMPL; +} + +static int query_format(uint32_t format) +{ + mp_msg(MSGT_VO, MSGL_V, + "vo_imageon: query_format was called: %x (%s)\n", + format, vo_format_name(format)); + + if (IMGFMT_IS_RGB(format)) { + return 0; + + switch (IMGFMT_RGB_DEPTH(format)) { + case 16: + return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | + VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | + VFCAP_OSD | VFCAP_ACCEPT_STRIDE; + break; + } + } else { + /* Planar YUV Formats */ + switch (format) { + case IMGFMT_YV12: + case IMGFMT_IYUV: + case IMGFMT_I420: + case IMGFMT_YVU9: + case IMGFMT_IF09: + case IMGFMT_Y8: + case IMGFMT_Y800: + return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | + VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | + VFCAP_OSD | VFCAP_ACCEPT_STRIDE; + break; + } + } + + return 0; +} + +