Українська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
Повідомлення: 3750
Класс "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
Повідомлення: 3750
"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
Повідомлення: 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.
Повідомлення створено: 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
Повідомлення: 3750
"gsxr" wrote:

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

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

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



9279