| Submitter | Martin Jansa |
|---|---|
| Date | Nov. 30, 2011, 8:06 a.m. |
| Message ID | <8aed264c593ee085d99e335ae04bed95c2536a0b.1322640244.git.Martin.Jansa@gmail.com> |
| Download | mbox | patch |
| Permalink | /patch/15777/ |
| State | Rejected |
| Headers | show |
Comments
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Op 30-11-11 09:06, Martin Jansa schreef: > * not everybody has FEED_ARCH in OVERRIDES * and not everybody has > PKGARCHCOMPAT_ARMV7A enabled so we would need to duplicate armv7a and > armv7a-vfp-neon NAK on that. I'm not going to cripple mplayer because some distros lack FEED_ARCH in overrides. > * example of working omapfb patch and optimizations is in meta-smartphone > layer > http://git.shr-project.org/git/?p=meta-smartphone.git;a=commit;h=483afbee82869a0b2dacadc4b9580c47dcb59d26 I > do agree that that omapfb patch belongs in a BSP, not in the recipe. regards, Koen > > Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- > .../0001-video-out-for-omapfb-support.patch | 826 > -------------------- meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb | > 21 +- 2 files changed, 1 insertions(+), 846 deletions(-) delete mode > 100644 > meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > diff --git > a/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > b/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > deleted file mode 100644 > index a362ef6..0000000 --- > a/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > +++ /dev/null > @@ -1,826 +0,0 @@ -From 2a42cec41a018008d07ea33b2b91dca191d78481 Mon Sep > 17 00:00:00 2001 -From: Martin Jansa <Martin.Jansa@gmail.com> -Date: Thu, > 25 Nov 2010 16:49:53 +0100 -Subject: [PATCH] video out for omapfb > support - -Upstream-Status: Pending -Signed-off-by: Martin Jansa > <Martin.Jansa@gmail.com> -Signed-off-by: Koen Kooi > <koen@dominion.thruhere.net> ---- - Makefile | 2 +- - > libvo/video_out.c | 2 + - libvo/vo_omapfb.c | 591 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ - libvo/yuv.S > | 170 +++++++++++++++ - 4 files changed, 764 insertions(+), 1 > deletions(-) - create mode 100644 libvo/vo_omapfb.c - create mode 100644 > libvo/yuv.S - -diff --git a/Makefile b/Makefile -index 83304a2..1e88d40 > 100644 ---- a/Makefile -+++ b/Makefile -@@ -450,7 +450,7 @@ > SRCS_MPLAYER-$(DIRECTFB) += libvo/vo_directfb2.c libvo/vo_dfbmga.c - > SRCS_MPLAYER-$(DIRECTX) += libao2/ao_dsound.c libvo/vo_directx.c - > SRCS_MPLAYER-$(DXR3) += libvo/vo_dxr3.c - SRCS_MPLAYER-$(ESD) > += libao2/ao_esd.c --SRCS_MPLAYER-$(FBDEV) += libvo/vo_fbdev.c > libvo/vo_fbdev2.c -+SRCS_MPLAYER-$(FBDEV) += libvo/vo_fbdev.c > libvo/vo_fbdev2.c libvo/vo_omapfb.c libvo/yuv.S - SRCS_MPLAYER-$(FFMPEG) > += libvo/vo_png.c - SRCS_MPLAYER-$(GGI) += libvo/vo_ggi.c - > SRCS_MPLAYER-$(GIF) += libvo/vo_gif89a.c -diff --git > a/libvo/video_out.c b/libvo/video_out.c -index e796784..1433834 100644 > ---- a/libvo/video_out.c -+++ b/libvo/video_out.c -@@ -95,6 +95,7 @@ > extern struct vo_driver video_out_null; - extern struct vo_driver > video_out_bl; - extern struct vo_driver video_out_fbdev; - extern struct > vo_driver video_out_fbdev2; -+extern struct vo_driver video_out_omapfb; - > extern struct vo_driver video_out_svga; - extern struct vo_driver > video_out_png; - extern struct vo_driver video_out_ggi; -@@ -193,6 +194,7 > @@ const struct vo_driver *video_out_drivers[] = - #ifdef CONFIG_FBDEV - > &video_out_fbdev, - &video_out_fbdev2, -+ > &video_out_omapfb, - #endif - #ifdef CONFIG_SVGALIB - > &video_out_svga, -diff --git a/libvo/vo_omapfb.c b/libvo/vo_omapfb.c -new > file mode 100644 -index 0000000..7bd8927 ---- /dev/null -+++ > b/libvo/vo_omapfb.c -@@ -0,0 +1,591 @@ -+/* -+ -+Copyright (C) 2008 > Gregoire Gentil <gregoire@gentil.com> -+Portions Copyright (C) 2009 > Howard Chu <hyc@symas.com> -+This file adds an optimized vo output to > mplayer for the OMAP platform. This is a first pass and an attempt to > help to improve -+media playing on the OMAP platform. The usual > disclaimer comes here: this code is provided without any warranty. -+Many > bugs and issues still exist. Feed-back is welcome. -+ -+This output uses > the yuv420_to_yuv422 conversion from Mans Rullgard, and is heavily > inspired from the work of Siarhei Siamashka. -+I would like to thank > those two persons here, without them this code would certainly not > exist. -+ -+Two options of the output are available: -+fb_overlay_only > (disabled by default): only the overlay is drawn. X11 stuff is ignored. > -+dbl_buffer (disabled by default): add double buffering. Some tearsync > flags are probably missing in the code. -+ -+Syntax is the following: > -+mplayer -ao alsa -vo omapfb /test.avi -+mplayer -nosound -vo > omapfb:fb_overlay_only:dbl_buffer /test.avi -+ -+You need to have two > planes on your system. On beagleboard, it means something like: > video=omapfb:vram:2M,vram:4M -+ -+Known issues: -+1) A green line or some > vertical lines (if mplayer decides to draw bands instead of frame) may > appear. -+It's an interpolation bug in the color conversion that needs to > be fixed -+ -+2) The color conversion accepts only 16-pixel multiple for > width and height. -+ -+3) The scaling down is disabled as the scaling > down kernel patch for the OMAP3 platform doesn't seem to work yet. -+ -+ > * This program 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. -+ * -+ * This program 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 this program; if not, write to the Free > Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > 02110-1301 USA -+*/ -+ -+#include <stdio.h> -+#include <stdlib.h> > -+#include <string.h> -+#include <fcntl.h> -+#include <unistd.h> > -+#include <errno.h> -+ -+#include <sys/mman.h> -+#include <sys/ioctl.h> > -+#include <linux/fb.h> -+ -+#include "config.h" -+#include > "video_out.h" -+#include "video_out_internal.h" -+#include > "fastmemcpy.h" -+#include "sub/sub.h" -+#include "mp_msg.h" -+#include > "omapfb.h" -+#include "x11_common.h" -+ -+#include > "libswscale/swscale.h" -+#include "libmpcodecs/vf_scale.h" -+#include > "libavcodec/avcodec.h" -+ -+#include "aspect.h" -+ -+#include > "subopt-helper.h" -+ -+#include <X11/Xlib.h> -+#include <X11/Xutil.h> > -+#include <X11/Xatom.h> -+#include "wskeys.h" -+ -+static vo_info_t info > = { -+ "omapfb video driver", -+ "omapfb", -+ "", -+ "" -+}; -+ > -+LIBVO_EXTERN(omapfb) -+ -+static int fb_overlay_only = 0; // if set, we > need only framebuffer overlay, but do not need any x11 code -+static int > dbl_buffer = 0; -+static int fullscreen_flag = 0; -+static int > plane_ready = 0; -+static uint32_t drwX, drwY; -+ -+extern void > yuv420_to_yuv422(uint8_t *yuv, uint8_t *y, uint8_t *u, uint8_t *v, int w, > int h, int yw, int cw, int dw); -+static struct fb_var_screeninfo > sinfo_p0; -+static struct fb_var_screeninfo sinfo; -+static struct > fb_var_screeninfo sinfo2; -+static struct fb_fix_screeninfo finfo; > -+static struct omapfb_mem_info minfo; -+static struct omapfb_plane_info > pinfo; -+static int xoff, yoff; -+ -+static struct { -+ unsigned x; -+ > unsigned y; -+ uint8_t *buf; -+} fb_pages[2]; -+static int dev_fd = > -1; -+static int fb_page_flip = 0; -+static int page = 0; -+static void > omapfb_update(int x, int y, int out_w, int out_h, int show); -+ -+extern > void mplayer_put_key( int code ); -+#include "input/keycodes.h" -+ > -+#define TRANSPARENT_COLOR_KEY 0xff0 -+ -+static Display *display = > NULL; // pointer to X Display structure. -+static int screen_num; // > number of screen to place the window on. -+static Window win = 0; > -+static Window parent = 0; // pointer to the newly created window. -+ > -+/* This is used to intercept window closing requests. */ -+static Atom > wm_delete_window; -+ -+ -+void vo_calc_drwXY(uint32_t *drwX, uint32_t > *drwY) -+{ -+ *drwX = *drwY = 0; -+ if (vo_fs) { -+ > aspect(&vo_dwidth, &vo_dheight, A_ZOOM); -+ vo_dwidth = > FFMIN(vo_dwidth, vo_screenwidth); -+ vo_dheight = > FFMIN(vo_dheight, vo_screenheight); -+ *drwX = > (vo_screenwidth - vo_dwidth) / 2; -+ *drwY = (vo_screenheight > - vo_dheight) / 2; -+ mp_msg(MSGT_VO, MSGL_V, "[vo-fs] dx: %d dy: > %d dw: %d dh: %d\n", -+ *drwX, *drwY, vo_dwidth, > vo_dheight); -+ } else if (WinID == 0) { -+ *drwX = vo_dx; -+ > *drwY = vo_dy; -+ } -+} -+ -+static void getPrimaryPlaneInfo() -+{ -+ > int dev_fd = open("/dev/fb0", O_RDWR); -+ -+ if (dev_fd == -1) { -+ > mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error /dev/fb0\n"); -+ > return -1; -+ } -+ -+ ioctl(dev_fd, FBIOGET_VSCREENINFO, > &sinfo_p0); -+ close(dev_fd); -+} -+ -+/** -+ * Function to get the > offset to be used when in windowed mode -+ * or when using -wid option -+ > */ -+static void x11_get_window_abs_position(Display *display, Window > window, -+ int *wx, int *wy, > int *ww, int *wh) -+{ -+ Window root, parent; -+ Window *child; -+ > unsigned int n_children; -+ XWindowAttributes attribs; -+ -+ /* Get > window attributes */ -+ XGetWindowAttributes(display, window, > &attribs); -+ -+ /* Get relative position of given window */ -+ *wx > = attribs.x; -+ *wy = attribs.y; -+ if (ww) -+ *ww = > attribs.width; -+ if (wh) -+ *wh = attribs.height; -+ -+ /* > Query window tree information */ -+ XQueryTree(display, window, &root, > &parent, &child, &n_children); -+ if (parent) -+ { -+ int x, > y; -+ /* If we have a parent we must go there and discover his > position*/ -+ x11_get_window_abs_position(display, parent, &x, &y, > NULL, NULL); -+ *wx += x; -+ *wy += y; -+ } -+ -+ /* If > we had children, free it */ -+ if(n_children) -+ XFree(child); > -+} -+ -+static void x11_check_events(void) -+{ -+ int e = > vo_x11_check_events(mDisplay); -+ -+ if (e & VO_EVENT_RESIZE) -+ > vo_calc_drwXY(&drwX, &drwY); -+ -+ if (e & VO_EVENT_EXPOSE || e & > VO_EVENT_RESIZE) -+ { -+ vo_xv_draw_colorkey(drwX, drwY, > vo_dwidth - 1, vo_dheight - 1); -+ omapfb_update(0, 0, 0, 0, 1); > -+ } -+} -+ -+static void x11_uninit() -+{ -+ if (display) { -+ > XCloseDisplay(display); -+ display = NULL; -+ } -+} -+ -+/** -+ > * Initialize framebuffer -+ */ -+static int preinit(const char *arg) -+{ > -+ opt_t subopts[] = { -+ {"fb_overlay_only", OPT_ARG_BOOL, > &fb_overlay_only, NULL}, -+ {"dbl_buffer", OPT_ARG_BOOL, > &dbl_buffer, NULL}, -+ {NULL} -+ }; -+ -+ if > (subopt_parse(arg, subopts) != 0) { -+ mp_msg(MSGT_VO, MSGL_FATAL, > "[omapfb] unknown suboptions: %s\n", arg); -+ return -1; -+ } > -+ -+ getPrimaryPlaneInfo(); -+ dev_fd = open("/dev/fb1", O_RDWR); > -+ -+ if (dev_fd == -1) { -+ mp_msg(MSGT_VO, MSGL_FATAL, > "[omapfb] Error /dev/fb1\n"); -+ return -1; -+ } -+ -+ > ioctl(dev_fd, FBIOGET_VSCREENINFO, &sinfo); -+ ioctl(dev_fd, > OMAPFB_QUERY_PLANE, &pinfo); -+ ioctl(dev_fd, OMAPFB_QUERY_MEM, > &minfo); -+ -+ if (!fb_overlay_only && !vo_init()) -+ { -+ > mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Could not open X, overlay > only...\n"); -+ fb_overlay_only = 1; -+ } -+ -+ return 0; > -+} -+ -+static void omapfb_update(int x, int y, int out_w, int out_h, > int show) -+{ -+ int xres, yres; -+ if (!fb_overlay_only) -+ > x11_get_window_abs_position(mDisplay, vo_window, &x, &y, &out_w, > &out_h); -+ -+ /* Check for new screen rotation */ -+ ioctl(dev_fd, > FBIOGET_VSCREENINFO, &sinfo2); -+ if (sinfo2.rotate != > sinfo_p0.rotate) -+ getPrimaryPlaneInfo(); -+ -+ if ( (!x && !y > && !out_w && !out_h) || -+ (out_w < sinfo.xres_virtual / 4) || > (out_h < sinfo.yres_virtual / 4) || /* HW can't scale down by more than > 4x */ -+ (out_w > sinfo.xres_virtual * 8) || (out_h > > sinfo.yres_virtual * 8) ) { /* HW can't scale up by more than 8x */ -+ > pinfo.enabled = 0; -+ pinfo.pos_x = 0; -+ pinfo.pos_y = 0; > -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+ return; -+ > } -+ -+ xres = sinfo.xres_virtual; -+ yres = sinfo.yres_virtual; > -+ -+ /* Handle clipping: if the left or top edge of the window goes > -+ * offscreen, clamp the overlay to the left or top edge of the -+ > * screen, and set the difference into the frame offset. Also -+ * > decrease the overlay size by the offset. The offset must -+ * take > window scaling into account as well. -+ * -+ * Likewise, if the > right or bottom edge of the window goes -+ * offscreen, clamp the > overlay to the right or bottom edge of -+ * the screen, and decrease > the overlay size accordingly. The -+ * hardware will truncate the > output accordingly, so no offset -+ * is needed. Also take window > scaling into account. -- hyc -+ */ -+ if (x < 0) { -+ /* > clamp to left edge */ -+ xoff = -x; -+ if (out_w != > sinfo.xres_virtual) { -+ /* account for scaling */ -+ > xoff *= sinfo.xres_virtual; -+ xoff /= out_w; -+ } -+ > xres -= xoff; -+ out_w += x; -+ x = 0; -+ } else { -+ > xoff = 0; -+ if (x + out_w > sinfo_p0.xres) { -+ /* > clamp to right edge */ -+ int diff = sinfo_p0.xres - x; -+ > if (out_w != sinfo.xres_virtual) { -+ /* account for > scaling */ -+ xres = diff * sinfo.xres_virtual; -+ > xres /= out_w; -+ } else { -+ xres = diff; -+ > } -+ out_w = diff; -+ } -+ } -+ -+ if (y < 0) { > -+ /* clamp to top edge - this seldom occurs since the window -+ > * titlebar is usually forced to stay visible -+ */ -+ yoff > = -y; -+ if (out_h != sinfo.yres_virtual) { -+ /* > account for scaling */ -+ yoff *= sinfo.yres_virtual; -+ > yoff /= out_h; -+ } -+ yres -= yoff; -+ out_h += y; > -+ y = 0; -+ } else { -+ yoff = 0; -+ if (y + > out_h > sinfo_p0.yres) { -+ /* clamp to bottom edge */ -+ > int diff = sinfo_p0.yres - y; -+ if (out_h != > sinfo.yres_virtual) { -+ /* account for scaling */ -+ > yres = diff * sinfo.yres_virtual; -+ yres /= out_h; -+ > } else { -+ yres = diff; -+ } -+ > out_h = diff; -+ } -+ } -+ -+ if (xoff & 1) -+ > xoff++; -+ if (xres & 1) -+ xres--; -+ -+ pinfo.enabled = > show; -+ pinfo.pos_x = x; -+ pinfo.pos_y = y; -+ pinfo.out_width > = out_w; -+ pinfo.out_height = out_h; -+ -+ sinfo.xoffset = > fb_pages[page].x + xoff; -+ sinfo.yoffset = fb_pages[page].y + yoff; > -+ /* If we had to change the overlay dimensions, update it */ -+ > if (xres != sinfo2.xres || yres != sinfo2.yres || -+ sinfo.xoffset > != sinfo2.xoffset || -+ sinfo.yoffset != sinfo2.yoffset) { -+ > sinfo.xres = xres; -+ sinfo.yres = yres; -+ sinfo.rotate = > sinfo2.rotate; -+ ioctl(dev_fd, FBIOPUT_VSCREENINFO, &sinfo); -+ > } -+ -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+} -+ -+static int > config(uint32_t width, uint32_t height, uint32_t d_width, -+ uint32_t > d_height, uint32_t flags, char *title, -+ uint32_t format) -+{ -+ > uint8_t *fbmem; -+ int i; -+ struct omapfb_color_key color_key; -+ > -+ XVisualInfo vinfo; -+ XSetWindowAttributes xswa; -+ > XWindowAttributes attribs; -+ unsigned long xswamask; -+ int > depth; -+ -+ Window root, parent; -+ Window *child; -+ unsigned > int n_children; -+ -+ fullscreen_flag = flags & VOFLAG_FULLSCREEN; -+ > if (!fb_overlay_only) -+ { -+ if (!title) -+ title = > "MPlayer OMAPFB (X11/FB) render"; -+ -+ > XGetWindowAttributes(mDisplay, mRootWin, &attribs); -+ depth = > attribs.depth; -+ if (depth != 15 && depth != 16 && depth != 24 && > depth != 32) -+ depth = 24; -+ > XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); -+ -+ > xswa.border_pixel = 0; -+ xswa.background_pixel = xv_colorkey = > TRANSPARENT_COLOR_KEY; -+ -+ xswamask = CWBackPixel | > CWBorderPixel; -+ xv_ck_info.method = CK_METHOD_BACKGROUND; -+ -+ > vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, vo_dwidth, vo_dheight, -+ > flags, CopyFromParent, "omapfb", title); -+ > XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); -+ -+ > /* Need to receive events on the parent window -- so when it is -+ > moved / resized / etc., we know. */ -+ if(WinID > 0) -+ { > -+ /* Query window tree information */ -+ > XQueryTree(mDisplay, vo_window, &root, &parent, &child, &n_children); -+ > if (n_children) -+ XFree(child); -+ -+ > XUnmapWindow(mDisplay, vo_window); -+ if (parent) -+ > XSelectInput(mDisplay, parent, StructureNotifyMask); -+ > XMapWindow(mDisplay, vo_window); -+ } -+ -+ > vo_calc_drwXY(&drwX, &drwY); -+ vo_xv_draw_colorkey(drwX, drwY, > vo_dwidth - 1, vo_dheight - 1); -+ } -+ -+ fbmem = mmap(NULL, > minfo.size, PROT_READ|PROT_WRITE, MAP_SHARED, dev_fd, 0); -+ if (fbmem > == MAP_FAILED) { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error > mmap\n"); -+ return -1; -+ } -+ -+ for (i = 0; i < > minfo.size / 4; i++) -+ ((uint32_t*)fbmem)[i] = 0x80008000; -+ -+ > sinfo.xres = width & ~15; -+ sinfo.yres = height & ~15; -+ > sinfo.xoffset = 0; -+ sinfo.yoffset = 0; -+ sinfo.nonstd = > OMAPFB_COLOR_YUY422; -+ -+ fb_pages[0].x = 0; -+ fb_pages[0].y = > 0; -+ fb_pages[0].buf = fbmem; -+ -+ if (dbl_buffer && minfo.size > >= sinfo.xres * sinfo.yres * 2) { -+ sinfo.xres_virtual = > sinfo.xres; -+ sinfo.yres_virtual = sinfo.yres * 2; -+ > fb_pages[1].x = 0; -+ fb_pages[1].y = sinfo.yres; -+ > fb_pages[1].buf = fbmem + sinfo.xres * sinfo.yres * 2; -+ > fb_page_flip = 1; -+ } else { -+ sinfo.xres_virtual = > sinfo.xres; -+ sinfo.yres_virtual = sinfo.yres; -+ > fb_page_flip = 0; -+ } -+ -+ ioctl(dev_fd, FBIOPUT_VSCREENINFO, > &sinfo); -+ ioctl(dev_fd, FBIOGET_FSCREENINFO, &finfo); -+ -+ if > (WinID <= 0) { -+ if (fullscreen_flag) { -+ > omapfb_update(0, 0, sinfo_p0.xres, sinfo_p0.yres, 1); -+ } else { > -+ omapfb_update(sinfo_p0.xres / 2 - sinfo.xres / 2, > sinfo_p0.yres / 2 - sinfo.yres / 2, sinfo.xres, sinfo.yres, 1); -+ > } -+ } -+ -+ color_key.channel_out = OMAPFB_CHANNEL_OUT_LCD; -+ > color_key.background = 0x0; -+ color_key.trans_key = > TRANSPARENT_COLOR_KEY; -+ if (fb_overlay_only) -+ > color_key.key_type = OMAPFB_COLOR_KEY_DISABLED; -+ else -+ > color_key.key_type = OMAPFB_COLOR_KEY_GFX_DST; -+ ioctl(dev_fd, > OMAPFB_SET_COLOR_KEY, &color_key); -+ -+ plane_ready = 1; -+ return > 0; -+} -+ -+static void draw_alpha(int x0, int y0, int w, int h, unsigned > char *src, unsigned char *srca, int stride) -+{ -+ > vo_draw_alpha_yuy2(w, h, src, srca, stride, fb_pages[page].buf + y0 * > finfo.line_length + x0 * 2, finfo.line_length); -+} -+ -+static void > draw_osd(void) -+{ -+ vo_draw_text(sinfo.xres, sinfo.yres, > draw_alpha); -+} -+ -+static int draw_frame(uint8_t *src[]) -+{ -+ > return 1; -+} -+ -+static int draw_slice(uint8_t *src[], int stride[], > int w, int h, int x, int y) -+{ -+ if (x!=0) -+ return 0; -+ -+ > if (!plane_ready) -+ return 0; -+ -+ ioctl(dev_fd, > OMAPFB_SYNC_GFX); -+ -+ yuv420_to_yuv422(fb_pages[page].buf + y * > finfo.line_length, src[0], src[1], src[2], w & ~15, h, stride[0], > stride[1], finfo.line_length); -+ return 0; -+} -+ -+static void > flip_page(void) -+{ -+ if (fb_page_flip) { -+ sinfo.xoffset = > fb_pages[page].x + xoff; -+ sinfo.yoffset = fb_pages[page].y + > yoff; -+ ioctl(dev_fd, FBIOPAN_DISPLAY, &sinfo); -+ page ^= > fb_page_flip; -+ } -+} -+ -+static int query_format(uint32_t format) > -+{ -+ // For simplicity pretend that we can only do YV12, support > for -+ // other formats can be added quite easily if/when needed -+ > if (format != IMGFMT_YV12) -+ return 0; -+ -+ return > VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | > VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; -+} -+ -+ -+/** -+ * Uninitialize > framebuffer -+ */ -+static void uninit() -+{ -+ pinfo.enabled = 0; -+ > ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+ -+ if (!fb_overlay_only) > { -+ struct omapfb_color_key color_key; -+ > color_key.channel_out = OMAPFB_CHANNEL_OUT_LCD; -+ > color_key.key_type = OMAPFB_COLOR_KEY_DISABLED; -+ ioctl(dev_fd, > OMAPFB_SET_COLOR_KEY, &color_key); -+ } -+ -+ close(dev_fd); -+ -+ > if (!fb_overlay_only) -+ x11_uninit(); -+} -+ -+ -+static int > control(uint32_t request, void *data, ...) -+{ -+ switch (request) { > -+ case VOCTRL_QUERY_FORMAT: -+ return > query_format(*((uint32_t*)data)); -+ case VOCTRL_FULLSCREEN: { -+ > if (WinID > 0) return VO_FALSE; -+ if (fullscreen_flag) { -+ > if (!fb_overlay_only) -+ vo_x11_fullscreen(); -+ > fullscreen_flag = 0; -+ omapfb_update(sinfo_p0.xres / 2 - > sinfo.xres / 2, sinfo_p0.yres / 2 - sinfo.yres / 2, sinfo.xres, > sinfo.yres, 1); -+ } else { -+ if > (!fb_overlay_only) -+ vo_x11_fullscreen(); -+ > fullscreen_flag = 1; -+ omapfb_update(0, 0, sinfo_p0.xres, > sinfo_p0.yres, 1); -+ } -+ return VO_TRUE; -+ > } -+ case VOCTRL_UPDATE_SCREENINFO: -+ > update_xinerama_info(); -+ return VO_TRUE; -+ } -+ > return VO_NOTIMPL; -+} -+ -+ -+static void check_events(void) -+{ -+ > if (!fb_overlay_only) -+ x11_check_events(); -+} -diff --git > a/libvo/yuv.S b/libvo/yuv.S -new file mode 100644 -index > 0000000..1cd2c1d ---- /dev/null -+++ b/libvo/yuv.S -@@ -0,0 +1,170 @@ > -+/* -+ Copyright (C) 2008 Mans Rullgard -+ -+ Permission is hereby > granted, free of charge, to any person -+ obtaining a copy of this > software and associated documentation -+ files (the "Software"), to > deal in the Software without -+ restriction, including without > limitation the rights to use, copy, -+ modify, merge, publish, > distribute, sublicense, and/or sell copies -+ of the Software, and to > permit persons to whom the Software is -+ furnished to do so, subject > to the following conditions: -+ -+ The above copyright notice and this > permission notice shall be -+ included in all copies or substantial > portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED "AS IS", > WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT > LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A > PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE > AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR > OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE > OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ */ -+ -+ > .macro mov32 rd, val -+ movw \rd, #:lower16:\val -+ > movt \rd, #:upper16:\val -+ .endm -+ -+ .fpu > neon -+ .text -+ -+@ yuv420_to_yuv422(uint8_t *yuv, uint8_t *y, > uint8_t *u, uint8_t *v, -+@ int w, int h, int yw, int > cw, int dw) -+ -+#define yuv r0 -+#define y r1 -+#define u r2 > -+#define v r3 -+#define w r4 -+#define h r5 -+#define yw r6 > -+#define cw r7 -+#define dw r8 -+ -+#define tyuv r9 -+#define ty > r10 -+#define tu r11 -+#define tv r12 -+#define i lr -+ -+ > .global yuv420_to_yuv422 -+ .func yuv420_to_yuv422 > -+yuv420_to_yuv422: -+ push {r4-r11,lr} -+ add > r4, sp, #36 -+.Ldo_conv: -+ ldm r4, {r4-r8} -+ > push {r4} -+1: -+ mov tu, u -+ mov > tv, v -+ vld1.64 {d2}, [u,:64], cw @ u0 -+ > vld1.64 {d3}, [v,:64], cw @ v0 -+ mov > tyuv, yuv -+ mov ty, y -+ vzip.8 d2, > d3 @ u0v0 -+ mov i, #16 -+2: > -+ pld [y, #64] -+ vld1.64 {d0, d1}, > [y,:128], yw @ y0 -+ pld [u, #64] -+ > subs i, i, #4 -+ vld1.64 {d6}, > [u,:64], cw @ u2 -+ pld [y, #64] -+ > vld1.64 {d4, d5}, [y,:128], yw @ y1 -+ pld > [v, #64] -+ vld1.64 {d7}, [v,:64], cw @ v2 > -+ pld [y, #64] -+ vld1.64 {d16,d17}, > [y,:128], yw @ y2 -+ vzip.8 d6, d7 > @ u2v2 -+ pld [u, #64] -+ vld1.64 > {d22}, [u,:64], cw @ u4 -+ pld [v, #64] > -+ vld1.64 {d23}, [v,:64], cw @ v4 -+ > pld [y, #64] -+ vld1.64 {d20,d21}, [y,:128], > yw @ y3 -+ vmov q9, q3 > @ u2v2 -+ vzip.8 d22, d23 @ u4v4 > -+ vrhadd.u8 q3, q1, q3 @ u1v1 -+ > vzip.8 q0, q1 @ y0u0y0v0 -+ vmov > q12, q11 @ u4v4 -+ vzip.8 q2, q3 > @ y1u1y1v1 -+ vrhadd.u8 q11, q9, q11 @ > u3v3 -+ vst1.64 {d0-d3}, [yuv,:128], dw @ > y0u0y0v0 -+ vzip.8 q8, q9 @ > y2u2y2v2 -+ vst1.64 {d4-d7}, [yuv,:128], dw @ > y1u1y1v1 -+ vzip.8 q10, q11 @ > y3u3y3v3 -+ vst1.64 {d16-d19}, [yuv,:128], dw @ > y2u2y2v2 -+ vmov q1, q12 -+ vst1.64 > {d20-d23}, [yuv,:128], dw @ y3u3y3v3 -+ bgt 2b > -+ -+ subs w, w, #16 -+ add > yuv, tyuv, #32 -+ add y, ty, #16 -+ add > u, tu, #8 -+ add v, tv, #8 -+ bgt > 1b -+ -+ ldr w, [sp] -+ subs h, > h, #16 -+ add yuv, yuv, dw, lsl #4 -+ sub > yuv, yuv, w, lsl #1 -+ add y, y, yw, lsl #4 > -+ sub y, y, w -+ add u, > u, cw, lsl #3 -+ sub u, u, w, asr #1 -+ > add v, v, cw, lsl #3 -+ sub v, v, > w, asr #1 -+ bgt 1b -+ -+ pop > {r3-r11,pc} -+ .endfunc -+ -+ .func neon_open > -+neon_open: -+ push {r4-r8,lr} -+ ldrd > r4, r5, [r0, #16] -+ ldrd r6, r7, [r0, #24] -+ > lsl r8, r4, #1 -+ mov32 r0, conv_params > -+ stm r0, {r4-r8} -+ mov r0, #0 > -+ pop {r4-r8,pc} -+ .endfunc -+ -+ > .func neon_convert -+neon_convert: -+ push > {r4-r11,lr} -+ ldr r0, [r0] -+ mov32 > r4, conv_params -+ ldm r1, {r1-r3} -+ b > .Ldo_conv -+ .endfunc -+ -+ .func neon_nop -+neon_nop: -+ > bx lr -+ .endfunc -+ -+ .section .bss > -+conv_params: -+ .skip 5*4 -+ .size > conv_params, . - conv_params -+ -+ .section .rodata > -+.Lname: .asciz "neon" -+ofb_pixconv_neon: -+ .word > .Lname -+ .word 0 @ flags -+ .word > neon_open -+ .word neon_convert -+ .word > neon_nop @ finish -+ .word neon_nop @ > close -+ .size ofb_pixconv_neon, . - ofb_pixconv_neon > -+ -+ .section .ofb_pixconv, "a" -+ofb_pixconv_neon_p: -+ > .word ofb_pixconv_neon --- -1.7.2.5 - diff --git > a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb > b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb index > 10a69a9..c24cc4a 100644 --- > a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb +++ > b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb @@ -5,7 +5,7 @@ > HOMEPAGE = "http://www.mplayerhq.hu/" DEPENDS = "libvpx live555 > libdvdread libtheora virtual/libsdl ffmpeg xsp zlib libpng jpeg liba52 > freetype fontconfig alsa-lib lzo ncurses lame libxv virtual/libx11 > virtual/kernel libass \ ${@base_conditional('ENTERPRISE_DISTRO', '1', '', > 'libmad liba52 lame', d)}" > > -#RDEPENDS_${PN} = "mplayer-common" +RDEPENDS_${PN} = "mplayer-common" > PROVIDES = "mplayer" RPROVIDES_${PN} = "mplayer" RCONFLICTS_${PN} = > "mplayer" @@ -17,10 +17,6 @@ SRC_URI = > "git://repo.or.cz/mplayer.git;protocol=git;branch=master \ > file://cross.compile.codec-cfg.patch \ " > > -SRC_URI_append_aarmv7a = " \ - > file://0001-video-out-for-omapfb-support.patch \ - " - SRCREV = > "e3f5043233336d8b4b0731c6a8b42a8fda5535ac" > > ARM_INSTRUCTION_SET = "ARM" @@ -40,9 +36,6 @@ CONFFILES_${PN} += > "/usr/etc/mplayer/input.conf \ > > inherit autotools pkgconfig > > -# We want a kernel header for armv7a, but we don't want to make mplayer > machine specific for that -STAGING_KERNEL_DIR = > "${STAGING_DIR}/${MACHINE_ARCH}${TARGET_VENDOR}-${TARGET_OS}/kernel" - > EXTRA_OECONF = " \ --prefix=/usr \ --mandir=${mandir} \ @@ -135,21 +128,9 > @@ EXTRA_OECONF = " \ --extra-libs=' -lXext -lX11 -lBasicUsageEnvironment > -lUsageEnvironment -lgroupsock -lliveMedia -lstdc++' \ " > > -EXTRA_OECONF_append_armv6 = " --enable-armv6" > -EXTRA_OECONF_append_armv7a = " --enable-armv6 --enable-neon" - > FULL_OPTIMIZATION = "-fexpensive-optimizations -fomit-frame-pointer > -frename-registers -O4 -ffast-math" -FULL_OPTIMIZATION_armv7a = > "-fexpensive-optimizations -ftree-vectorize -fomit-frame-pointer -O4 > -ffast-math" BUILD_OPTIMIZATION = "${FULL_OPTIMIZATION}" > > -do_configure_prepend_armv7a() { - cp > ${STAGING_KERNEL_DIR}/arch/arm/plat-omap/include/mach/omapfb.h > ${S}/libvo/omapfb.h || true - cp > ${STAGING_KERNEL_DIR}/include/asm-arm/arch-omap/omapfb.h > ${S}/libvo/omapfb.h || true - cp > ${STAGING_KERNEL_DIR}/include/linux/omapfb.h ${S}/libvo/omapfb.h || true > - cp ${STAGING_DIR_TARGET}/kernel/include/linux/omapfb.h > ${S}/libvo/omapfb.h || true - sed -e 's/__user//g' -i ${S}/libvo/omapfb.h > || true -} - CFLAGS_append = " -I${S}/libdvdread4 " > > do_configure() { -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (Darwin) Comment: GPGTools - http://gpgtools.org iEYEARECAAYFAk7V9jEACgkQMkyGM64RGpGvFgCgmauFl5GYmdtr9KDc69Yu68A4 cAcAn3eIhQeqzypd4tHVsq1d1CJz4FyV =+jxs -----END PGP SIGNATURE-----
On Wed, Nov 30, 2011 at 10:24:04AM +0100, Koen Kooi wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Op 30-11-11 09:06, Martin Jansa schreef: > > * not everybody has FEED_ARCH in OVERRIDES * and not everybody has > > PKGARCHCOMPAT_ARMV7A enabled so we would need to duplicate armv7a and > > armv7a-vfp-neon > > NAK on that. I'm not going to cripple mplayer because some distros lack > FEED_ARCH in overrides. Do we also cripple mplayer for people not using PKGARCHCOMPAT_ARMV7A? Or do we want all armv7a-vfp-neon duplicated with armv7a? I've asked you to propose FEED_ARCH in oe-core before, please do.. > > * example of working omapfb patch and optimizations is in meta-smartphone > > layer > > http://git.shr-project.org/git/?p=meta-smartphone.git;a=commit;h=483afbee82869a0b2dacadc4b9580c47dcb59d26 > > I > > > do agree that that omapfb patch belongs in a BSP, not in the recipe. yes and the current version of that patch in meta-oe is broken IIRC.. Cheers, > regards, > > Koen > > > > > Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- > > .../0001-video-out-for-omapfb-support.patch | 826 > > -------------------- meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb | > > 21 +- 2 files changed, 1 insertions(+), 846 deletions(-) delete mode > > 100644 > > meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > > > diff --git > > a/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > b/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > > > > deleted file mode 100644 > > index a362ef6..0000000 --- > > a/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch > > > > > +++ /dev/null > > @@ -1,826 +0,0 @@ -From 2a42cec41a018008d07ea33b2b91dca191d78481 Mon Sep > > 17 00:00:00 2001 -From: Martin Jansa <Martin.Jansa@gmail.com> -Date: Thu, > > 25 Nov 2010 16:49:53 +0100 -Subject: [PATCH] video out for omapfb > > support - -Upstream-Status: Pending -Signed-off-by: Martin Jansa > > <Martin.Jansa@gmail.com> -Signed-off-by: Koen Kooi > > <koen@dominion.thruhere.net> ---- - Makefile | 2 +- - > > libvo/video_out.c | 2 + - libvo/vo_omapfb.c | 591 > > +++++++++++++++++++++++++++++++++++++++++++++++++++++ - libvo/yuv.S > > | 170 +++++++++++++++ - 4 files changed, 764 insertions(+), 1 > > deletions(-) - create mode 100644 libvo/vo_omapfb.c - create mode 100644 > > libvo/yuv.S - -diff --git a/Makefile b/Makefile -index 83304a2..1e88d40 > > 100644 ---- a/Makefile -+++ b/Makefile -@@ -450,7 +450,7 @@ > > SRCS_MPLAYER-$(DIRECTFB) += libvo/vo_directfb2.c libvo/vo_dfbmga.c - > > SRCS_MPLAYER-$(DIRECTX) += libao2/ao_dsound.c libvo/vo_directx.c - > > SRCS_MPLAYER-$(DXR3) += libvo/vo_dxr3.c - SRCS_MPLAYER-$(ESD) > > += libao2/ao_esd.c --SRCS_MPLAYER-$(FBDEV) += libvo/vo_fbdev.c > > libvo/vo_fbdev2.c -+SRCS_MPLAYER-$(FBDEV) += libvo/vo_fbdev.c > > libvo/vo_fbdev2.c libvo/vo_omapfb.c libvo/yuv.S - SRCS_MPLAYER-$(FFMPEG) > > += libvo/vo_png.c - SRCS_MPLAYER-$(GGI) += libvo/vo_ggi.c - > > SRCS_MPLAYER-$(GIF) += libvo/vo_gif89a.c -diff --git > > a/libvo/video_out.c b/libvo/video_out.c -index e796784..1433834 100644 > > ---- a/libvo/video_out.c -+++ b/libvo/video_out.c -@@ -95,6 +95,7 @@ > > extern struct vo_driver video_out_null; - extern struct vo_driver > > video_out_bl; - extern struct vo_driver video_out_fbdev; - extern struct > > vo_driver video_out_fbdev2; -+extern struct vo_driver video_out_omapfb; - > > extern struct vo_driver video_out_svga; - extern struct vo_driver > > video_out_png; - extern struct vo_driver video_out_ggi; -@@ -193,6 +194,7 > > @@ const struct vo_driver *video_out_drivers[] = - #ifdef CONFIG_FBDEV - > > &video_out_fbdev, - &video_out_fbdev2, -+ > > &video_out_omapfb, - #endif - #ifdef CONFIG_SVGALIB - > > &video_out_svga, -diff --git a/libvo/vo_omapfb.c b/libvo/vo_omapfb.c -new > > file mode 100644 -index 0000000..7bd8927 ---- /dev/null -+++ > > b/libvo/vo_omapfb.c -@@ -0,0 +1,591 @@ -+/* -+ -+Copyright (C) 2008 > > Gregoire Gentil <gregoire@gentil.com> -+Portions Copyright (C) 2009 > > Howard Chu <hyc@symas.com> -+This file adds an optimized vo output to > > mplayer for the OMAP platform. This is a first pass and an attempt to > > help to improve -+media playing on the OMAP platform. The usual > > disclaimer comes here: this code is provided without any warranty. -+Many > > bugs and issues still exist. Feed-back is welcome. -+ -+This output uses > > the yuv420_to_yuv422 conversion from Mans Rullgard, and is heavily > > inspired from the work of Siarhei Siamashka. -+I would like to thank > > those two persons here, without them this code would certainly not > > exist. -+ -+Two options of the output are available: -+fb_overlay_only > > (disabled by default): only the overlay is drawn. X11 stuff is ignored. > > -+dbl_buffer (disabled by default): add double buffering. Some tearsync > > flags are probably missing in the code. -+ -+Syntax is the following: > > -+mplayer -ao alsa -vo omapfb /test.avi -+mplayer -nosound -vo > > omapfb:fb_overlay_only:dbl_buffer /test.avi -+ -+You need to have two > > planes on your system. On beagleboard, it means something like: > > video=omapfb:vram:2M,vram:4M -+ -+Known issues: -+1) A green line or some > > vertical lines (if mplayer decides to draw bands instead of frame) may > > appear. -+It's an interpolation bug in the color conversion that needs to > > be fixed -+ -+2) The color conversion accepts only 16-pixel multiple for > > width and height. -+ -+3) The scaling down is disabled as the scaling > > down kernel patch for the OMAP3 platform doesn't seem to work yet. -+ -+ > > * This program 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. -+ * -+ * This program 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 this program; if not, write to the Free > > Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > > 02110-1301 USA -+*/ -+ -+#include <stdio.h> -+#include <stdlib.h> > > -+#include <string.h> -+#include <fcntl.h> -+#include <unistd.h> > > -+#include <errno.h> -+ -+#include <sys/mman.h> -+#include <sys/ioctl.h> > > -+#include <linux/fb.h> -+ -+#include "config.h" -+#include > > "video_out.h" -+#include "video_out_internal.h" -+#include > > "fastmemcpy.h" -+#include "sub/sub.h" -+#include "mp_msg.h" -+#include > > "omapfb.h" -+#include "x11_common.h" -+ -+#include > > "libswscale/swscale.h" -+#include "libmpcodecs/vf_scale.h" -+#include > > "libavcodec/avcodec.h" -+ -+#include "aspect.h" -+ -+#include > > "subopt-helper.h" -+ -+#include <X11/Xlib.h> -+#include <X11/Xutil.h> > > -+#include <X11/Xatom.h> -+#include "wskeys.h" -+ -+static vo_info_t info > > = { -+ "omapfb video driver", -+ "omapfb", -+ "", -+ "" -+}; -+ > > -+LIBVO_EXTERN(omapfb) -+ -+static int fb_overlay_only = 0; // if set, we > > need only framebuffer overlay, but do not need any x11 code -+static int > > dbl_buffer = 0; -+static int fullscreen_flag = 0; -+static int > > plane_ready = 0; -+static uint32_t drwX, drwY; -+ -+extern void > > yuv420_to_yuv422(uint8_t *yuv, uint8_t *y, uint8_t *u, uint8_t *v, int w, > > int h, int yw, int cw, int dw); -+static struct fb_var_screeninfo > > sinfo_p0; -+static struct fb_var_screeninfo sinfo; -+static struct > > fb_var_screeninfo sinfo2; -+static struct fb_fix_screeninfo finfo; > > -+static struct omapfb_mem_info minfo; -+static struct omapfb_plane_info > > pinfo; -+static int xoff, yoff; -+ -+static struct { -+ unsigned x; -+ > > unsigned y; -+ uint8_t *buf; -+} fb_pages[2]; -+static int dev_fd = > > -1; -+static int fb_page_flip = 0; -+static int page = 0; -+static void > > omapfb_update(int x, int y, int out_w, int out_h, int show); -+ -+extern > > void mplayer_put_key( int code ); -+#include "input/keycodes.h" -+ > > -+#define TRANSPARENT_COLOR_KEY 0xff0 -+ -+static Display *display = > > NULL; // pointer to X Display structure. -+static int screen_num; // > > number of screen to place the window on. -+static Window win = 0; > > -+static Window parent = 0; // pointer to the newly created window. -+ > > -+/* This is used to intercept window closing requests. */ -+static Atom > > wm_delete_window; -+ -+ -+void vo_calc_drwXY(uint32_t *drwX, uint32_t > > *drwY) -+{ -+ *drwX = *drwY = 0; -+ if (vo_fs) { -+ > > aspect(&vo_dwidth, &vo_dheight, A_ZOOM); -+ vo_dwidth = > > FFMIN(vo_dwidth, vo_screenwidth); -+ vo_dheight = > > FFMIN(vo_dheight, vo_screenheight); -+ *drwX = > > (vo_screenwidth - vo_dwidth) / 2; -+ *drwY = (vo_screenheight > > - vo_dheight) / 2; -+ mp_msg(MSGT_VO, MSGL_V, "[vo-fs] dx: %d dy: > > %d dw: %d dh: %d\n", -+ *drwX, *drwY, vo_dwidth, > > vo_dheight); -+ } else if (WinID == 0) { -+ *drwX = vo_dx; -+ > > *drwY = vo_dy; -+ } -+} -+ -+static void getPrimaryPlaneInfo() -+{ -+ > > int dev_fd = open("/dev/fb0", O_RDWR); -+ -+ if (dev_fd == -1) { -+ > > mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error /dev/fb0\n"); -+ > > return -1; -+ } -+ -+ ioctl(dev_fd, FBIOGET_VSCREENINFO, > > &sinfo_p0); -+ close(dev_fd); -+} -+ -+/** -+ * Function to get the > > offset to be used when in windowed mode -+ * or when using -wid option -+ > > */ -+static void x11_get_window_abs_position(Display *display, Window > > window, -+ int *wx, int *wy, > > int *ww, int *wh) -+{ -+ Window root, parent; -+ Window *child; -+ > > unsigned int n_children; -+ XWindowAttributes attribs; -+ -+ /* Get > > window attributes */ -+ XGetWindowAttributes(display, window, > > &attribs); -+ -+ /* Get relative position of given window */ -+ *wx > > = attribs.x; -+ *wy = attribs.y; -+ if (ww) -+ *ww = > > attribs.width; -+ if (wh) -+ *wh = attribs.height; -+ -+ /* > > Query window tree information */ -+ XQueryTree(display, window, &root, > > &parent, &child, &n_children); -+ if (parent) -+ { -+ int x, > > y; -+ /* If we have a parent we must go there and discover his > > position*/ -+ x11_get_window_abs_position(display, parent, &x, &y, > > NULL, NULL); -+ *wx += x; -+ *wy += y; -+ } -+ -+ /* If > > we had children, free it */ -+ if(n_children) -+ XFree(child); > > -+} -+ -+static void x11_check_events(void) -+{ -+ int e = > > vo_x11_check_events(mDisplay); -+ -+ if (e & VO_EVENT_RESIZE) -+ > > vo_calc_drwXY(&drwX, &drwY); -+ -+ if (e & VO_EVENT_EXPOSE || e & > > VO_EVENT_RESIZE) -+ { -+ vo_xv_draw_colorkey(drwX, drwY, > > vo_dwidth - 1, vo_dheight - 1); -+ omapfb_update(0, 0, 0, 0, 1); > > -+ } -+} -+ -+static void x11_uninit() -+{ -+ if (display) { -+ > > XCloseDisplay(display); -+ display = NULL; -+ } -+} -+ -+/** -+ > > * Initialize framebuffer -+ */ -+static int preinit(const char *arg) -+{ > > -+ opt_t subopts[] = { -+ {"fb_overlay_only", OPT_ARG_BOOL, > > &fb_overlay_only, NULL}, -+ {"dbl_buffer", OPT_ARG_BOOL, > > &dbl_buffer, NULL}, -+ {NULL} -+ }; -+ -+ if > > (subopt_parse(arg, subopts) != 0) { -+ mp_msg(MSGT_VO, MSGL_FATAL, > > "[omapfb] unknown suboptions: %s\n", arg); -+ return -1; -+ } > > -+ -+ getPrimaryPlaneInfo(); -+ dev_fd = open("/dev/fb1", O_RDWR); > > -+ -+ if (dev_fd == -1) { -+ mp_msg(MSGT_VO, MSGL_FATAL, > > "[omapfb] Error /dev/fb1\n"); -+ return -1; -+ } -+ -+ > > ioctl(dev_fd, FBIOGET_VSCREENINFO, &sinfo); -+ ioctl(dev_fd, > > OMAPFB_QUERY_PLANE, &pinfo); -+ ioctl(dev_fd, OMAPFB_QUERY_MEM, > > &minfo); -+ -+ if (!fb_overlay_only && !vo_init()) -+ { -+ > > mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Could not open X, overlay > > only...\n"); -+ fb_overlay_only = 1; -+ } -+ -+ return 0; > > -+} -+ -+static void omapfb_update(int x, int y, int out_w, int out_h, > > int show) -+{ -+ int xres, yres; -+ if (!fb_overlay_only) -+ > > x11_get_window_abs_position(mDisplay, vo_window, &x, &y, &out_w, > > &out_h); -+ -+ /* Check for new screen rotation */ -+ ioctl(dev_fd, > > FBIOGET_VSCREENINFO, &sinfo2); -+ if (sinfo2.rotate != > > sinfo_p0.rotate) -+ getPrimaryPlaneInfo(); -+ -+ if ( (!x && !y > > && !out_w && !out_h) || -+ (out_w < sinfo.xres_virtual / 4) || > > (out_h < sinfo.yres_virtual / 4) || /* HW can't scale down by more than > > 4x */ -+ (out_w > sinfo.xres_virtual * 8) || (out_h > > > sinfo.yres_virtual * 8) ) { /* HW can't scale up by more than 8x */ -+ > > pinfo.enabled = 0; -+ pinfo.pos_x = 0; -+ pinfo.pos_y = 0; > > -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+ return; -+ > > } -+ -+ xres = sinfo.xres_virtual; -+ yres = sinfo.yres_virtual; > > -+ -+ /* Handle clipping: if the left or top edge of the window goes > > -+ * offscreen, clamp the overlay to the left or top edge of the -+ > > * screen, and set the difference into the frame offset. Also -+ * > > decrease the overlay size by the offset. The offset must -+ * take > > window scaling into account as well. -+ * -+ * Likewise, if the > > right or bottom edge of the window goes -+ * offscreen, clamp the > > overlay to the right or bottom edge of -+ * the screen, and decrease > > the overlay size accordingly. The -+ * hardware will truncate the > > output accordingly, so no offset -+ * is needed. Also take window > > scaling into account. -- hyc -+ */ -+ if (x < 0) { -+ /* > > clamp to left edge */ -+ xoff = -x; -+ if (out_w != > > sinfo.xres_virtual) { -+ /* account for scaling */ -+ > > xoff *= sinfo.xres_virtual; -+ xoff /= out_w; -+ } -+ > > xres -= xoff; -+ out_w += x; -+ x = 0; -+ } else { -+ > > xoff = 0; -+ if (x + out_w > sinfo_p0.xres) { -+ /* > > clamp to right edge */ -+ int diff = sinfo_p0.xres - x; -+ > > if (out_w != sinfo.xres_virtual) { -+ /* account for > > scaling */ -+ xres = diff * sinfo.xres_virtual; -+ > > xres /= out_w; -+ } else { -+ xres = diff; -+ > > } -+ out_w = diff; -+ } -+ } -+ -+ if (y < 0) { > > -+ /* clamp to top edge - this seldom occurs since the window -+ > > * titlebar is usually forced to stay visible -+ */ -+ yoff > > = -y; -+ if (out_h != sinfo.yres_virtual) { -+ /* > > account for scaling */ -+ yoff *= sinfo.yres_virtual; -+ > > yoff /= out_h; -+ } -+ yres -= yoff; -+ out_h += y; > > -+ y = 0; -+ } else { -+ yoff = 0; -+ if (y + > > out_h > sinfo_p0.yres) { -+ /* clamp to bottom edge */ -+ > > int diff = sinfo_p0.yres - y; -+ if (out_h != > > sinfo.yres_virtual) { -+ /* account for scaling */ -+ > > yres = diff * sinfo.yres_virtual; -+ yres /= out_h; -+ > > } else { -+ yres = diff; -+ } -+ > > out_h = diff; -+ } -+ } -+ -+ if (xoff & 1) -+ > > xoff++; -+ if (xres & 1) -+ xres--; -+ -+ pinfo.enabled = > > show; -+ pinfo.pos_x = x; -+ pinfo.pos_y = y; -+ pinfo.out_width > > = out_w; -+ pinfo.out_height = out_h; -+ -+ sinfo.xoffset = > > fb_pages[page].x + xoff; -+ sinfo.yoffset = fb_pages[page].y + yoff; > > -+ /* If we had to change the overlay dimensions, update it */ -+ > > if (xres != sinfo2.xres || yres != sinfo2.yres || -+ sinfo.xoffset > > != sinfo2.xoffset || -+ sinfo.yoffset != sinfo2.yoffset) { -+ > > sinfo.xres = xres; -+ sinfo.yres = yres; -+ sinfo.rotate = > > sinfo2.rotate; -+ ioctl(dev_fd, FBIOPUT_VSCREENINFO, &sinfo); -+ > > } -+ -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+} -+ -+static int > > config(uint32_t width, uint32_t height, uint32_t d_width, -+ uint32_t > > d_height, uint32_t flags, char *title, -+ uint32_t format) -+{ -+ > > uint8_t *fbmem; -+ int i; -+ struct omapfb_color_key color_key; -+ > > -+ XVisualInfo vinfo; -+ XSetWindowAttributes xswa; -+ > > XWindowAttributes attribs; -+ unsigned long xswamask; -+ int > > depth; -+ -+ Window root, parent; -+ Window *child; -+ unsigned > > int n_children; -+ -+ fullscreen_flag = flags & VOFLAG_FULLSCREEN; -+ > > if (!fb_overlay_only) -+ { -+ if (!title) -+ title = > > "MPlayer OMAPFB (X11/FB) render"; -+ -+ > > XGetWindowAttributes(mDisplay, mRootWin, &attribs); -+ depth = > > attribs.depth; -+ if (depth != 15 && depth != 16 && depth != 24 && > > depth != 32) -+ depth = 24; -+ > > XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); -+ -+ > > xswa.border_pixel = 0; -+ xswa.background_pixel = xv_colorkey = > > TRANSPARENT_COLOR_KEY; -+ -+ xswamask = CWBackPixel | > > CWBorderPixel; -+ xv_ck_info.method = CK_METHOD_BACKGROUND; -+ -+ > > vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, vo_dwidth, vo_dheight, -+ > > flags, CopyFromParent, "omapfb", title); -+ > > XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); -+ -+ > > /* Need to receive events on the parent window -- so when it is -+ > > moved / resized / etc., we know. */ -+ if(WinID > 0) -+ { > > -+ /* Query window tree information */ -+ > > XQueryTree(mDisplay, vo_window, &root, &parent, &child, &n_children); -+ > > if (n_children) -+ XFree(child); -+ -+ > > XUnmapWindow(mDisplay, vo_window); -+ if (parent) -+ > > XSelectInput(mDisplay, parent, StructureNotifyMask); -+ > > XMapWindow(mDisplay, vo_window); -+ } -+ -+ > > vo_calc_drwXY(&drwX, &drwY); -+ vo_xv_draw_colorkey(drwX, drwY, > > vo_dwidth - 1, vo_dheight - 1); -+ } -+ -+ fbmem = mmap(NULL, > > minfo.size, PROT_READ|PROT_WRITE, MAP_SHARED, dev_fd, 0); -+ if (fbmem > > == MAP_FAILED) { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error > > mmap\n"); -+ return -1; -+ } -+ -+ for (i = 0; i < > > minfo.size / 4; i++) -+ ((uint32_t*)fbmem)[i] = 0x80008000; -+ -+ > > sinfo.xres = width & ~15; -+ sinfo.yres = height & ~15; -+ > > sinfo.xoffset = 0; -+ sinfo.yoffset = 0; -+ sinfo.nonstd = > > OMAPFB_COLOR_YUY422; -+ -+ fb_pages[0].x = 0; -+ fb_pages[0].y = > > 0; -+ fb_pages[0].buf = fbmem; -+ -+ if (dbl_buffer && minfo.size > > >= sinfo.xres * sinfo.yres * 2) { -+ sinfo.xres_virtual = > > sinfo.xres; -+ sinfo.yres_virtual = sinfo.yres * 2; -+ > > fb_pages[1].x = 0; -+ fb_pages[1].y = sinfo.yres; -+ > > fb_pages[1].buf = fbmem + sinfo.xres * sinfo.yres * 2; -+ > > fb_page_flip = 1; -+ } else { -+ sinfo.xres_virtual = > > sinfo.xres; -+ sinfo.yres_virtual = sinfo.yres; -+ > > fb_page_flip = 0; -+ } -+ -+ ioctl(dev_fd, FBIOPUT_VSCREENINFO, > > &sinfo); -+ ioctl(dev_fd, FBIOGET_FSCREENINFO, &finfo); -+ -+ if > > (WinID <= 0) { -+ if (fullscreen_flag) { -+ > > omapfb_update(0, 0, sinfo_p0.xres, sinfo_p0.yres, 1); -+ } else { > > -+ omapfb_update(sinfo_p0.xres / 2 - sinfo.xres / 2, > > sinfo_p0.yres / 2 - sinfo.yres / 2, sinfo.xres, sinfo.yres, 1); -+ > > } -+ } -+ -+ color_key.channel_out = OMAPFB_CHANNEL_OUT_LCD; -+ > > color_key.background = 0x0; -+ color_key.trans_key = > > TRANSPARENT_COLOR_KEY; -+ if (fb_overlay_only) -+ > > color_key.key_type = OMAPFB_COLOR_KEY_DISABLED; -+ else -+ > > color_key.key_type = OMAPFB_COLOR_KEY_GFX_DST; -+ ioctl(dev_fd, > > OMAPFB_SET_COLOR_KEY, &color_key); -+ -+ plane_ready = 1; -+ return > > 0; -+} -+ -+static void draw_alpha(int x0, int y0, int w, int h, unsigned > > char *src, unsigned char *srca, int stride) -+{ -+ > > vo_draw_alpha_yuy2(w, h, src, srca, stride, fb_pages[page].buf + y0 * > > finfo.line_length + x0 * 2, finfo.line_length); -+} -+ -+static void > > draw_osd(void) -+{ -+ vo_draw_text(sinfo.xres, sinfo.yres, > > draw_alpha); -+} -+ -+static int draw_frame(uint8_t *src[]) -+{ -+ > > return 1; -+} -+ -+static int draw_slice(uint8_t *src[], int stride[], > > int w, int h, int x, int y) -+{ -+ if (x!=0) -+ return 0; -+ -+ > > if (!plane_ready) -+ return 0; -+ -+ ioctl(dev_fd, > > OMAPFB_SYNC_GFX); -+ -+ yuv420_to_yuv422(fb_pages[page].buf + y * > > finfo.line_length, src[0], src[1], src[2], w & ~15, h, stride[0], > > stride[1], finfo.line_length); -+ return 0; -+} -+ -+static void > > flip_page(void) -+{ -+ if (fb_page_flip) { -+ sinfo.xoffset = > > fb_pages[page].x + xoff; -+ sinfo.yoffset = fb_pages[page].y + > > yoff; -+ ioctl(dev_fd, FBIOPAN_DISPLAY, &sinfo); -+ page ^= > > fb_page_flip; -+ } -+} -+ -+static int query_format(uint32_t format) > > -+{ -+ // For simplicity pretend that we can only do YV12, support > > for -+ // other formats can be added quite easily if/when needed -+ > > if (format != IMGFMT_YV12) -+ return 0; -+ -+ return > > VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | > > VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; -+} -+ -+ -+/** -+ * Uninitialize > > framebuffer -+ */ -+static void uninit() -+{ -+ pinfo.enabled = 0; -+ > > ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+ -+ if (!fb_overlay_only) > > { -+ struct omapfb_color_key color_key; -+ > > color_key.channel_out = OMAPFB_CHANNEL_OUT_LCD; -+ > > color_key.key_type = OMAPFB_COLOR_KEY_DISABLED; -+ ioctl(dev_fd, > > OMAPFB_SET_COLOR_KEY, &color_key); -+ } -+ -+ close(dev_fd); -+ -+ > > if (!fb_overlay_only) -+ x11_uninit(); -+} -+ -+ -+static int > > control(uint32_t request, void *data, ...) -+{ -+ switch (request) { > > -+ case VOCTRL_QUERY_FORMAT: -+ return > > query_format(*((uint32_t*)data)); -+ case VOCTRL_FULLSCREEN: { -+ > > if (WinID > 0) return VO_FALSE; -+ if (fullscreen_flag) { -+ > > if (!fb_overlay_only) -+ vo_x11_fullscreen(); -+ > > fullscreen_flag = 0; -+ omapfb_update(sinfo_p0.xres / 2 - > > sinfo.xres / 2, sinfo_p0.yres / 2 - sinfo.yres / 2, sinfo.xres, > > sinfo.yres, 1); -+ } else { -+ if > > (!fb_overlay_only) -+ vo_x11_fullscreen(); -+ > > fullscreen_flag = 1; -+ omapfb_update(0, 0, sinfo_p0.xres, > > sinfo_p0.yres, 1); -+ } -+ return VO_TRUE; -+ > > } -+ case VOCTRL_UPDATE_SCREENINFO: -+ > > update_xinerama_info(); -+ return VO_TRUE; -+ } -+ > > return VO_NOTIMPL; -+} -+ -+ -+static void check_events(void) -+{ -+ > > if (!fb_overlay_only) -+ x11_check_events(); -+} -diff --git > > a/libvo/yuv.S b/libvo/yuv.S -new file mode 100644 -index > > 0000000..1cd2c1d ---- /dev/null -+++ b/libvo/yuv.S -@@ -0,0 +1,170 @@ > > -+/* -+ Copyright (C) 2008 Mans Rullgard -+ -+ Permission is hereby > > granted, free of charge, to any person -+ obtaining a copy of this > > software and associated documentation -+ files (the "Software"), to > > deal in the Software without -+ restriction, including without > > limitation the rights to use, copy, -+ modify, merge, publish, > > distribute, sublicense, and/or sell copies -+ of the Software, and to > > permit persons to whom the Software is -+ furnished to do so, subject > > to the following conditions: -+ -+ The above copyright notice and this > > permission notice shall be -+ included in all copies or substantial > > portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED "AS IS", > > WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT > > LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A > > PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE > > AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > > OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR > > OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE > > OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ */ -+ -+ > > .macro mov32 rd, val -+ movw \rd, #:lower16:\val -+ > > movt \rd, #:upper16:\val -+ .endm -+ -+ .fpu > > neon -+ .text -+ -+@ yuv420_to_yuv422(uint8_t *yuv, uint8_t *y, > > uint8_t *u, uint8_t *v, -+@ int w, int h, int yw, int > > cw, int dw) -+ -+#define yuv r0 -+#define y r1 -+#define u r2 > > -+#define v r3 -+#define w r4 -+#define h r5 -+#define yw r6 > > -+#define cw r7 -+#define dw r8 -+ -+#define tyuv r9 -+#define ty > > r10 -+#define tu r11 -+#define tv r12 -+#define i lr -+ -+ > > .global yuv420_to_yuv422 -+ .func yuv420_to_yuv422 > > -+yuv420_to_yuv422: -+ push {r4-r11,lr} -+ add > > r4, sp, #36 -+.Ldo_conv: -+ ldm r4, {r4-r8} -+ > > push {r4} -+1: -+ mov tu, u -+ mov > > tv, v -+ vld1.64 {d2}, [u,:64], cw @ u0 -+ > > vld1.64 {d3}, [v,:64], cw @ v0 -+ mov > > tyuv, yuv -+ mov ty, y -+ vzip.8 d2, > > d3 @ u0v0 -+ mov i, #16 -+2: > > -+ pld [y, #64] -+ vld1.64 {d0, d1}, > > [y,:128], yw @ y0 -+ pld [u, #64] -+ > > subs i, i, #4 -+ vld1.64 {d6}, > > [u,:64], cw @ u2 -+ pld [y, #64] -+ > > vld1.64 {d4, d5}, [y,:128], yw @ y1 -+ pld > > [v, #64] -+ vld1.64 {d7}, [v,:64], cw @ v2 > > -+ pld [y, #64] -+ vld1.64 {d16,d17}, > > [y,:128], yw @ y2 -+ vzip.8 d6, d7 > > @ u2v2 -+ pld [u, #64] -+ vld1.64 > > {d22}, [u,:64], cw @ u4 -+ pld [v, #64] > > -+ vld1.64 {d23}, [v,:64], cw @ v4 -+ > > pld [y, #64] -+ vld1.64 {d20,d21}, [y,:128], > > yw @ y3 -+ vmov q9, q3 > > @ u2v2 -+ vzip.8 d22, d23 @ u4v4 > > -+ vrhadd.u8 q3, q1, q3 @ u1v1 -+ > > vzip.8 q0, q1 @ y0u0y0v0 -+ vmov > > q12, q11 @ u4v4 -+ vzip.8 q2, q3 > > @ y1u1y1v1 -+ vrhadd.u8 q11, q9, q11 @ > > u3v3 -+ vst1.64 {d0-d3}, [yuv,:128], dw @ > > y0u0y0v0 -+ vzip.8 q8, q9 @ > > y2u2y2v2 -+ vst1.64 {d4-d7}, [yuv,:128], dw @ > > y1u1y1v1 -+ vzip.8 q10, q11 @ > > y3u3y3v3 -+ vst1.64 {d16-d19}, [yuv,:128], dw @ > > y2u2y2v2 -+ vmov q1, q12 -+ vst1.64 > > {d20-d23}, [yuv,:128], dw @ y3u3y3v3 -+ bgt 2b > > -+ -+ subs w, w, #16 -+ add > > yuv, tyuv, #32 -+ add y, ty, #16 -+ add > > u, tu, #8 -+ add v, tv, #8 -+ bgt > > 1b -+ -+ ldr w, [sp] -+ subs h, > > h, #16 -+ add yuv, yuv, dw, lsl #4 -+ sub > > yuv, yuv, w, lsl #1 -+ add y, y, yw, lsl #4 > > -+ sub y, y, w -+ add u, > > u, cw, lsl #3 -+ sub u, u, w, asr #1 -+ > > add v, v, cw, lsl #3 -+ sub v, v, > > w, asr #1 -+ bgt 1b -+ -+ pop > > {r3-r11,pc} -+ .endfunc -+ -+ .func neon_open > > -+neon_open: -+ push {r4-r8,lr} -+ ldrd > > r4, r5, [r0, #16] -+ ldrd r6, r7, [r0, #24] -+ > > lsl r8, r4, #1 -+ mov32 r0, conv_params > > -+ stm r0, {r4-r8} -+ mov r0, #0 > > -+ pop {r4-r8,pc} -+ .endfunc -+ -+ > > .func neon_convert -+neon_convert: -+ push > > {r4-r11,lr} -+ ldr r0, [r0] -+ mov32 > > r4, conv_params -+ ldm r1, {r1-r3} -+ b > > .Ldo_conv -+ .endfunc -+ -+ .func neon_nop -+neon_nop: -+ > > bx lr -+ .endfunc -+ -+ .section .bss > > -+conv_params: -+ .skip 5*4 -+ .size > > conv_params, . - conv_params -+ -+ .section .rodata > > -+.Lname: .asciz "neon" -+ofb_pixconv_neon: -+ .word > > .Lname -+ .word 0 @ flags -+ .word > > neon_open -+ .word neon_convert -+ .word > > neon_nop @ finish -+ .word neon_nop @ > > close -+ .size ofb_pixconv_neon, . - ofb_pixconv_neon > > -+ -+ .section .ofb_pixconv, "a" -+ofb_pixconv_neon_p: -+ > > .word ofb_pixconv_neon --- -1.7.2.5 - diff --git > > a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb > > b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb index > > 10a69a9..c24cc4a 100644 --- > > a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb +++ > > b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb @@ -5,7 +5,7 @@ > > HOMEPAGE = "http://www.mplayerhq.hu/" DEPENDS = "libvpx live555 > > libdvdread libtheora virtual/libsdl ffmpeg xsp zlib libpng jpeg liba52 > > freetype fontconfig alsa-lib lzo ncurses lame libxv virtual/libx11 > > virtual/kernel libass \ ${@base_conditional('ENTERPRISE_DISTRO', '1', '', > > 'libmad liba52 lame', d)}" > > > > -#RDEPENDS_${PN} = "mplayer-common" +RDEPENDS_${PN} = "mplayer-common" > > PROVIDES = "mplayer" RPROVIDES_${PN} = "mplayer" RCONFLICTS_${PN} = > > "mplayer" @@ -17,10 +17,6 @@ SRC_URI = > > "git://repo.or.cz/mplayer.git;protocol=git;branch=master \ > > file://cross.compile.codec-cfg.patch \ " > > > > -SRC_URI_append_aarmv7a = " \ - > > file://0001-video-out-for-omapfb-support.patch \ - " - SRCREV = > > "e3f5043233336d8b4b0731c6a8b42a8fda5535ac" > > > > ARM_INSTRUCTION_SET = "ARM" @@ -40,9 +36,6 @@ CONFFILES_${PN} += > > "/usr/etc/mplayer/input.conf \ > > > > inherit autotools pkgconfig > > > > -# We want a kernel header for armv7a, but we don't want to make mplayer > > machine specific for that -STAGING_KERNEL_DIR = > > "${STAGING_DIR}/${MACHINE_ARCH}${TARGET_VENDOR}-${TARGET_OS}/kernel" - > > EXTRA_OECONF = " \ --prefix=/usr \ --mandir=${mandir} \ @@ -135,21 +128,9 > > @@ EXTRA_OECONF = " \ --extra-libs=' -lXext -lX11 -lBasicUsageEnvironment > > -lUsageEnvironment -lgroupsock -lliveMedia -lstdc++' \ " > > > > -EXTRA_OECONF_append_armv6 = " --enable-armv6" > > -EXTRA_OECONF_append_armv7a = " --enable-armv6 --enable-neon" - > > FULL_OPTIMIZATION = "-fexpensive-optimizations -fomit-frame-pointer > > -frename-registers -O4 -ffast-math" -FULL_OPTIMIZATION_armv7a = > > "-fexpensive-optimizations -ftree-vectorize -fomit-frame-pointer -O4 > > -ffast-math" BUILD_OPTIMIZATION = "${FULL_OPTIMIZATION}" > > > > -do_configure_prepend_armv7a() { - cp > > ${STAGING_KERNEL_DIR}/arch/arm/plat-omap/include/mach/omapfb.h > > ${S}/libvo/omapfb.h || true - cp > > ${STAGING_KERNEL_DIR}/include/asm-arm/arch-omap/omapfb.h > > ${S}/libvo/omapfb.h || true - cp > > ${STAGING_KERNEL_DIR}/include/linux/omapfb.h ${S}/libvo/omapfb.h || true > > - cp ${STAGING_DIR_TARGET}/kernel/include/linux/omapfb.h > > ${S}/libvo/omapfb.h || true - sed -e 's/__user//g' -i ${S}/libvo/omapfb.h > > || true -} - CFLAGS_append = " -I${S}/libdvdread4 " > > > > do_configure() { > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.11 (Darwin) > Comment: GPGTools - http://gpgtools.org > > iEYEARECAAYFAk7V9jEACgkQMkyGM64RGpGvFgCgmauFl5GYmdtr9KDc69Yu68A4 > cAcAn3eIhQeqzypd4tHVsq1d1CJz4FyV > =+jxs > -----END PGP SIGNATURE----- > > > _______________________________________________ > Openembedded-devel mailing list > Openembedded-devel@lists.openembedded.org > http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-devel
Patch
diff --git a/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch b/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch deleted file mode 100644 index a362ef6..0000000 --- a/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch +++ /dev/null @@ -1,826 +0,0 @@ -From 2a42cec41a018008d07ea33b2b91dca191d78481 Mon Sep 17 00:00:00 2001 -From: Martin Jansa <Martin.Jansa@gmail.com> -Date: Thu, 25 Nov 2010 16:49:53 +0100 -Subject: [PATCH] video out for omapfb support - -Upstream-Status: Pending -Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> -Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> ---- - Makefile | 2 +- - libvo/video_out.c | 2 + - libvo/vo_omapfb.c | 591 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - libvo/yuv.S | 170 +++++++++++++++ - 4 files changed, 764 insertions(+), 1 deletions(-) - create mode 100644 libvo/vo_omapfb.c - create mode 100644 libvo/yuv.S - -diff --git a/Makefile b/Makefile -index 83304a2..1e88d40 100644 ---- a/Makefile -+++ b/Makefile -@@ -450,7 +450,7 @@ SRCS_MPLAYER-$(DIRECTFB) += libvo/vo_directfb2.c libvo/vo_dfbmga.c - SRCS_MPLAYER-$(DIRECTX) += libao2/ao_dsound.c libvo/vo_directx.c - SRCS_MPLAYER-$(DXR3) += libvo/vo_dxr3.c - SRCS_MPLAYER-$(ESD) += libao2/ao_esd.c --SRCS_MPLAYER-$(FBDEV) += libvo/vo_fbdev.c libvo/vo_fbdev2.c -+SRCS_MPLAYER-$(FBDEV) += libvo/vo_fbdev.c libvo/vo_fbdev2.c libvo/vo_omapfb.c libvo/yuv.S - SRCS_MPLAYER-$(FFMPEG) += libvo/vo_png.c - SRCS_MPLAYER-$(GGI) += libvo/vo_ggi.c - SRCS_MPLAYER-$(GIF) += libvo/vo_gif89a.c -diff --git a/libvo/video_out.c b/libvo/video_out.c -index e796784..1433834 100644 ---- a/libvo/video_out.c -+++ b/libvo/video_out.c -@@ -95,6 +95,7 @@ extern struct vo_driver video_out_null; - extern struct vo_driver video_out_bl; - extern struct vo_driver video_out_fbdev; - extern struct vo_driver video_out_fbdev2; -+extern struct vo_driver video_out_omapfb; - extern struct vo_driver video_out_svga; - extern struct vo_driver video_out_png; - extern struct vo_driver video_out_ggi; -@@ -193,6 +194,7 @@ const struct vo_driver *video_out_drivers[] = - #ifdef CONFIG_FBDEV - &video_out_fbdev, - &video_out_fbdev2, -+ &video_out_omapfb, - #endif - #ifdef CONFIG_SVGALIB - &video_out_svga, -diff --git a/libvo/vo_omapfb.c b/libvo/vo_omapfb.c -new file mode 100644 -index 0000000..7bd8927 ---- /dev/null -+++ b/libvo/vo_omapfb.c -@@ -0,0 +1,591 @@ -+/* -+ -+Copyright (C) 2008 Gregoire Gentil <gregoire@gentil.com> -+Portions Copyright (C) 2009 Howard Chu <hyc@symas.com> -+This file adds an optimized vo output to mplayer for the OMAP platform. This is a first pass and an attempt to help to improve -+media playing on the OMAP platform. The usual disclaimer comes here: this code is provided without any warranty. -+Many bugs and issues still exist. Feed-back is welcome. -+ -+This output uses the yuv420_to_yuv422 conversion from Mans Rullgard, and is heavily inspired from the work of Siarhei Siamashka. -+I would like to thank those two persons here, without them this code would certainly not exist. -+ -+Two options of the output are available: -+fb_overlay_only (disabled by default): only the overlay is drawn. X11 stuff is ignored. -+dbl_buffer (disabled by default): add double buffering. Some tearsync flags are probably missing in the code. -+ -+Syntax is the following: -+mplayer -ao alsa -vo omapfb /test.avi -+mplayer -nosound -vo omapfb:fb_overlay_only:dbl_buffer /test.avi -+ -+You need to have two planes on your system. On beagleboard, it means something like: video=omapfb:vram:2M,vram:4M -+ -+Known issues: -+1) A green line or some vertical lines (if mplayer decides to draw bands instead of frame) may appear. -+It's an interpolation bug in the color conversion that needs to be fixed -+ -+2) The color conversion accepts only 16-pixel multiple for width and height. -+ -+3) The scaling down is disabled as the scaling down kernel patch for the OMAP3 platform doesn't seem to work yet. -+ -+ * This program 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. -+ * -+ * This program 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 this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+*/ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <fcntl.h> -+#include <unistd.h> -+#include <errno.h> -+ -+#include <sys/mman.h> -+#include <sys/ioctl.h> -+#include <linux/fb.h> -+ -+#include "config.h" -+#include "video_out.h" -+#include "video_out_internal.h" -+#include "fastmemcpy.h" -+#include "sub/sub.h" -+#include "mp_msg.h" -+#include "omapfb.h" -+#include "x11_common.h" -+ -+#include "libswscale/swscale.h" -+#include "libmpcodecs/vf_scale.h" -+#include "libavcodec/avcodec.h" -+ -+#include "aspect.h" -+ -+#include "subopt-helper.h" -+ -+#include <X11/Xlib.h> -+#include <X11/Xutil.h> -+#include <X11/Xatom.h> -+#include "wskeys.h" -+ -+static vo_info_t info = { -+ "omapfb video driver", -+ "omapfb", -+ "", -+ "" -+}; -+ -+LIBVO_EXTERN(omapfb) -+ -+static int fb_overlay_only = 0; // if set, we need only framebuffer overlay, but do not need any x11 code -+static int dbl_buffer = 0; -+static int fullscreen_flag = 0; -+static int plane_ready = 0; -+static uint32_t drwX, drwY; -+ -+extern void yuv420_to_yuv422(uint8_t *yuv, uint8_t *y, uint8_t *u, uint8_t *v, int w, int h, int yw, int cw, int dw); -+static struct fb_var_screeninfo sinfo_p0; -+static struct fb_var_screeninfo sinfo; -+static struct fb_var_screeninfo sinfo2; -+static struct fb_fix_screeninfo finfo; -+static struct omapfb_mem_info minfo; -+static struct omapfb_plane_info pinfo; -+static int xoff, yoff; -+ -+static struct { -+ unsigned x; -+ unsigned y; -+ uint8_t *buf; -+} fb_pages[2]; -+static int dev_fd = -1; -+static int fb_page_flip = 0; -+static int page = 0; -+static void omapfb_update(int x, int y, int out_w, int out_h, int show); -+ -+extern void mplayer_put_key( int code ); -+#include "input/keycodes.h" -+ -+#define TRANSPARENT_COLOR_KEY 0xff0 -+ -+static Display *display = NULL; // pointer to X Display structure. -+static int screen_num; // number of screen to place the window on. -+static Window win = 0; -+static Window parent = 0; // pointer to the newly created window. -+ -+/* This is used to intercept window closing requests. */ -+static Atom wm_delete_window; -+ -+ -+void vo_calc_drwXY(uint32_t *drwX, uint32_t *drwY) -+{ -+ *drwX = *drwY = 0; -+ if (vo_fs) { -+ aspect(&vo_dwidth, &vo_dheight, A_ZOOM); -+ vo_dwidth = FFMIN(vo_dwidth, vo_screenwidth); -+ vo_dheight = FFMIN(vo_dheight, vo_screenheight); -+ *drwX = (vo_screenwidth - vo_dwidth) / 2; -+ *drwY = (vo_screenheight - vo_dheight) / 2; -+ mp_msg(MSGT_VO, MSGL_V, "[vo-fs] dx: %d dy: %d dw: %d dh: %d\n", -+ *drwX, *drwY, vo_dwidth, vo_dheight); -+ } else if (WinID == 0) { -+ *drwX = vo_dx; -+ *drwY = vo_dy; -+ } -+} -+ -+static void getPrimaryPlaneInfo() -+{ -+ int dev_fd = open("/dev/fb0", O_RDWR); -+ -+ if (dev_fd == -1) { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error /dev/fb0\n"); -+ return -1; -+ } -+ -+ ioctl(dev_fd, FBIOGET_VSCREENINFO, &sinfo_p0); -+ close(dev_fd); -+} -+ -+/** -+ * Function to get the offset to be used when in windowed mode -+ * or when using -wid option -+ */ -+static void x11_get_window_abs_position(Display *display, Window window, -+ int *wx, int *wy, int *ww, int *wh) -+{ -+ Window root, parent; -+ Window *child; -+ unsigned int n_children; -+ XWindowAttributes attribs; -+ -+ /* Get window attributes */ -+ XGetWindowAttributes(display, window, &attribs); -+ -+ /* Get relative position of given window */ -+ *wx = attribs.x; -+ *wy = attribs.y; -+ if (ww) -+ *ww = attribs.width; -+ if (wh) -+ *wh = attribs.height; -+ -+ /* Query window tree information */ -+ XQueryTree(display, window, &root, &parent, &child, &n_children); -+ if (parent) -+ { -+ int x, y; -+ /* If we have a parent we must go there and discover his position*/ -+ x11_get_window_abs_position(display, parent, &x, &y, NULL, NULL); -+ *wx += x; -+ *wy += y; -+ } -+ -+ /* If we had children, free it */ -+ if(n_children) -+ XFree(child); -+} -+ -+static void x11_check_events(void) -+{ -+ int e = vo_x11_check_events(mDisplay); -+ -+ if (e & VO_EVENT_RESIZE) -+ vo_calc_drwXY(&drwX, &drwY); -+ -+ if (e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) -+ { -+ vo_xv_draw_colorkey(drwX, drwY, vo_dwidth - 1, vo_dheight - 1); -+ omapfb_update(0, 0, 0, 0, 1); -+ } -+} -+ -+static void x11_uninit() -+{ -+ if (display) { -+ XCloseDisplay(display); -+ display = NULL; -+ } -+} -+ -+/** -+ * Initialize framebuffer -+ */ -+static int preinit(const char *arg) -+{ -+ opt_t subopts[] = { -+ {"fb_overlay_only", OPT_ARG_BOOL, &fb_overlay_only, NULL}, -+ {"dbl_buffer", OPT_ARG_BOOL, &dbl_buffer, NULL}, -+ {NULL} -+ }; -+ -+ if (subopt_parse(arg, subopts) != 0) { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] unknown suboptions: %s\n", arg); -+ return -1; -+ } -+ -+ getPrimaryPlaneInfo(); -+ dev_fd = open("/dev/fb1", O_RDWR); -+ -+ if (dev_fd == -1) { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error /dev/fb1\n"); -+ return -1; -+ } -+ -+ ioctl(dev_fd, FBIOGET_VSCREENINFO, &sinfo); -+ ioctl(dev_fd, OMAPFB_QUERY_PLANE, &pinfo); -+ ioctl(dev_fd, OMAPFB_QUERY_MEM, &minfo); -+ -+ if (!fb_overlay_only && !vo_init()) -+ { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Could not open X, overlay only...\n"); -+ fb_overlay_only = 1; -+ } -+ -+ return 0; -+} -+ -+static void omapfb_update(int x, int y, int out_w, int out_h, int show) -+{ -+ int xres, yres; -+ if (!fb_overlay_only) -+ x11_get_window_abs_position(mDisplay, vo_window, &x, &y, &out_w, &out_h); -+ -+ /* Check for new screen rotation */ -+ ioctl(dev_fd, FBIOGET_VSCREENINFO, &sinfo2); -+ if (sinfo2.rotate != sinfo_p0.rotate) -+ getPrimaryPlaneInfo(); -+ -+ if ( (!x && !y && !out_w && !out_h) || -+ (out_w < sinfo.xres_virtual / 4) || (out_h < sinfo.yres_virtual / 4) || /* HW can't scale down by more than 4x */ -+ (out_w > sinfo.xres_virtual * 8) || (out_h > sinfo.yres_virtual * 8) ) { /* HW can't scale up by more than 8x */ -+ pinfo.enabled = 0; -+ pinfo.pos_x = 0; -+ pinfo.pos_y = 0; -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+ return; -+ } -+ -+ xres = sinfo.xres_virtual; -+ yres = sinfo.yres_virtual; -+ -+ /* Handle clipping: if the left or top edge of the window goes -+ * offscreen, clamp the overlay to the left or top edge of the -+ * screen, and set the difference into the frame offset. Also -+ * decrease the overlay size by the offset. The offset must -+ * take window scaling into account as well. -+ * -+ * Likewise, if the right or bottom edge of the window goes -+ * offscreen, clamp the overlay to the right or bottom edge of -+ * the screen, and decrease the overlay size accordingly. The -+ * hardware will truncate the output accordingly, so no offset -+ * is needed. Also take window scaling into account. -- hyc -+ */ -+ if (x < 0) { -+ /* clamp to left edge */ -+ xoff = -x; -+ if (out_w != sinfo.xres_virtual) { -+ /* account for scaling */ -+ xoff *= sinfo.xres_virtual; -+ xoff /= out_w; -+ } -+ xres -= xoff; -+ out_w += x; -+ x = 0; -+ } else { -+ xoff = 0; -+ if (x + out_w > sinfo_p0.xres) { -+ /* clamp to right edge */ -+ int diff = sinfo_p0.xres - x; -+ if (out_w != sinfo.xres_virtual) { -+ /* account for scaling */ -+ xres = diff * sinfo.xres_virtual; -+ xres /= out_w; -+ } else { -+ xres = diff; -+ } -+ out_w = diff; -+ } -+ } -+ -+ if (y < 0) { -+ /* clamp to top edge - this seldom occurs since the window -+ * titlebar is usually forced to stay visible -+ */ -+ yoff = -y; -+ if (out_h != sinfo.yres_virtual) { -+ /* account for scaling */ -+ yoff *= sinfo.yres_virtual; -+ yoff /= out_h; -+ } -+ yres -= yoff; -+ out_h += y; -+ y = 0; -+ } else { -+ yoff = 0; -+ if (y + out_h > sinfo_p0.yres) { -+ /* clamp to bottom edge */ -+ int diff = sinfo_p0.yres - y; -+ if (out_h != sinfo.yres_virtual) { -+ /* account for scaling */ -+ yres = diff * sinfo.yres_virtual; -+ yres /= out_h; -+ } else { -+ yres = diff; -+ } -+ out_h = diff; -+ } -+ } -+ -+ if (xoff & 1) -+ xoff++; -+ if (xres & 1) -+ xres--; -+ -+ pinfo.enabled = show; -+ pinfo.pos_x = x; -+ pinfo.pos_y = y; -+ pinfo.out_width = out_w; -+ pinfo.out_height = out_h; -+ -+ sinfo.xoffset = fb_pages[page].x + xoff; -+ sinfo.yoffset = fb_pages[page].y + yoff; -+ /* If we had to change the overlay dimensions, update it */ -+ if (xres != sinfo2.xres || yres != sinfo2.yres || -+ sinfo.xoffset != sinfo2.xoffset || -+ sinfo.yoffset != sinfo2.yoffset) { -+ sinfo.xres = xres; -+ sinfo.yres = yres; -+ sinfo.rotate = sinfo2.rotate; -+ ioctl(dev_fd, FBIOPUT_VSCREENINFO, &sinfo); -+ } -+ -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+} -+ -+static int config(uint32_t width, uint32_t height, uint32_t d_width, -+ uint32_t d_height, uint32_t flags, char *title, -+ uint32_t format) -+{ -+ uint8_t *fbmem; -+ int i; -+ struct omapfb_color_key color_key; -+ -+ XVisualInfo vinfo; -+ XSetWindowAttributes xswa; -+ XWindowAttributes attribs; -+ unsigned long xswamask; -+ int depth; -+ -+ Window root, parent; -+ Window *child; -+ unsigned int n_children; -+ -+ fullscreen_flag = flags & VOFLAG_FULLSCREEN; -+ if (!fb_overlay_only) -+ { -+ if (!title) -+ title = "MPlayer OMAPFB (X11/FB) render"; -+ -+ XGetWindowAttributes(mDisplay, mRootWin, &attribs); -+ depth = attribs.depth; -+ if (depth != 15 && depth != 16 && depth != 24 && depth != 32) -+ depth = 24; -+ XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); -+ -+ xswa.border_pixel = 0; -+ xswa.background_pixel = xv_colorkey = TRANSPARENT_COLOR_KEY; -+ -+ xswamask = CWBackPixel | CWBorderPixel; -+ xv_ck_info.method = CK_METHOD_BACKGROUND; -+ -+ vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, vo_dwidth, vo_dheight, -+ flags, CopyFromParent, "omapfb", title); -+ XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); -+ -+ /* Need to receive events on the parent window -- so when it is -+ moved / resized / etc., we know. */ -+ if(WinID > 0) -+ { -+ /* Query window tree information */ -+ XQueryTree(mDisplay, vo_window, &root, &parent, &child, &n_children); -+ if (n_children) -+ XFree(child); -+ -+ XUnmapWindow(mDisplay, vo_window); -+ if (parent) -+ XSelectInput(mDisplay, parent, StructureNotifyMask); -+ XMapWindow(mDisplay, vo_window); -+ } -+ -+ vo_calc_drwXY(&drwX, &drwY); -+ vo_xv_draw_colorkey(drwX, drwY, vo_dwidth - 1, vo_dheight - 1); -+ } -+ -+ fbmem = mmap(NULL, minfo.size, PROT_READ|PROT_WRITE, MAP_SHARED, dev_fd, 0); -+ if (fbmem == MAP_FAILED) { -+ mp_msg(MSGT_VO, MSGL_FATAL, "[omapfb] Error mmap\n"); -+ return -1; -+ } -+ -+ for (i = 0; i < minfo.size / 4; i++) -+ ((uint32_t*)fbmem)[i] = 0x80008000; -+ -+ sinfo.xres = width & ~15; -+ sinfo.yres = height & ~15; -+ sinfo.xoffset = 0; -+ sinfo.yoffset = 0; -+ sinfo.nonstd = OMAPFB_COLOR_YUY422; -+ -+ fb_pages[0].x = 0; -+ fb_pages[0].y = 0; -+ fb_pages[0].buf = fbmem; -+ -+ if (dbl_buffer && minfo.size >= sinfo.xres * sinfo.yres * 2) { -+ sinfo.xres_virtual = sinfo.xres; -+ sinfo.yres_virtual = sinfo.yres * 2; -+ fb_pages[1].x = 0; -+ fb_pages[1].y = sinfo.yres; -+ fb_pages[1].buf = fbmem + sinfo.xres * sinfo.yres * 2; -+ fb_page_flip = 1; -+ } else { -+ sinfo.xres_virtual = sinfo.xres; -+ sinfo.yres_virtual = sinfo.yres; -+ fb_page_flip = 0; -+ } -+ -+ ioctl(dev_fd, FBIOPUT_VSCREENINFO, &sinfo); -+ ioctl(dev_fd, FBIOGET_FSCREENINFO, &finfo); -+ -+ if (WinID <= 0) { -+ if (fullscreen_flag) { -+ omapfb_update(0, 0, sinfo_p0.xres, sinfo_p0.yres, 1); -+ } else { -+ omapfb_update(sinfo_p0.xres / 2 - sinfo.xres / 2, sinfo_p0.yres / 2 - sinfo.yres / 2, sinfo.xres, sinfo.yres, 1); -+ } -+ } -+ -+ color_key.channel_out = OMAPFB_CHANNEL_OUT_LCD; -+ color_key.background = 0x0; -+ color_key.trans_key = TRANSPARENT_COLOR_KEY; -+ if (fb_overlay_only) -+ color_key.key_type = OMAPFB_COLOR_KEY_DISABLED; -+ else -+ color_key.key_type = OMAPFB_COLOR_KEY_GFX_DST; -+ ioctl(dev_fd, OMAPFB_SET_COLOR_KEY, &color_key); -+ -+ plane_ready = 1; -+ return 0; -+} -+ -+static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride) -+{ -+ vo_draw_alpha_yuy2(w, h, src, srca, stride, fb_pages[page].buf + y0 * finfo.line_length + x0 * 2, finfo.line_length); -+} -+ -+static void draw_osd(void) -+{ -+ vo_draw_text(sinfo.xres, sinfo.yres, draw_alpha); -+} -+ -+static int draw_frame(uint8_t *src[]) -+{ -+ return 1; -+} -+ -+static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y) -+{ -+ if (x!=0) -+ return 0; -+ -+ if (!plane_ready) -+ return 0; -+ -+ ioctl(dev_fd, OMAPFB_SYNC_GFX); -+ -+ yuv420_to_yuv422(fb_pages[page].buf + y * finfo.line_length, src[0], src[1], src[2], w & ~15, h, stride[0], stride[1], finfo.line_length); -+ return 0; -+} -+ -+static void flip_page(void) -+{ -+ if (fb_page_flip) { -+ sinfo.xoffset = fb_pages[page].x + xoff; -+ sinfo.yoffset = fb_pages[page].y + yoff; -+ ioctl(dev_fd, FBIOPAN_DISPLAY, &sinfo); -+ page ^= fb_page_flip; -+ } -+} -+ -+static int query_format(uint32_t format) -+{ -+ // For simplicity pretend that we can only do YV12, support for -+ // other formats can be added quite easily if/when needed -+ if (format != IMGFMT_YV12) -+ return 0; -+ -+ return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; -+} -+ -+ -+/** -+ * Uninitialize framebuffer -+ */ -+static void uninit() -+{ -+ pinfo.enabled = 0; -+ ioctl(dev_fd, OMAPFB_SETUP_PLANE, &pinfo); -+ -+ if (!fb_overlay_only) { -+ struct omapfb_color_key color_key; -+ color_key.channel_out = OMAPFB_CHANNEL_OUT_LCD; -+ color_key.key_type = OMAPFB_COLOR_KEY_DISABLED; -+ ioctl(dev_fd, OMAPFB_SET_COLOR_KEY, &color_key); -+ } -+ -+ close(dev_fd); -+ -+ if (!fb_overlay_only) -+ x11_uninit(); -+} -+ -+ -+static int control(uint32_t request, void *data, ...) -+{ -+ switch (request) { -+ case VOCTRL_QUERY_FORMAT: -+ return query_format(*((uint32_t*)data)); -+ case VOCTRL_FULLSCREEN: { -+ if (WinID > 0) return VO_FALSE; -+ if (fullscreen_flag) { -+ if (!fb_overlay_only) -+ vo_x11_fullscreen(); -+ fullscreen_flag = 0; -+ omapfb_update(sinfo_p0.xres / 2 - sinfo.xres / 2, sinfo_p0.yres / 2 - sinfo.yres / 2, sinfo.xres, sinfo.yres, 1); -+ } else { -+ if (!fb_overlay_only) -+ vo_x11_fullscreen(); -+ fullscreen_flag = 1; -+ omapfb_update(0, 0, sinfo_p0.xres, sinfo_p0.yres, 1); -+ } -+ return VO_TRUE; -+ } -+ case VOCTRL_UPDATE_SCREENINFO: -+ update_xinerama_info(); -+ return VO_TRUE; -+ } -+ return VO_NOTIMPL; -+} -+ -+ -+static void check_events(void) -+{ -+ if (!fb_overlay_only) -+ x11_check_events(); -+} -diff --git a/libvo/yuv.S b/libvo/yuv.S -new file mode 100644 -index 0000000..1cd2c1d ---- /dev/null -+++ b/libvo/yuv.S -@@ -0,0 +1,170 @@ -+/* -+ Copyright (C) 2008 Mans Rullgard -+ -+ Permission is hereby granted, free of charge, to any person -+ obtaining a copy of this software and associated documentation -+ files (the "Software"), to deal in the Software without -+ restriction, including without limitation the rights to use, copy, -+ modify, merge, publish, distribute, sublicense, and/or sell copies -+ of the Software, and to permit persons to whom the Software is -+ furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice shall be -+ included in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ */ -+ -+ .macro mov32 rd, val -+ movw \rd, #:lower16:\val -+ movt \rd, #:upper16:\val -+ .endm -+ -+ .fpu neon -+ .text -+ -+@ yuv420_to_yuv422(uint8_t *yuv, uint8_t *y, uint8_t *u, uint8_t *v, -+@ int w, int h, int yw, int cw, int dw) -+ -+#define yuv r0 -+#define y r1 -+#define u r2 -+#define v r3 -+#define w r4 -+#define h r5 -+#define yw r6 -+#define cw r7 -+#define dw r8 -+ -+#define tyuv r9 -+#define ty r10 -+#define tu r11 -+#define tv r12 -+#define i lr -+ -+ .global yuv420_to_yuv422 -+ .func yuv420_to_yuv422 -+yuv420_to_yuv422: -+ push {r4-r11,lr} -+ add r4, sp, #36 -+.Ldo_conv: -+ ldm r4, {r4-r8} -+ push {r4} -+1: -+ mov tu, u -+ mov tv, v -+ vld1.64 {d2}, [u,:64], cw @ u0 -+ vld1.64 {d3}, [v,:64], cw @ v0 -+ mov tyuv, yuv -+ mov ty, y -+ vzip.8 d2, d3 @ u0v0 -+ mov i, #16 -+2: -+ pld [y, #64] -+ vld1.64 {d0, d1}, [y,:128], yw @ y0 -+ pld [u, #64] -+ subs i, i, #4 -+ vld1.64 {d6}, [u,:64], cw @ u2 -+ pld [y, #64] -+ vld1.64 {d4, d5}, [y,:128], yw @ y1 -+ pld [v, #64] -+ vld1.64 {d7}, [v,:64], cw @ v2 -+ pld [y, #64] -+ vld1.64 {d16,d17}, [y,:128], yw @ y2 -+ vzip.8 d6, d7 @ u2v2 -+ pld [u, #64] -+ vld1.64 {d22}, [u,:64], cw @ u4 -+ pld [v, #64] -+ vld1.64 {d23}, [v,:64], cw @ v4 -+ pld [y, #64] -+ vld1.64 {d20,d21}, [y,:128], yw @ y3 -+ vmov q9, q3 @ u2v2 -+ vzip.8 d22, d23 @ u4v4 -+ vrhadd.u8 q3, q1, q3 @ u1v1 -+ vzip.8 q0, q1 @ y0u0y0v0 -+ vmov q12, q11 @ u4v4 -+ vzip.8 q2, q3 @ y1u1y1v1 -+ vrhadd.u8 q11, q9, q11 @ u3v3 -+ vst1.64 {d0-d3}, [yuv,:128], dw @ y0u0y0v0 -+ vzip.8 q8, q9 @ y2u2y2v2 -+ vst1.64 {d4-d7}, [yuv,:128], dw @ y1u1y1v1 -+ vzip.8 q10, q11 @ y3u3y3v3 -+ vst1.64 {d16-d19}, [yuv,:128], dw @ y2u2y2v2 -+ vmov q1, q12 -+ vst1.64 {d20-d23}, [yuv,:128], dw @ y3u3y3v3 -+ bgt 2b -+ -+ subs w, w, #16 -+ add yuv, tyuv, #32 -+ add y, ty, #16 -+ add u, tu, #8 -+ add v, tv, #8 -+ bgt 1b -+ -+ ldr w, [sp] -+ subs h, h, #16 -+ add yuv, yuv, dw, lsl #4 -+ sub yuv, yuv, w, lsl #1 -+ add y, y, yw, lsl #4 -+ sub y, y, w -+ add u, u, cw, lsl #3 -+ sub u, u, w, asr #1 -+ add v, v, cw, lsl #3 -+ sub v, v, w, asr #1 -+ bgt 1b -+ -+ pop {r3-r11,pc} -+ .endfunc -+ -+ .func neon_open -+neon_open: -+ push {r4-r8,lr} -+ ldrd r4, r5, [r0, #16] -+ ldrd r6, r7, [r0, #24] -+ lsl r8, r4, #1 -+ mov32 r0, conv_params -+ stm r0, {r4-r8} -+ mov r0, #0 -+ pop {r4-r8,pc} -+ .endfunc -+ -+ .func neon_convert -+neon_convert: -+ push {r4-r11,lr} -+ ldr r0, [r0] -+ mov32 r4, conv_params -+ ldm r1, {r1-r3} -+ b .Ldo_conv -+ .endfunc -+ -+ .func neon_nop -+neon_nop: -+ bx lr -+ .endfunc -+ -+ .section .bss -+conv_params: -+ .skip 5*4 -+ .size conv_params, . - conv_params -+ -+ .section .rodata -+.Lname: .asciz "neon" -+ofb_pixconv_neon: -+ .word .Lname -+ .word 0 @ flags -+ .word neon_open -+ .word neon_convert -+ .word neon_nop @ finish -+ .word neon_nop @ close -+ .size ofb_pixconv_neon, . - ofb_pixconv_neon -+ -+ .section .ofb_pixconv, "a" -+ofb_pixconv_neon_p: -+ .word ofb_pixconv_neon --- -1.7.2.5 - diff --git a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb index 10a69a9..c24cc4a 100644 --- a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb +++ b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb @@ -5,7 +5,7 @@ HOMEPAGE = "http://www.mplayerhq.hu/" DEPENDS = "libvpx live555 libdvdread libtheora virtual/libsdl ffmpeg xsp zlib libpng jpeg liba52 freetype fontconfig alsa-lib lzo ncurses lame libxv virtual/libx11 virtual/kernel libass \ ${@base_conditional('ENTERPRISE_DISTRO', '1', '', 'libmad liba52 lame', d)}" -#RDEPENDS_${PN} = "mplayer-common" +RDEPENDS_${PN} = "mplayer-common" PROVIDES = "mplayer" RPROVIDES_${PN} = "mplayer" RCONFLICTS_${PN} = "mplayer" @@ -17,10 +17,6 @@ SRC_URI = "git://repo.or.cz/mplayer.git;protocol=git;branch=master \ file://cross.compile.codec-cfg.patch \ " -SRC_URI_append_aarmv7a = " \ - file://0001-video-out-for-omapfb-support.patch \ - " - SRCREV = "e3f5043233336d8b4b0731c6a8b42a8fda5535ac" ARM_INSTRUCTION_SET = "ARM" @@ -40,9 +36,6 @@ CONFFILES_${PN} += "/usr/etc/mplayer/input.conf \ inherit autotools pkgconfig -# We want a kernel header for armv7a, but we don't want to make mplayer machine specific for that -STAGING_KERNEL_DIR = "${STAGING_DIR}/${MACHINE_ARCH}${TARGET_VENDOR}-${TARGET_OS}/kernel" - EXTRA_OECONF = " \ --prefix=/usr \ --mandir=${mandir} \ @@ -135,21 +128,9 @@ EXTRA_OECONF = " \ --extra-libs=' -lXext -lX11 -lBasicUsageEnvironment -lUsageEnvironment -lgroupsock -lliveMedia -lstdc++' \ " -EXTRA_OECONF_append_armv6 = " --enable-armv6" -EXTRA_OECONF_append_armv7a = " --enable-armv6 --enable-neon" - FULL_OPTIMIZATION = "-fexpensive-optimizations -fomit-frame-pointer -frename-registers -O4 -ffast-math" -FULL_OPTIMIZATION_armv7a = "-fexpensive-optimizations -ftree-vectorize -fomit-frame-pointer -O4 -ffast-math" BUILD_OPTIMIZATION = "${FULL_OPTIMIZATION}" -do_configure_prepend_armv7a() { - cp ${STAGING_KERNEL_DIR}/arch/arm/plat-omap/include/mach/omapfb.h ${S}/libvo/omapfb.h || true - cp ${STAGING_KERNEL_DIR}/include/asm-arm/arch-omap/omapfb.h ${S}/libvo/omapfb.h || true - cp ${STAGING_KERNEL_DIR}/include/linux/omapfb.h ${S}/libvo/omapfb.h || true - cp ${STAGING_DIR_TARGET}/kernel/include/linux/omapfb.h ${S}/libvo/omapfb.h || true - sed -e 's/__user//g' -i ${S}/libvo/omapfb.h || true -} - CFLAGS_append = " -I${S}/libdvdread4 " do_configure() {
* not everybody has FEED_ARCH in OVERRIDES * and not everybody has PKGARCHCOMPAT_ARMV7A enabled so we would need to duplicate armv7a and armv7a-vfp-neon * example of working omapfb patch and optimizations is in meta-smartphone layer http://git.shr-project.org/git/?p=meta-smartphone.git;a=commit;h=483afbee82869a0b2dacadc4b9580c47dcb59d26 Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- .../0001-video-out-for-omapfb-support.patch | 826 -------------------- meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb | 21 +- 2 files changed, 1 insertions(+), 846 deletions(-) delete mode 100644 meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch