From: Martin Jansa <martin.jansa@gmail.com>
To: openembedded-devel@lists.openembedded.org
Subject: [PATCH] mplayer2: import from OE-classic
Date: Fri, 4 Nov 2011 10:38:56 +0100 [thread overview]
Message-ID: <1320399536-9588-1-git-send-email-Martin.Jansa@gmail.com> (raw)
* taken from 1a91fc4b705b0c4f45eb088a2f7aea01ebc9c98e
* dropped V4L1, largefile, xvmc
* added libass
* added LIC_FILES_CHKSUM
* upgraded to latest SRCREV
* moved glamo patch to meta-openmoko layer
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
.../0001-video-out-for-omapfb-support.patch | 1487 ++++++++++++++++++++
.../mplayer/mplayer2/cross.compile.codec-cfg.patch | 16 +
meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb | 175 +++
3 files changed, 1678 insertions(+), 0 deletions(-)
create mode 100644 meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch
create mode 100644 meta-oe/recipes-multimedia/mplayer/mplayer2/cross.compile.codec-cfg.patch
create mode 100644 meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb
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
new file mode 100644
index 0000000..0354ccf
--- /dev/null
+++ b/meta-oe/recipes-multimedia/mplayer/mplayer2/0001-video-out-for-omapfb-support.patch
@@ -0,0 +1,1487 @@
+From 23eb4c4051c7acb2babd4b224ef85cc8ee8fa511 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>
+---
+ Makefile | 2 +-
+ libvo/video_out.c | 2 +
+ libvo/video_out.c.orig | 654 ++++++++++++++++++++++++++++++++++++++++++++++++
+ libvo/vo_omapfb.c | 591 +++++++++++++++++++++++++++++++++++++++++++
+ libvo/yuv.S | 170 +++++++++++++
+ 5 files changed, 1418 insertions(+), 1 deletions(-)
+ create mode 100644 libvo/video_out.c.orig
+ create mode 100644 libvo/vo_omapfb.c
+ create mode 100644 libvo/yuv.S
+
+diff --git a/Makefile b/Makefile
+index 28c6383..b023136 100644
+--- a/Makefile
++++ b/Makefile
+@@ -451,7 +451,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 2ed0c86..fc9a1cd 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;
+@@ -194,6 +195,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/video_out.c.orig b/libvo/video_out.c.orig
+new file mode 100644
+index 0000000..2ed0c86
+--- /dev/null
++++ b/libvo/video_out.c.orig
+@@ -0,0 +1,654 @@
++/*
++ * libvo common functions, variables used by many/all drivers.
++ *
++ * This file is part of MPlayer.
++ *
++ * MPlayer is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * MPlayer is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License along
++ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <assert.h>
++#include <stdbool.h>
++
++#include <unistd.h>
++//#include <sys/mman.h>
++
++#include "config.h"
++#include "options.h"
++#include "talloc.h"
++#include "video_out.h"
++#include "aspect.h"
++#include "geometry.h"
++#include "old_vo_wrapper.h"
++#include "input/input.h"
++#include "mp_fifo.h"
++
++
++#include "mp_msg.h"
++
++#include "osdep/shmem.h"
++#ifdef CONFIG_X11
++#include "x11_common.h"
++#endif
++
++int xinerama_screen = -1;
++int xinerama_x;
++int xinerama_y;
++
++int vo_nomouse_input = 0;
++int vo_grabpointer = 1;
++int vo_doublebuffering = 1;
++int vo_vsync = 0;
++int vo_fs = 0;
++int vo_fsmode = 0;
++float vo_panscan = 0.0f;
++int vo_adapter_num=0;
++int vo_refresh_rate=0;
++int vo_keepaspect=1;
++int vo_rootwin=0;
++int vo_border=1;
++int64_t WinID = -1;
++
++int vo_pts=0; // for hw decoding
++float vo_fps=0;
++
++char *vo_subdevice = NULL;
++int vo_directrendering=0;
++
++int vo_colorkey = 0x0000ff00; // default colorkey is green
++ // (0xff000000 means that colorkey has been disabled)
++
++
++//
++// Externally visible list of all vo drivers
++//
++extern struct vo_driver video_out_mga;
++extern struct vo_driver video_out_xmga;
++extern struct vo_driver video_out_x11;
++extern struct vo_driver video_out_xover;
++extern struct vo_driver video_out_vdpau;
++extern struct vo_driver video_out_xv;
++extern struct vo_driver video_out_gl_nosw;
++extern struct vo_driver video_out_gl;
++extern struct vo_driver video_out_gl_sdl;
++extern struct vo_driver video_out_dga;
++extern struct vo_driver video_out_sdl;
++extern struct vo_driver video_out_3dfx;
++extern struct vo_driver video_out_tdfxfb;
++extern struct vo_driver video_out_s3fb;
++extern struct vo_driver video_out_wii;
++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_svga;
++extern struct vo_driver video_out_png;
++extern struct vo_driver video_out_ggi;
++extern struct vo_driver video_out_aa;
++extern struct vo_driver video_out_caca;
++extern struct vo_driver video_out_mpegpes;
++extern struct vo_driver video_out_yuv4mpeg;
++extern struct vo_driver video_out_direct3d;
++extern struct vo_driver video_out_directx;
++extern struct vo_driver video_out_kva;
++extern struct vo_driver video_out_dxr3;
++extern struct vo_driver video_out_ivtv;
++extern struct vo_driver video_out_v4l2;
++extern struct vo_driver video_out_jpeg;
++extern struct vo_driver video_out_gif89a;
++extern struct vo_driver video_out_vesa;
++extern struct vo_driver video_out_directfb;
++extern struct vo_driver video_out_dfbmga;
++extern struct vo_driver video_out_tdfx_vid;
++extern struct vo_driver video_out_xvr100;
++extern struct vo_driver video_out_tga;
++extern struct vo_driver video_out_corevideo;
++extern struct vo_driver video_out_quartz;
++extern struct vo_driver video_out_pnm;
++extern struct vo_driver video_out_md5sum;
++extern struct vo_driver video_out_glamo;
++
++const struct vo_driver *video_out_drivers[] =
++{
++#ifdef CONFIG_XVR100
++ &video_out_xvr100,
++#endif
++#ifdef CONFIG_TDFX_VID
++ &video_out_tdfx_vid,
++#endif
++#ifdef CONFIG_DIRECTX
++ &video_out_directx,
++#endif
++#ifdef CONFIG_DIRECT3D
++ &video_out_direct3d,
++#endif
++#ifdef CONFIG_KVA
++ &video_out_kva,
++#endif
++#ifdef CONFIG_COREVIDEO
++ &video_out_corevideo,
++#endif
++#ifdef CONFIG_QUARTZ
++ &video_out_quartz,
++#endif
++#ifdef CONFIG_XMGA
++ &video_out_xmga,
++#endif
++#ifdef CONFIG_MGA
++ &video_out_mga,
++#endif
++#ifdef CONFIG_TDFXFB
++ &video_out_tdfxfb,
++#endif
++#ifdef CONFIG_S3FB
++ &video_out_s3fb,
++#endif
++#ifdef CONFIG_WII
++ &video_out_wii,
++#endif
++#ifdef CONFIG_3DFX
++ &video_out_3dfx,
++#endif
++#if CONFIG_VDPAU
++ &video_out_vdpau,
++#endif
++#ifdef CONFIG_XV
++ &video_out_xv,
++#endif
++#ifdef CONFIG_X11
++#ifdef CONFIG_GL
++ &video_out_gl_nosw,
++#endif
++ &video_out_x11,
++ &video_out_xover,
++#endif
++#ifdef CONFIG_SDL
++ &video_out_sdl,
++#endif
++#ifdef CONFIG_GL
++ &video_out_gl,
++#endif
++#ifdef CONFIG_GL_SDL
++ &video_out_gl_sdl,
++#endif
++#ifdef CONFIG_DGA
++ &video_out_dga,
++#endif
++#ifdef CONFIG_GGI
++ &video_out_ggi,
++#endif
++#ifdef CONFIG_FBDEV
++ &video_out_fbdev,
++ &video_out_fbdev2,
++#endif
++#ifdef CONFIG_SVGALIB
++ &video_out_svga,
++#endif
++#ifdef CONFIG_AA
++ &video_out_aa,
++#endif
++#ifdef CONFIG_CACA
++ &video_out_caca,
++#endif
++#ifdef CONFIG_DXR3
++ &video_out_dxr3,
++#endif
++#ifdef CONFIG_IVTV
++ &video_out_ivtv,
++#endif
++#ifdef CONFIG_V4L2_DECODER
++ &video_out_v4l2,
++#endif
++#ifdef CONFIG_BL
++ &video_out_bl,
++#endif
++#ifdef CONFIG_VESA
++ &video_out_vesa,
++#endif
++#ifdef CONFIG_DIRECTFB
++ &video_out_dfbmga,
++#endif
++ &video_out_null,
++ // should not be auto-selected
++#ifdef CONFIG_DIRECTFB
++ // vo directfb can call exit() if initialization fails
++ &video_out_directfb,
++#endif
++ &video_out_mpegpes,
++#ifdef CONFIG_YUV4MPEG
++ &video_out_yuv4mpeg,
++#endif
++#ifdef CONFIG_FFMPEG
++ &video_out_png,
++#endif
++#ifdef CONFIG_JPEG
++ &video_out_jpeg,
++#endif
++#ifdef CONFIG_GIF
++ &video_out_gif89a,
++#endif
++#ifdef CONFIG_TGA
++ &video_out_tga,
++#endif
++#ifdef CONFIG_PNM
++ &video_out_pnm,
++#endif
++#ifdef CONFIG_MD5SUM
++ &video_out_md5sum,
++#endif
++#ifdef CONFIG_GLAMO
++ &video_out_glamo,
++#endif
++ NULL
++};
++
++
++static int vo_preinit(struct vo *vo, const char *arg)
++{
++ return vo->driver->preinit(vo, arg);
++}
++
++int vo_control(struct vo *vo, uint32_t request, void *data)
++{
++ return vo->driver->control(vo, request, data);
++}
++
++// Return -1 if driver appears not to support a draw_image interface,
++// 0 otherwise (whether the driver actually drew something or not).
++int vo_draw_image(struct vo *vo, struct mp_image *mpi, double pts)
++{
++ if (!vo->config_ok)
++ return 0;
++ if (vo->driver->buffer_frames) {
++ vo->driver->draw_image(vo, mpi, pts);
++ return 0;
++ }
++ vo->frame_loaded = true;
++ vo->next_pts = pts;
++ if (vo_control(vo, VOCTRL_DRAW_IMAGE, mpi) == VO_NOTIMPL)
++ return -1;
++ return 0;
++}
++
++int vo_get_buffered_frame(struct vo *vo, bool eof)
++{
++ if (!vo->config_ok)
++ return -1;
++ if (vo->frame_loaded)
++ return 0;
++ if (!vo->driver->buffer_frames)
++ return -1;
++ vo->driver->get_buffered_frame(vo, eof);
++ return vo->frame_loaded ? 0 : -1;
++}
++
++void vo_skip_frame(struct vo *vo)
++{
++ vo->frame_loaded = false;
++}
++
++int vo_draw_frame(struct vo *vo, uint8_t *src[])
++{
++ assert(!vo->driver->is_new);
++ if (!vo->config_ok)
++ return 0;
++ return old_vo_draw_frame(vo, src);
++}
++
++int vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[], int w, int h, int x, int y)
++{
++ return vo->driver->draw_slice(vo, src, stride, w, h, x, y);
++}
++
++void vo_draw_osd(struct vo *vo, struct osd_state *osd)
++{
++ if (!vo->config_ok)
++ return;
++ vo->driver->draw_osd(vo, osd);
++}
++
++void vo_flip_page(struct vo *vo, unsigned int pts_us, int duration)
++{
++ if (!vo->config_ok)
++ return;
++ vo->frame_loaded = false;
++ vo->next_pts = MP_NOPTS_VALUE;
++ if (vo->driver->flip_page_timed)
++ vo->driver->flip_page_timed(vo, pts_us, duration);
++ else
++ vo->driver->flip_page(vo);
++}
++
++void vo_check_events(struct vo *vo)
++{
++ if (!vo->config_ok) {
++ if (vo->registered_fd != -1)
++ mp_input_rm_key_fd(vo->input_ctx, vo->registered_fd);
++ vo->registered_fd = -1;
++ return;
++ }
++ vo->driver->check_events(vo);
++}
++
++void vo_seek_reset(struct vo *vo)
++{
++ vo_control(vo, VOCTRL_RESET, NULL);
++ vo->frame_loaded = false;
++}
++
++void vo_destroy(struct vo *vo)
++{
++ if (vo->registered_fd != -1)
++ mp_input_rm_key_fd(vo->input_ctx, vo->registered_fd);
++ vo->driver->uninit(vo);
++ talloc_free(vo);
++}
++
++void list_video_out(void)
++{
++ int i = 0;
++ mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Available video output drivers:\n");
++ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_OUTPUTS\n");
++ while (video_out_drivers[i]) {
++ const vo_info_t *info = video_out_drivers[i++]->info;
++ mp_msg(MSGT_GLOBAL, MSGL_INFO,"\t%s\t%s\n", info->short_name, info->name);
++ }
++ mp_msg(MSGT_GLOBAL, MSGL_INFO,"\n");
++}
++
++struct vo *init_best_video_out(struct MPOpts *opts, struct vo_x11_state *x11,
++ struct mp_fifo *key_fifo,
++ struct input_ctx *input_ctx)
++{
++ char **vo_list = opts->video_driver_list;
++ int i;
++ struct vo *vo = talloc_ptrtype(NULL, vo);
++ struct vo initial_values = {
++ .opts = opts,
++ .x11 = x11,
++ .key_fifo = key_fifo,
++ .input_ctx = input_ctx,
++ .event_fd = -1,
++ .registered_fd = -1,
++ };
++ // first try the preferred drivers, with their optional subdevice param:
++ if (vo_list && vo_list[0])
++ while (vo_list[0][0]) {
++ char *name = strdup(vo_list[0]);
++ vo_subdevice = strchr(name,':');
++ if (!strcmp(name, "pgm"))
++ mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "The pgm video output driver has been replaced by -vo pnm:pgmyuv.\n");
++ if (!strcmp(name, "md5"))
++ mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "The md5 video output driver has been replaced by -vo md5sum.\n");
++ if (vo_subdevice) {
++ vo_subdevice[0] = 0;
++ ++vo_subdevice;
++ }
++ for (i = 0; video_out_drivers[i]; i++) {
++ const struct vo_driver *video_driver = video_out_drivers[i];
++ const vo_info_t *info = video_driver->info;
++ if (!strcmp(info->short_name, name)) {
++ // name matches, try it
++ *vo = initial_values;
++ vo->driver = video_driver;
++ if (!vo_preinit(vo, vo_subdevice)) {
++ free(name);
++ return vo; // success!
++ }
++ talloc_free_children(vo);
++ }
++ }
++ // continue...
++ free(name);
++ ++vo_list;
++ if (!(vo_list[0]))
++ return NULL; // do NOT fallback to others
++ }
++ // now try the rest...
++ vo_subdevice = NULL;
++ for (i = 0; video_out_drivers[i]; i++) {
++ const struct vo_driver *video_driver = video_out_drivers[i];
++ *vo = initial_values;
++ vo->driver = video_driver;
++ if (!vo_preinit(vo, vo_subdevice))
++ return vo; // success!
++ talloc_free_children(vo);
++ }
++ free(vo);
++ return NULL;
++}
++
++static int event_fd_callback(void *ctx, int fd)
++{
++ struct vo *vo = ctx;
++ vo_check_events(vo);
++ return MP_INPUT_NOTHING;
++}
++
++int vo_config(struct vo *vo, uint32_t width, uint32_t height,
++ uint32_t d_width, uint32_t d_height, uint32_t flags,
++ char *title, uint32_t format)
++{
++ struct MPOpts *opts = vo->opts;
++ panscan_init(vo);
++ aspect_save_orig(vo, width, height);
++ aspect_save_prescale(vo, d_width, d_height);
++
++ if (vo_control(vo, VOCTRL_UPDATE_SCREENINFO, NULL) == VO_TRUE) {
++ aspect(vo, &d_width, &d_height, A_NOZOOM);
++ vo->dx = (int)(opts->vo_screenwidth - d_width) / 2;
++ vo->dy = (int)(opts->vo_screenheight - d_height) / 2;
++ geometry(&vo->dx, &vo->dy, &d_width, &d_height,
++ opts->vo_screenwidth, opts->vo_screenheight);
++ geometry_xy_changed |= xinerama_screen >= 0;
++ vo->dx += xinerama_x;
++ vo->dy += xinerama_y;
++ vo->dwidth = d_width;
++ vo->dheight = d_height;
++ }
++
++ int ret = vo->driver->config(vo, width, height, d_width, d_height, flags,
++ title, format);
++ vo->config_ok = (ret == 0);
++ vo->config_count += vo->config_ok;
++ if (vo->registered_fd == -1 && vo->event_fd != -1 && vo->config_ok) {
++ mp_input_add_key_fd(vo->input_ctx, vo->event_fd, 1, event_fd_callback,
++ NULL, vo);
++ vo->registered_fd = vo->event_fd;
++ }
++ return ret;
++}
++
++/**
++ * \brief lookup an integer in a table, table must have 0 as the last key
++ * \param key key to search for
++ * \result translation corresponding to key or "to" value of last mapping
++ * if not found.
++ */
++int lookup_keymap_table(const struct mp_keymap *map, int key) {
++ while (map->from && map->from != key) map++;
++ return map->to;
++}
++
++/**
++ * \brief helper function for the kind of panscan-scaling that needs a source
++ * and destination rectangle like Direct3D and VDPAU
++ */
++static void src_dst_split_scaling(int src_size, int dst_size, int scaled_src_size,
++ int *src_start, int *src_end, int *dst_start, int *dst_end) {
++ if (scaled_src_size > dst_size) {
++ int border = src_size * (scaled_src_size - dst_size) / scaled_src_size;
++ // round to a multiple of 2, this is at least needed for vo_direct3d and ATI cards
++ border = (border / 2 + 1) & ~1;
++ *src_start = border;
++ *src_end = src_size - border;
++ *dst_start = 0;
++ *dst_end = dst_size;
++ } else {
++ *src_start = 0;
++ *src_end = src_size;
++ *dst_start = (dst_size - scaled_src_size) / 2;
++ *dst_end = *dst_start + scaled_src_size;
++ }
++}
++
++/**
++ * Calculate the appropriate source and destination rectangle to
++ * get a correctly scaled picture, including pan-scan.
++ * Can be extended to take future cropping support into account.
++ *
++ * \param crop specifies the cropping border size in the left, right, top and bottom members, may be NULL
++ * \param borders the border values as e.g. EOSD (ASS) and properly placed DVD highlight support requires,
++ * may be NULL and only left and top are currently valid.
++ */
++void calc_src_dst_rects(struct vo *vo, int src_width, int src_height,
++ struct vo_rect *src, struct vo_rect *dst,
++ struct vo_rect *borders, const struct vo_rect *crop)
++{
++ static const struct vo_rect no_crop = {0, 0, 0, 0, 0, 0};
++ int scaled_width = 0;
++ int scaled_height = 0;
++ if (!crop) crop = &no_crop;
++ src_width -= crop->left + crop->right;
++ src_height -= crop->top + crop->bottom;
++ if (src_width < 2) src_width = 2;
++ if (src_height < 2) src_height = 2;
++ dst->left = 0; dst->right = vo->dwidth;
++ dst->top = 0; dst->bottom = vo->dheight;
++ src->left = 0; src->right = src_width;
++ src->top = 0; src->bottom = src_height;
++ if (borders) {
++ borders->left = 0; borders->top = 0;
++ }
++ if (aspect_scaling()) {
++ aspect(vo, &scaled_width, &scaled_height, A_WINZOOM);
++ panscan_calc_windowed(vo);
++ scaled_width += vo->panscan_x;
++ scaled_height += vo->panscan_y;
++ if (borders) {
++ borders->left = (vo->dwidth - scaled_width ) / 2;
++ borders->top = (vo->dheight - scaled_height) / 2;
++ }
++ src_dst_split_scaling(src_width, vo->dwidth, scaled_width,
++ &src->left, &src->right, &dst->left, &dst->right);
++ src_dst_split_scaling(src_height, vo->dheight, scaled_height,
++ &src->top, &src->bottom, &dst->top, &dst->bottom);
++ }
++ src->left += crop->left; src->right += crop->left;
++ src->top += crop->top; src->bottom += crop->top;
++ src->width = src->right - src->left;
++ src->height = src->bottom - src->top;
++ dst->width = dst->right - dst->left;
++ dst->height = dst->bottom - dst->top;
++}
++
++/**
++ * Generates a mouse movement message if those are enable and sends it
++ * to the "main" MPlayer.
++ *
++ * \param posx new x position of mouse
++ * \param posy new y position of mouse
++ */
++void vo_mouse_movement(struct vo *vo, int posx, int posy)
++{
++ char cmd_str[40];
++ if (!enable_mouse_movements)
++ return;
++ snprintf(cmd_str, sizeof(cmd_str), "set_mouse_pos %i %i", posx, posy);
++ mp_input_queue_cmd(vo->input_ctx, mp_input_parse_cmd(cmd_str));
++}
++
++#if defined(CONFIG_FBDEV) || defined(CONFIG_VESA)
++/* Borrowed from vo_fbdev.c
++Monitor ranges related functions*/
++
++char *monitor_hfreq_str = NULL;
++char *monitor_vfreq_str = NULL;
++char *monitor_dotclock_str = NULL;
++
++float range_max(range_t *r)
++{
++float max = 0;
++
++ for (/* NOTHING */; (r->min != -1 && r->max != -1); r++)
++ if (max < r->max) max = r->max;
++ return max;
++}
++
++
++int in_range(range_t *r, float f)
++{
++ for (/* NOTHING */; (r->min != -1 && r->max != -1); r++)
++ if (f >= r->min && f <= r->max)
++ return 1;
++ return 0;
++}
++
++range_t *str2range(char *s)
++{
++ float tmp_min, tmp_max;
++ char *endptr = s; // to start the loop
++ range_t *r = NULL;
++ int i;
++
++ if (!s)
++ return NULL;
++ for (i = 0; *endptr; i++) {
++ if (*s == ',')
++ goto out_err;
++ if (!(r = realloc(r, sizeof(*r) * (i + 2)))) {
++ mp_msg(MSGT_GLOBAL, MSGL_WARN,"can't realloc 'r'\n");
++ return NULL;
++ }
++ tmp_min = strtod(s, &endptr);
++ if (*endptr == 'k' || *endptr == 'K') {
++ tmp_min *= 1000.0;
++ endptr++;
++ } else if (*endptr == 'm' || *endptr == 'M') {
++ tmp_min *= 1000000.0;
++ endptr++;
++ }
++ if (*endptr == '-') {
++ tmp_max = strtod(endptr + 1, &endptr);
++ if (*endptr == 'k' || *endptr == 'K') {
++ tmp_max *= 1000.0;
++ endptr++;
++ } else if (*endptr == 'm' || *endptr == 'M') {
++ tmp_max *= 1000000.0;
++ endptr++;
++ }
++ if (*endptr != ',' && *endptr)
++ goto out_err;
++ } else if (*endptr == ',' || !*endptr) {
++ tmp_max = tmp_min;
++ } else
++ goto out_err;
++ r[i].min = tmp_min;
++ r[i].max = tmp_max;
++ if (r[i].min < 0 || r[i].max < 0)
++ goto out_err;
++ s = endptr + 1;
++ }
++ r[i].min = r[i].max = -1;
++ return r;
++out_err:
++ free(r);
++ return NULL;
++}
++
++/* Borrowed from vo_fbdev.c END */
++#endif
+diff --git a/libvo/vo_omapfb.c b/libvo/vo_omapfb.c
+new file mode 100644
+index 0000000..8c927b7
+--- /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 "osdep/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.7.1
+
diff --git a/meta-oe/recipes-multimedia/mplayer/mplayer2/cross.compile.codec-cfg.patch b/meta-oe/recipes-multimedia/mplayer/mplayer2/cross.compile.codec-cfg.patch
new file mode 100644
index 0000000..7b290b5
--- /dev/null
+++ b/meta-oe/recipes-multimedia/mplayer/mplayer2/cross.compile.codec-cfg.patch
@@ -0,0 +1,16 @@
+Upstream-Status: Pending
+Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
+
+diff --git a/Makefile b/Makefile
+index 6013ca3..28c6383 100644
+--- a/Makefile
++++ b/Makefile
+@@ -600,7 +602,7 @@ mplayer$(EXESUF):
+ $(CC) -o $@ $^ $(EXTRALIBS)
+
+ codec-cfg$(EXESUF): codec-cfg.c codec-cfg.h
+- $(HOST_CC) -O -DCODECS2HTML -I. -o $@ $<
++ $(BUILD_CC) -O -DCODECS2HTML -I. -Iffmpeg -o $@ $<
+
+ codecs.conf.h: codec-cfg$(EXESUF) etc/codecs.conf
+ ./$^ > $@
diff --git a/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb
new file mode 100644
index 0000000..f4015e9
--- /dev/null
+++ b/meta-oe/recipes-multimedia/mplayer/mplayer2_git.bb
@@ -0,0 +1,175 @@
+DESCRIPTION = "Open Source multimedia player."
+SECTION = "multimedia"
+PRIORITY = "optional"
+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"
+PROVIDES = "mplayer"
+RPROVIDES_${PN} = "mplayer"
+RCONFLICTS_${PN} = "mplayer"
+
+LICENSE = "GPLv3"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d32239bcb673463ab874e80d47fae504"
+
+SRC_URI = "git://repo.or.cz/mplayer.git;protocol=git;branch=master \
+ file://cross.compile.codec-cfg.patch \
+"
+
+SRC_URI_append_armv7a = " \
+ file://0001-video-out-for-omapfb-support.patch \
+ "
+
+SRCREV = "e3f5043233336d8b4b0731c6a8b42a8fda5535ac"
+
+ARM_INSTRUCTION_SET = "ARM"
+
+PV = "2.0+gitr${SRCPV}"
+
+PARALLEL_MAKE = ""
+
+S = "${WORKDIR}/git"
+
+FILES_${PN} = "${bindir}/mplayer ${libdir} /usr/etc/mplayer/"
+CONFFILES_${PN} += "/usr/etc/mplayer/input.conf \
+ /usr/etc/mplayer/example.conf \
+ /usr/etc/mplayer/codecs.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} \
+ --target=${SIMPLE_TARGET_SYS} \
+ \
+ --disable-lirc \
+ --disable-lircc \
+ --disable-joystick \
+ --disable-vm \
+ --disable-xf86keysym \
+ --enable-tv \
+ --disable-tv-v4l1 \
+ --enable-tv-v4l2 \
+ --disable-tv-bsdbt848 \
+ --enable-rtc \
+ --enable-networking \
+ --disable-smb \
+ --enable-live \
+ --disable-dvdnav \
+ --enable-dvdread \
+ --disable-dvdread-internal \
+ --disable-libdvdcss-internal \
+ --disable-cdparanoia \
+ --enable-freetype \
+ --enable-sortsub \
+ --disable-fribidi \
+ --disable-enca \
+ --disable-ftp \
+ --disable-vstream \
+ \
+ --disable-gif \
+ --enable-png \
+ --enable-jpeg \
+ --disable-libcdio \
+ --disable-qtx \
+ --disable-xanim \
+ --disable-real \
+ --disable-xvid \
+ \
+ --disable-speex \
+ --enable-theora \
+ --disable-ladspa \
+ --disable-libdv \
+ --enable-mad \
+ --disable-xmms \
+ --disable-musepack \
+ \
+ --disable-gl \
+ --disable-vesa \
+ --disable-svga \
+ --enable-sdl \
+ --disable-aa \
+ --disable-caca \
+ --disable-ggi \
+ --disable-ggiwmh \
+ --disable-directx \
+ --disable-dxr3 \
+ --disable-dvb \
+ --disable-mga \
+ --disable-xmga \
+ --enable-xv \
+ --disable-vm \
+ --disable-xinerama \
+ --enable-x11 \
+ --enable-fbdev \
+ --disable-3dfx \
+ --disable-tdfxfb \
+ --disable-s3fb \
+ --disable-directfb \
+ --disable-bl \
+ --disable-tdfxvid \
+ --disable-tga \
+ --disable-pnm \
+ --disable-md5sum \
+ \
+ --enable-alsa \
+ --enable-ossaudio \
+ --disable-arts \
+ --disable-esd \
+ --disable-pulse \
+ --disable-jack \
+ --disable-openal \
+ --disable-nas \
+ --disable-sgiaudio \
+ --disable-sunaudio \
+ --disable-win32waveout \
+ --enable-select \
+ --enable-libass \
+ \
+ --extra-libs=' -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
+ sed -e 's/__user//g' -i ${S}/libvo/omapfb.h || true
+}
+
+CFLAGS_append = " -I${S}/libdvdread4 "
+
+do_configure() {
+ sed -i 's|/usr/include|${STAGING_INCDIR}|g' ${S}/configure
+ sed -i 's|/usr/lib|${STAGING_LIBDIR}|g' ${S}/configure
+ sed -i 's|/usr/\S*include[\w/]*||g' ${S}/configure
+ sed -i 's|/usr/\S*lib[\w/]*||g' ${S}/configure
+ sed -i 's|_install_strip="-s"|_install_strip=""|g' ${S}/configure
+ sed -i 's|HOST_CC|BUILD_CC|' ${S}/Makefile
+
+ export SIMPLE_TARGET_SYS="$(echo ${TARGET_SYS} | sed s:${TARGET_VENDOR}::g)"
+ ./configure ${EXTRA_OECONF}
+
+}
+
+do_compile () {
+ oe_runmake
+}
+
+do_install_append() {
+ install -d ${D}/usr/etc/mplayer
+ install ${S}/etc/input.conf ${D}/usr/etc/mplayer/
+ install ${S}/etc/example.conf ${D}/usr/etc/mplayer/
+ install ${S}/etc/codecs.conf ${D}/usr/etc/mplayer/
+}
--
1.7.7.2
next reply other threads:[~2011-11-04 9:45 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-04 9:38 Martin Jansa [this message]
2011-11-04 16:55 ` [PATCH] mplayer2: import from OE-classic Koen Kooi
2011-11-07 11:34 ` Martin Jansa
2011-11-07 12:45 ` Koen Kooi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1320399536-9588-1-git-send-email-Martin.Jansa@gmail.com \
--to=martin.jansa@gmail.com \
--cc=openembedded-devel@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.