📄 vo_qt.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 + -