Guest User

LibVLC Video Player Source

a guest
Jun 15th, 2018
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.25 KB | None | 0 0
  1. /*
  2.     *
  3.     * NBAVPlayer.cpp - Peek plugin to preview Video and Audio
  4.     *
  5. */
  6.  
  7. #include "NBAVPlayer.hpp"
  8.  
  9. NBAVPlayer::NBAVPlayer( QString pth ) : QDialog() {
  10.  
  11.     /* Video path */
  12.     mPath = QString( pth );
  13.  
  14.     /* Is video playing */
  15.     mIsPlaying = false;
  16.  
  17.     /* Load the VLC engine */
  18.     inst = libvlc_new( 0, NULL );
  19.  
  20.     /* Create the UI */
  21.     createGUI();
  22.     setWindowProperties();
  23.  
  24.     /* Load the video */
  25.     loadMedia();
  26.  
  27.     peekWidgetBase->setFocus();
  28. };
  29.  
  30. NBAVPlayer::~NBAVPlayer() {
  31.  
  32.     /* Stop the player first */
  33.     stop();
  34.  
  35.     /* Free the media_player */
  36.     libvlc_media_player_release( mp );
  37.  
  38.     /* Release the instance */
  39.     libvlc_release( inst );
  40. };
  41.  
  42. void NBAVPlayer::createGUI() {
  43.  
  44.     QHBoxLayout *lblBtnLyt = new QHBoxLayout();
  45.     QVBoxLayout *widgetLyt = new QVBoxLayout();
  46.     QVBoxLayout *baseLyt = new QVBoxLayout();
  47.  
  48.     lbl = new QLabel( "<tt><b>" + mPath + "</b></tt>" );
  49.  
  50.     QToolButton *openBtn = new QToolButton();
  51.     openBtn->setIcon( QIcon( ":/icons/maximize.png" ) );
  52.     openBtn->setAutoRaise( true );
  53.     openBtn->setFocusPolicy( Qt::NoFocus );
  54.  
  55.     QWidget *baseWidget = new QWidget();
  56.     baseWidget->setObjectName( tr( "guiBase" ) );
  57.  
  58.     connect( openBtn, SIGNAL( clicked() ), this, SLOT( openInExternal() ) );
  59.  
  60.     peekWidgetBase = new QWidget( this );
  61.     peekWidgetBase->setObjectName( tr( "previewBase" ) );
  62.  
  63.     QWidget *avBase = new QWidget();
  64.     avLyt = new QVBoxLayout();
  65.     avLyt->setAlignment( Qt::AlignHCenter );
  66.     avLyt->setContentsMargins( QMargins() );
  67.     avBase->setLayout( avLyt );
  68.  
  69.     lblBtnLyt->addWidget( lbl );
  70.     lblBtnLyt->addStretch( 0 );
  71.     lblBtnLyt->addWidget( openBtn );
  72.  
  73.     widgetLyt->addLayout( lblBtnLyt );
  74.     widgetLyt->addWidget( peekWidgetBase );
  75.  
  76.     baseWidget->setLayout( widgetLyt );
  77.     baseLyt->addWidget( baseWidget );
  78.     baseLyt->setContentsMargins( 0, 0, 0, 0 );
  79.  
  80.     setLayout( baseLyt );
  81.     peekWidgetBase->setFocus();
  82. };
  83.  
  84. void NBAVPlayer::setWindowProperties() {
  85.  
  86.     setFixedSize( 720, 540 );
  87.  
  88.     QDesktopWidget dw;
  89.     int hpos = (int)( ( dw.width() - 720 ) / 2 );
  90.     int vpos = (int)( ( dw.height() - 540 ) / 2 );
  91.  
  92.     setGeometry( hpos, vpos, 720, 540 );
  93.  
  94.     setWindowFlags( windowFlags() | Qt::FramelessWindowHint );
  95. };
  96.  
  97. void NBAVPlayer::loadMedia() {
  98.  
  99.     /* Create a new item */
  100.     m = libvlc_media_new_path( inst, mPath.toLocal8Bit().data() );
  101.  
  102.     /* Create a media player playing environment */
  103.     mp = libvlc_media_player_new( inst );
  104.     libvlc_media_player_set_media( mp, m );
  105.  
  106.     /* Free the media */
  107.     libvlc_media_release( m );
  108.  
  109.     /* Attach the current window to our player */
  110.     libvlc_media_player_set_xwindow( mp, peekWidgetBase->winId() );
  111.  
  112.     /* Start playing the media */
  113.     togglePausePlay();
  114. };
  115.  
  116. void NBAVPlayer::togglePausePlay() {
  117.  
  118.     if ( mIsPlaying ) {
  119.         /* Is video playing */
  120.         mIsPlaying = false;
  121.  
  122.         /* pause the media_player */
  123.         libvlc_media_player_pause( mp );
  124.     }
  125.  
  126.     else {
  127.         /* Is video playing */
  128.         mIsPlaying = true;
  129.  
  130.         /* play the media_player */
  131.         libvlc_media_player_play( mp );
  132.     }
  133. };
  134.  
  135. void NBAVPlayer::stop() {
  136.  
  137.     if ( mIsPlaying ) {
  138.         /* Stop playing */
  139.         libvlc_media_player_stop( mp );
  140.  
  141.         /* Is video playing */
  142.         mIsPlaying = false;
  143.     }
  144. };
  145.  
  146. void NBAVPlayer::seek( int ms, bool forward ) {
  147.  
  148.     int curtime = libvlc_media_player_get_time( mp );
  149.  
  150.     libvlc_media_player_pause( mp );
  151.  
  152.     if ( forward ) {
  153.         int newtime = curtime + ms;
  154.         libvlc_media_player_set_time( mp, newtime );
  155.     }
  156.  
  157.     else {
  158.         int newtime = curtime - ms;
  159.         if ( newtime < 0 )
  160.             libvlc_media_player_set_time( mp, 0 );
  161.  
  162.         else
  163.             libvlc_media_player_set_time( mp, newtime );
  164.     }
  165.  
  166.     libvlc_media_player_play( mp );
  167. };
  168.  
  169. void NBAVPlayer::openInExternal() {
  170.  
  171.     QProcess::startDetached( "xdg-open " + mPath );
  172.     close();
  173. };
  174.  
  175. void NBAVPlayer::keyPressEvent( QKeyEvent *kEvent ) {
  176.  
  177.     /* No Modifiers */
  178.     if ( qApp->keyboardModifiers().testFlag( Qt::NoModifier ) ) {
  179.         switch ( kEvent->key() ) {
  180.             case Qt::Key_Right: {
  181.                 seek( 10000, true );
  182.                 break;
  183.             }
  184.  
  185.             case Qt::Key_Left: {
  186.                 seek( 10000, false );
  187.                 break;
  188.             }
  189.  
  190.             case Qt::Key_Space: {
  191.                 togglePausePlay();
  192.                 break;
  193.             }
  194.  
  195.             case Qt::Key_Escape: {
  196.                 stop();
  197.                 close();
  198.                 break;
  199.             }
  200.  
  201.             default: {
  202.                 QWidget::keyPressEvent( kEvent );
  203.             }
  204.         }
  205.     }
  206.  
  207.     /* Control Modifiers */
  208.     else if ( qApp->keyboardModifiers().testFlag( Qt::ControlModifier ) ) {
  209.         switch ( kEvent->key() ) {
  210.             case Qt::Key_Right: {
  211.                 seek( 60000, true );
  212.                 break;
  213.             }
  214.  
  215.             case Qt::Key_Left: {
  216.                 seek( 60000, false );
  217.                 break;
  218.             }
  219.  
  220.             case Qt::Key_Space: {
  221.                 stop();
  222.                 break;
  223.             }
  224.  
  225.             default: {
  226.                 QWidget::keyPressEvent( kEvent );
  227.             }
  228.         }
  229.     }
  230. };
  231.  
  232. void NBAVPlayer::changeEvent( QEvent *event ) {
  233.  
  234.     // if ( ( event->type() == QEvent::ActivationChange ) and ( !isActiveWindow() ) ) {
  235.         // close();
  236.         // event->accept();
  237.     // }
  238.  
  239.     // else {
  240.         QDialog::changeEvent( event );
  241.         event->accept();
  242.     // }
  243. };
  244.  
  245. void NBAVPlayer::paintEvent( QPaintEvent *pEvent ) {
  246.  
  247.     QWidget::paintEvent( pEvent );
  248.     QPainter *painter = new QPainter( this );
  249.  
  250.     painter->setPen( QPen( palette().color( QPalette::Window ).darker(), 2.0 ) );
  251.     painter->drawRect( rect().adjusted( +1, +1, -1, -1 ) );
  252.  
  253.     painter->end();
  254.     pEvent->accept();
  255. };
  256.  
  257. int main( int argc, char **argv ) {
  258.  
  259.     QApplication app( argc, argv );
  260.     NBAVPlayer Gui( argv[ 1 ] );
  261.     Gui.exec();
  262.  
  263.     return 0;
  264. };
Add Comment
Please, Sign In to add comment