?? qte.cpp
字號:
/***************************************************************************** * qte.cpp : QT Embedded plugin for vlc ***************************************************************************** * Copyright (C) 1998-2003 the VideoLAN team * $Id: 2968e073d9ccc7330e6c369e93c87397de8aa87f $ * * Authors: Gerald Hansink <gerald.hansink@ordina.nl> * Jean-Paul Saman <jpsaman _at_ videolan _dot_ org> * * 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 Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************//***************************************************************************** * notes: * - written for ipaq, so hardcoded assumptions specific for ipaq... * - runs full screen * - no "mouse events" handling * - etc. *****************************************************************************/extern "C"{#include <errno.h> /* ENOMEM */#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_plugin.h>#include <vlc_interface.h>#include <vlc_vout.h>#ifdef HAVE_MACHINE_PARAM_H /* BSD */# include <machine/param.h># include <sys/types.h> /* typedef ushort */# include <sys/ipc.h>#endif#ifndef WIN32# include <netinet/in.h> /* BSD: struct in_addr */#endif#ifdef HAVE_SYS_SHM_H# include <sys/shm.h> /* shmget(), shmctl() */#endif} /* extern "C" */#include <qapplication.h>#include <qpainter.h>#ifdef Q_WS_QWS# define USE_DIRECT_PAINTER# include <qdirectpainter_qws.h># include <qgfxraster_qws.h>#endifextern "C"{#include "qte.h"/***************************************************************************** * Module descriptor *****************************************************************************/#define DISPLAY_TEXT N_("QT Embedded display")#define DISPLAY_LONGTEXT N_( \ "Qt Embedded hardware display to use. " \ "By default VLC will use the value of the DISPLAY environment variable.")/***************************************************************************** * Local prototypes *****************************************************************************/static int Open ( vlc_object_t * );static void Close ( vlc_object_t * );static void Render ( vout_thread_t *, picture_t * );static void Display ( vout_thread_t *, picture_t * );static int Manage ( vout_thread_t * );static int Init ( vout_thread_t * );static void End ( vout_thread_t * );static int OpenDisplay ( vout_thread_t * );static void CloseDisplay( vout_thread_t * );static int NewPicture ( vout_thread_t *, picture_t * );static void FreePicture ( vout_thread_t *, picture_t * );static void ToggleFullScreen ( vout_thread_t * );static void* RunQtThread( vlc_object_t *p_this );} /* extern "C" *//****************************************************************************** Exported prototypes*****************************************************************************/extern "C"{vlc_module_begin(); set_category( CAT_VIDEO ); set_subcategory( SUBCAT_VIDEO_VOUT );// add_category_hint( N_("QT Embedded"), NULL );// add_string( "qte-display", "landscape", NULL, DISPLAY_TEXT, DISPLAY_LONGTEXT); set_description( N_("QT Embedded video output") ); set_capability( "video output", 70 ); add_shortcut( "qte" ); set_callbacks( Open, Close);vlc_module_end();} /* extern "C" *//***************************************************************************** * Seeking function TODO: put this in a generic location ! *****************************************************************************/static inline void vout_Seek( off_t i_seek ){}/***************************************************************************** * Open: allocate video thread output method *****************************************************************************/static int Open( vlc_object_t *p_this ){ vout_thread_t * p_vout = (vout_thread_t *)p_this; /* Allocate structure */ p_vout->p_sys = (struct vout_sys_t*) malloc( sizeof( struct vout_sys_t ) ); if( p_vout->p_sys == NULL ) return( 1 ); p_vout->pf_init = Init; p_vout->pf_end = End; p_vout->pf_manage = Manage; p_vout->pf_render = NULL; //Render; p_vout->pf_display = Display;#ifdef NEED_QTE_MAIN p_vout->p_sys->p_qte_main = module_Need( p_this, "gui-helper", "qte", true ); if( p_vout->p_sys->p_qte_main == NULL ) { free( p_vout->p_sys ); return VLC_ENOMOD; }#endif if (OpenDisplay(p_vout)) { msg_Err( p_vout, "Cannot set up qte video output" ); Close(p_this); return( -1 ); } return( 0 );}/***************************************************************************** * CloseVideo: destroy Sys video thread output method ***************************************************************************** * Terminate an output method created by Open *****************************************************************************/static void Close ( vlc_object_t *p_this ){ vout_thread_t * p_vout = (vout_thread_t *)p_this; msg_Dbg( p_vout, "close" ); if( p_vout->p_sys->p_event ) { vlc_object_detach( p_vout->p_sys->p_event ); /* Kill RunQtThread */ vlc_object_kill( p_vout->p_sys->p_event ); CloseDisplay(p_vout); vlc_thread_join( p_vout->p_sys->p_event ); vlc_object_release( p_vout->p_sys->p_event ); }#ifdef NEED_QTE_MAIN msg_Dbg( p_vout, "releasing gui-helper" ); module_Unneed( p_vout, p_vout->p_sys->p_qte_main );#endif if( p_vout->p_sys ) { free( p_vout->p_sys ); p_vout->p_sys = NULL; }}/***************************************************************************** * Init: initialize video thread output method ***************************************************************************** * This function create the buffers needed by the output thread. It is called * at the beginning of the thread, but also each time the window is resized. *****************************************************************************/static int Init( vout_thread_t *p_vout ){ int i_index; picture_t* p_pic; int dd = QPixmap::defaultDepth(); I_OUTPUTPICTURES = 0; p_vout->output.i_chroma = (dd == 16) ? VLC_FOURCC('R','V','1','6'): VLC_FOURCC('R','V','3','2'); p_vout->output.i_rmask = 0xf800; p_vout->output.i_gmask = 0x07e0; p_vout->output.i_bmask = 0x001f; /* All we have is an RGB image with square pixels */ p_vout->output.i_width = p_vout->p_sys->i_width; p_vout->output.i_height = p_vout->p_sys->i_height; if( !p_vout->b_fullscreen ) { p_vout->output.i_aspect = p_vout->output.i_width * VOUT_ASPECT_FACTOR / p_vout->output.i_height; } else { p_vout->output.i_aspect = p_vout->render.i_aspect; }#if 0 msg_Dbg( p_vout, "Init (h=%d,w=%d,aspect=%d)",p_vout->output.i_height,p_vout->output.i_width,p_vout->output.i_aspect );#endif /* Try to initialize MAX_DIRECTBUFFERS direct buffers */ while( I_OUTPUTPICTURES < QTE_MAX_DIRECTBUFFERS ) { p_pic = NULL; /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } /* Allocate the picture */ if( p_pic == NULL || NewPicture( p_vout, p_pic ) ) { break; } p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; } return( 0 );}/***************************************************************************** * Render: render previously calculated output *****************************************************************************/static void Render( vout_thread_t *p_vout, picture_t *p_pic ){ ;}/***************************************************************************** * Display: displays previously rendered output ***************************************************************************** * This function sends the currently rendered image to screen. *****************************************************************************/static void Display( vout_thread_t *p_vout, picture_t *p_pic ){ unsigned int x, y, w, h; vout_PlacePicture( p_vout, p_vout->output.i_width, p_vout->output.i_height, &x, &y, &w, &h );#if 0 msg_Dbg(p_vout, "+qte::Display( p_vout, i_width=%d, i_height=%d, x=%u, y=%u, w=%u, h=%u", p_vout->output.i_width, p_vout->output.i_height, x, y, w, h );#endif if(p_vout->p_sys->p_VideoWidget) {// shameless borrowed from opie mediaplayer....#ifndef USE_DIRECT_PAINTER msg_Dbg(p_vout, "not using direct painter"); QPainter p(p_vout->p_sys->p_VideoWidget); /* rotate frame */ int dd = QPixmap::defaultDepth(); int bytes = ( dd == 16 ) ? 2 : 4; int rw = h, rh = w; QImage rotatedFrame( rw, rh, bytes << 3 ); ushort* in = (ushort*)p_pic->p_sys->pQImage->bits(); ushort* out = (ushort*)rotatedFrame.bits(); int spl = rotatedFrame.bytesPerLine() / bytes; for (int x=0; x<h; x++) { if ( bytes == 2 ) { ushort* lout = out++ + (w - 1)*spl; for (int y=0; y<w; y++) { *lout=*in++; lout-=spl; } } else { ulong* lout = ((ulong *)out)++ + (w - 1)*spl; for (int y=0; y<w; y++) { *lout=*((ulong*)in)++; lout-=spl; } } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -