EnglishУкраїнськаmRussian
Login/New
Topic with many replies

Реализация Phonon бекенда для Media виджета


Author Message
Written on: 28. 03. 2012 [23:09]
aleax
Alexey Bondarchuk
Topic creator
registered since: 27.01.2010
Posts: 73
"gsxr" wrote:

Есть возможность организовать вещание прямо с ip камер. В наличии axis и evidence. Нужно?


Было-бы замечательно!
Written on: 02. 04. 2012 [12:36]
aleax
Alexey Bondarchuk
Topic creator
registered since: 27.01.2010
Posts: 73
Реализовал переключение в fullscreen по двойному клику ЛКМ:
JAVASCRIPT
Index: src/moduls/ui/Vision/vis_shapes.cpp
===================================================================
--- src/moduls/ui/Vision/vis_shapes.cpp	(revision 1777)
+++ src/moduls/ui/Vision/vis_shapes.cpp	(working copy)
@@ -58,7 +58,7 @@
 #include "vis_shapes.h"
 
 #ifdef HAVE_PHONON
-#include <phonon/VideoPlayer>
+#include "vis_mediaplayer.h"
 #endif
 
 
@@ -1000,7 +1000,7 @@
     }
 
 #ifdef HAVE_PHONON
-    VideoPlayer *player = dynamic_cast<VideoPlayer*>(shD->addrWdg);
+    MediaPlayer *player = dynamic_cast<MediaPlayer*>(shD->addrWdg);
     if(player)
     {
 	if(shD->mediaType == 0 || shD->mediaType == 1)	{ player->deleteLater(); shD->addrWdg = NULL; }
@@ -1012,7 +1012,7 @@
 {
     QLabel *lab;
 #ifdef HAVE_PHONON
-    VideoPlayer *player;
+    MediaPlayer *player;
 #endif
 
     bool up = true, reld_cfg = false;
@@ -1112,7 +1112,7 @@
 		}
 	    }
 #ifdef HAVE_PHONON
-	    else if((player=dynamic_cast<VideoPlayer*>(shD->addrWdg)))
+	    else if((player=dynamic_cast<MediaPlayer*>(shD->addrWdg)))
 	    {
 		if(shD->videoPlay)
 		{
@@ -1127,7 +1127,7 @@
 	case 30:	//roll
 	    if(shD->videoRoll == (bool)atoi(val.c_str())) break;
 	    shD->videoRoll = (bool)atoi(val.c_str());
-	    if((player=dynamic_cast<VideoPlayer*>(shD->addrWdg)))
+	    if((player=dynamic_cast<MediaPlayer*>(shD->addrWdg)))
 	    {
 		if(shD->videoRoll) connect(player, SIGNAL(finished()), player, SLOT(play()));
 		else disconnect(player, SIGNAL(finished()), 0, 0);
@@ -1135,7 +1135,7 @@
 	    break;
 	case 31:	//pause
 	    shD->videoPause = (bool)atoi(val.c_str());
-	    if((player=dynamic_cast<VideoPlayer*>(shD->addrWdg)))
+	    if((player=dynamic_cast<MediaPlayer*>(shD->addrWdg)))
 	    {
 		if(shD->videoPause && !player->isPaused()) player->pause();
 		if(!shD->videoPause && player->isPaused()) player->play();
@@ -1144,12 +1144,12 @@
 	case 33:	//seek
 	    if(shD->videoSeek == atof(val.c_str())) break;
 	    shD->videoSeek = atof(val.c_str());
-	    if((player=dynamic_cast<VideoPlayer*>(shD->addrWdg))) player->seek(shD->videoSeek);
+	    if((player=dynamic_cast<MediaPlayer*>(shD->addrWdg))) player->seek(shD->videoSeek);
 	    break;
 	case 34:	//volume
 	    if(shD->audioVolume == atof(val.c_str())) break;
 	    shD->audioVolume = atof(val.c_str());
-	    if((player=dynamic_cast<VideoPlayer*>(shD->addrWdg))) player->setVolume(shD->audioVolume);
+	    if((player=dynamic_cast<MediaPlayer*>(shD->addrWdg))) player->setVolume(shD->audioVolume);
 	    break;
 #endif
 	default:
@@ -1247,12 +1247,12 @@
 		//> Create player widget
 		if(!shD->addrWdg)
 		{
-		    shD->addrWdg = new VideoPlayer(Phonon::VideoCategory, w);
+		    shD->addrWdg = new MediaPlayer(Phonon::VideoCategory, w);
 		    if(shD->videoRoll) connect(shD->addrWdg, SIGNAL(finished()), shD->addrWdg, SLOT(play()));
 		    mk_new = true;
 		}
 		//> Set new data
-		player = dynamic_cast<VideoPlayer*>(shD->addrWdg);
+		player = dynamic_cast<MediaPlayer*>(shD->addrWdg);
 		if(!player) break;
 		MediaSource mSrc;
 		if(player->isPlaying()) { player->stop(); player->seek(0); }
@@ -1314,8 +1314,11 @@
     ShpDt *shD = (ShpDt*)w->shpData;
     if(!shD->en) return false;
 
+  //  qDebug() << event;
+    
     switch( event->type() )
     {
+
 	case QEvent::Paint:
 	{
 	    QPainter pnt( w );
Index: src/moduls/ui/Vision/vis_mediaplayer.cpp
===================================================================
--- src/moduls/ui/Vision/vis_mediaplayer.cpp	(revision 0)
+++ src/moduls/ui/Vision/vis_mediaplayer.cpp	(revision 0)
@@ -0,0 +1,36 @@
+#include "vis_mediaplayer.h"
+
+#include <QMouseEvent>
+#include <phonon/VideoWidget>
+
+MediaPlayer::MediaPlayer( Category category, QWidget *parent ) : VideoPlayer( category, parent )
+{
+    this->videoWidget()->installEventFilter(this);
+}
+
+MediaPlayer::MediaPlayer( QWidget *parent ) : VideoPlayer( parent )
+{
+    this->videoWidget()->installEventFilter(this);
+}
+
+bool MediaPlayer::eventFilter(QObject *obj, QEvent *event)
+{
+     if ( obj == this->videoWidget() ) 
+     {
+         if( event->type() == QEvent::MouseButtonDblClick )
+	 {
+	      QMouseEvent *mouse = static_cast<QMouseEvent *>(event); // mouseEvent
+	      if( mouse->button() == Qt::LeftButton )
+	      {
+		    this->videoWidget()->setFullScreen( !this->videoWidget()->isFullScreen() );
+		    return true;
+	      }
+	 }
+	 return false;
+     } 
+     else
+     {
+         // pass the event on to the parent class
+         return VideoPlayer::eventFilter(obj, event);
+     }
+}
\ No newline at end of file
Index: src/moduls/ui/Vision/vis_mediaplayer.h
===================================================================
--- src/moduls/ui/Vision/vis_mediaplayer.h	(revision 0)
+++ src/moduls/ui/Vision/vis_mediaplayer.h	(revision 0)
@@ -0,0 +1,20 @@
+#ifndef VIS_MEDIAPLAYER_H
+#define VIS_MEDIAPLAYER_H
+
+#include <phonon/VideoPlayer>
+
+using namespace Phonon;
+
+class MediaPlayer : public VideoPlayer
+{
+    Q_OBJECT
+
+    public:
+	MediaPlayer( Category category, QWidget *parent = 0 );
+	MediaPlayer( QWidget *parent = 0 );
+
+    protected:
+	bool eventFilter( QObject *obj, QEvent *event );
+};
+
+#endif //VIS_MEDIAPLAYER_H
Index: src/moduls/ui/Vision/Makefile.am
===================================================================
--- src/moduls/ui/Vision/Makefile.am	(revision 1777)
+++ src/moduls/ui/Vision/Makefile.am	(working copy)
@@ -5,9 +5,9 @@
 ui_Vision_la_LDFLAGS = -module -avoid-version -no-undefined
 ui_Vision_la_SOURCES = tvision.cpp qrc_vision.cpp vis_widgs.cpp moc_vis_widgs.cpp vis_shapes.cpp moc_vis_shapes.cpp \
     vis_devel.cpp moc_vis_devel.cpp vis_devel_dlgs.cpp moc_vis_devel_dlgs.cpp vis_devel_widgs.cpp moc_vis_devel_widgs.cpp \
-    vis_run.cpp moc_vis_run.cpp vis_run_widgs.cpp moc_vis_run_widgs.cpp vis_shape_elfig.cpp moc_vis_shape_elfig.cpp
+    vis_run.cpp moc_vis_run.cpp vis_run_widgs.cpp moc_vis_run_widgs.cpp vis_shape_elfig.cpp moc_vis_shape_elfig.cpp vis_mediaplayer.cpp moc_vis_mediaplayer.cpp
 ui_Vision_la_DIST = tvision.cpp vis_widgs.cpp vis_shapes.cpp vis_devel.cpp vis_devel_dlgs.cpp vis_devel_widgs.cpp \
-    vis_run.cpp vis_run_widgs.cpp vis_shape_elfig.cpp vision.qrc
+    vis_run.cpp vis_run_widgs.cpp vis_shape_elfig.cpp vision.qrc vis_mediaplayer.cpp
 ui_Vision_la_LIBADD = $(QT4_LIB) $(LIB_FFTW3) $(phonon_LIBS)
 ui_Vision_la_LIBTOOLFLAGS = --tag=disable-static
 
@@ -35,6 +35,9 @@
 moc_vis_shape_elfig.cpp: vis_shape_elfig.h
 	$(QT4_MOC) vis_shape_elfig.h > moc_vis_shape_elfig.cpp
 
+moc_vis_mediaplayer.cpp: vis_mediaplayer.h
+	$(QT4_MOC) vis_mediaplayer.h > moc_vis_mediaplayer.cpp
+
 I18N_mod = $(oscd_modulpref)Vision
 
 clean-local:
Written on: 02. 04. 2012 [13:28]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
Класс "MediaPlayer" тут вообще лишний, а использование eventFilter() можно сделать прямо и примеры там есть.

Learn, learn and learn better than work, work and work.
Written on: 02. 04. 2012 [14:30]
aleax
Alexey Bondarchuk
Topic creator
registered since: 27.01.2010
Posts: 73
"roman" wrote:

Класс "MediaPlayer" тут вообще лишний, а использование eventFilter() можно сделать прямо и примеры там есть.


Ну в принципе да, но я класс заложил, что бы была возможность возможность построить граф объектов фонона по своему, и расширить возможности дефолтного Phonon::VideoPlayer.
P.S.: ну и не осилил я корректно "вклинится" в существующий код, потому пошел по пути наименьшего сопротивления (так как фича нужна была мне еще на вчера)
Written on: 03. 04. 2012 [11:35]
Osipetka
Пётр Осипенко
registered since: 27.03.2011
Posts: 27
"aleax" wrote:

Реализовал переключение в fullscreen по двойному клику ЛКМ

Отлично, полезный патч! Как раз то что нам было нужно!
Written on: 03. 04. 2012 [21:39]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"aleax" wrote:

"roman" wrote:

Класс "MediaPlayer" тут вообще лишний, а использование eventFilter() можно сделать прямо и примеры там есть.


P.S.: ну и не осилил я корректно "вклинится" в существующий код, потому пошел по пути наименьшего сопротивления (так как фича нужна была мне еще на вчера)

Реализовал нормально!

Learn, learn and learn better than work, work and work.
Written on: 09. 04. 2012 [09:33]
gsxr
Андрей Ехлаков
registered since: 03.03.2010
Posts: 58
При сборке версии 0.8:
vis_shapes.cpp:1253: ошибка: invalid use of incomplete type ‘struct Phonon::VideoWidget’
/usr/include/phonon/Phonon/../../phonon/videoplayer.h:41: ошибка: forward declaration of ‘struct Phonon::VideoWidget’
vis_shapes.cpp: In member function ‘virtual bool VISION::ShapeMedia::eventFilter(VISION::WdgView*, QObject*, QEvent*)’:
vis_shapes.cpp:1388: ошибка: comparison между разными указательными типами ‘Phonon::VideoWidget*’ и ‘QObject*’: отсутствует приведение
vis_shapes.cpp:1391: ошибка: invalid use of incomplete type ‘struct Phonon::VideoWidget’
/usr/include/phonon/Phonon/../../phonon/videoplayer.h:41: ошибка: forward declaration of ‘struct Phonon::VideoWidget’
vis_shapes.cpp:1391: ошибка: invalid use of incomplete type ‘struct Phonon::VideoWidget’
/usr/include/phonon/Phonon/../../phonon/videoplayer.h:41: ошибка: forward declaration of ‘struct Phonon::VideoWidget’
make[5]: *** [ui_Vision_la-vis_shapes.lo] Ошибка 1
make[5]: Leaving directory `/home/sf/project/OpenSCADA/src/moduls/ui/Vision'
make[4]: *** [all-recursive] Ошибка 1
make[4]: Leaving directory `/home/sf/project/OpenSCADA/src/moduls/ui'
make[3]: *** [all-recursive] Ошибка 1
make[3]: Leaving directory `/home/sf/project/OpenSCADA/src/moduls'
make[2]: *** [all-recursive] Ошибка 1
make[2]: Leaving directory `/home/sf/project/OpenSCADA/src'
make[1]: *** [all] Ошибка 2
make[1]: Leaving directory `/home/sf/project/OpenSCADA/src'
make: *** [all-recursive] Ошибка 1
Written on: 09. 04. 2012 [09:45]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"gsxr" wrote:

При сборке версии 0.8:
vis_shapes.cpp:1253: ошибка: invalid use of incomplete type ‘struct Phonon::VideoWidget’

А выше почитать, прежде чем писать?
Это проблема ранего и текущего размещения заголовков Phonon, в директории "Phonon/*" и "phonon/*", соответственно.

Learn, learn and learn better than work, work and work.
Written on: 09. 04. 2012 [11:33]
gsxr
Андрей Ехлаков
registered since: 03.03.2010
Posts: 58
"roman" wrote:

"gsxr" wrote:

При сборке версии 0.8:
vis_shapes.cpp:1253: ошибка: invalid use of incomplete type ‘struct Phonon::VideoWidget’

А выше почитать, прежде чем писать?
Это проблема ранего и текущего размещения заголовков Phonon, в директории "Phonon/*" и "phonon/*", соответственно.

Мне не поможет перечитывание моих собственный сообщений. В предыдущем случае сообщение об ошибке было другим.
Written on: 09. 04. 2012 [11:48]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"gsxr" wrote:

Мне не поможет перечитывание моих собственный сообщений. В предыдущем случае сообщение об ошибке было другим.

Если поменять оба инклуда то поможет. Вы думаете как у меня для Ubuntu 10.04 собрано?

Learn, learn and learn better than work, work and work.



9356