mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-05-08 05:29:22 +00:00
mplayer2: drop omapfb patch and support, this can be applied from bsp layer if needed
* 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>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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} \
|
||||
@@ -142,14 +135,6 @@ FULL_OPTIMIZATION = "-fexpensive-optimizations -fomit-frame-pointer -frename-reg
|
||||
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() {
|
||||
|
||||
Reference in New Issue
Block a user