diff --git a/src/gui/AUTHORS b/src/gui/AUTHORS deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/gui/COPYING b/src/gui/COPYING deleted file mode 120000 index 71537690b..000000000 --- a/src/gui/COPYING +++ /dev/null @@ -1 +0,0 @@ -/usr/share/automake-1.9/COPYING \ No newline at end of file diff --git a/src/gui/ChangeLog b/src/gui/ChangeLog deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/gui/INSTALL b/src/gui/INSTALL deleted file mode 120000 index 81fa6ffa4..000000000 --- a/src/gui/INSTALL +++ /dev/null @@ -1 +0,0 @@ -/usr/share/automake-1.9/INSTALL \ No newline at end of file diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 329e83f38..50af375e8 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -1,16 +1,9 @@ ## Process this file with automake to produce Makefile.in -## Created by Anjuta SUBDIRS = src po gtk_lumieradocdir = ${prefix}/doc/gtk-lumiera -gtk_lumieradoc_DATA = \ - README\ - COPYING\ - AUTHORS\ - ChangeLog\ - INSTALL\ - NEWS +gtk_lumieradoc_DATA = EXTRA_DIST = $(gtk_lumieradoc_DATA) diff --git a/src/gui/NEWS b/src/gui/NEWS deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/gui/README b/src/gui/README deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/gui/TODO.tasks b/src/gui/TODO.tasks deleted file mode 100644 index d1fa282d9..000000000 --- a/src/gui/TODO.tasks +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/gui/autogen.sh b/src/gui/autogen.sh index 9ab346a30..5e54fc413 100755 --- a/src/gui/autogen.sh +++ b/src/gui/autogen.sh @@ -140,8 +140,8 @@ do echo "Running autoheader..." autoheader fi - echo "Running automake --gnu $am_opt ..." - automake --add-missing --gnu $am_opt + echo "Running automake --foreign $am_opt ..." + automake --add-missing --foreign $am_opt echo "Running autoconf ..." autoconf ) diff --git a/src/gui/configure.ac b/src/gui/configure.ac index fbc00ed01..2e3a7cd21 100644 --- a/src/gui/configure.ac +++ b/src/gui/configure.ac @@ -1,5 +1,4 @@ dnl Process this file with autoconf to produce a configure script. -dnl Created by Anjuta application wizard. AC_INIT(gtk-lumiera, 0.1) @@ -29,14 +28,48 @@ IT_PROG_INTLTOOL([0.35.0]) AM_PROG_LIBTOOL +# ###################################################################### +# Checks for X11 and XVideo +# ###################################################################### +AC_PATH_X +AC_PATH_XTRA +# CFLAGS="$CFLAGS $X_CFLAGS" +LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS" +AC_CHECK_HEADERS([X11/Xlib.h X11/Xutil.h],[], + [AC_MSG_ERROR([Xlib.h or Xutil.h not found install xdevel])]) + +# OK, this is confusing. The old tests test for the existence of a number +# of header files, and add -lXv to the linker flags if they are there. +# However, if they are _not_ there, only a warning is issued, but +# src/displayer.h includes these unconditionally. +# I conclude that -lXv _is_ required. If not, src/displayer.h should be edited, +# I think. +# This test requires libXv and, therefore, libXext + +AC_CHECK_HEADERS([sys/ipc.h sys/shm.h],, + [AC_MSG_ERROR([Required header not found. Please check that it is installed])] +) +AC_CHECK_HEADERS([X11/extensions/Xvlib.h X11/extensions/XShm.h],, + [AC_MSG_ERROR([Required xvideo (Xv) extension to X not found. Please check that it is installed.])], + [#include ] +) + +AC_CHECK_LIB(Xext, XInitExtension, , + [AC_MSG_ERROR([Could not link with libXext. Check that you have libXext installed])], -lX11 +) +AC_CHECK_LIB(Xv, XvQueryAdaptors, , + [AC_MSG_ERROR([Could not link with libXv. Check that you have libXv installed])] +) + +# ###################################################################### +# Checks for GTK stuff +# ###################################################################### PKG_CHECK_MODULES(GTK_LUMIERA, [gtkmm-2.4 >= 2.8 gdl-1.0 >= 0.6.1 cairomm-1.0 >= 0.6.0]) + AC_SUBST(GTK_LUMIERA_CFLAGS) AC_SUBST(GTK_LUMIERA_LIBS) - - - AC_OUTPUT([ Makefile src/Makefile diff --git a/src/gui/src/Makefile.am b/src/gui/src/Makefile.am index 2755fb0ae..29e6a6cfb 100644 --- a/src/gui/src/Makefile.am +++ b/src/gui/src/Makefile.am @@ -38,7 +38,11 @@ gtk_lumiera_SOURCES = \ widgets/timeline-widget.cpp \ widgets/timeline-widget.hpp \ model/project.cpp \ - model/project.hpp + model/project.hpp \ + output/displayer.cpp \ + output/displayer.hpp \ + output/xvdisplayer.cpp \ + output/xvdisplayer.hpp gtk_lumiera_LDFLAGS = diff --git a/src/gui/src/output/displayer.cpp b/src/gui/src/output/displayer.cpp new file mode 100644 index 000000000..0570d5a19 --- /dev/null +++ b/src/gui/src/output/displayer.cpp @@ -0,0 +1,65 @@ +/* + displayer.cpp - Implements the base class for displaying video + + Copyright (C) Lumiera.org + 2000, Arne Schirmacher + 2001-2007, Dan Dennedy + 2008, Joel Holdsworth + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + +#include "displayer.hpp" + +namespace lumiera { +namespace gui { +namespace output { + + + + DisplayerInput Displayer::format() + { + return DISPLAY_NONE; + } + + int Displayer::preferredWidth() + { + return imageWidth; + } + + int Displayer::preferredHeight() + { + return imageHeight; + } + + void Displayer::put( void *image, int width, int height ) + { + if ( width == preferredWidth() && height == preferredHeight() ) + { + put( image ); + } + else + { + reformat( format(), format(), image, width, height ); + put( pixels ); + } + } + + + +} // namespace output +} // namespace gui +} // namespace lumiera diff --git a/src/gui/src/output/displayer.hpp b/src/gui/src/output/displayer.hpp new file mode 100644 index 000000000..a04eca784 --- /dev/null +++ b/src/gui/src/output/displayer.hpp @@ -0,0 +1,107 @@ +/* + displayer.hpp - Defines the base class for displaying video + + Copyright (C) Lumiera.org + 2000, Arne Schirmacher + 2001-2007, Dan Dennedy + 2008, Joel Holdsworth + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ +/** @file displayer.hpp + ** This file contains the defintion of Displayer; the base class + ** of all video display implementations + ** @see displayer.cpp + */ + +#ifndef DISPLAYER_HPP +#define DISPLAYER_HPP + +namespace lumiera { +namespace gui { +namespace output { + + /** Supported Displayer formats + */ + + typedef enum { + DISPLAY_NONE, + DISPLAY_YUV, + DISPLAY_RGB, + DISPLAY_BGR, + DISPLAY_BGR0, + DISPLAY_RGB16 + } + DisplayerInput; + + /** A Displayer is a class which is responsible for rendering an image in some + way (ie: Xvideo, GDK, OpenGL etc). + + All Displayer classes must extend the Displayer class and minimally rewrite: + + + usable() - to indicate if the object can be used, + + format() - to indicate what type of input the put method expects + + put( void * ) - deal with an image of the expected type and size + + By default, all images will be delivered to the put method in a resolution + of IMG_WIDTH * IMG_HEIGHT. If another size is required, then the rewrite + the methods: + + + preferredWidth + + preferredHeight + + If the widget being written to doesn't need a fixed size, then rewrite + the two other put methods as required. + */ + class Displayer + { + public: + + /** Indicates the format required by the abstract put method. + */ + virtual DisplayerInput format(); + + /** Expected width of input to put. + */ + virtual int preferredWidth(); + + /** Expected height of input to put. + */ + virtual int preferredHeight(); + + /** Put an image of a given width and height with the expected input + format (as indicated by the format method). + + \param image image of correct format and specified width/height + \param width width of image + \param height height of image + */ + virtual void put( void *image, int width, int height ); + + virtual bool usable(); + + protected: + int imageWidth; + int imageHeight; + + virtual void put( void * ) = 0; + }; + +} // namespace output +} // namespace gui +} // namespace lumiera + +#endif // DISPLAYER_HPP diff --git a/src/gui/src/output/xvdisplayer.cpp b/src/gui/src/output/xvdisplayer.cpp new file mode 100644 index 000000000..ac15c86d1 --- /dev/null +++ b/src/gui/src/output/xvdisplayer.cpp @@ -0,0 +1,214 @@ +/* + displayer.cpp - Implements the base class for displaying video + + Copyright (C) Lumiera.org + 2000, Arne Schirmacher + 2001-2007, Dan Dennedy + 2008, Joel Holdsworth + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + +#include "xvdisplayer.hpp" + +namespace lumiera { +namespace gui { +namespace output { + +XvDisplayer::XvDisplayer( GtkWidget *drawingarea, int width, int height, bool isPAL, bool isWidescreen ) : + xvImage( NULL ) +{ + cerr << ">> Trying XVideo at " << width << "x" << height << endl; + + this->drawingarea = drawingarea; + img_width = width; + img_height = height; + this->isPAL = isPAL; + this->isWidescreen = isWidescreen; + + shmInfo.shmaddr = NULL; + gotPort = false; + + window = GDK_WINDOW_XID( drawingarea->window ); + display = GDK_WINDOW_XDISPLAY( drawingarea->window ); + + unsigned int count; + XvAdaptorInfo *adaptorInfo; + + if ( XvQueryAdaptors( display, window, &count, &adaptorInfo ) == Success ) + { + + cerr << ">>> XvQueryAdaptors count: " << count << endl; + for ( unsigned int n = 0; gotPort == false && n < count; ++n ) + { + // Diagnostics + cerr << ">>> Xv: " << adaptorInfo[ n ].name + << ": ports " << adaptorInfo[ n ].base_id + << " - " << adaptorInfo[ n ].base_id + + adaptorInfo[ n ].num_ports - 1 + << endl; + + for ( port = adaptorInfo[ n ].base_id; + port < adaptorInfo[ n ].base_id + adaptorInfo[ n ].num_ports; + port ++ ) + { + if ( XvGrabPort( display, port, CurrentTime ) == 0 ) + { + + int formats; + XvImageFormatValues *list; + + list = XvListImageFormats( display, port, &formats ); + + cerr << ">>> formats supported: " << formats << endl; + + for ( int i = 0; i < formats; i ++ ) + { + fprintf( stderr, ">>> 0x%x (%c%c%c%c) %s\n", + list[ i ].id, + ( list[ i ].id ) & 0xff, + ( list[ i ].id >> 8 ) & 0xff, + ( list[ i ].id >> 16 ) & 0xff, + ( list[ i ].id >> 24 ) & 0xff, + ( list[ i ].format == XvPacked ) ? "packed" : "planar" ); + if ( list[ i ].id == 0x32595559 && !gotPort ) + gotPort = true; + } + + if ( !gotPort ) + { + XvUngrabPort( display, port, CurrentTime ); + } + else + { + grabbedPort = port; + break; + } + } + } + } + + if ( gotPort ) + { + int num; + unsigned int unum; + XvEncodingInfo *enc; + + XvQueryEncodings( display, grabbedPort, &unum, &enc ); + for ( unsigned int index = 0; index < unum; index ++ ) + { + fprintf( stderr, ">>> %d: %s, %ldx%ld rate = %d/%d\n", index, enc->name, + enc->width, enc->height, enc->rate.numerator, + enc->rate.denominator ); + } + + XvAttribute *xvattr = XvQueryPortAttributes( display, port, &num ); + for ( int k = 0; k < num; k++ ) + { + if ( xvattr[k].flags & XvSettable ) + { + if ( strcmp( xvattr[k].name, "XV_AUTOPAINT_COLORKEY") == 0 ) + { + Atom val_atom = XInternAtom( display, xvattr[k].name, False ); + if ( XvSetPortAttribute( display, port, val_atom, 1 ) != Success ) + fprintf(stderr, "Couldn't set Xv attribute %s\n", xvattr[k].name); + } + else if ( strcmp( xvattr[k].name, "XV_COLORKEY") == 0 ) + { + Atom val_atom = XInternAtom( display, xvattr[k].name, False ); + if ( XvSetPortAttribute( display, port, val_atom, 0x010102 ) != Success ) + fprintf(stderr, "Couldn't set Xv attribute %s\n", xvattr[k].name); + } + } + } + } + + if ( gotPort ) + { + gc = XCreateGC( display, window, 0, &values ); + + xvImage = ( XvImage * ) XvShmCreateImage( display, port, 0x32595559, 0, width, height, &shmInfo ); + + shmInfo.shmid = shmget( IPC_PRIVATE, xvImage->data_size, IPC_CREAT | 0777 ); + if (shmInfo.shmid < 0) { + perror("shmget"); + gotPort = false; + } else { + shmInfo.shmaddr = ( char * ) shmat( shmInfo.shmid, 0, 0 ); + xvImage->data = shmInfo.shmaddr; + shmInfo.readOnly = 0; + if ( !XShmAttach( gdk_display, &shmInfo ) ) + { + gotPort = false; + } + XSync( display, false ); + shmctl( shmInfo.shmid, IPC_RMID, 0 ); +#if 0 + xvImage = ( XvImage * ) XvCreateImage( display, port, 0x32595559, pix, width , height ); +#endif + } + } + } + else + { + gotPort = false; + } +} + +XvDisplayer::~XvDisplayer() +{ + cerr << ">> Destroying XV Displayer" << endl; + + if ( gotPort ) + { + XvUngrabPort( display, grabbedPort, CurrentTime ); + } + + if ( xvImage != NULL ) + XvStopVideo( display, port, window ); + + if ( shmInfo.shmaddr != NULL ) + { + XShmDetach( display, &shmInfo ); + shmctl( shmInfo.shmid, IPC_RMID, 0 ); + shmdt( shmInfo.shmaddr ); + } + if ( xvImage != NULL ) + XFree( xvImage ); +} + +bool XvDisplayer::usable() +{ + return gotPort; +} + + void XvDisplayer::put( void *image ) + { + AspectRatioCalculator calc( ( ( GtkWidget * ) drawingarea ) ->allocation.width, + ( ( GtkWidget * ) drawingarea ) ->allocation.height, + this->preferredWidth(), this->preferredHeight(), + isPAL, isWidescreen ); + + memcpy( xvImage->data, image, xvImage->data_size ); + + XvShmPutImage( display, port, window, gc, xvImage, + 0, 0, this->preferredWidth(), this->preferredHeight(), + calc.x, calc.y, calc.width, calc.height, false ); + } + +} // namespace output +} // namespace gui +} // namespace lumiera diff --git a/src/gui/src/output/xvdisplayer.hpp b/src/gui/src/output/xvdisplayer.hpp new file mode 100644 index 000000000..77cd27459 --- /dev/null +++ b/src/gui/src/output/xvdisplayer.hpp @@ -0,0 +1,68 @@ +/* + xcdisplayer.hpp - Defines the base class for XVideo display + + Copyright (C) Lumiera.org + 2000, Arne Schirmacher + 2001-2007, Dan Dennedy + 2008, Joel Holdsworth + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ +/** @file xvdisplayer.hpp + ** This file contains the definition of XvDisplayer, the XVideo + ** video output implementation + ** @see xvdisplayer.cpp + */ + +#include "displayer.hpp" + +#include +#include +#include + +#ifndef XVDISPLAYER_HPP +#define XVDISPLAYER_HPP + +namespace lumiera { +namespace gui { +namespace output { + + class XvDisplayer + { + public: + XvDisplayer(); + ~XvDisplayer(); + + protected: + void put( void *image ); + + private: + bool canuse; + int depth; + GtkWidget *drawingarea; + Display *display; + Window window; + GC gc; + XImage *xImage; + XGCValues values; + XShmSegmentInfo shmInfo; + }; + +} // namespace output +} // namespace gui +} // namespace lumiera + +#endif // XVDISPLAYER_HPP diff --git a/src/gui/src/widgets/video-display-widget.hpp b/src/gui/src/widgets/video-display-widget.hpp index d082e8a2f..b7ef32200 100644 --- a/src/gui/src/widgets/video-display-widget.hpp +++ b/src/gui/src/widgets/video-display-widget.hpp @@ -38,9 +38,13 @@ namespace widgets { VideoDisplayWidget(); /* ===== Overrides ===== */ - protected: + private: virtual void on_realize(); virtual bool on_expose_event(GdkEventExpose* event); + + /* ===== Internals ===== */ + private: + }; } // namespace widgets diff --git a/src/gui/src/window-manager.hpp b/src/gui/src/window-manager.hpp index e2a9af8fa..f41d9945c 100644 --- a/src/gui/src/window-manager.hpp +++ b/src/gui/src/window-manager.hpp @@ -20,7 +20,7 @@ */ /** @file window-manager.hpp - ** This file contains the of global UI Manager class + ** This file contains the defintion of global UI Manager class ** user actions. ** @see window-manager.cpp ** @see gtk-lumiera.hpp