⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vo_qt.cpp

📁 为mplayer写的一个新的VO
💻 CPP
字号:
/* Qt VO for mplayer by kf701 */#include <stdint.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <fcntl.h>#include <sys/stat.h>#include <errno.h>#include <qwidget.h>#include <qpainter.h>#include <qapplication.h>#include <qimage.h>#include <qthread.h>#define ERRMSG  printf#define CMMB_SEM_FILE   "/tmp/cmmb_sem"#define CMMB_SHM_FILE  "/tmp/cmmb_shm"#define CMMB_SHM_SIZE   (320*240*4)int semid;uint8_t *shm_addr;int dw = 320, dh=240, depth = 32;uint8_t *rgb_buffer;int player_started = 0;static int shm_init(void){	key_t IPC_key;	int IPC_id;	close(open(CMMB_SHM_FILE, O_CREAT, S_IRUSR|S_IWUSR));	if( (IPC_key = ftok(CMMB_SHM_FILE, 'a')) == -1 )	{		ERRMSG("%m\n");		return -1;	}	IPC_id = shmget( IPC_key, CMMB_SHM_SIZE, IPC_CREAT|S_IRUSR|S_IWUSR );	if( IPC_id == -1 )	{		ERRMSG("%m\n");		return -1;	}	shm_addr = (uint8_t*)shmat( IPC_id, NULL, 0 );	if( (void*)-1 == shm_addr )	{		ERRMSG("%m\n");		return -1;	}	return 0;}static struct sembuf semwait, semsignal;static void init_semaphore_struct(struct sembuf *sem,int semnum, int semop,int semflg){	sem->sem_num=semnum;	sem->sem_op=semop;	sem->sem_flg=semflg;} static int sem_init(char *file){	close(open(file, O_CREAT, S_IRUSR|S_IWUSR));	key_t key = ftok(file, 'b');	if( -1 == key )	{		ERRMSG("%s,%d: %m\n",__FILE__, __LINE__);		return -1;	}	int semid = semget(key, 1, IPC_CREAT|S_IRUSR|S_IWUSR);	if( semid == -1 )	{		ERRMSG("%s,%d: %m\n",__FILE__, __LINE__);		return -1;	}	init_semaphore_struct(&semwait, 0, -1, SEM_UNDO);	init_semaphore_struct(&semsignal, 0, 1, SEM_UNDO); 	return semid;}static int del_sem(int semid){	return semctl(semid,0,IPC_RMID);} static void sem_lock(int semid){	while( -1 == semop(semid, &semwait, 1) && errno == EINTR )		ERRMSG("wait lock\n");}static void sem_unlock(int semid){	while( -1 == semop(semid, &semsignal, 1) && errno == EINTR )		ERRMSG("wait unlock\n");}static int sem_lock_timeout( int semid, struct timespec *timeout ){	return semtimedop( semid, &semwait, 1, timeout );}class DrawView : public QWidget, public QThread{	public:		DrawView()		{			semid = sem_init(CMMB_SEM_FILE);			if( semid != -1 )			{				struct timespec ts = {0, 1000*1000};				sem_lock_timeout( semid, &ts );				sem_unlock(semid);			}			if( shm_init() != -1 )				rgb_buffer = shm_addr;			setBackgroundColor( black );			QThread::start();		}		~DrawView()		{		}	protected:		void paintEvent( QPaintEvent * )		{			QPainter paint( this );			QImage img(rgb_buffer, dw, dh, depth, NULL, 1, QImage::IgnoreEndian );			paint.drawImage( 0, 0, img );		}		void run()		{			QPainter paint( this );			QImage img(rgb_buffer, dw, dh, depth, NULL, 1, QImage::IgnoreEndian );			int len = 320 * 240 * 4;			while( TRUE )			{				if( !player_started )				{					sleep(1);					continue;				}				sem_lock( semid );				qApp->lock();				img.loadFromData( rgb_buffer, len );				paint.drawImage( 0, 0, img );				qApp->unlock();				sem_unlock( semid );			}		}};int main(int argc, char **argv){	QApplication app( argc, argv );	DrawView draw;	draw.setCaption("Player QT VO");	draw.resize( 240, 240 );	app.setMainWidget( &draw );	draw.show();	app.exec();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -