УкраїнськаEnglishmRussian
Вход/Новый
В теме много сообщений

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


Автор Сообщение
Сообщение создано: 28. 03. 2012 [23:09]
aleax
Alexey Bondarchuk
Создатель темы
Зарегистрирован(а) с: 27.01.2010
Сообщения: 73
"gsxr" wrote:

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


Было-бы замечательно!
Сообщение создано: 02. 04. 2012 [12:36]
aleax
Alexey Bondarchuk
Создатель темы
Зарегистрирован(а) с: 27.01.2010
Сообщения: 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:
Сообщение создано: 02. 04. 2012 [13:28]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
Класс "MediaPlayer" тут вообще лишний, а использование eventFilter() можно сделать прямо и примеры там есть.

Learn, learn and learn better than work, work and work.
Сообщение создано: 02. 04. 2012 [14:30]
aleax
Alexey Bondarchuk
Создатель темы
Зарегистрирован(а) с: 27.01.2010
Сообщения: 73
"roman" wrote:

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


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

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

Отлично, полезный патч! Как раз то что нам было нужно!
Сообщение создано: 03. 04. 2012 [21:39]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"aleax" wrote:

"roman" wrote:

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


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

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

Learn, learn and learn better than work, work and work.
Сообщение создано: 09. 04. 2012 [09:33]
gsxr
Андрей Ехлаков
Зарегистрирован(а) с: 03.03.2010
Сообщения: 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
Сообщение создано: 09. 04. 2012 [09:45]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"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.
Сообщение создано: 09. 04. 2012 [11:33]
gsxr
Андрей Ехлаков
Зарегистрирован(а) с: 03.03.2010
Сообщения: 58
"roman" wrote:

"gsxr" wrote:

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

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

Мне не поможет перечитывание моих собственный сообщений. В предыдущем случае сообщение об ошибке было другим.
Сообщение создано: 09. 04. 2012 [11:48]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"gsxr" wrote:

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

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

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



10177