@ -1,46 +1,32 @@
/*
* X11 video grab interface
* Copyright ( C ) 2006 Clemens Fruhwirth
*
* A quick note on licensing . This file is a mixture of LGPL code
* ( ffmpeg ) and GPL code ( xvidcap ) . The result is a file that must
* abid both licenses . As they are compatible and GPL is more
* strict , this code has an " effective " GPL license .
*
* This file contains code from grab . c :
* Copyright ( c ) 2000 , 2001 Fabrice Bellard
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2 of the License , or ( at your option ) any later version .
* This file is part of FFmpeg .
*
* This library 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
* Lesser General Public License for more details .
* FFmpeg integration :
* Copyright ( C ) 2006 Clemens Fruhwirth < clemens @ endorphin . org >
* Edouard Gomez < ed . gomez @ free . fr >
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
* This file contains code from grab . c :
* Copyright ( c ) 2000 - 2001 Fabrice Bellard
*
* This file contains code from the xvidcap project :
* Copyright ( C ) 1997 - 98 Rasca , Berlin
* Copyright ( C ) 2003 , 04 Karl H . Beckers , Frankfurt
* Copyright ( C ) 1997 - 1998 Rasca , Berlin
* 2003 - 2004 Karl H . Beckers , Frankfurt
*
* This program is free software ; you can redistribute it and / or modify
* FFmpeg 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 ,
* FFmpeg 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 0213 9 , USA .
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include "avformat.h"
@ -55,6 +41,7 @@
# include <X11/Xlib.h>
# include <X11/Xlibint.h>
# include <X11/Xproto.h>
# include <X11/Xutil.h>
# include <sys/ipc.h>
# include <sys/shm.h>
# include <X11/extensions/XShm.h>
@ -113,7 +100,7 @@ x11grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
if ( ! st ) {
return - ENOMEM ;
}
av_set_pts_info ( st , 48 , 1 , 1000000 ) ; /* 48 bits pts in us */
av_set_pts_info ( st , 6 4, 1 , 1000000 ) ; /* 6 4 bits pts in us */
use_shm = XShmQueryExtension ( dpy ) ;
av_log ( s1 , AV_LOG_INFO , " shared memory extension %s \n " , use_shm ? " found " : " not found " ) ;
@ -121,8 +108,8 @@ x11grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
if ( use_shm ) {
int scr = XDefaultScreen ( dpy ) ;
image = XShmCreateImage ( dpy ,
DefaultVisual ( dpy , scr ) ,
DefaultDepth ( dpy , scr ) ,
DefaultVisual ( dpy , scr ) ,
DefaultDepth ( dpy , scr ) ,
ZPixmap ,
NULL ,
& x11grab - > shminfo ,
@ -236,18 +223,6 @@ fail:
return AVERROR_IO ;
}
static uint16_t mousePointerBlack [ ] =
{
0 , 49152 , 40960 , 36864 , 34816 , 33792 , 33280 , 33024 , 32896 , 32832 ,
33728 , 37376 , 43264 , 51456 , 1152 , 1152 , 576 , 576 , 448 , 0
} ;
static uint16_t mousePointerWhite [ ] =
{
0 , 0 , 16384 , 24576 , 28672 , 30720 , 31744 , 32256 , 32512 , 32640 , 31744 ,
27648 , 17920 , 1536 , 768 , 768 , 384 , 384 , 0 , 0
} ;
static void
getCurrentPointer ( AVFormatContext * s1 , X11Grab * s , int * x , int * y )
{
@ -299,6 +274,22 @@ for (line = 0; line < min(20, (y_off + height) - *y); line++ ) { \
static void
paintMousePointer ( AVFormatContext * s1 , X11Grab * s , int * x , int * y , XImage * image )
{
static const uint16_t const mousePointerBlack [ ] =
{
0 , 49152 , 40960 , 36864 , 34816 ,
33792 , 33280 , 33024 , 32896 , 32832 ,
33728 , 37376 , 43264 , 51456 , 1152 ,
1152 , 576 , 576 , 448 , 0
} ;
static const uint16_t const mousePointerWhite [ ] =
{
0 , 0 , 16384 , 24576 , 28672 ,
30720 , 31744 , 32256 , 32512 , 32640 ,
31744 , 27648 , 17920 , 1536 , 768 ,
768 , 384 , 384 , 0 , 0
} ;
int x_off = s - > x_off ;
int y_off = s - > y_off ;
int width = s - > width ;
@ -429,12 +420,19 @@ static int x11grab_read_close(AVFormatContext *s1)
{
X11Grab * x11grab = s1 - > priv_data ;
/* Free shared mem if necessary */
/* Detach cleanly from shared mem */
if ( x11grab - > use_shm ) {
XShmDetach ( x11grab - > dpy , & x11grab - > shminfo ) ;
shmdt ( x11grab - > shminfo . shmaddr ) ;
shmctl ( x11grab - > shminfo . shmid , IPC_RMID , NULL ) ;
}
/* Destroy X11 image */
if ( x11grab - > image ) {
XDestroyImage ( x11grab - > image ) ;
x11grab - > image = NULL ;
}
/* Free X11 display */
XCloseDisplay ( x11grab - > dpy ) ;
return 0 ;