0
0
Fork 0
haikuports/media-video/mplayer/patches/mplayer_x86-1.4.0.patchset

1447 lines
32 KiB
Plaintext

From fa11c15302e76a470d9ae76c6983e74cceafb61f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Mon, 22 Apr 2019 11:38:50 +0200
Subject: [PATCH] Haiku
---
Makefile | 3 +
configure | 42 +++++-
libao2/ao_haiku.cpp | 195 ++++++++++++++++++++++++++
libao2/audio_out.c | 7 +
libvo/haiku_common.cpp | 304 +++++++++++++++++++++++++++++++++++++++++
libvo/haiku_common.h | 69 ++++++++++
libvo/haiku_view.cpp | 171 +++++++++++++++++++++++
libvo/haiku_view.h | 36 +++++
libvo/haiku_window.cpp | 125 +++++++++++++++++
libvo/haiku_window.h | 31 +++++
libvo/video_out.c | 4 +
libvo/vo_haiku.cpp | 201 +++++++++++++++++++++++++++
path.c | 18 +++
13 files changed, 1203 insertions(+), 3 deletions(-)
create mode 100644 libao2/ao_haiku.cpp
create mode 100644 libvo/haiku_common.cpp
create mode 100644 libvo/haiku_common.h
create mode 100644 libvo/haiku_view.cpp
create mode 100644 libvo/haiku_view.h
create mode 100644 libvo/haiku_window.cpp
create mode 100644 libvo/haiku_window.h
create mode 100644 libvo/vo_haiku.cpp
diff --git a/Makefile b/Makefile
index efa871d..aec5a2f 100644
--- a/Makefile
+++ b/Makefile
@@ -544,6 +544,9 @@ SRCS_MPLAYER-$(S3FB) += libvo/vo_s3fb.c
SRCS_MPLAYER-$(SDL) += libao2/ao_sdl.c \
libvo/vo_sdl.c \
libvo/sdl_common.c
+SRCS_MPLAYER-$(HAIKU) += libao2/ao_haiku.cpp \
+ libvo/vo_haiku.cpp \
+ libvo/haiku_common.cpp
SRCS_MPLAYER-$(SGIAUDIO) += libao2/ao_sgi.c
SRCS_MPLAYER-$(SNDIO) += libao2/ao_sndio.c
SRCS_MPLAYER-$(SUNAUDIO) += libao2/ao_sun.c
diff --git a/configure b/configure
index d1aa8cd..52aa9b5 100755
--- a/configure
+++ b/configure
@@ -228,6 +228,7 @@ qnx() { issystem "QNX"; }
sunos() { issystem "SunOS"; }
wine() { issystem "Wine"; }
win32() { cygwin || mingw32 || wine; }
+haiku() { issystem "Haiku"; }
# arch test boolean functions
# x86/x86pc is used by QNX
@@ -469,6 +470,7 @@ Video output:
--enable-vesa enable VESA video output [autodetect]
--enable-svga enable SVGAlib video output [autodetect]
--enable-sdl enable SDL video output [autodetect]
+ --enable-haiku enable Haiku video and audio output [autodetect]
--enable-kva enable KVA video output [autodetect]
--enable-aa enable AAlib video output [autodetect]
--enable-caca enable CACA video output [autodetect]
@@ -682,6 +684,7 @@ _xvmc=no #auto when complete
_vda=auto
_vdpau=auto
_sdl=auto
+_haiku=auto
_kva=auto
_direct3d=auto
_directx=auto
@@ -1033,6 +1036,8 @@ for ac_option do
--disable-vdpau) _vdpau=no ;;
--enable-sdl) _sdl=yes ;;
--disable-sdl) _sdl=no ;;
+ --enable-haiku) _haiku=yes ;;
+ --disable-haiku) _haiku=no ;;
--enable-kva) _kva=yes ;;
--disable-kva) _kva=no ;;
--enable-direct3d) _direct3d=yes ;;
@@ -1676,7 +1681,7 @@ else
cc_name=$cc_name_tmp
echocheck "$_cc version"
cc_vendor=gnu
- cc_version=$($_cc -dumpversion 2>&1)
+ cc_version=$( ( $_cc -dumpversion | sed -e 's/-nb[0-9]//' ) 2>&1 )
case $cc_version in
2.96*)
cc_fail=yes
@@ -1746,7 +1751,7 @@ if test -z "$_target" ; then
# host's CPU/instruction set
set_host_arch() {
case "$1" in
- x86_64|amd64|i[3-9]86*|i86pc|x86|x86pc|k5|k6|k6_2|k6_3|k6-2|k6-3|pentium*|athlon*|i586_i686|i586-i686) host_arch=i386 ;;
+ x86_64|amd64|i[3-9]86*|i86pc|x86|x86pc|k5|k6|k6_2|k6_3|k6-2|k6-3|pentium*|athlon*|i586_i686|i586-i686|BePC) host_arch=i386 ;;
ia64) host_arch=ia64 ;;
macppc|ppc*|Power*) host_arch=ppc ;;
alpha) host_arch=alpha ;;
@@ -1785,6 +1790,7 @@ else # if test -z "$_target"
amigaos) system_name=AmigaOS ;;
mingw32*) system_name=MINGW32 ;;
wine) system_name=Wine ;;
+ haiku) system_name=Haiku ;;
esac
done
# We need to convert underscores so that values like k6-2 and pentium-mmx can be passed
@@ -1863,6 +1869,11 @@ if wine ; then
extra_cflags="-fno-pic -UWIN32 -U_WIN32 -U__WIN32 -U__WIN32__ -DWINE_NOWINSOCK $extra_cflags"
fi
+if haiku ; then
+ extra_ldflags="$extra_ldflags -lbe -lmedia -lsupc++"
+ extra_cflags="-fno-pic $extra_cflags"
+fi
+
if darwin && test "$cc_vendor" != "clang" ; then
extra_cflags="-falign-loops=16 -shared-libgcc $extra_cflags"
fi
@@ -5894,6 +5905,29 @@ fi
echores "$_v4l2"
+echocheck "Haiku"
+if test "$_haiku" = auto || test "$_haiku" = yes ; then
+ cat > $TMPC << EOF
+int main(void) {
+#ifdef __HAIKU__
+ return 0;
+#endif
+}
+EOF
+ _haiku=no
+ cc_check && _haiku=yes
+fi
+if test "$_haiku" = yes ; then
+ def_haiku='#define CONFIG_HAIKU 1'
+ vomodules="haiku $vomodules"
+ aomodules="haiku $aomodules"
+else
+ def_haiku='#undef CONFIG_HAIKU'
+ novomodules="haiku $novomodules"
+ noaomodules="haiku $noaomodules"
+fi
+echores "$_haiku"
+
#########
# AUDIO #
@@ -8059,7 +8093,7 @@ fi
# (FIXME: 'echocheck "dynamic linking"' above and modify here accordingly)
ld_dl_dynamic=''
freebsd || netbsd || openbsd || dragonfly || bsdos && ld_dl_dynamic='-rdynamic'
-if test "$_real" = yes || test "$_xanim" = yes && ! win32 && ! qnx && ! darwin && ! os2 && ! sunos; then
+if test "$_real" = yes || test "$_xanim" = yes && ! win32 && ! qnx && ! darwin && ! os2 && ! sunos && ! haiku; then
ld_dl_dynamic='-rdynamic'
fi
@@ -8552,6 +8586,7 @@ RADIO_CAPTURE=$_radio_capture
REAL_CODECS = $_real
S3FB = $_s3fb
SDL = $_sdl
+HAIKU = $_haiku
SDL_IMAGE = $sdl_image
SPEEX = $_speex
STREAM_CACHE = $_stream_cache
@@ -9153,6 +9188,7 @@ $def_quartz
$def_s3fb
$def_sdl
$def_sdl_sdl_h
+$def_haiku
$def_svga
$def_tdfxfb
$def_tdfxvid
diff --git a/libao2/ao_haiku.cpp b/libao2/ao_haiku.cpp
new file mode 100644
index 0000000..e50f1dc
--- /dev/null
+++ b/libao2/ao_haiku.cpp
@@ -0,0 +1,195 @@
+/*
+ * Haiku audio output driver for MPlayer
+ * (c) 2011 3dEyes**
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <Application.h>
+#include <PushGameSound.h>
+#include <SoundPlayer.h>
+
+#include "config.h"
+
+extern "C" {
+#include "config.h"
+#include "audio_out.h"
+#include "audio_out_internal.h"
+#include "libaf/af_format.h"
+#include "mp_msg.h"
+#include "help_mp.h"
+#include "osdep/timer.h"
+#include "libavutil/fifo.h"
+}
+
+static const ao_info_t info =
+{
+ "Haiku audio output",
+ "haiku",
+ "3dEyes** (3dEyes@gmail.com)",
+ ""
+};
+
+extern "C" {
+ao_functions_t audio_out_haiku =
+ {
+ &info,
+ control,
+ init,
+ uninit,
+ reset,
+ get_space,
+ play,
+ get_delay,
+ audio_pause,
+ audio_resume
+ };
+}
+
+
+
+#define SAMPLESIZE 1024
+#define CHUNK_SIZE 4096
+#define NUM_CHUNKS 10
+#define BUFFSIZE (NUM_CHUNKS * CHUNK_SIZE)
+
+static AVFifoBuffer *buffer;
+
+BApplication app("application/x-vnd.mplayer");
+static BSoundPlayer *player = NULL;
+
+static int write_buffer(unsigned char* data,int len){
+ int free = av_fifo_space(buffer);
+ if (len > free) len = free;
+ return av_fifo_generic_write(buffer, data, len, NULL);
+}
+
+
+static int read_buffer(unsigned char* data,int len){
+ int buffered = av_fifo_size(buffer);
+ if (len > buffered) len = buffered;
+ av_fifo_generic_read(buffer, data, len, NULL);
+ return len;
+}
+
+//BSoundPlayer proc func
+static void proc(void *cookie, void *buffer, size_t len, const media_raw_audio_format &format)
+{
+ read_buffer((unsigned char*)buffer, len);
+}
+
+// to set/get/query special features/parameters
+static int control(int cmd,void *arg){
+ return CONTROL_UNKNOWN;
+}
+
+// open & setup audio device
+// return: 1=success 0=fail
+static int init(int rate,int channels,int format,int flags){
+ buffer = av_fifo_alloc(BUFFSIZE);
+
+ ao_data.channels = channels;
+ ao_data.samplerate = rate;
+ ao_data.buffersize = CHUNK_SIZE;
+ ao_data.outburst = CHUNK_SIZE;
+ ao_data.format = format;
+
+ media_raw_audio_format hspec = {
+ rate,
+ channels,
+ media_raw_audio_format::B_AUDIO_SHORT,
+ B_MEDIA_LITTLE_ENDIAN,
+ CHUNK_SIZE / 2
+ };
+
+ switch(format) {
+ case AF_FORMAT_U8:
+ hspec.format = media_raw_audio_format::B_AUDIO_UCHAR;
+ break;
+ case AF_FORMAT_S8:
+ hspec.format = media_raw_audio_format::B_AUDIO_CHAR;;
+ break;
+ case AF_FORMAT_S16_LE:
+ hspec.format = media_raw_audio_format::B_AUDIO_SHORT;
+ hspec.byte_order = B_MEDIA_LITTLE_ENDIAN;
+ break;
+ case AF_FORMAT_S16_BE:
+ hspec.format = media_raw_audio_format::B_AUDIO_SHORT;
+ hspec.byte_order = B_MEDIA_BIG_ENDIAN;
+ break;
+ case AF_FORMAT_FLOAT_LE:
+ hspec.format = media_raw_audio_format::B_AUDIO_FLOAT;
+ hspec.byte_order = B_MEDIA_LITTLE_ENDIAN;
+ break;
+ case AF_FORMAT_FLOAT_BE:
+ hspec.format = media_raw_audio_format::B_AUDIO_FLOAT;
+ hspec.byte_order = B_MEDIA_BIG_ENDIAN;
+ break;
+ default:
+ hspec.format = media_raw_audio_format::B_AUDIO_SHORT;
+ hspec.byte_order = B_MEDIA_LITTLE_ENDIAN;
+ ao_data.format = AF_FORMAT_S16_LE;
+ break;
+ }
+
+ hspec.buffer_size = CHUNK_SIZE / (af_fmt2bits(ao_data.format) / 8);
+ ao_data.bps = channels * rate * (af_fmt2bits(ao_data.format) / 8);
+
+ player = new BSoundPlayer(&hspec, "MPlayer", proc);
+
+ if(player->InitCheck() != B_OK) {
+ delete player;
+ player = NULL;
+ return 0;
+ }
+
+ player->Start();
+ player->SetHasData(true);
+
+ return 1;
+}
+
+// close audio device
+static void uninit(int immed){
+
+ if (!immed)
+ usec_sleep(get_delay() * 1000 * 1000);
+
+ player->SetHasData(false);
+ delete player;
+
+ av_fifo_free(buffer);
+}
+
+static void reset(void){
+
+ av_fifo_reset(buffer);
+}
+
+static void audio_pause(void)
+{
+ player->Stop();
+}
+
+static void audio_resume(void)
+{
+ player->Start();
+ player->SetHasData(true);
+}
+
+static int get_space(void){
+ return av_fifo_space(buffer);
+}
+
+static int play(void* data,int len,int flags){
+ if (!(flags & AOPLAY_FINAL_CHUNK))
+ len = (len/ao_data.outburst)*ao_data.outburst;
+ return write_buffer((unsigned char*)data, len);
+}
+
+static float get_delay(void){
+ int buffered = av_fifo_size(buffer); // could be less
+ return (float)(buffered + ao_data.buffersize)/(float)ao_data.bps;
+}
diff --git a/libao2/audio_out.c b/libao2/audio_out.c
index 197a63b..7f7baff 100644
--- a/libao2/audio_out.c
+++ b/libao2/audio_out.c
@@ -43,6 +43,7 @@ extern const ao_functions_t audio_out_alsa;
extern const ao_functions_t audio_out_sndio;
extern const ao_functions_t audio_out_nas;
extern const ao_functions_t audio_out_sdl;
+extern const ao_functions_t audio_out_haiku;
extern const ao_functions_t audio_out_sun;
extern const ao_functions_t audio_out_sgi;
extern const ao_functions_t audio_out_win32;
@@ -108,6 +109,12 @@ const ao_functions_t* const audio_out_drivers[] =
#ifdef CONFIG_SDL
&audio_out_sdl,
#endif
+#ifdef CONFIG_HAIKU
+ &audio_out_haiku,
+#endif
+#ifdef CONFIG_HAIKU
+ &audio_out_haiku,
+#endif
#ifdef CONFIG_OPENAL
&audio_out_openal,
#endif
diff --git a/libvo/haiku_common.cpp b/libvo/haiku_common.cpp
new file mode 100644
index 0000000..1ea5f96
--- /dev/null
+++ b/libvo/haiku_common.cpp
@@ -0,0 +1,304 @@
+/*
+ * Copyright 2011 3dEyes** <3dEyes@gmail.com>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+#include "haiku_common.h"
+
+extern "C" {
+#include "config.h"
+#include "mp_msg.h"
+#include "m_option.h"
+#include "mp_fifo.h"
+#include "mpbswap.h"
+#include "sub/sub.h"
+#include "video_out.h"
+#include "help_mp.h"
+#include "aspect.h"
+#include "command.h"
+#include "osdep/keycodes.h"
+#include "input/input.h"
+#include "input/mouse.h"
+}
+
+
+FBView::FBView(BRect rect) :
+ BView(rect, "FBView", B_FOLLOW_ALL, B_WILL_DRAW)
+{
+ FBView(rect, rect.IntegerWidth(), rect.IntegerHeight());
+}
+
+FBView::FBView(BRect rect, int width, int height) :
+ BView(rect, "FBView", B_FOLLOW_ALL, B_WILL_DRAW)
+{
+ renderRect = Bounds();
+
+ buffer_width = width;
+ buffer_height = height;
+
+ BRect fbRect = BRect(0,0,buffer_width-1,buffer_height-1);
+ bufferView = new BView(fbRect, "bufferView", B_FOLLOW_ALL_SIDES, 0);
+ bufferBitmap = new BBitmap(fbRect, B_RGB32, true);
+ bufferBitmap->AddChild(bufferView);
+}
+
+FBView::~FBView()
+{
+
+}
+
+void
+FBView::MouseDown(BPoint point)
+{
+ uint32 buttons = Window()->CurrentMessage()->FindInt32("buttons");
+ int32 clicks = Window()->CurrentMessage()->FindInt32("clicks");
+
+ if( buttons & B_PRIMARY_MOUSE_BUTTON ) {
+ if(clicks==1)
+ mplayer_put_key(MOUSE_BTN0);
+ else {
+ vo_fs = !vo_fs;
+ ((MWindow*)Window())->SetFullscreen(vo_fs);
+ mplayer_put_key(MOUSE_BTN0);
+ }
+ }
+ if( buttons & B_SECONDARY_MOUSE_BUTTON ) {
+ mplayer_put_key(clicks==1?MOUSE_BTN2:MOUSE_BTN2_DBL);
+ }
+ if( buttons & B_TERTIARY_MOUSE_BUTTON ) {
+ mplayer_put_key(clicks==1?MOUSE_BTN1:MOUSE_BTN1_DBL);
+ }
+}
+
+void
+FBView::MouseWheelChanged(BMessage *msg)
+{
+ float dy;
+ if (msg->FindFloat("be:wheel_delta_y", &dy) == B_OK) {
+ if(dy<0)
+ mplayer_put_key(MOUSE_BTN3);
+ else
+ mplayer_put_key(MOUSE_BTN4);
+ }
+}
+
+void
+FBView::MouseMoved(BPoint point, uint32 transit,const BMessage *message)
+{
+ switch(transit)
+ {
+ case B_INSIDE_VIEW:
+ case B_ENTERED_VIEW:
+ {
+ BPoint p = point;
+ vo_mouse_movement(p.x, p.y);
+ break;
+ }
+ }
+}
+
+void
+FBView::MessageReceived(BMessage *pmsg)
+{
+ switch (pmsg->what) {
+ case B_MOUSE_WHEEL_CHANGED:
+ MouseWheelChanged(pmsg);
+ break;
+ default:
+ BView::MessageReceived(pmsg);
+ break;
+ }
+}
+
+void
+FBView::Draw(BRect rect)
+{
+ Paint();
+}
+
+void
+FBView::SetRenderRect(BRect rect)
+{
+ renderRect = rect;
+ MoveTo(rect.left, rect.top);
+ ResizeTo(rect.Width(),rect.Height());
+ Paint();
+}
+
+void
+FBView::Paint()
+{
+ if(LockLooper()) {
+ bufferView->LockLooper();
+ SetDrawingMode(B_OP_COPY);
+ DrawBitmap(bufferBitmap,bufferView->Bounds(),Bounds());
+ bufferView->UnlockLooper();
+ UnlockLooper();
+ }
+}
+
+uint32 *
+FBView::GetBuffer()
+{
+ if(bufferBitmap) {
+ return (uint32*)bufferBitmap->Bits();
+ }
+ return NULL;
+}
+
+uint32
+FBView::GetBufferSize()
+{
+ if(bufferBitmap) {
+ return bufferBitmap->BitsLength()/4;
+ }
+ return 0;
+}
+
+int
+FBView::Width()
+{
+ return buffer_width;
+}
+
+int
+FBView::Height()
+{
+ return buffer_height;
+}
+
+
+MWindow::MWindow(int width, int height, const char* title)
+ : BWindow(BRect(80,80,80+width,80+height), title, B_TITLED_WINDOW_LOOK,B_NORMAL_WINDOW_FEEL,0)//B_NOT_RESIZABLE|B_NOT_ZOOMABLE)
+{
+ BScreen scr;
+ image_width = width;
+ image_height = height;
+
+ float oWidth = ( Frame().left + width )<scr.Frame().Width()?width:(scr.Frame().Width()-Frame().left-20);
+ float oHeight = ( Frame().top + height )<scr.Frame().Height()?height:(scr.Frame().Height()-Frame().top-20);
+
+ renderRect = Bounds();
+ prev_frame = Frame();
+
+ BView *view = new BView(Bounds(),"container",B_FOLLOW_ALL, B_WILL_DRAW);
+ view->SetViewColor(0,0,0);
+ AddChild(view);
+
+ fb = new FBView(Bounds(), width, height);
+ fb->SetViewColor(B_TRANSPARENT_32_BIT);
+ view->AddChild(fb);
+
+ ResizeTo(oWidth, oHeight);
+
+ renderRect = Bounds();
+ prev_frame = Frame();
+
+}
+
+
+MWindow::~MWindow()
+{
+
+}
+
+void
+MWindow::SetFullscreen(int fs)
+{
+ if(fs==1) {
+ prev_frame = Frame();
+ BScreen scr;
+ MoveTo(0,0);
+ ResizeTo(scr.Frame().right+1,scr.Frame().bottom+1);
+ } else {
+ MoveTo(prev_frame.left,prev_frame.top);
+ ResizeTo(prev_frame.Width(),prev_frame.Height());
+ }
+}
+
+void
+MWindow::FrameResized(float width, float height)
+{
+ int d_width=width;
+ int d_height=height;
+
+ float winaspect = width/height;
+ float videoaspect = image_width/image_height;
+
+ d_width = width;
+ d_height = width/videoaspect;
+
+ if(d_height>height) {
+ d_height = height;
+ d_width = height*videoaspect;
+ }
+
+ renderRect.left = (width - d_width) / 2;
+ renderRect.top = (height - d_height) / 2;
+ renderRect.right = renderRect.left + d_width;
+ renderRect.bottom = renderRect.top + d_height;
+ fb->SetRenderRect(renderRect);
+}
+
+void
+MWindow::Zoom(BPoint origin, float width,float height)
+{
+ vo_fs = !vo_fs;
+ SetFullscreen(vo_fs);
+}
+
+void
+MWindow::MessageReceived(BMessage *message)
+{
+ switch (message->what) {
+ case B_KEY_DOWN:
+ {
+ uint32 code = message->FindInt32("key");
+ uint32 raw_char = message->FindInt32("raw_char");
+
+ switch (raw_char) {
+ case B_ESCAPE:
+ if(vo_fs==1) {
+ vo_fs = !vo_fs;
+ SetFullscreen(vo_fs);
+ } else {
+ mplayer_put_key(KEY_ESC);
+ }
+ break;
+ case B_LEFT_ARROW:
+ mplayer_put_key(KEY_LEFT);
+ break;
+ case B_RIGHT_ARROW:
+ mplayer_put_key(KEY_RIGHT);
+ break;
+ case B_UP_ARROW:
+ mplayer_put_key(KEY_UP);
+ break;
+ case B_DOWN_ARROW:
+ mplayer_put_key(KEY_DOWN);
+ break;
+ case B_FUNCTION_KEY:
+ mplayer_put_key(KEY_F+code-1);
+ break;
+ case B_ENTER:
+ mplayer_put_key(KEY_ENTER);
+ break;
+ default:
+ mplayer_put_key(raw_char);
+ break;
+
+ }
+ break;
+ }
+ default:
+ BWindow::MessageReceived(message);
+ break;
+ }
+}
+
+bool
+MWindow::QuitRequested()
+{
+ mplayer_put_key(KEY_CLOSE_WIN);
+ return true;
+}
diff --git a/libvo/haiku_common.h b/libvo/haiku_common.h
new file mode 100644
index 0000000..53e21ef
--- /dev/null
+++ b/libvo/haiku_common.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2011 3dEyes** <3dEyes@gmail.com>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+#ifndef MPLAYER_HAIKU_COMMON_H
+#define MPLAYER_HAIKU_COMMON_H
+
+#include <stdio.h>
+
+#include <SupportDefs.h>
+#include <Application.h>
+#include <Window.h>
+#include <View.h>
+#include <Bitmap.h>
+#include <Rect.h>
+#include <OS.h>
+#include <Screen.h>
+
+
+class FBView : public BView
+{
+ public:
+ FBView(BRect rect);
+ FBView(BRect rect, int width, int height);
+ virtual ~FBView();
+
+ void SetRenderRect(BRect r);
+ void Paint(void);
+ uint32 *GetBuffer();
+ uint32 GetBufferSize();
+ void Draw(BRect rect);
+ virtual void MouseDown(BPoint point);
+ virtual void MouseMoved(BPoint point, uint32 transit,const BMessage *message);
+ void MouseWheelChanged(BMessage *msg);
+ void MessageReceived(BMessage *pmsg);
+
+ int Width();
+ int Height();
+ private:
+ int buffer_width;
+ int buffer_height;
+ BView *bufferView;
+ BBitmap *bufferBitmap;
+ BRect renderRect;
+};
+
+class MWindow : public BWindow {
+ public:
+ MWindow(int w, int h, const char* name);
+ virtual ~MWindow();
+
+ virtual void MessageReceived(BMessage *message);
+ virtual void FrameResized(float width, float height);
+ virtual void Zoom(BPoint origin, float width,float height);
+ bool QuitRequested();
+ void SetFullscreen(int fs);
+
+ FBView *fb;
+public:
+ BRect prev_frame;
+ BRect renderRect;
+ thread_id renderer_thread;
+ float image_width, image_height;
+};
+
+#endif //MPLAYER_HAIKU_COMMON_H
+
+
diff --git a/libvo/haiku_view.cpp b/libvo/haiku_view.cpp
new file mode 100644
index 0000000..e491de4
--- /dev/null
+++ b/libvo/haiku_view.cpp
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2010 Your Name <your@email.address>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+#include "haiku_window.h"
+#include "haiku_view.h"
+
+#include <stdio.h>
+
+extern "C" {
+#include "config.h"
+#include "mp_msg.h"
+#include "m_option.h"
+#include "mp_fifo.h"
+#include "mpbswap.h"
+#include "sub/sub.h"
+#include "video_out.h"
+
+#include "input/input.h"
+#include "input/mouse.h"
+}
+
+extern void haiku_fullscreen(void);
+
+FBView::FBView(BRect rect) :
+ BView(rect, "FBView", B_FOLLOW_ALL, B_WILL_DRAW) //B_WILL_DRAW|B_PULSE_NEEDED|B_FRAME_EVENTS
+{
+ FBView(rect, rect.IntegerWidth(), rect.IntegerHeight());
+}
+
+FBView::FBView(BRect rect, int width, int height) :
+ BView(rect, "FBView", B_FOLLOW_ALL, B_WILL_DRAW) //B_WILL_DRAW|B_PULSE_NEEDED|B_FRAME_EVENTS
+{
+ renderRect = Bounds();
+
+ buffer_width = width;
+ buffer_height = height;
+
+ BRect fbRect = BRect(0,0,buffer_width-1,buffer_height-1);
+ bufferView = new BView(fbRect, "bufferView", B_FOLLOW_ALL_SIDES, 0);
+ bufferBitmap = new BBitmap(fbRect, B_RGB32, true);
+ bufferBitmap->AddChild(bufferView);
+}
+
+FBView::~FBView()
+{
+
+}
+
+void
+FBView::MouseDown(BPoint point)
+{
+ uint32 buttons = Window()->CurrentMessage()->FindInt32("buttons");
+ int32 clicks = Window()->CurrentMessage()->FindInt32("clicks");
+
+ if( buttons & B_PRIMARY_MOUSE_BUTTON ) {
+ if(clicks==1)
+ mplayer_put_key(MOUSE_BTN0);
+ else {
+ vo_fs = !vo_fs;
+ haiku_fullscreen();
+ mplayer_put_key(MOUSE_BTN0);
+ }
+ }
+ if( buttons & B_SECONDARY_MOUSE_BUTTON ) {
+ mplayer_put_key(clicks==1?MOUSE_BTN2:MOUSE_BTN2_DBL);
+ }
+ if( buttons & B_TERTIARY_MOUSE_BUTTON ) {
+ mplayer_put_key(clicks==1?MOUSE_BTN1:MOUSE_BTN1_DBL);
+ }
+}
+
+void
+FBView::MouseWheelChanged(BMessage *msg)
+{
+ float dy;
+ if (msg->FindFloat("be:wheel_delta_y", &dy) == B_OK) {
+ if(dy>0)
+ mplayer_put_key(MOUSE_BTN3);
+ else
+ mplayer_put_key(MOUSE_BTN4);
+ }
+}
+
+void
+FBView::MouseMoved(BPoint point, uint32 transit,const BMessage *message)
+{
+ switch(transit)
+ {
+ case B_INSIDE_VIEW:
+ case B_ENTERED_VIEW:
+ {
+ BPoint p = point;
+ vo_mouse_movement(p.x, p.y);
+ break;
+ }
+ }
+}
+
+void
+FBView::MessageReceived(BMessage *pmsg)
+{
+ switch (pmsg->what) {
+ case B_MOUSE_WHEEL_CHANGED:
+ MouseWheelChanged(pmsg);
+ break;
+ default:
+ BView::MessageReceived(pmsg);
+ break;
+ }
+}
+
+void
+FBView::Draw(BRect rect)
+{
+ Paint();
+}
+
+void
+FBView::SetRenderRect(BRect rect)
+{
+ renderRect = rect;
+ MoveTo(rect.left, rect.top);
+ ResizeTo(rect.Width(),rect.Height());
+ Paint();
+}
+
+void
+FBView::Paint()
+{
+ if(LockLooper()) {
+ bufferView->LockLooper();
+ SetDrawingMode(B_OP_COPY);
+ DrawBitmap(bufferBitmap,bufferView->Bounds(),B_FILTER_BITMAP_BILINEAR,Bounds());
+ bufferView->UnlockLooper();
+ UnlockLooper();
+ }
+}
+
+uint32 *
+FBView::GetBuffer()
+{
+ if(bufferBitmap) {
+ return (uint32*)bufferBitmap->Bits();
+ }
+ return NULL;
+}
+
+uint32
+FBView::GetBufferSize()
+{
+ if(bufferBitmap) {
+ return bufferBitmap->BitsLength()/4;
+ }
+ return 0;
+}
+
+int
+FBView::Width()
+{
+ return buffer_width;
+}
+
+int
+FBView::Height()
+{
+ return buffer_height;
+}
+
+
diff --git a/libvo/haiku_view.h b/libvo/haiku_view.h
new file mode 100644
index 0000000..21103eb
--- /dev/null
+++ b/libvo/haiku_view.h
@@ -0,0 +1,36 @@
+#ifndef _H_FBVIEW_
+#define _H_FBVIEW_
+
+#include <SupportDefs.h>
+#include <Bitmap.h>
+#include <View.h>
+#include <Rect.h>
+
+class FBView : public BView
+{
+ public:
+ FBView(BRect rect);
+ FBView(BRect rect, int width, int height);
+ ~FBView();
+
+ void SetRenderRect(BRect r);
+ void Paint(void);
+ uint32 *GetBuffer();
+ uint32 GetBufferSize();
+ void Draw(BRect rect);
+ virtual void MouseDown(BPoint point);
+ virtual void MouseMoved(BPoint point, uint32 transit,const BMessage *message);
+ void MouseWheelChanged(BMessage *msg);
+ void MessageReceived(BMessage *pmsg);
+
+ int Width();
+ int Height();
+ private:
+ int buffer_width;
+ int buffer_height;
+ BView *bufferView;
+ BBitmap *bufferBitmap;
+ BRect renderRect;
+};
+
+#endif
diff --git a/libvo/haiku_window.cpp b/libvo/haiku_window.cpp
new file mode 100644
index 0000000..2f4c8bf
--- /dev/null
+++ b/libvo/haiku_window.cpp
@@ -0,0 +1,125 @@
+#include <stdio.h>
+
+extern "C" {
+#include "config.h"
+#include "command.h"
+#include "mp_fifo.h"
+#include "aspect.h"
+#include "osdep/keycodes.h"
+#include "mp_msg.h"
+#include "help_mp.h"
+#include "sub/sub.h"
+#include "video_out.h"
+}
+
+extern void haiku_fullscreen(void);
+#include "haiku_window.h"
+
+
+TestWindow::TestWindow(int width, int height, const char* title)
+ : BWindow(BRect(100,100,100+width,100+height), title, B_TITLED_WINDOW_LOOK,B_NORMAL_WINDOW_FEEL,0)//B_NOT_RESIZABLE|B_NOT_ZOOMABLE)
+{
+ image_width = width;
+ image_height = height;
+ renderRect = Bounds();
+ BView *view = new BView(Bounds(),"back",B_FOLLOW_ALL, B_WILL_DRAW);
+ view->SetViewColor(0,0,0);
+ AddChild(view);
+
+ fb = new FBView(Bounds(), width, height);
+ fb->SetViewColor(B_TRANSPARENT_32_BIT);
+ view->AddChild(fb);
+}
+
+
+TestWindow::~TestWindow()
+{
+
+}
+
+void
+TestWindow::FrameResized(float width, float height)
+{
+ int d_width=width;
+ int d_height=height;
+
+ float winaspect = width/height;
+ float videoaspect = image_width/image_height;
+
+ d_width = width;
+ d_height = width/videoaspect;
+
+ if(d_height>height) {
+ d_height = height;
+ d_width = height*videoaspect;
+ }
+
+ renderRect.left = (width - d_width) / 2;
+ renderRect.top = (height - d_height) / 2;
+ renderRect.right = renderRect.left + d_width;
+ renderRect.bottom = renderRect.top + d_height;
+ fb->SetRenderRect(renderRect);
+}
+
+void
+TestWindow::Zoom(BPoint origin, float width,float height)
+{
+ vo_fs = !vo_fs;
+ haiku_fullscreen();
+}
+
+void
+TestWindow::MessageReceived(BMessage *message)
+{
+ switch (message->what) {
+ case B_KEY_DOWN:
+ {
+ uint32 code = message->FindInt32("key");
+ uint32 raw_char = message->FindInt32("raw_char");
+ switch (raw_char) {
+ case B_ESCAPE:
+ if(vo_fs==1) {
+ vo_fs = !vo_fs;
+ haiku_fullscreen();
+ } else {
+ mplayer_put_key(KEY_ESC);
+ }
+ break;
+ case B_LEFT_ARROW:
+ mplayer_put_key(KEY_LEFT);
+ break;
+ case B_RIGHT_ARROW:
+ mplayer_put_key(KEY_RIGHT);
+ break;
+ case B_UP_ARROW:
+ mplayer_put_key(KEY_UP);
+ break;
+ case B_DOWN_ARROW:
+ mplayer_put_key(KEY_DOWN);
+ break;
+ case B_FUNCTION_KEY:
+ mplayer_put_key(KEY_F+code-1);
+ break;
+ case B_ENTER:
+ mplayer_put_key(KEY_ENTER);
+ break;
+ default:
+ mplayer_put_key(raw_char);
+ break;
+
+ }
+ break;
+ }
+ default:
+ BWindow::MessageReceived(message);
+ break;
+ }
+}
+
+bool
+TestWindow::QuitRequested()
+{
+ mplayer_put_key(KEY_CLOSE_WIN);
+ //be_app->PostMessage(B_QUIT_REQUESTED);
+ return true;
+}
diff --git a/libvo/haiku_window.h b/libvo/haiku_window.h
new file mode 100644
index 0000000..34513df
--- /dev/null
+++ b/libvo/haiku_window.h
@@ -0,0 +1,31 @@
+#ifndef _TEST_WINDOW_H
+#define _TEST_WINDOW_H
+
+#include <Application.h>
+#include <Window.h>
+#include <View.h>
+#include <OS.h>
+
+#include "haiku_window.h"
+#include "haiku_view.h"
+
+class TestWindow : public BWindow {
+ public:
+ TestWindow(int w, int h, const char* name);
+ virtual ~TestWindow();
+
+ virtual void MessageReceived(BMessage *message);
+ virtual void FrameResized(float width, float height);
+ virtual void Zoom(BPoint origin, float width,float height);
+ bool QuitRequested();
+
+ FBView *fb;
+public:
+ BRect renderRect;
+ thread_id renderer_thread;
+ float image_width, image_height;
+};
+
+#endif
+
+
diff --git a/libvo/video_out.c b/libvo/video_out.c
index bcf5174..c797ae8 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -109,6 +109,7 @@ extern const vo_functions_t video_out_gl_tiled;
extern const vo_functions_t video_out_matrixview;
extern const vo_functions_t video_out_dga;
extern const vo_functions_t video_out_sdl;
+extern const vo_functions_t video_out_haiku;
extern const vo_functions_t video_out_3dfx;
extern const vo_functions_t video_out_tdfxfb;
extern const vo_functions_t video_out_s3fb;
@@ -211,6 +212,9 @@ const vo_functions_t* const video_out_drivers[] =
#ifdef CONFIG_SDL
&video_out_sdl,
#endif
+#ifdef CONFIG_HAIKU
+ &video_out_haiku,
+#endif
#ifdef CONFIG_GL
&video_out_gl,
#endif
diff --git a/libvo/vo_haiku.cpp b/libvo/vo_haiku.cpp
new file mode 100644
index 0000000..614c8ff
--- /dev/null
+++ b/libvo/vo_haiku.cpp
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2011 3dEyes** <3dEyes@gmail.com>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "haiku_common.h"
+
+extern "C" {
+#include "config.h"
+#include "mp_msg.h"
+#include "aspect.h"
+#include "mp_fifo.h"
+#include "help_mp.h"
+#include "video_out.h"
+#include "video_out_internal.h"
+#include "sub/sub.h"
+#include "libswscale/swscale.h"
+#include "libmpcodecs/vf_scale.h"
+}
+
+static int cnt = 0;
+static MWindow *haiku_wnd=NULL;
+
+#define BLOCK 16384
+static port_id port=B_BAD_VALUE;
+
+static const vo_info_t info =
+{
+ "Haiku video output",
+ "haiku",
+ "3dEyes**",
+ ""
+};
+
+extern "C" {
+vo_functions_t video_out_haiku =
+ {
+ &info,
+ preinit,
+ config,
+ control,
+ draw_frame,
+ draw_slice,
+ draw_osd,
+ flip_page,
+ check_events,
+ uninit
+ };
+
+}
+
+static uint32_t image_width, image_height;
+static uint32_t image_depth;
+static uint32_t image_format;
+static uint32_t image_size;
+static uint32_t image_buffer_size;
+static unsigned char *image_data = NULL;
+
+static int draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
+{
+ return 0;
+}
+
+static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride)
+{
+ switch (image_format)
+ {
+ case IMGFMT_BGR32:
+ vo_draw_alpha_rgb32(w,h,src,srca,stride, image_data+4*(y0*image_width+x0),4*image_width);
+ break;
+ }
+}
+
+static void draw_osd(void)
+{
+ if(image_data)
+ vo_draw_text(image_width, image_height, draw_alpha);
+}
+
+static void
+flip_page(void)
+{
+ if(haiku_wnd) {
+ haiku_wnd->fb->Paint();
+ } else {
+ int32 msg_code='RGBA';
+ int32 w = image_width, h = image_height, cmd = 0;
+ int32 sizeBuf = w*h*4;
+ unsigned char *pbuffer = (unsigned char *)image_data;
+
+ int n = sizeBuf/BLOCK;
+ int ln = sizeBuf%BLOCK;
+ unsigned char* ptr=pbuffer;
+
+ write_port(port,'BITS',(void*)&cmd, sizeof(int));
+
+ write_port(port,msg_code,(void*)&w, sizeof(int));
+ write_port(port,msg_code,(void*)&h, sizeof(int));
+
+ for(int i=0;i<n;i++,ptr+=BLOCK)
+ write_port(port,msg_code,(void*)ptr, BLOCK);
+ write_port(port,msg_code,(void*)ptr, ln);
+ }
+}
+
+static int
+draw_frame(uint8_t *src[])
+{
+ memcpy(image_data,src[0],image_size);
+ return 0;
+}
+
+static int
+query_format(uint32_t format)
+{
+ image_format = format;
+ switch(format){
+ case IMGFMT_BGR32:
+ return VFCAP_CSP_SUPPORTED|VFCAP_OSD|VFCAP_SWSCALE;
+ }
+ return 0;
+}
+
+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)
+{
+ image_width = width;
+ image_height = height;
+ image_depth = 32;
+ image_size = (image_width * image_height * image_depth + 7) / 8;
+
+ aspect_save_orig(width,height);
+ aspect_save_prescale(d_width,d_height);
+
+ //printf("WinID=%d\n",WinID);
+ port=find_port("WID:12345");
+
+ if(port==B_NAME_NOT_FOUND || port==B_BAD_VALUE) {
+ haiku_wnd = new MWindow(image_width,image_height, title);
+ image_data=(unsigned char *)haiku_wnd->fb->GetBuffer();
+ haiku_wnd->Show();
+ if(flags&VOFLAG_FULLSCREEN) {
+ vo_fs=1;
+ if(haiku_wnd)
+ haiku_wnd->SetFullscreen(vo_fs);
+ }
+ } else {
+ image_data=(unsigned char *)malloc(image_size);
+ }
+
+ return 0;
+}
+
+static void
+uninit(void)
+{
+ if(!haiku_wnd)
+ free(image_data);
+}
+
+
+static void check_events(void)
+{
+}
+
+static int preinit(const char *arg)
+{
+// if(be_app==NULL)
+// be_app = new BApplication("application/x-vnd.mplayer");
+ if(arg)
+ {
+ mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_NULL_UnknownSubdevice,arg);
+ return ENOSYS;
+ }
+ return 0;
+}
+
+static int control(uint32_t request, void *data)
+{
+ switch (request) {
+ case VOCTRL_QUERY_FORMAT:
+ {
+ return query_format(*((uint32_t*)data));
+ }
+ case VOCTRL_FULLSCREEN:
+ {
+ vo_fs = !vo_fs;
+ if(haiku_wnd)
+ haiku_wnd->SetFullscreen(vo_fs);
+ return VO_TRUE;
+ }
+ }
+ return VO_NOTIMPL;
+}
+
+
diff --git a/path.c b/path.c
index e6287d2..e5c4cd9 100644
--- a/path.c
+++ b/path.c
@@ -42,6 +42,11 @@
#include <sys/cygwin.h>
#endif
+#ifdef __HAIKU__
+#include <FindDirectory.h>
+#include <fs_info.h>
+#endif
+
#include "osdep/osdep.h"
char *get_path(const char *filename){
@@ -51,6 +56,13 @@ char *get_path(const char *filename){
char *buff;
#ifdef __MINGW32__
const char *config_dir = "/mplayer";
+#elif defined(__HAIKU__)
+ dev_t volume = dev_for_path("/boot");
+ char buffer[B_PATH_NAME_LENGTH+B_FILE_NAME_LENGTH];
+ status_t result;
+ result = find_directory(B_USER_SETTINGS_DIRECTORY,volume,false,buffer,sizeof(buffer));
+ strcat(buffer,"/mplayer");
+ const char *config_dir = &buffer;
#else
const char *config_dir = "/.mplayer";
#endif
@@ -94,6 +106,12 @@ char *get_path(const char *filename){
else config_dir++;
#endif
}
+#ifdef __HAIKU__
+ // As the home directory path is already on the
+ // find_directory call above, we empty the homedir
+ // variable
+ homedir = "";
+#endif
len = strlen(homedir) + strlen(config_dir) + 1;
if (filename == NULL) {
if ((buff = malloc(len)) == NULL)
--
2.21.0